lunes, 1 de septiembre de 2014

Agenda de Septiembre y Octubre

Septiembre y Octubre, como quien no quiere la cosa, está plagado de conferencias y eventos de seguridad por casi todo el país. Durante los pasados meses he mandado algunas propuestas a los CFP de las diferentes charlas y he tenido la suerte de que sean aceptadas, así que tocan un par de meses de pasearse por ahí :)


El primero de los eventos es la RootedCON Satellite Edition, el 19 y 20 de Septiembre, una iniciativa de los organizadores de la RootedCON que pretende acercar charlas de seguridad de primer nivel a todas las ciudades de España. Este año, en su primera edición, la ciudad elegida es Valencia, mi ciudad natal, así que era un evento que no podía perderme. Fin de semana de charlas de seguridad, paseos por la Ciudad de las Artes y las Ciencias y bañito en la playa, que aún tendremos buena temperatura ¿Se puede pedir más?

En este evento hablaremos un poco de exploits, de lo frustrante que es a veces para un Pentester cuando lanzas un exploit y el condenado no funciona, y como podemos, en ocasiones, usar un poco de "brujería" para hacer que finalmente funcione.

Todos los detalles en la PÁGINA OFICIAL DEL EVENTO.


Un par de semanas después, los días 2, 3 y 4 de Octubre, nos desplazaremos a Albacete a dar una charla en las conferencias Navaja Negra, que a pesar de tener menos volumen de asistentes que otras macro-conferencias del panorama nacional, cuenta siempre con una calidad muy alta en sus charlas.

En esta charla os contaré un caso real de como realizamos una simulación de un ataque dirigido (APT) contra un alto directivo de una importante empresa española. Móviles, exploiting, puertas traseras, ingeniería social, ... todo mezclado y revuelto ¿Te apetece ver como acaba la historia? Apúntate en la PÁGINA OFICIAL.


Los días 16 y 17 de Octubre damos un salto un poco más largo y nos vamos hasta Amsterdam, a dar una charla en las conferencias BlackHat Europe, la edición europea de las conocidas conferencias BlackHat, que tienen diferentes ediciones por todo el mundo.

En la charla hablaremos sobre conexiones HTTPS, la cabecera HTTP Strict Transport Security y sobre algunas circunstancias en las cuales esta protección podría perder su efectividad. Más información en la PÁGINA OFICIAL.


Aunque por motivos de agenda este año me ha resultado imposible repetir dando charla en ConectaCON, me parecería injusto no mencionarla, ya que siempre cuenta con un buen cartel de ponentes y con charlas de gran interés, así que si tenéis la oportunidad pasaros los próximos 23 y 24 de Octubre por Jaén a disfrutar del evento. PÁGINA OFICIAL.


Otra de las conferencias por las que este año no me podré pasar pero que es más que recomendable son las conferencias GSickMinds que tendrán lugar en La Coruña los días 29, 30 y 31 de Octubre. Estas conferencias tienen el aliciente de contar habitualmente con ponentes invitados de altísimo nivel, como por ejemplo Angel Prado y Juliano Rizzo, que el año pasado estuvieron hablando de las debilidades en SSL que publicaron y de las que habían andado hablando por las principales conferencias del mundo.


Aunque tampoco estré finalmente este año, los días 31 de Octubre y 1 de Noviembre tenéis en Barcelona la conferencia No cON Name, la más veterana de las conferencias (públicas) Españolas y, junto con RootedCON, el referente en los eventos de seguridad del país. La NcN tiene el aliciente de contar con un magnifico reto de Capture de Flag (CTF). El año pasado fue organizado por el equipo de seguridad de FaceBook y tengo que decir que me lo pasé realmente bien participando.

Apuntaros YA en la PÁGINA OFICIAL.

viernes, 7 de febrero de 2014

Vulnerabilidad en el iBoot de iPhone 4S

