CMSmap Escaner de vulnerabilidades en Drupal, WordPress y Joomla

Un tema un tanto importante a tener en cuenta, es la seguridad de un sitio web.

A día de hoy, existen multitud de CMS para hacernos la vida un poco más fácil a todos, pero cuando más conocidos son, más a la vista está el código, y con ello más vulnerabilidades se encuentran.

El mejor consejo, es siempre tener los CMS actualizados a la última versión, tanto CMS como módulos, aparte de toda la seguridad del servidor y buenas prácticas a la hora de la programación.

Existe un escaner de vulnerabilidades basado en python llamado CMSmap.

Este escaner funciona con Drupal, WordPress y Joomla y nos da una lista detallada de las vulnerabilidades encontradas y como explotarlas. Si tenemos como explotarlas, podemos resolverlas aplicando parches en el código o actualizando siempre.

Básicamente funciona haciendo peticiones a todos los módulos conocidos de un CMS y intentar explotarlas.

Lo podemos descargar desde gitHub (como no xD).

Para utilizarlo tenemos diferentes opciones:

-t, –target target URL (e.g. ‘https://abc.test.com:8080/’)
-v, –verbose verbose mode (Default: false)
-T, –threads number of threads (Default: 5)
-u, –usr username or file
-p, –psw password or file
-i, –input scan multiple targets listed in a given text file
-o, –output save output in a file
-k, –crack password hashes file
-w, –wordlist wordlist file (Default: rockyou.txt – WordPress only)
-U, –update (C)MSmap, (W)ordpress plugins and themes, (J)oomla components, (D)rupal modules
-h, –help show this help
-f, –force force scan (W)ordpress, (J)oomla or (D)rupal
-F, –fullscan full scan using large plugin lists. Slow! (Default: false)

Por ejemplo:

cmsmap.py -t https://example.com

Realiza un escaneo simple.

 

Con:
cmsmap.py -t https://example.com -f W

Forzamos que el sitio web sea un WordPress.

 

Con:
cmsmap.py -t https://example.com -u admin -p Diccionario.txt

Podemos hacer fuerza bruta para encontrar el login del usuario admin.

 

Y así tenemos una gran variedad de opciones.

Úsalo bajo tu responsabilidad con fines educativos y siempre para hacer el bien.

 

Un saludo – Juanan 😉

Permisos recursivos PHP en servidor apache (Tips PHP – Seguridad)

No está demás en ningún sitio online la seguridad.

A día de hoy, existen multitud de sitios vulnerables a SQL injection etc…

¿Que pasa si tu sitio no es seguro?

Puedes dejar al descubierto absolutamente todo, existen Shell’s programadas en PHP, por ejemplo C99.php que se pueden subir a un servidor, y si dejamos permisos de ejecución en el servidor para los archivos PHP o los carpetas de manera equivocada,  estamos literalmente vendidos.

Nos pueden desde borrar todo, ejecutar código malicioso, convertir nuestro server en una botnet para hacer ataques DDos, ver nuestras bases de datos etc…

Lo principal es asegurarse de tener alguna medida de seguridad, ya sea desde antivirus, hasta modificaciones en el core, módulos de apache para prevención de ataques etc…

Pero algo muy simple que siempre se debe hacer es tener los permisos adecuados a cada archivo, por lo general los directorios

se suelen dejar en 755 mientras que los PHP en 644.

Darle 777 a un directorio, o permisos de ejecución a un PHP es algo bastante peligroso.

 

Para aplicar los permisos de forma recursiva lo puedes hacer con estos dos comandos.

Los directorios:

find . -type d -exec chmod 755 {} \;

Los archivos a 644:

find . -type f -exec chmod 644 {} \;

 

Cuidadin con la seguridad 😛 – Juanan

Desactivar claves foraneas en MySQL (Tips MySQL)

En ocasiones, cuando estamos manejando una base de datos, tenemos la necesidad de hacer un TRUNCATE TABLE o un

DELETE FROM y es un poco «engorroso» si tenemos claves foraneas (Foreign keys), ir borrando las tablas en cascada.

Con la siguiente sentencia puedes desactivar las claves foraneas:

SET FOREIGN_KEY_CHECKS=0;

 

Una vez hecho el trabajo en la base de datos, no te olvides dejarlo como estaba de la siguiente forma:

SET FOREIGN_KEY_CHECKS=1;

 

Un saludo – Juanan 🙂

Patrones de diseño en PHP

¿Qué es un Patrón de Diseño?

Los patrones de diseño, nos brindan una solución a problemas comunes a la hora de diseñar software que ya están probados y documentados.

Hay que decir, que muchas veces, usamos algún patrón a la hora de diseñar software sin apenas darnos cuenta, ya que en ocasiones cualquier programador, se pone a programar sin pensar que patrón tiene que aplicar a un problema.

No es obligatorio siempre aplicar un patrón a la hora de diseñar software, esto depende de la necesidad, ya que en ocasiones, algo no es de tanta envergadura como para aplicar un tipo de diseño específico, pero sí que nos pueden ayudar a salir de una «encerrona» cuando nos quedamos bloqueados a la hora de nuestro desarrollo de software.

A la hora de aplicar un patrón, debemos analizar la situación en la que estamos y tener en cuenta tres cosas básicas:

1 – El problema que tenemos.

2 – Cuando aplicar un patrón.

3 – Que patrón elegir.

Muchos CMS, implementan patrones de diseño muy conocidos, Prestashop, o algunos Frameworks PHP, están muy enfocados a MVC.

Otros patrones conocidos y que también se usan bastante, pueden ser el Factory que como su nombre indica es una fábrica de instancias, objetos, etc…

El patrón Singleton, se utiliza para crear una sola instancia. Este por ejemplo, lo podemos usar para asegurarnos de que solo existe una conexión a una base de datos desde una clase.

A día de hoy,estos son los patrones de diseño que más he utilizado, pero existen muchos más. Como curiosidad, en github, hay un proyecto donde hay un montón de patrones explicados en PHP, es algo que me llamo mucho la  atención y que me gustaría compartir. Dejo el link a continuación.

https://github.com/domnikl/DesignPatternsPHP

Este chico, se ha currado un montón de ejemplos programados y muy bien documentados en PHP.

También tenemos que comentar, que existen los «anti-patrones» de diseño, pero de eso ya hablaremos otro día.

Un saludo – Juanan Vicent 😉

Volvemos??

Hace dos años que no publico nada en el blog.

A día de hoy, he adquirido muchos conocimientos tanto en mi trabajo como programador en ESET España, como por mi cuenta.

Tal es así, que me he planteado algo,que tal si volvemos a re-emprender ésto?…

Mi intención es publicar curiosidades, pequeños tutoriales, o algunas explicaciones.

Temas relacionados con Prestashop, Drupal, Joomla, PHP, etc…

Así como temas relacionados con seguridad y vulnerabilidades informáticas.

También en la medida de lo posible, iré contestando a los comentarios más recientes que tengo por moderar.

…..Volvemos??

letsgo2

VMWare en Debian 6 Squeeze

Ayer en el trabajo , me encontré en la situación de tener que instalar VMware Server sobre una máquina linux, concretamente una Debian Squeeze.

La cosa pintaba bien, pero cuando me puse manos a la obra, me topé con el problema de que la versión 2.0.2 de VMware Server no funcionaba correctamente bajo ésta distribución linux. Al parecer el instalador está montado para kernels más antiguos, no me quiero ni imaginar que podría haber ocurrido si el SO anfitrión del servidor fuera Ubuntu, o algún otra distro que cambia de versión y de Kernel como de ropa interior xD..jejeje..

Al lío,  me he puesto a indagar un poco éste fin de semana en mi casa,y con mis trasto, y al fín he encontrado la solución.

Lo primero; registrarnos y bajarnos la versión VMware Server del sitio oficial (recordad que és grátis). Hay que descargar la «tar.gz», NO la «rpm».

Después instalamos los paquetes necesários:

sudo apt-get install build-essential  gcc-4.3 linux-headers-`uname -r`

Necesitamos, los headers de nuestro kernel, el gcc 4.3 para compilar los módulos del vmware, y varias utilidades de buil-essential (killall etc…)…

Después descomprimimos el .gz de el vmware:

tar -xvzf  VMware-server-2.0.2-203138.i386.tar.gz

Ejecutamos el instalador:

./vmware-install.pl

Bien, ahora vamos a responder a varios tips, dejamos todo por defecto respondiendo con «enter» hasta que nos pregunte si queremos ejecutar el script de configuración vmware-config.pl a lo que responderemos  NO.

Ahora, tenemos que parchear algunos módulos para poder compilarlos, para ello bajamos éste parche:

wget http://codebin.cotescu.com/vmware/vmware-server-2.0.x-kernel-2.6.3x-install.sh

Seguidamente descomprimimos el parche:

tar  -xvzf vmware-server-2.0.x-kernel-2.6.3x-install

Copiamos el primer parche aquí:

cp vmware-config.patch /usr/bin

Y el segundo parche aquí:

cp vmware-server-2.0.2-203138-update.patch /usr/lib/vmware/modules/source

Una vez hecho esto, aplicamos el primer parche:

/usr/bin/patch -p3 < vmware-config.patch

Después aplicamos el segundo,podemos montar un script, o simplemente copiar estas cuatro lineas en la shell:

cd /usr/lib/vmware/modules/source

for i in *.tar ; do tar xpf $i ; done

patch -p4 < vmware-server-2.0.2-203138-update.patch

for i in vmci vmmon vmnet vsock ; do tar cpf $i.tar $i-only ; done

Ya tenemos casi todo, pero nos faltan un par de cosas para poder configurar nuestro VMware correctamente, y es que como ya he comentado la versión de gcc que se utilizo para compilar nuestro kernel es distinta que la que requiere el instalador de VMware, por lo tanto hacemos ésto:

rm -f /usr/bin/gcc


Y después:
ln -fs /usr/bin/gcc-4.3 /usr/bin/gcc

Con esto estamos creando un enlace simbólico de la versión gcc-4.3 para poder configurar VMware.

Si todo ha salido bién, ya podremos configurar nuestro VMware server lanzando el script:

/usr/bin/./vmware-config.pl

Tras la configuración,solo nos queda acceder a nuestra máquina a través de el navegador, yo he usado Google Chrome, ya que Firefox me estaba dando problemas:

https://Ip_de_la_máquina:8333

Y ésto és todo, espero que a alguien le pueda servir de ayuda..

Un Saludo!

EDIT: Al parecer, no funciona el plugin de administración remota desde ningún navegador de linux, por lo menos actuales.

Sí que nos deja entrar a parte de la administración con Chrome, pero no con firefox, opera etc…

Sigo buscando una solución …ñam ñam xD

Un Saludo

CSS3 y Internet Explorer (border-radius ie6,ie7,ie8)

Algunas propiedades CSS3 como border-radius, box-shadow, o linear-gradient son propiedades que todo navegador «decente» reconoce, pero Internet Explorer 6,7 y 8 no.
Al fín los de Micro$oft se han dado cuenta y en Internet Explorer 9 han implementado el reconocimiento de estos.

Si quieres usar estas propiedades en Internet Explorer existe una solución muy efectiva,se llama Css3Pie. Por ejemplo,para usar bordes redondeados:


#ejemplo{
 -webkit-border-radius: 1px;
 -moz-border-radius: 1px;
 border-radius: 1px;
 }

