Ikasten.IO
Learning, Aprendiendo

HackIt! 2017 Level 3 29 Julio, 2017


usbmon es una funcionalidad ofrecida por el kernel Linux para recolectar trazas de entrada/salida que usen el bus USB. El level 3 nos plantea unas trazas de texto plano obtenidas a través de usbmon.

Tras mucho analizar, allá donde esperábamos información sobre el dispositivo USB en concreto, vimos que había tres líneas censuradas.

Intentamos también convertir la salida ascii de usbmon a formato .pcap para manejar el dump más cómodamente desde wireshark, pero no lo conseguimos. Así que tocaba parsear el fichero de texto. Antes de ponernos a programar un parser, buscamos alguno ya existente y encontramos varias alternativas, entre ellas este script en python que además generaba su salida en un bonito HTML.

Lo intentamos por todos los medios. Lo primero fue extraer los datos de tipo isochronous e interpretarlos: como raw image, como audio, como señal de unos y ceros… agua.

Hasta muchas horas después de planteado el reto, nadie lo solucionó. Si no recuerdo mal, el lunes 24 pusieron la primera pista: “Audio parece, pero audio no es.” que nos dejó igual que estábamos (bueno, redujo el espacio de búsqueda, eso sí). La madrugada del lunes al martes (a eso de las 4am) se publicó la segunda pista, pero nos pilló exhaustos, y a la mayoría dormidos. La segunda pista restauraba parte de las líneas del dump eliminadas, facilitando información sobre el dispositivo que las generó. Un láser. Seguramente se nos tenía que haber ocurrido antes, conociendo al autor de la prueba y su afición por estos dispositivos

No sé si w0pr solucionó este reto con esta segunda pista o con la primera… pero ¡lo solucionó! Así que espero que publiquen el write-up para actualizar este post con el enlace directo.

UPDATE (30/07/2017): w0pr ha publicado la solución completa a este reto.

No hay comentarios en HackIt! 2017 Level 3
Categorias: HackIt

HackIt! 2017. Level 2 28 Julio, 2017

¡Y vamos a por bingo! El nivel 2 nos pide que encontremos el secreto que esconde una captura de tráfico de red. Realmente esto me sonaba a otra prueba del hackit… de 2007 (!). Abriendo la captura con un wireshark moderno, vemos tramas bluetooth. Probablement de algún dispositivo que envía datos, y en concreto, este SoundCore-Sport-XL-Bluetooth-Speaker.

Seleccionamos Telephony / RTP / RTP Streams…

Y oímos la señal, pero muy distorsionada. Aquí tuvimos un problema: queríamos exportar el audio para poderlo tratar con Audacity. Pero oh, sorpresa, no era posible:

Aquí se nos ocurrió una solución tal vez no muy “ortodoxa”, pero que funcionó perfectamente 🙂 Abrimos Camtasia, lo configuramos para grabar sonido del sistema y le dimos al Play stream en Wireshark. Exportamos luego el resultado de la grabación a formato mp4 (en Camtasia) y lo abrimos con Audacity, aplicándole el efecto de cambio de speed, encontrando la solución (fuaaaa!) 🙂

No hay comentarios en HackIt! 2017. Level 2
Categorias: HackIt

HackIt! 2017. Soluciones que me quitan de las manos 27 Julio, 2017

Gooood morning Vietnam! Siguiendo con la tradición (2014,2013,2012,2010,2009,2008,2007) que lamentablemente dejé de lado en 2015 y 2016, quiero volver a publicar soluciones para el HackIt! de la Euskal Encounter de este año (25 ediciones ya, OMG, cómo pasa el tiempo…) Lo primero, saludos a @marcan42 e @imobilis, por organizar el evento un año más. Lo segundo, pedirle a @marcan42 que suba las pruebas que faltan (have you stopped being lazy yet?) };-)

Vamos con el Level 1. Facilito, pero más complejo que otros años para ser una prueba de calentamiento.

Nos presentan un mapa de reservas de sitios… algo modificado:

Si abrimos el código y miramos las diferencias con el mapa de ocupación original, vemos algo raro (¡en el código de producción!):

Funciones xor, magic numbers y uno de ellos 31337 (eleet!, elite)… huele a que vamos por el buen camino 😉

La idea consistió en poner un breakpoint en la función w() de producción y otro en el de la prueba. En la ventana de la prueba, recogemos el array de datos y lo inyectamos en el de producción, para ver qué pintaba en pantalla esa función. ¡Sorpresa!