Hace unos pocos días pudimos ver en Twitter como un conocido Jailbreaker, iH8sn0w, comentaba haber encontrado una vulnerabilidad en los dispositivos con procesador A5 de Apple (iPhone 4S, por ejemplo). 



Según sus propias palabras, la vulnerabilidad se encontraría en el iBoot, una de las partes del arranque de los dispositivos de Apple que se ejecuta previamente a la ejecución del kernel del sistema operativo iOS. 


El arranque de un dispositivo iOS se realiza mediante la llamada "Secure Boot Chain", en la que cada etapa realiza sus acciones pertinentes y comprueba la firma de la siguiente etapa antes de otorgarle el control. 

La primera etapa de todas, el bootrom, se escribe en el dispositivo en el momento del ensamblaje, y no puede ser cambiada ni actualizada en toda la vida del mismo. Las vulnerabilidades en alguno de estos elementos del arranque, o en el propio kernel, permitirían evadir esta protección de la firma, y por lo tanto arrancar versiones modificadas del kernel, que es en lo que consiste un Jailbreak. 

No obstante, a pesar de que el propio iH8sn0w comenta que, a partir de ahora, los dispositivos A5 son "Jailbreakeables" de por vida, a priori únicamente las vulnerabilidades en el bootrom serían de este tipo, ya que al estar embebido en el propio hardware es el único elemento que no puede ser actualizado por Apple. El iBoot, elemento en el que parece existir la vulnerabilidad, se encuentra dentro de la imagen del sistema operativo iOS que descargamos en el momento de realizar una actualización, dentro del fichero IPSW, por lo que Apple podría corregir la vulnerabilidad en próximas releases. 

Dado que los detalles de la vulnerabilidad aún no han sido publicados y todavía no podemos ponernos a jugar con ella, vamos a descargar el IPSW de una versión vulnerable y a intentar extraer la imagen del iBoot. Para ello lo primero que vamos a hacer es descargar la imagen con la que vamos a trabajar, por ejemplo la versión 7.0.4 para iPhone 4S, de la conocida web ipswdownloader.com.


El fichero IPSW no es más que un ZIP al que se le ha cambiado la extensión, pero sus ficheros se encuentran cifrados mediante el algoritmo AES, empleando claves a priori desconocidas. Veamoslo: 

$ file iPhone4,1_7.0.4_11B554a_Restore.ipsw 
iPhone4,1_7.0.4_11B554a_Restore.ipsw: Zip archive data, at least v2.0 to extract 

$ unzip iPhone4,1_7.0.4_11B554a_Restore.ipsw 
Archive: iPhone4,1_7.0.4_11B554a_Restore.ipsw 
inflating: 058-1077-002.dmg 
inflating: 058-1108-002.dmg 
inflating: 058-1124-002.dmg 
inflating: BuildManifest.plist 
creating: Firmware/ 
creating: Firmware/all_flash/ 
creating: Firmware/all_flash/all_flash.n94ap.production/ 
inflating: Firmware/all_flash/all_flash.n94ap.production/applelogo@2x~iphone.s5l8940x.img3 
inflating: Firmware/all_flash/all_flash.n94ap.production/batterycharging0@2x~iphone.s5l8940x.img3 
inflating: Firmware/all_flash/all_flash.n94ap.production/batterycharging1@2x~iphone.s5l8940x.img3 
inflating: Firmware/all_flash/all_flash.n94ap.production/batteryfull@2x~iphone.s5l8940x.img3 
inflating: Firmware/all_flash/all_flash.n94ap.production/batterylow0@2x~iphone.s5l8940x.img3 
inflating: Firmware/all_flash/all_flash.n94ap.production/batterylow1@2x~iphone.s5l8940x.img3 
inflating: Firmware/all_flash/all_flash.n94ap.production/DeviceTree.n94ap.img3 
inflating: Firmware/all_flash/all_flash.n94ap.production/glyphplugin@2x~iphone-30pin.s5l8940x.img3 
inflating: Firmware/all_flash/all_flash.n94ap.production/iBoot.n94ap.RELEASE.img3 
inflating: Firmware/all_flash/all_flash.n94ap.production/LLB.n94ap.RELEASE.img3 
inflating: Firmware/all_flash/all_flash.n94ap.production/manifest 
inflating: Firmware/all_flash/all_flash.n94ap.production/recoverymode@2x~iphone-30pin.s5l8940x.img3 
creating: Firmware/dfu/ 
inflating: Firmware/dfu/iBEC.n94ap.RELEASE.dfu 
inflating: Firmware/dfu/iBSS.n94ap.RELEASE.dfu 
inflating: Firmware/Trek-5.0.02.Release.bbfw 
inflating: Firmware/Trek-5.0.02.Release.plist 
creating: Firmware/usr/ 
creating: Firmware/usr/local/ 
creating: Firmware/usr/local/standalone/ 
inflating: kernelcache.release.n94 
inflating: Restore.plist 