Pero al usar IE no se visualizan los bordes redondeados, entonces al código anterior le agregamos behavior:url(PIE.htc)


#ejemplo{
 -webkit-border-radius: 1px;
 -moz-border-radius: 1px;
 border-radius: 1px;
 behavior: url(PIE.htc);
 }

PIE.htc es un archivo que podemos descargarlo desde css3pie.com .

El mismo método se usa para box-shadow y linear-gradiente , usando al final behavior: url(PIE.htc);

Como dirían en un programa de TV de cuyo nombre no puedo acordarme, «fácil, sencillo y para toda la familia»…

Un Saludo!

Juanan Web

Codigo en Visual Basic para programar apagado de Windows

No soy mucho de utilizar SO de Micr$oft. [mode ironic on] Pero hace algunas noches,  me encontré con un problema que no me dejó dormir [mode ironic off]. Estaba viendo una peli en el portátil y quería programarlo para que se apagara a una cierta hora, en windows ésto se puede hacer desde el panel de control, el programador de tareas y introduciendo el comando «shutdown» con los parámetros -s -t  y el tiempo deseado…Al igual que lo podemos hacer mediante una terminal  de MS-DOS introduciendo dicho comando. Aprobechando que quería programar un poco con la plataforma .NET de Visual Studio, me puse a hacer un programa que realizara dicha función, os dejo el còdigo en VB:


