Programador PHP freelance

Análisis forense de una web hackeada (primera parte)

Recientemente he dado alojamiento web a un cliente nuevo que disponía de un portal realizado, por lo que he podido deducir, from scratch.

Ya en su momento, después de realizar algunas modificaciones, observe que el acceso al backoffice se realizaba con una contraseña en claro que se encontraba en la base de datos.

¿A estas alturas aún hay contraseñas en claro?… Piensa uno.

 

El caso, es que semanas después de la migración al nuevo servidor el portal fue vulnerado y aparecieron algunas modificaciones en sus contenidos donde el hacker en cuestión se hacía publicidad.

Después de un vistazo rápido a los logs, compruebo que las modificaciones a los contenidos se realizaron limpiamente desde el backoffice, es decir, el hacker no accedió directamente a la base de datos, ni vulneró el Panel de control del servidor u otro servicio. Simplemente se colo utilizando el formulario de autenticación.

No creo que el hacker llegara a deducir la contraseña, aunque esta estuviera en claro, aunque ese detalle te hace tener una idea de la consideración que se ha tenido en la seguridad, al desarrollar el código. Por mi parte pienso que seguramente se trata de una SQL injection. Y aquí empieza el trabajo.

 

Analizando el error_log por la fecha/hora que suponemos que se realizó el ataque descubro frecuentes llamadas desde la misma IP en un espacio de tiempo corto, buscando la entrada al backoffice. Os pego aquí algunas, en las cuales he modificado el dominio real por example.com, por motivos obvios 😉

[Sat Jul 14 17:41:58 2012] [error] [client 94.121.219.129] File does not exist: /var/www/vhosts/example.com/httpdocs/admin.htm
[Sat Jul 14 17:41:58 2012] [error] [client 94.121.219.129] File does not exist: /var/www/vhosts/example.com/httpdocs/admin.html
[Sat Jul 14 17:41:58 2012] [error] [client 94.121.219.129] File does not exist: /var/www/vhosts/example.com/httpdocs/adminitem
[Sat Jul 14 17:41:58 2012] [error] [client 94.121.219.129] File does not exist: /var/www/vhosts/example.com/httpdocs/adminitem.asp
[Sat Jul 14 17:41:58 2012] [error] [client 94.121.219.129] script ‘/var/www/vhosts/example.com/httpdocs/adminitem.php’ not found or unable to stat
[Sat Jul 14 17:41:58 2012] [error] [client 94.121.219.129] File does not exist: /var/www/vhosts/example.com/httpdocs/adminitems
[Sat Jul 14 17:41:58 2012] [error] [client 94.121.219.129] script ‘/var/www/vhosts/example.com/httpdocs/adminitems.php’ not found or unable to stat

A las 17:41:20 empezo a probar URLs y a las 17:42:48 dejan de aparecer registros en el error_log, lo que se puede deber a que finalmente consiguió localizar la entrada o simplemente a que decidió abrir la web con un navegador y confirmar que existía un formulario de acceso al backoffice en la parte pública (/index.php), el cual pasaba los datos por POST a log.php.

Si el user/pass no es correcto el usuario es redirigido a log.php donde vuelve a mostrársele otro formulario para que introduzca el acceso. Cabe destacar que esta es otra página y por tanto otro formulario.

Si el user/pass es correcto el portal redirecciona a la última noticia publicada.

Efectivamente, revisando el access_log vemos que el usuario accede a log.php desde el formulario de la parte pública, sin éxito.

94.121.219.129 – – [14/Jul/2012:17:42:09 +0200] “GET /log.php HTTP/1.1” 200 1033 “-” “Mozilla/5.0 (Windows NT 5.1; rv:13.0) Gecko/20100101 Firefox/13.0.1”

El sistema lo redirige a log.php donde parece que realiza otro intento fallido

94.121.219.129 – – [14/Jul/2012:17:42:10 +0200] “GET /Imagenes/Aceptar.gif HTTP/1.1” 200 869 “http://www.example.com/log.php” “Mozilla/5.0 (Windows NT 5.1; rv:13.0) Gecko/20100101 Firefox/13.0.1”

y posterirmente después de otro intento el usuario es redirigido a la url de la noticia, lo cual quiere decir que ha superado el acceso.

94.121.219.129 – – [14/Jul/2012:17:42:26 +0200] “GET /index.php?Id=79 HTTP/1.1” 200 8930 “http://www.example.com/log.php” “Mozilla/5.0 (Windows NT 5.1; rv:13.0) Gecko/20100101 Firefox/13.0.1”

Sólo tres intentos para saltarse la seguridad del sistema. Esto es lo que me hace pensar que estamos hablando de SQL inyectada.

 

En un post posterior os cuento como sigue la aventura.