$ srch_strings Firmware/dfu/iBSS.n94ap.RELEASE.dfu | head -10 
3gmI 
ssbiEPYT 
ssbi 
ATAD 
jnZf 
UZ^_ 
[...] 

Como podemos ver, el formato de los ficheros no es reconocido, debido a que su contenido está cifrado. A pesar de que la clave de cifrado no se publica por Apple, los Jailbreakers las obtienen como parte de su trabajo de investigación, y van publicando aquellas que identifican, por ejemplo, en el iPhoneWiki

En este caso, el propio iH8sn0w ha colgado en su Twitter una de las claves que ha encontrado durante su trabajo: 


Con esta información ya podemos extraer las imágenes del IPSW que acabamos de descargar. Imagino que podríamos hacerlo a mano con openssl, pero yo he preferido usar una versión modificada del script "kernel_patcher.py" de la suite iphone-dataprotection (que podéis descargar de AQUI). 

Básicamente, en script es el mismo que el original pero eliminando las acciones de parcheo del kernel, dejando las imágenes tal cual se encuentran dentro del IPSW. Veamos si funciona: 

$ ./ipsw_decrypt.py --iv 3a0fc879691a5a359973792bcd367277 --key 371e3aea9121d90b8106228bf2b5ee4c638a0b4837fefbd87a3c0aca646e5996 --binary iBSS iPhone4,1_7.0.4_11B554a_Restore.ipsw 
Decrypting iBSS.n94ap.RELEASE.dfu 
Decrypted kernel written to iBSS.n94ap.RELEASE.dfu.decrypt 

Parece que todo ha funcionado bien, así que solo nos queda ver si efectivamente lo que hay dentro tiene pinta de iBSS: 

$ srch_strings iBSS.n94ap.RELEASE.dfu.decrypt 
iBSS for n94ap, Copyright 2013, Apple Inc. 
RELEASE 
iBoot-1940.3.5 
[...] 

Pues... todo apunta a que sí. Lamentablemente cada imagen está cifrada con una clave diferente y no podemos utilizar esta misma clave para descifrar el iBoot y ponernos a mirar, así que por el momento habrá que esperar a ver si son publicados más detalles sobre la vulnerabilidad.

miércoles, 13 de noviembre de 2013

NcN PreQuals 2013: Reto 3 (b)

Hace unos días, tras la solución del Reto 1 y el Reto 2 de las quals del CTF de la NcN de este año, os comentaba una posible solución al Reto 3, y os dejaba pendiente una segunda solución "tirando de debugger", que  es la que veremos hoy.

Yo voy a utilizar radare2 para hacerlo, pero podríais utilizar gdb, IDA, o vuestro debugger favorito.
Para los que se pierdan como yo mirando el puro ensamblador, radare2 tiene una función con la que podemos pintar un poco los bloques de las funciones, lo cual nos ayudará a visualizar un poco mejor lo que pasa:

$ r2 -d level.elf
[0x0040101f]> af@main
[0x0040101f]> ag > foo.dot
foo.dot created

Hemos abierto el binario y nos hemos colocado en el main, y desde ahí generamos la gráfica que comentábamos anteriormente. Ahora solo tenemos que convertirla a otro formato más visible, por ejemplo PNG:

 $ dot -Tpng foo.dot > foo.png


No voy a subir el PNG a alta resolución (podéis generarlo vosotros mismos), pero creo que con esta captura será suficiente para que veáis el proceso.

¿Os acordáis que nos habíamos dado cuenta que la aplicación comparaba carácter a carácter? Quizá buscar bucles sea un buen punto de partida. En este caso, se puede ver fácilmente en la gráfica que existen únicamente DOS bucles (los identificamos porque hay flechas que vuelven a bloques anteriores). Si miramos ambos detenidamente veremos que el que nos interesa es el de la izquierda de los que tenéis marcados. Las dos flechas señalan donde están los dos puntos donde voy a hacer zoom a continuación, para que no os perdáis.

Pegando un vistazo al bucle, observamos una bifurcación curiosa:


Como podéis ver, llega un momento en el que se realiza una comparación y el flujo de la ejecución se va a una rama que llama a la función game_over(), o a otra rama que llama a las funciones success() y después a no_me_jodas_manolo() (vaya nombre xDDD). Está claro que lo que nos interesa es forzar a que la ejecución del programa vaya a esta última rama, pero nos interesa hacerlo desde algún sitio en el que el contenido cifrado ya haya sido descifrado, o sino seguramente no vamos a conseguir nada ¿Donde podemos estar seguros que estará el contenido cifrado pero todavía no hemos tenido que introducir caracteres? Pues al comienzo del bucle que estábamos mirando.


Donde tenéis la fecha roja es el bloque a donde vuelve el bucle, con lo que... ¿qué pasará si sobre escribimos el contenido y metemos un salto al bloque que nos da la solución? ¿funcionará?

Os he marcado también con un recuadro rojo la que supuestamente es la comparación entre lo que introduce el usuario por teclado y lo que hay en memoria. Poniendo un breakpoint aquí y yendo a la zona de memoria a la que referencia seguramente también seríamos capaces de obtener la clave, pero de momento nosotros vamos a intentar hacer el bypass directo que comentábamos antes, a ver si funciona.

$ cp level.elf foolevel.elf
$ r2 -w foolevel.elf
[0x00400690]> s 0x0040114e
[0x0040114e]> wa jmp dword 0x0040117b
Written 5 bytes ( jmp dword 0x0040117b)=wx e928000000
[0x0040114e]> pd
      ,=< 0x0040114e     e928000000       jmp dword 0x40117b

Hemos abierto una copia de level.elf a la que hemos llamado foolevel.elf y la hemos abierto en modo de escritura. Nos hemos ido a la posición 0x0040114e, que es la del inicio del bucle, y hemos sobre escrito un salto a la posición 0x0040117b, que es la del bloque que suponemos que nos mostrará el flag. Ahora solo nos queda salir de radare y ejecutar el binario a ver que pasa:

$ ./foolevel.elf
|  >  Type to win, only what I want to read...
|  >  |
|  -> Congratulations! The key is:
|  9e0d399e83e7c50c615361506a294eca22dc49bfddd90eb7a831e90e9e1bf2fb

Bingo! Ya tenemos el flag de nuevo, pero esta vez no hemos necesitado sacar la clave. En otras situaciones no habríamos podido hacer esto (o hubiera resultado mucho más complicado), porque depende mucho de como esté implementado, pero en esta ocasión ha funcionado a las mil maravillas. Por supuesto, existen bastantes maneras de solucionar este mismo reto. Si lo habéis probado de otra manera y queréis dejar un comentario... será bien recibido :)