Public Class Form1
 Dim s As Integer = 59
 Dim ahora As String
 Private Sub apagarAhora_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles apagarAhora.Click

 Shell("shutdown /f /s")

 End Sub

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 Shell("shutdown /a")
 Timer1.Stop()

 Label2.Text = "Se ha cancelado el apagado del PC"
 End Sub

 Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click

 End Sub

 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles apagaX.Click
 Dim tiempo As String
 tiempo = TextBox1.Text
 tiempo.Trim()
 If tiempo = "" Then
 MsgBox("Eh!! No has introducido nada en la casilla de abajo")
 Else

 If IsNumeric(tiempo) Then
 tiempo = tiempo * 60
 tiempo = "shutdown -s -f -t " + tiempo
 Shell(tiempo)
 ahora = TextBox1.Text
 Timer1.Start()
 Else
 MsgBox("Ups!!Se te ha colado...El valor '" + tiempo + "' no es un numero." + vbCr + "No te pases de listo xD")
 TextBox1.Text = ""
 End If
 End If
 End Sub

 Private Sub TextBox1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Click
 TextBox1.Text = ""
 End Sub

 Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

 End Sub

 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

 If s = 0 Then
 s = 59
 ahora = ahora - 1
 Else
 s = s - 1
 End If
 Label2.Text = "El PC se apagará en " + ahora.ToString + " minutos y " + s.ToString + " segundos."
 End Sub

 Private Sub Label2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label2.Click

 End Sub

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 TextBox1.Text = "Introduce el tiempo"

 FormBorderStyle = FormBorderStyle.Fixed3D

 End Sub