UPDATE: los compañeros de w0pr han empezado a publicar un write-up con sus impresiones. ¡Imprescindible lectura!

1 comentario en HackIt! 2017. Soluciones que me quitan de las manos
Categorias: HackIt

HackIt! 2014 : epílogo 28 Septiembre, 2014

Tras mi insistencia a @ramonechavarri y @abeaumont de w0pr para que nos echara un cable con el writeup de alguno de los dos levels del HackIt! 2014 que se nos quedaron en el tintero, nos pasaron hace unos días un extenso y completo texto que explica paso a paso en qué consiste y cómo superar el último nivel, la marcanada del año (TM) 🙂

Captura de pantalla 2014-09-28 a la(s) 18.55.05

¡Disfrutadlo!

2 comentarios en HackIt! 2014 : epílogo

HackIt! 2014: final 26 Agosto, 2014

Hubo otra prueba que nos tuvo a todos los participantes danzando al lado de la “caseta” de redes y sistemas. @marcan42 puso una Raspberry Pi enviando pings extraños vía wifi. El título del level era “Raspberry Pi(ng)” y el enunciado decía:

“Hemos montado una Raspberry Pi de router wifi (¡no se lo digas a Iban!), pero le ha poseído algo raro al kernel y nos hace cosas muy raras. ¿Podéis mirar a ver qué pasa? La contraseña es 0hvoit6e y el SSID lo he puesto yo”.

Una vez encontrado el SSID (como digo, cerca de “control”), tuvimos algunos problemas porque de vez en cuando la señal desaparecía. Cuando conseguimos encontrarla de forma estable (por el camino desvirtualizamos a la gente de amnesia, como @L0ngin0s y @thePoPe, ¡kudos! y hablamos con @tatai, que lógicamente no soltó prenda – tenían la prueba pasada – entre otras cosas porque había 2 equipos justo detrás de NavarParty a un level) lanzamos Wireshark para esnifar y analizar el tráfico. Lo primero que nos sorprendió fue el ver paquetes IPv4 con contenido IPv6 (¿WTF?) como éstos:

eth1_wireshark_scapy

La IP 192.168.42.1 estaba emitiendo en broadcast mensajes de ping con el texto “I’m so lonely here :-(” La idea era responderle a esos pings (con empaquetamiento travestido). Había que afinar con el id de respuesta y el id de secuencia. El checksum… por ahora mejor no ponerlo, y si luego lo pide, ya nos estrujaremos un poco más el bolo 🙂

Bien, ¿y cómo demonios generamos un paquete ping con esas características tan “al detalle”? Con Scapy, una potente herramienta de manipulación de paquetes desarrollada en Python.

Construimos un paquete como el siguiente:

scapy_2
(UPDATE: añadir data=”I’m so lonely here :-(” como opción a ICMPv6EchoReply)

y vimos que se enviaba, pero no a la dirección MAC correcta sino en broadcast… Mmmh… momento para sacar la MAC de la Raspi de Wireshark y fijarla a manivela:

Ahora debería funcionar… lanzamos de nuevo el paquete Scapy y… no vemos respuesta en Wireshark. ¿Qué demonios? Aquí es cuando @marcan42 nos comunicó que quedaban 3 minutos… 2 minutos… 1 minuto… Ya sabéis, con calma 🙂
@ochoto fue a quien se le ocurrió: igual es que el filtro de Wireshark no era correcto y estábamos “escondiendo” la respuesta de la Raspi… ¿por qué no filtrar por la MAC en lugar de por el protocolo? Veamos…

scapy_3

¡Bingo! (PD: hay que ser maléfico para devolver la respuesta justo con un empaquetamiento inverso al que se nos presentó originalmente, IPv6 sobre IPv4). “Pero… ¿qué hora es? Las 14:01… oh, ¡shit! perdimos por 1 minuto…”

Acabada la prueba nos fuimos a hablar con la gente de @w0pr y @tatai que andaban por allí. @abeaumont y su equipo estuvo luchando con el último level, “la marcanada del año”, durante muchas horas y -también sobre la campana de las 14:00- parece ser que lo resolvieron. Hubo algún revuelo porque llamaron a @marcan para que revisara la prueba… No sé si finalmente entró su solución o no, pero lo que sí sé es que terminaron todos los niveles y eso, señoras y señores, es para quitarse el sombrero.

1 comentario en HackIt! 2014: final