[Guia] Perl Forever
[Titulo] : Perl Forever
[Autor] : Doddy Hackman
[Temario]
--========================================================--
0x01 : Introduccion
0x02 : Variables y el poder de print
0x03 : Variables argumentales
0x04 : Arrays
0x05 : Hashes
0x06 : Concatenacion
0x07 : Comentarios
0x08 : Entradas de teclado
0x09 : Expresiones regulares
0x10 : Tipos de condiciones
0x11 : if - else
0x12 : elsif
0x13 : while
0x14 : do - until
0x15 : for
0x16 : unless
0x17 : split
0x18 : Funciones
0x19 : Listar directorios y manejo de archivos
0x20 : Sockets
0x21 : Interactuar con la web
0x22 : Descarga de archivos
0x23 : Creando un cliente FTP
0x24 : Creando un keylogger en Perl
0x25 : Listar procesos de Windows
0X26 : Envio de mails en Perl
0x27 : perl2exe
0x28 : Bibliografia
--======================================================--
0x01 : Introduccion
Hola a todos.
Estoy haciendo esta guia sobre perl con los pocos conocimientos que tengo
del mismo todo para inspirar a que mas personas usen perl para propositos diabolicos
Si ven cpan veran que muchos usan perl y ofrecen variados modulos
para cualquier necesidad.
Cabe destacar que mis conocimientos son basicos , por eso uso mas ejemplos que teoria ademas
de no usar un lenguaje tecnico del mismo xDDD
Para ejecutar un script en perl , necesitan active perl si estan en win32 , si estan
en linux este viene por defecto
En el caso de windows , si tenemos el script de perl a ejecutar en un directorio como este
c:/scripts
Lo que tenemos que hacer es usar el comando cd de la siguiente manera
cd c:/scripts
Como ya estamos en el directorio de los scripts usamos el comando
perl para cargar el script , el comando perl solo esta cuando ya tenemos perl instalado , pues
este no aparece por accion divina
perl simple.pl
Con esto lo cargariamos , pero no pasara nada al menos que el archivo simple.pl
tengo algo que no sea nada.
Entonces creamos el archivo simple.pl , para que la extension sea de pl (extension de perl) deben poner la opcion
de "todos los archivos" en el formulario de la creacion de un archivo en notepad
Antes de crearlo debes poner como contenido un simple print
print "hola mundo";
Volvemos a cargar simple.pl y veremos un hola mundo.
En el caso de linux
Perl viene instalado por defecto y en el contenido siempre debe tener
esto al inicio del script de lo contrario nunca andaria
#!usr/bin/perl
Despues el tipico hola mundo en el contenido y listo.
0x02 : Variables y el poder de print
Si queremos declarar una variable seria asi
$hola = "hola";
Como ven , para declarar una variable usamos $ y despues el nombre
de la variable , luego usamos el = para poder definir lo que va a contener
la variable $hola , todo el contenido de la variable lo marcamos con comillas
Para poder mostrar la variable seria asi
print $hola
Tambien se puede asi
print "hola $hola";
La variable se mostraria igual pero habria un problema si usaramos
comillas simples en vez de dobles
print 'hola $hola';
Pues las variable $hola no se mostraria
Esa es la diferencia entre comillas simples y comillas dobles .
0x03 : Variables argumentales
La variables argumentales son las tipicas que usan en los exploits
Un ejemplo de como usar las variables argumentales seria asi
my $hola = $ARGV[0];
print $hola;
Entonces si ejecutamos el script estilo
perl script.pl hola
Nos devolveria hola
Si queremos poner dos variables argumentales seria asi
my $hola1 = $ARGV[0];
my $hola2 = $ARGV[1];
print $hola1 $hola2\n";
Entonces si ejecutamos el script de la sig forma
perl script.pl hola hola
El script nos devolveria "hola hola"
Como ven si queremos seguir usando variables argumentales solo le deberiamos
sumar uno y listo
En el caso de tres variables argumentales
my $hola1 = $ARGV[0];
my $hola2 = $ARGV[1];
my $hola3 = $ARGV[2];
print $hola1 $hola2 $hola3\n";
La ejecucion del script seria asi
perl script.pl hola hola hola
Un triple hola como respuesta del script
0x04 : Arrays
Los arrays son muy utiles cuando se tiene una lista de datos y los queremos
ver de un forma comoda.
Cuando se declara un array se pone una @ y despues el nombre del array
Despues se pone un igual para establecer los datos que esta va a tener como en este ejemplo
my @vida = ("nada","nada");
Se pueden usar comillas simples como dobles
Para poder mostrarlos a todos seria usando for de la sig forma
for my $d(@vida) {
print $d."\n";
}
Como ven usamos for para abrir el array y mostrar cada dato mediante
la variable $d
Los arrays se pueden ver tambien por numero de orden empezando desde el 0
print @vida[0]; #muestra nada
print @vida[1]; #muestra el segundo dato que tambien es nada
Tambien se pueden mostrar de una de la sig forma
print @vida;
0x05 : Hashes
Los hashes son un tipo de array , el cual esta compuesto por claves que tiene valores ,
esto es util para cuando se requiere cierta informacion sobre un dato
Los hashes se declaran usando un % y despues el nombre del hash
Un ejemplo de hash seria esto
%vida = (
Doddy => "Idiota",
Hackman => "Patetico"
);
Como ven es parecido a los arrays , pero con la poderosa diferencia
de poder establecer una clave (Doddy) y un valor a ella (Idiota)
Si queremos mostrar todo el contenido de un hash seria algo asi:
for my $data(keys %vida) {
print "$data es un ".$vida{$data}."\n";
}
Obviamente abrimos el hashes usando keys , despues mostramos los keys
con la variable $data , despues mostramos los values usando el hash como una variable
normal y encerrando entre corchetes la variable $data que en realidad son las keys que se van
mostrando
Como resultado a esta complicacion insensata y aburrida nos devuelve
Doddy es un Idiota
Hackman es un Patetico
0x06 : Concatenacion
La concatenacion se puede usar cuando queremos unir dos variables
Realizar esto se puede hacer de esta forma
Tenemos dos variables
$hola = "hola";
$chau = "chau";
Si queremos unir las dos variables seria usando un "." entre las dos
$todo = $hola.$chau;
print $todo;
Como ven el resultado de esto se guarda en la variable todo para despues
mostrarla
La concatenacion tambien se puede usar cuando estamos con print
Un ejemplo seria este
print $hola." estoy bien pero bueno ".$chau;
Devuelve
hola estoy bien pero bueno chau
Como ven se muestran las variables sin ningun problema
0x07 : Comentarios
Los comentarios en perl se pueden usar con #
Un ejemplo seria
#hola
Si en un script real los usamos seria algo asi
#simple hola
print "hola";
Un comentario sirve para dar un comentario xDD , asi van poder dar explicaciones de en que
parte del script esta o que esta por hacer, tambien lo podemos poner al costado del print
print "hola"; #simple hola en el lado derecho
Pero nunca al lado izquierdo porque el print nunca seria leido
0x08 : Entradas de teclado
Esto nos sirve para usar un programa interactivo para el usuario
, en ejemplo de un simple menu seria asi
print "estas bien :";
$rta = <stdin>;
print $rta;
Como ven , capturamos lo que el usuario respondio a la pregunta con
<stdin> y lo guardamos en la variable $rta para despues imprimirla
Tambien podemos usar chop() y chomp()
Con chop() podemos eliminar el ultimo caracter un ejemplo seria asi
$hola = "hola";
chop($hola);
print $hola
Esto nos devolveria
hol
Con chomp() podemos hace lo mismo y nos devuelve el numero de caracteres
que se han eliminado
print "estas bien : ";
$c = <stdin>;
$test = chomp $c;
print $test;
Esto nos devolveria 1
0x09 : Expresiones regulares
Las expresiones regulares sirven mucho para buscar cierta informacion
en una variable
Entonces tenemos el siguiente ejemplo
my $code = "hola estoy bien";
Si queremos usar expresion regular para saber que hay entre hola y bien podriamos hacer de esta forma
if ($code=~/hola (.*) bien/ig) {
print $1;
}
Entonces si nos ponemos a analizar el codigo podemos ver que
usamos (.*) para sacar cualquier cosa que haya entre hola y bien
Tambien usamos i y g al final de la barra que indica lo que estamos buscando
que sirven para
i : Detecta la palabra en la forma en la que esta , minuscula o mayuscula
g : busca alrededor del texto
Cuando la expresion regular tiene exito podemos sacar el resultado que hay entre (.*) con $1 , en el caso
de que hubiera dos (.*) y el resultado del segundo es el que queremos deberias usar
$2 para sacar lo que queremos.
(.*) : Sirve para buscar cualquier coincidencia que haya , pues hay otras formas en vez de usar este
Pero como estoy dando lo basico no lo vamos a ver
0x10 : Tipos de condiciones
Para poder usar if y las otras funciones de control , debemos tener
en cuenta los tipos de condiciones , hay dos , las variables numericas
estrictas y las que pueden estar compuestas por caracteres alfanumericos
Los primeros son
== : iGUAl
!= : Diferente
< : menor
> : mayor
>= : mayor o igual
<= : menor o igual
Los segundos son
eq : igual
ne : diferente
lt : menor
gt : mayot
ge : mayor o igual
le : menor o igual
0x11 : if - else
Una forma de controlar el script seria con if y else
Tenemos dos variables
$hola = "hola";
$hola1 = "hola";
Una forma de controlar que las dos sean iguales seria asi
if ($hola1 == $hola) {
print "bien";
} else {
print "mal";
}
Como ven , controlamos que las dos variables sean iguales mediante ==
Si estas no son iguales nos mostraria "mal" que es la parte de else
.
Otra forma sin usa == seria usando eq
if ($hola1 eq $hola) {
print "bien";
} else {
print "mal";
}
Lo mismo pero en vez de usar == uso eq
eq y == sirven para verificar que dos variables sean iguales
0x12 : elsif
Para controlar que una variable puede ser varias cosas podemos usar
elsif
Un ejemplo seria
Tenemos una variable llamada uno con el valor de 1
$uno = "1";
if ($uno eq "1") {
print "es uno";
}
elsif ($uno eq "2") {
print "es dos";
}
elsif ($uno eq "3") {
print "es tres";
}
else {
print "es nada";
}
Como ven verificamos que que uno sea 1 , si lo es , muestra es uno,
despues usamos elsif para verificar que sea 2 o tres , de lo contrario
si no es nada , muestra es nada.
0x13 : while
Si queremos controlar que cierta cosa este ocurriendo de una forma
podemos usar while()
Su uso es simple , un ejemplo de uso seria este
Tenemos una variable
my $numero = "0";
Que pasa si el numero aumenta y queremos controlar que solo llegue hasta 3
Entonces es el momento de usar a while de la sig forma
while ($numero < 3) {
$numero++; #Aumenta el numero
print "voy bien\n";
}
Si ejecutamos esto veremos que se imprimen tres veces "voy bien"
Funciono !!!
Entonces que pasa si queremos crear una bucle infinito
Seria algo asi
while(true) {
#Nunca morire
}
Esto ocurrira siempre , porque while verificara que siempre sea true xDDD
0x14 : do - until
Bueno , que pasa si queremos que cierta cosa pase hasta cierta condicion
Es la hora de usar do y until
Un ejemplo seria
my $numero = 0;
do {
$numero++;
print $numero."\n";
} until ($numero eq "3");
Entonces , si vemos el codigo , nos damos cuenta de que primero
declaramos la variable $numero con el valor de 0
Para que despues usando do , el numero aumento infinitamente hasta que
until detecte que el numero sea 3
Como resultado el script solo devolvera
1
2
3
0x15 : for
Que pasa si queremos que una accion ocurra una cierta cantidad de veces
entonces es cuando usamos la funcion for()
Esta funcion nos permite abrir arrays como recorrer numeros
Si queremos abrir un array seria asi
for my $palabra(@total) {
print $palabra."\n";
}
Entonces abrimos el array @total y vamos recorriendolo mostrando cada dato
con la variable $palabra.
Tambien si queremos recorrer numeros seria asi
for my $numero(1..100) {
print $numero."\n";
}
Entonces recorremos todos los numeros del 1 al 100 y los vamos mostrando
con la variable $numero
Si queremos que una accion ocurra 30 veces podriamos hacer asi
for (1..30) {
print "hola";
}
Entonces , en el codigo hacemos que se impriman 30 veces la palabra hola
Tambien podemos usar foreach() que nos tambien para abrir y mostrar arrays
foreach $word(@words) {
print $word."\n";
}
Es simple abrimos el array y vamos mostrando cada dato mediante la variable
$word.
0x16 : unless
Tambien tenemos a unless , se encargar de verificar justamente todo
lo contrario de if
Un ejemplo seria
$uno = "1";
unless ($uno eq "1") {
print "no es uno";
}
Confuso ? , no es facil verifica justamente que $uno no sea uno , justamente
lo contrario que if.
0x17 : split
Que pasa , si queremos sacar un ":" de una variable
Es cuando podemos usar a split
Tenemos la tipica variable
my $pa = "hola:chau";
Si queremos separar esas dos palabra podemos usar split
Seria algo asi
@todo = split(":",$pa);
print "@todo[0] y @todo[1]\n";
Como ven este script nos devuelve
hola y chau
Si vemos el codigo nos damos cuenta de que usamos la funcion split
para primero poner el ":" que queremos sacar y como segundo ponemos
la variable a la queremos separar
Todo esta funcion se guarda en la variable @todo donde despues la mostramos
como un array cualquiera , claro que esta vez mostramos por posicion de array y no lo
mostramos todo.
Si no entendieron bien como quedo el array miren este ejemplo
@todo = ("hola","chau");
"hola" esta en la posicion 0 porque es la primera en el array y "chau"
como la primera "1"
0x18 : Funciones
Las funciones se pueden usar cuando estamos haciendo una accion repetidamente
Con una funcion podriamos hacer esa accion en una sola vez y reducir codigo
Un ejemplo seria
sub hola {
print $_[0];
}
hola("hola");
Como ven , una funcion comienza con el sub , despues con el nombre del funcion
y finalmente con los corchetes que indican cuando empiezan y cuando terminan
Las funciones pueden ser llamadas de dos formas :
hola("hola");
&hola("hola");
Depende de cada uno como las quiere usar.
Para enviar datos a una funcion cuando se la llama, se debe en encerrar
entre parentesis como en el ejemplo anterior que estamos enviando un hola
En la funcion recibimos lo enviado con $_[0] y lo imprimimos
Si hubieran habido dos datos enviados y se espera que la funcion devuelva dos datos seria asi
sub hola {
return ($_[0],$_[1]);
}
$var1,$var2 = hola("hola","chau");
Como ven en el ejemplo anterior , usamos return para enviar datos como
respuesta.
Los datos enviados fueron $_[0] y $_[1] , esto es porque fueron dos variables , si hubiesen sido tres
$_[0] ,$_[1],$_[2] # Se cuenta a partir del cero
Entonces la funcion nos devuelve con lo que le enviamos.
Para poder ver los datos que la funcion nos devuelve uso dos variables , para guardar los datos que nos devuelve
Si hubiese sido un dato solo uso una variable antes del igual
0x19 : Listar directorios y manejo de archivos
Bien , si queremos listar un directorio y ver sus archivos seria algo asi
Primero abrimos el directorio "/" usando la variable DIR como clave para poder seguir haciendo cosas
opendir DIR,"/";
Guardamos en un array el listado
my @archivos = readdir DIR;
Cerramos el directorio para no seguir usandolo
close DIR;
Ahora abrimos el array y mostramos mediante la variable $files todo lo que haya encontrado en el listado
for my $files(@archivos) {
}
Si queremos saber si es un directorio o un archivo tendriamos que poner esto entre los corchetes del for
if (-f $files) { #Verificamos que sea un archivo
print "[Files] : $files\n";
}
if (-d $files) { #Verificamos que sea un directorio
print "[DIR] : $files\n";
}
Si queremos cambiar de directorio simplemente usamos un chdir()
chdir("C:/xampp");
Y listo , solo ponemos entre parentesis , usando comillas simples o dobles , el nombre del directorio al que nos
queremos cambiar
Una cosa no muy novedosa en perl es el manejo de archivos ...
Si queremos crear un archivo en el directorio actual de script debemos
hacer asi
open (FILE,">>"."yo.txt");
"FILE" es esencial para poder tener contacto en el archivo creado
Para escribir en el archivo podemos usar un print y la variable FILE
print FILE "hola";
Entonces el archivo creado tendra hola en el su contenido
Para cerrar el archivo porque si el script sigue ejecutandose el archivo no podra
ser ejecutado de forma normal
Entonces cerramos el archivo de la siguiente forma
close FILE;
Si queremos leerlo seria asi de facil
Solo ponemos la ruta del archivo a leer y ponemos LEER para poder tener contacto con el archivo
open (LEER,"yo.txt)";
Usamos un array para leer todo lo que hay en el archivo
@text = <LEER>;
Cerramos el archivo
close FILE;
Si queremos leer el archivo usariamos un for my y listo
for my $word(@text) {
print $word."\n";
}
Si odiamos el archivo y queremos borrarlo hacemos esto
unlink("yo.txt");
En la funcion unlink() ponen entre comillas la ruta del archivo a eliminar
0x20 : Sockets
Bien , en perl tambien podemos usar sockets de una forma muy sencilla
Con el modulo
IO::Socket
Podemos establacer conexiones con el puerto que nos venga en gana
Primero llamamos al modulo con use
use IO::Socket;
Para usar esto primero tenes que crear un objeto con la variable $socket
my $socket = IO::Socket::INET->new(
PeerAddr=>"localhost", #Host donde conectarnos
PeerPort=>"80", #Puerto donde bla bla
Proto=>"tcp"); #Protocolo que queremos
Ahora que el objecto esta creado podemos comenzar a usar las funciones
de este modulo.
Con print mandamos los datos que queremos enviar al servidor que estamos conectados de la sig forma
print $socket "GET /"."\r\n";
Usamos \r\n para marcar el fin de los datos a enviar sino ponemos esto
al final siempre se va a tildar la maquina de ustedes porque no marcaron el final
Bien , para ver lo que el host nos respondio podemos hacer de esta forma
read $socket,$total,"1000";
print $total;
En la variable $total tenemos la respuesta para despues imprimirla.
0x21 : Interactuar con la web
Para interactuar con la web podemos usar dos modulos
LWP::UserAgent
HTTP::Request::Common
Primer los llamamos con use
use LWP::UserAgent;
use HTTP::Request::Common;
Despues creamos el objeto necesario para usar las funciones del modulo mediante la variable $nave
my $nave = LWP::UserAgent->new();
Establecemos un timeout
$nave->timeout(5);
Establecemos el agente que vera la pagina a la que entramos
$nave->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201Firefox/2.0.0.12");
Establemos la pagina a la que queremos navegar con la variable $web
my $web = "http://www.google.com.ar";
Realizamos la peticion GET y guardamos el contenido en la variable $contenido
my $contenido = $nave->request (GET $web)->content;
Mostramos el contenido
print $contenido;
0x22 : Descarga de archivos
Una cosa interesante de perl es la descarga de archivos tan simple
Con el modulo
LWP::Simple
Podemos hacer descarga con la funcion getstore()
Un ejemplo de esto seria esto
Primero llamamos al modulo
use LWP::Simple;
Despues le ponemos las variables necesarias a los argumentos
my ($url,$file) = ($ARGV[0],$ARGV[1]);
Despues comenzamos la descarga de la siguiente forma
print "[+] Start the download\n";
if (getstore($url,$file)) {
print "[+] Oh Right\n";
} else {
print "[+] Fail\n";
}
Simple , muy simple , entonces si el archivo se descarga nos mostrara
oh right de lo contrario fail
0x23 : Creando un cliente FTP
Que pasa si queremos crear un cliente FTP en perl , se puede no se puede , pues se puede xDDD
Todo gracias al modulo
Net::FTP
Asi que es hora de empezar
Primero llamamos al modulo
use Net::FTP;
Despues declaramos las variables
$ftp = "localhost";
$user = "yo";
$pass = "si";
Despues verificamos que toda la conexion sea exitosa
if (my $socket = Net::FTP->new($ftp)) {
if ($socket->login($user,$pass)) {
#Todo marcha muy bien xDD
}
}
Como vemos si la conexion es exitosa tendremos el poder con la variable
$socket.
Entonces vamos hacer un pequeño menu de la siguiente forma
menu:
print "comando : ";
chomp(my $comando = <stdin>);
if ($comando=~/cd (.*) {
$socket->cwd($1); #Cambiamos al directorio que la expresion regular marca
}
if ($comando=~/pwd/) {
print $socket->pwd(); #mostramos el directorio actual
}
goto menu;
Con eso tendriamos un cliente basico.
Ustedes se encargaran de poner las funciones que les dicte su corazoN xD
0x25 : Listar procesos de Windows
El otro dia encontre un modulo muy groso en perl para poder usar
procesos como me venga en gana
El modulo se llama
Win32::Process::List
Si tienen perl y lo quieren instalar hagan asi con el comando ppm
ppm install http://trouchelle.com/ppm/Win32-Process-List.ppd
Ahora es cuando comienza la fiesta xDDD
Primero llaman al modulo con "use"
use Win32::Process::List;
Despues con la variable $new creamos lo necesario para poder llamar
a la funcion GetProcesses().
El resultado de la funcion anterior la devolvemos en un odioso hash llamado
%process
my $new = Win32::Process::List->new();
my %process = $new->GetProcesses();
Ahora vamos a listar los procesos con sus condenados PID
for my $pid (keys %process) {
print "[+] PrOCESO : ".$process{$pid}."\n";
print "[+] PID: ".$pid."\n\n";
}
Si todo salio bien veremos los procesos de nuestra maquina con el PID de aca uno
Facil ¿No??
0X26 : Envio de mails en Perl
Si queremos enviar mails con perl y no sabemos como , pues eh aqui la solucion.
En perl podemos usar un modulo llamado
Net::SMTP
Entonces ah programar xDD
Primero llamamos el modulo
use Net::SMTP;
Despues creamos cuestionario donde nos pida los datos
print "[+] Your Mail :";
chomp(my $mail = <stdin>);
print "[+] Victim : ";
chomp(my $target = <stdin>);
Ahora creamos lo necesario para poder usar las funciones del modulo
my $send = Net::SMTP->new("localhost",Hello => "localhost",Timeout=>10) or die("[-] Error");
Con la variable $send llamo al funcion mail() para poner mi email falso
$send->mail($mail);
Nuevamente llamamos a otra funcion llamada to() para poner mi target
send->to($target);
Ahora lo mas importante el contenido del mensaje
Aunque no hay mucho que decir solo abrimos el contenido y ponemos los datos que seran enviados en el mensaje
Con el asunto de hola y el contenido de chau xDD
$send->data();
$send->datasend("To:".$target."\n"."From:".$mail."\n"."Subject:"."Hola"."\n"."Chau"."\n\n");
$send->dataend();
Luego cerramos la conexion con el servidor SMTP
$send->quit();
Creo que eso seria todo , otra cosa necesitan un servidor SMTP para que realmente funcione xDD
0x27 : perl2exe
Si queremos compilar nuestro script en perl , para poder usarlo
en cualquier maquina como un exe cualquiera sin necesidad de que tenga instalado perl
Podriamos usar perl2exe
Simplemente lo buscan en google y les aparece , hay cada uno para cada version de perl
Una vez lo tengan , ejecutamos perl2exe en un consola
Su uso es simple , si queremos compilar un script simplemente ponen el nombre
perl2exe script.pl
Si queremos esconderle la consola al script por un motivo cualquiera
perl2exe -gui script.pl
0x28 : Bibliografia
Curso de perl by vengador de las sombras
perl a dolor (primera edicion) by ka0s
--================---
¿ The End ?
--================---