End Class

Aquí un par de LINKS por si alguien quiere el ejecutable. http://www.megaupload.com/?d=XM2VKQIV http://www.zshare.net/download/94449984bed6342b/ Sed curiosos!  😛 Un saludo. Juanan.

Consultas MySQL en Drupal

Después de estar un rato peleándome con Drupal para hacer una consulta en PHP a una base de datos mediante el tipo de contenido Page,

por fin he dado solución a mi problema. La cosa es que seguramente existan módulos que seguramente te faciliten la tarea, pero no era mi caso ya que necesitaba de algo más personalizado.

Aclarar que ante todo no soy un experto en PHP, y mucho menos en Drupal.

En una Pagina, tenía una consulta  a la base de datos MySQL la cual hacia un SELECT de una tabla creada por mi y la mostraba en la misma pagina.

La Pagina estaba creada desde Drupal con un tipo de contenido «Page» y «formato de entrada PHP», a su vez, mediante un formulario realizaba la llamada a un archivo «insertar_datos.php», éste (en teoría) tenía que ingresar los datos el la Base de datos y devolverte a la pagina anterior y mostrarte los resultados de la Pagina mediante el SELECT otra vez.

La cosa es que no funcionaba, por lo cual he obtado por crear otra página (nodo) utilizando la variable POST y llamarla desde el formulario.

A quedado más o menos así:

Esto sería la pagina que realiza el SELECT.

<?php
$host="localhost";
$user="root";
$password="toor";
$dbname="joker_drupal";
$tablename="libro_de_visitas";
$link = mysql_connect ($host, $user, $password) or die ("<center>No se puede conectar con la base de datos\n</center>\n");
?>

<table>
<?php
$query="SELECT * FROM $tablename;";
$result=mysql_db_query ($dbname, $query, $link);
while ($row = mysql_fetch_array ($result))
{
print ("<TR>");
print ("<TD>$row[nombre] -- ");
print ("$row[fecha]</TD>\n");
print ("</TR>");
print ("<TR>");
print ("<TD>$row[contenido_libro_visitas]</TD>\n");
print ("</TR>");
}
mysql_free_result($result);
    mysql_close($link);
?>
</table>

<form name="formulario_tablon" action="?q=node/4" method="POST">
Nombre: <input type="text" name="nombre"><br>
<textarea name="contenido_libro_visitas"></textarea><br>
<input type="submit" value="Enviar">
</form>


I ahora creamos otra Page con  formato de entrada en php y introducimos el código para el INSERT:

<?php
$host="localhost";
$user="root";
$password="toor";
$dbname="joker_drupal";
$tablename="libro_de_visitas";

// Primero comprobamos que ningún campo esté vacío y que todos los campos existan.
if(isset($_POST['nombre']) && !empty($_POST['nombre']) &&
isset($_POST['contenido_libro_visitas']) && !empty($_POST['contenido_libro_visitas'])) {

$link = mysql_connect ($host, $user, $password) or die ("<center>No se puede conectar con la base de datos\n</center>\n");
mysql_select_db($dbname,$link);
mysql_query("insert into $tablename (nombre,contenido_libro_visitas) values ('$_POST[nombre]','$_POST[contenido_libro_visitas]')");

}

mysql_close($link);

?>

Esta ha sido mi solución, seguramente existan otras alternativas o se pueda mejorar bastante el código, pero si a alguien le puede servir de ayuda me conformo.

Un Saludo.

Juanan.