Diario de a bordo, día 24 de enero de 2020 - Zerolynx · Diario de a bordo... Año 2020, todo en...
Transcript of Diario de a bordo, día 24 de enero de 2020 - Zerolynx · Diario de a bordo... Año 2020, todo en...
Diario de a bordo...
Año 2020, todo en el ciberespacio parece funcionar según lo establecido, tan solo
perturba el hecho de no poder controlar una región, una región que parece estar fuera
del alcance de los ciudadanos de a pie, donde la única ley son las pulsaciones de
teclado, el simple hecho de tener el poder en tus manos, Santander, y dentro de esta
pequeña región Sh3llc0n, una conferencia de ciberseguridad de la cual me es inevitable
hablar en este diario, allí es, ese es el lugar, lugar donde el conocimiento te hará libre!!!
Sigo pensando en como hacer que Sh3llc0n salga de la línea del underground y forme
parte de ese ciberespacio en equilibrio, quiero pensar que los tripulantes de esta nave
son capaces de infringir las normas, las leyes, deseo saber hasta dónde son capaces de
llegar, mi única opción es seleccionar a los mejores, aquellos que pasen una serie de
pruebas en tan solo 30h, sólo tenemos esa pequeña ventana de tiempo, desde el viernes
24 de Enero de 2020 a las 9:00AM hasta el Sábado 25 de Enero del 2020 a las
15:00PM, en el caso de no poder superar estos retos el equilibrio será destruido y
sh3llc0n quedará en el underground más profundo. Los seleccionados deben demostrar
ser válidos para emprender este viaje mas allá de lo terrenal, sólo podrán hacerlo
aquellos que sus mentes sean libres!!!
Diario de a bordo, día 24 de enero de 2020
RETO #1
RESP. MISION: YAGO
RECOMPENSA: 1000 SPACECOINS
Hoy es el día, primer día de forzar neuronas hasta el limite, la primera de las pruebas
para mi tripulación, hoy tocamos tierra firme. Caminando junto a una embajada de un
país remoto recibimos la extraña señal de una red Wi-Fi que parece solicitar auxilio.
Decidí sentarme en un banco frente a la embajada para tratar de descifrar esa señal.
Tomé mi portátil, mi adaptador Wi-Fi y un OS basado en UNIX, entre en modo monitor
y comencé a capturar paquetes. Era una señal de socorro que transmitía a intervalos de 5
minutos un total de 10 mensajes ocultos en tramas Wi-Fi (IEEE802.11) que debía
descifrar. Ahí es donde deje a mi tripulación tomar el mando, aquellas decisiones harían
que pudiésemos rescatar a uno de nuestros agentes secuestrados y poder llevarlo a salvo
a nuestra nave para seguir ese tan deseado viaje en busca del conocimiento.
RECURSOS
Tarjeta Wi-Fi en modo monitor con capacidad de inyección
Ordenador con Kali Linux o cualquier otro Linux como root
Aircrack-ng suite
Wireshark
Paquete iw instalado en el sistema
SOLUCION
Para comenzar, es posible que necesites ciertas herramientas y/o paquetes para tu Linux.
En aquellos Linux basados en estructura Debian, se podrán instalar de la siguiente
forma:
su root apt-get install wireshark apt-get install aircrack-ng apt-get install iw apt-get install wireless-tools apt-get install firmware-atheros
Para configurar el sistema y la tarjeta Wi-Fi en modo monitor se ejecutará:
export PATH="$PATH:/sbin" /sbin/iwconfig airmon-ng check kill airmon-ng check kill airmon-ng check kill airmon-ng start wlan1 ## wlan1,wlan0 u otra dependiendo del sistema
Cuando comience la prueba el participante deberá estar ya escaneando, monitorizando y
grabando los paquetes Wi-Fi del entorno mediante airodump-ng en la modalidad de
salto por canal en la banda de 2.4GHz:
airodump-ng wlan1mon -w ctf
La dirección MAC de origen en los paquetes transmitidos durante la prueba siempre
será la siguiente:
00:1a:01:2b:3c:44
El participante observará que el canal inicial de la prueba será el 11 en 2.4GHz y el
SSID será SH3LLCON-WIFI-CTF.
En ese momento comenzará a escanear mediante airodump-ng centrándose únicamente
en este canal y siempre grabando sus capturas.
airodump-ng wlan0mon -c 11 -w ctf
En este momento dará comienzo el CTF Wi-Fi que iniciará mediante la interacción de
@yadox con el dispositivo del CTF.
A partir de este punto, cada cinco minutos, el dispositivo emitirá unas ráfagas de 500
paquetes idénticos que irán nombrados en el campo SSID de las tramas 802.11 con los
siguientes valores:
WiFi-CTF-Packet-01!!!
WiFi-CTF-Packet-02!!! WiFi-CTF-Packet-03!!! WiFi-CTF-Packet-04!!! WiFi-CTF-Packet-05!!! WiFi-CTF-Packet-06!!! WiFi-CTF-Packet-07!!! WiFi-CTF-Packet-08!!! WiFi-CTF-Packet-09!!! WiFi-CTF-Packet-10!!!
Ejemplo del paquete 4 de la prueba
Cada una de estas tramas incluye un payload en el campo IE 221 que aporta
información del fabricante. Mediante Wireshark, strings, tcpdump, etc. se debe
examinar, extraer y utilizar esta información como siguiente pista para el reto. Algunos
de esos payloads están codificados en base 64, por lo que habrá que extraerlos y
decodificarlos en Wireshark o strings. Hay que copiar el valor del mismo y usar el
típico método Linux.
echo UGlzdGEtLWxlbmZsYWc9MTA= | base64 -d Pista--lenflag=10
Algunos de estos paquetes se emiten como beacons (type management 0, subtype 8) y
otros como Probe Response, aunque se avisa en el anterior que el próximo será una
trama Probe Response (type management 0, subtype 4).
Los filtros que se pueden utilizar en todo momento en Wireshark serían:
wlan.fc.type_subtype == 0x08 (para los beacons) wlan.fc.type_subtype == 0x04 (para los probe request) wlan.sa == 00:1a:01:2b:3c:44 (para filtrar por MAC)
Ejemplo de un paquete diseccionado en Wireshark mostrando el payload en el campo IE 221 (Vendor data)
Al finalizar el último paquete (el número 10) incluye un mensaje con la flag válida YadoxFlag
Se indica que el flag deberá ser enviado como campo SSID al sistema en un paquete de
tipo Probe Request (type 0 subtype 5).
Para lograrlo hay múltiples formas de hacerlo:
1. Mediante un smartphone (Android o iphone) o mediante el ordenador laptop.
Solicitando que se conecte a un AP oculto con SSID YadoxFlag. Esto generará una
ráfaga de solicitudes Probe Request al aire. El sistema captará la primera que envíe el
flag y se mostrará un mensaje en el bot de Telegram con la MAC del ganador.
2. Mediante scapy Dot11. scapy
Welcome to Scapy (2.4.0)
>>> mymac="mi dirección MAC del adaptador Wi-Fi"
>>>
packet=RadioTap()/Dot11(addr1="ff:ff:ff:ff:ff:ff",addr2=mymac,ad
dr3="ff:ff:ff:ff:ff:ff")/Dot11ProbeReq()/Dot11Elt(ID="YadoxFlag"
, info="")
>>> sendp(packet, iface="wlan1mon",count=50,inter=0.1,verbose=1)
PISTAS (2)
Primera pista: La dirección MAC de origen en los paquetes transmitidos durante la
prueba siempre será la siguiente: 00:1a:01:2b:3c:44
Segunda pista: El canal inicial de la prueba será el 11 en 2.4GHz y el SSID será:
SH3LLCON-WIFI-CTF.
FLAG: YadoxFlag
ESTA PRUEBA FUE INSITU, SE HA MODIFICADO PARA
PODER JUGARLA ONLINE
PRUEBA ORIGINAL:
RETO #2
RESP. MISION: C4T_13 (Organización Sh3llc0n)
RECOMPENSA: 3000 SPACECOINS 100 x IMAGEN
(30 IMÁGENES EN TOTAL)
Sentado en el banco me di cuenta que algo interfería en el espectro radioeléctrico
cercano, no podía creer lo que estaba viendo en la pantalla de mi equipo... ISS?
La estación espacial internacional parecía saber de nuestra existencia, multitud de
imágenes SSTV estaban pasando delante de mis ojos con la misma rapidez que el sol
iba cayendo y dejando entrar la oscuridad de la noche, además de una forma irracional,
sin ninguna clase de metodología, sin tiempo ni horarios lógicos, intentaban decirnos
algo, la primera de las imágenes me desconcertó...
POC: Imagen derecha decoder MMSTV, imagen Izquierda decoder APK Robot36.
(Todas las recepciones de los participantes serán validas al margen de su calidad)
Para resolver esta prueba deberán, además de obtener el flag correcta, enviar un correo a
[email protected] adjuntando la imagen correspondiente y una captura de pantalla
completa con fecha y hora donde se vea el programa que se está usando y el decoder
Era hora de informar a mi tripulación para que ellos mismos decodificaran esas
imágenes y las clasificaran. En esta prueba deberán estar durante 30h a la escucha según
nos informa Pedro Duque desde ISS, la emisión comenzará el viernes a las 9:00AM y
finalizará el sábado a las 15:00PM.
Que intentaban decirnos?...
SOLUCION
En la banda de FM (le emisión en esa banda no es legal por lo cual se limitará a un
alcance de 15/20metros aprox, zona 0 recepción de Santemar), se irá emitiendo cada
hora aprox (para que no puedan automatizarlo), 10 primeras imágenes SSTV
codificadas en Robot36, estas imágenes estarán en bucle hasta el final del CTF para que
así todos tengan la oportunidad de decodificarlas, pero… una vez se hayan emitido las
diez imágenes por primera vez la codificación cambiará a Scootie1 y por ultimo a
Martin2. (Pendiente ver si cambiamos de frecuencia junto con el cambio de decoder)
Frecuencia 107.1
Horarios de emisión:
Robot36
Imagen1 Hora en audio: 00:00:00 Hora emisión: 09:00:00
Imagen2 Hora en audio: 00:51:45 Hora emisión: 09:51:45
Imagen3 Hora en audio: 01:53:40 Hora emisión: 10:53:40
Imagen4 Hora en audio: 02:55:36 Hora emisión: 11:55:36
Imagen5 Hora en audio: 03:57:29 Hora emisión: 12:57:29
Imagen6 Hora en audio: 04:59:26 Hora emisión: 13:59:26
Imagen7 Hora en audio: 06:01:25 Hora emisión: 15:01:25
Imagen8 Hora en audio: 07:03:24 Hora emisión: 16:03:24
Imagen9 Hora en audio: 08:05:23 Hora emisión: 16:05:23
Imagen10 Hora en audio: 09:07:26 Hora emisión: 18:07:26
Scottie1
Imagen1 Hora en audio: 09:59:13 Hora emisión: 18:59:13
Imagen2 Hora en audio: 11:02:23 Hora emisión: 20:02:23
Imagen3 Hora en audio: 12:05:33 Hora emisión: 21:05:33
Imagen4 Hora en audio: 13:08:42 Hora emisión: 22:08:42
Imagen5 Hora en audio: 14:11:53 Hora emisión: 23:11:53
Imagen6 Hora en audio: 15:15:03 Hora emisión: 24:15:03
Imagen7 Hora en audio: 16:18:16 Hora emisión: 01:18:16
Imagen8 Hora en audio: 17:21:30 Hora emisión: 02:21:30
Imagen9 Hora en audio: 18:24:42 Hora emisión: 03:24:42
Imagen10 Hora en audio: 19:27:55 Hora emisión: 04:27:55
Martin2
Imagen1 Hora en audio: 20:00:31 Hora emisión: 05:00:31
Imagen2 Hora en audio: 21:02:49 Hora emisión: 06:02:49
Imagen3 Hora en audio: 22:05:07 Hora emisión: 07:05:07
Imagen4 Hora en audio: 23:07:25 Hora emisión: 08:07:25
Imagen5 Hora en audio: 24:09:43 Hora emisión: 09:09:43
Imagen6 Hora en audio: 25:12:04 Hora emisión: 10:12:04
Imagen7 Hora en audio: 26:14:26 Hora emisión: 11:14:26
Imagen8 Hora en audio: 27:16:46 Hora emisión: 12:16:46
Imagen9 Hora en audio: 28:19:10 Hora emisión: 13:19:10
Imagen10 Hora en audio: 29:21:31 Hora emisión: 14:21:31
PISTAS
Se les facilitaran los encoders usados en las imágenes:
Primera pista: Robot36
Segunda Pista: Scottie1
Tercera Pista: Martin2
En este caso el valor de cada una de las imágenes será 50 puntos en vez de 100.
FLAG: Decodificar las 30 imágenes que se transmitirán
PRUEBA MODIFICADA PARA
FLU PROJECT - ONLINE
Crear imágenes SSTV sh3llc0n 2020
Primero redimensionar las imágenes a 320x256. Añadimos las imágenes a MMSSTV
Emitimos en TX y grabamos desde File/Record soun to the file/ nos creara un archivo
con extensión .mmv
Hay infinidad de tools para resolver esta prueba, aquí explicaremos solo algunas de
ellas….
Instalaremos MMV2WAV
https://hamsoft.ca/pages/extras-add-on/mmv2wav.php
Esta tool nos pasa de extensión mmv a wav
Después abrimos con Audicity el .wav con parámetros 16bits 11025
En nuestro caso hemos creado el .wav para testear que las imágenes son correctas,
a los participantes solo se les dará el .mmv
Estos son los archivos finales que se le aportaran a los participantes
RETO #3
RESP. MISION: LORENZO
RECOMPENSA: 1000 SPACECOINS
Informé por la emisora ya que no era necesario que las pruebas fueran secuenciales
y todos los miembros de la tripulación eran libres de ejecutar dichas pruebas sin orden
ni horarios, aunque si liberábamos a nuestro agente secreto tendríamos la opción de
saber si, tanto nuestra nave como nosotros mismos, corríamos alguna clase de peligro,
los raptores se comunican mediante un ordenador compartido en el que dejaban un
fichero de texto en el escritorio. Necesitamos saber la longitud/latitud de dónde se
reunían para sabotear la misión Sh3llc0n2020, me consta que sólo él tiene esa
información…
SOLUCION
1.-) Convertir la memoria de vmem a raw con plugin imagecopy -> Indicar que es el
último Win10 [el profile es Win10x64_18362]
2.-) con un pslist se ve que hay un notepad.exe [hay que indicar que algo estaba leyendo
y es donde se iban a reunir]
3.-) memdump -p 5320
4.-) strings al 5320.dmp y generar un 5320.txt
5.-) mirar el strings y encontrar que es el Burgerheim de Víctor Pradera de Logroño a
las 23:50
6.-) Buscar dirección exacta de Burgerheim en google maps -> Calle Víctor Pradera, 5,
26001 Logroño, La Rioja
6.-) https://www.coordenadas-gps.com/convertidor-de-coordenadas-gps -> Devuelve
Latitud 42.4646656 y Long -2.4475692 Esta será la flag
PISTAS
0.-) Sé que la máquina era virtual
1.-) sé que es a las 23:50
2.-) que les gustan las hamburguesas
FLAG: 42.4646656/-2.4475692
RETO #4
RESP. MISION: DAVID MARUGAN
RECOMPENSA: 1000 SPACECOINS
Unos días atrás, antes de que nuestro agente fuese capturado, me hizo llegar un archivo
de audio, no sé muy bien de qué quería alertarme, el caso es que estoy sin tiempo,
pensándolo bien, qué mejor si quiero entrenar a mi tripulación final que sean ellos
mismos los que me den ese archivo decodificado?
SOLUCION
1. Se debe reproducir el archivo .wav en un reproductor cualquiera: VLC por ejemplo.
2. Se debe usar un cable virtual de audio como el gratuito Virtual Audio Cable para
Windows.
https://www.vb-audio.com/Cable/
3. Se debe descargar el sofware WSJT-X
https://www.physics.princeton.edu/pulsar/K1JT/wsjtx.html
4. Con todo el software instalado debemos reproducir el archivo en VLC por ejemplo
dando la salida de audio al VIRTUAL CABLE que instalamos anteriormente.
5. Ahora arrancamos el software de decodificación WSJT-X y le damos los
parámetros de entrada CABLE VIRTUAL, y en MODE el JT65. Activamos
MONITOR. Debemos observar una barra verde que sube de nivel y no
escucharemos nada.
6. Ahora veremos que la barra verde de la izquierda comienza a subir hasta 80 más
o menos y nos entrará una señal en el waterfall de señal del sofware:
7. Lo más IMPORTANTE de todo es que aun sabiendo que está codificado en
JT65, debemos saber que este modo es muy especial por motivos técnicos y
físicos, y la reproducción del archivo debe comenzar JUSTO cuando la barra
del decodificador está el segundo 60/60 de la ventana de un minuto, si no será
imposible decodificar el mensaje. Cada línea del mensaje tiene una o varias
palabras que conforman el mensaje completo.
PISTAS
Primera pista: para los que están muy perdidos se dirá que es un protocolo muy usado
por radioaficionados
Segunda pista: si no se aclaran todavía, se comenta lo del cable virtual y que busquen
un decodificador.
Tercera pista: Indicar que es un modo muy exigente con la sincronización del reloj.
FLAG:
NOTA: Según se vea la dificultad que han tenido los participantes, se puede dar
por válido aunque falte una de las 6 líneas que componen el mensaje en
JT65.
La red Avispa fue real, y fue desmantelada por el FBI en USA, estaba compuesta
por agentes ilegales durmientes del la inteligencia cubana… :)
RETO #5
RESP. MISION: PEDRO CABRERA
RECOMPENSA: 1000 SPACECOINS
No solo depende de tener conocimientos en Hacking, tengo que forzarles a que
demuestren su pensamiento lateral, si queremos salir al espacio exterior debemos tener
unos conocimientos mínimos de geoposicionamiento, sí, debo forzarles a ello, deben
darse cuenta de que no todo es hacking, las matemáticas son necesarias y una ciencia
exacta, ciencia que con este pequeño manual no deben tardar en resolver:
1. Partiendo de las coordenadas GPS publicadas en la web del hotel donde estamos
celebrando la Sh3llC0N (https://www.hotelsantemar.com/situacion/) debes encontrar
las coordenadas resultantes al aplicar un desplazamiento en metros de: [-261.515,
233.654, 0] -vector de desplazamiento os ha sido entregado en formato ENU
(East/North/Up).
2. Para facilitar las cosas, debéis suponer la altitud correspondiente a las coordenadas del
hotel de 30 metros.
3. Usar las coordenadas del hotel como coordenadas base (formato geodésico).
4. Aplicar el vector ENU para obtener las coordenadas geodésicas resultantes.
SOLUCION
La prueba consiste en un ejercicio de manipulación de coordenadas terrestres, en el que los participantes deberán realizar operaciones básicas de cambio de sistemas de coordenadas entre los modelos más habituales: Geodésicas, Cartesianas ECEF y ENU (East/North/Up) Referencia: https://en.wikipedia.org/wiki/Geographic_coordinate_conversion La operación básica que realizar es la suma de un desplazamiento a las coordenadas base de partida, para obtener un punto de destino, donde encontraran la bandera para la continuar con la siguiente prueba o para obtener la puntuación de la prueba. De esta manera, se propuso utilizar las coordenadas del hotel donde se realizará el evento como base. Podemos ver las coordenadas tal y como están publicadas en su página web:
Se pueden leer las coordenadas: “Lat:43.470087º Lon:-3.782958º” A partir de estas se debe aplicar un desplazamiento de 261,515 metros en dirección Oeste y 233,654 metros en dirección Norte, que son las coordenadas del vector desplazamiento ENU del enunciado: “[-261.515, 233.654, 0]” (El valor negativo de la componente Este indica que el desplazamiento se realiza en dirección opuesta, Oeste) Para aplicar este desplazamiento necesitamos que las coordenadas de origen y las del desplazamiento estén referenciadas a un mismo sistema de coordenadas, poder realizar la “suma” de estas, obteniendo así las coordenadas del destino. El sistema de coordenadas que conocemos en el día a día utilizadas por los sistemas de navegación GPS se denominan coordenadas geodésicas y siguen un modelo de la tierra llamado “esferoide” (esferoide de referencia WGS84). Manualmente se podrían aproximar las coordenadas geodésicas a coordenadas cartesianas centradas en la tierra, denominadas ECEF, que se expresan en un vector de 3 coordenadas:
(x,y,z) siendo la magnitud de cada una de las coordenadas de este vector metros, medidos desde el centro de la tierra. Existen varios métodos para realizar esta aproximación, aunque conllevan muchas operaciones matemáticas, como se puede leer en el enlace de Wikipedia de referencia. Debemos tener en cuenta que tras aplicar el desplazamiento a las nuevas coordenadas, se deben volver a convertir las coordenadas resultantes a coordenadas geodésicas. Todas estas operaciones pueden ser realizadas con la ayuda de bibliotecas existentes en Matlab, Octave y lenguajes de programación como Python: https://www.mathworks.com/help/map/3-d-coordinate-and-vector-transformations.html https://scivision.github.io/matmap3d/ https://pypi.org/project/pymap3d/ Implementar las operaciones necesarias utilizando una de estas bilbiotecas es un programa de apenas 10 línea de código, de las cuales una línea realiza la transformación de las coordenadas con el desplazamiento ENU:
Si a las coordenas de referencia del hotel aplicamos el vector desplazamiento, obtenemos las siguientes nuevas coordenadas: python calc_enu2geo_shell.py -261.515 233.654 0.00 43.4721900044;-3.786190005;30.0096409157 Latitud: 43.4721900044 (Norte) Longitud: -3.786190005 (Oeste) Se comprueba en Google Maps las nuevas coordenadas respecto a la ubicación de partida:
Comprobamos con la utilidad de medir distancias que desde el punto de partida al punto de destino (Parroquia San Roque) hay 350 metros en línea recta, como se puede ver en la siguiente imagen:
En la imagen se puede ver como el desplazamiento es hacia arriba (Dirección norte) y hacia la izquierda (Dirección oeste). Si calculamos la raíz cuadrada de la suma de los cuadrados de los desplazamientos (261,515 y 233,654), comprobamos que la hipotenusa del triangulo mide 350 metros.
FLAG: Calcula la coordenada destino donde encontrarás
el material para poder realizar el reto #6.
RETO #6
RESP. MISION: ZEROLYNX (MrSquid)
RECOMPENSA: 1000 SPACECOINS
Debo tener en cuenta el proceso de selección del líder de esta expedición. Me he
centrado demasiado en cómo elegir a los mejores y ponerlos a prueba, pero... ¿quién
será el que tenga la mayor responsabilidad, ¿quién será mi sucesor? No es fácil
gestionar tantos egos bajo presión, necesito una luz que los guíe... Tras noches
deliberando, en este caso, me centraré en la imaginación y el sentido común entre los
seleccionados, pero, sobre todo, buscaré aquella persona que mejor mecanismo de
comunicación posea. Esa cualidad es imprescindible en esta misión, porque…
“El ser humano se está convirtiendo en la única especie que es capaz
involucionar creyendo que evoluciona, esto nos llevará a la extinción,
nunca descartéis volver atrás en el tiempo para poder avanzar.” Junto con el CD se les entregará una nota que dirá:
SOLUCION
En este caso, se le facilitará al participante un fichero .ad1. Si montamos ese fichero con
FTK Imager, podremos observar que es una imagen del contenido de un USB.
Contenido del fichero folder.ad1
De ahí podremos extraer tanto el dump del Paint como el PCAP.
El PCAP contendrá muchos paquetes ICMP que representan una exfiltración de
información. La información exfiltrada va en base64 y mediante un pequeño script (o a
manija) se podrá obtener un texto en el que localizaremos una contraseña.
Contenido del pcap.
Con este pequeño script, podrán obtener el contenido de manera sencilla:
from scapy.all import *
import base64
capture = rdpcap('sniff.pcap')
ping_data = ""
for packet in capture:
if packet[ICMP].type == 8: # Echo request
ping_data += packet[ICMP].load[16::] #El 16 es el byte desde el que cogemos la
info (mira en tcpdump donde empieza la chicha buena)
print base64.b64decode(ping_data)
Contenido del texto (los datos que he usado para simular una exfiltración son
definiciones sobre seres mitológicos cántabros):
root@kali:~/Desktop/sh3llcon/Prueba pcap# python exfiltration.py
WARNING: No route found for IPv6 destination :: (no default route?)
Según cuenta la tradición popular, desde hace mucho tiempo las tierras cántabras han
sido habitadas por infinidad de seres fantásticos a los que la gente temía o adoraba y
en torno a los cuales surgieron numerosas historias y leyendas.
Personificando a la maldad nos encontramos con una pareja formada por el Ojáncanu
y su esposa, conocida como Ojáncana o Juáncana.
Él, gigante de fuerzas sobrehumanas, tiene un solo ojo, largas barbas y melenas de un
tono rojizo, lucha contra osos y toros tudancos y siempre sale vencedor. Sólo se
acobarda ante las Anjanas, pues es bien sabido por él que si éstas lllegasen a
arrancarle un pelo cano de su barba, moriría sin remedio alguno.
Ella posee colmillos de jabalí, alas muy grandes y unos pechos tan grandes y
deformes que se los echa a la espalda. Es infinitamente más maligna y sanguinaria
que él puesto que devora todo aquello cuanto encuentra a su paso, incluyendo a los
niños entre sus víctimas, una vez los haya cazado los lleva volando hasta una cumbre
y allí los devora. A pesar de ser tan terrible siente un inmenso pavor ante la minúscula
monuca galana o comadreja.
La Anjana es de los personajes más conocidos de la mitología de Cantabria. Es
considerada como la antítesis de la pareja anterior. Se trata de un hada buena y
generosa de pequeño tamaño, dotada de una graciosa y extraordinaria belleza. Viste
un manto chispeante de estrellas y se corona con lirios y rosas, dispone de una florida
vara que brilla con una luz diferente cada día de la semana. Vive en las fuentes y
manantiales de donde sale para bendecir aguas, árboles y ganado. Protectora de gente
honrada, de los enamorados y de todo aquel que se extravíe en los bosques y caminos.
Los Trasgus son pequeños duendes de cara negra y ojos verdes que habitan en los
bosques. Se burlan de la gente haciendo gamberradas, siendo sus víctimas habituales
las muchachas mientras realizan alguna tarea. Su vestimenta, formada por hojas de
árboles y musgo, les sirve de camuflaje para poder esconderse de los humanos.
Los Trastolillus se asemejan a los trasgus, son protectores del hogar, revoltosos y
juguetones. Sus facciones son pícaras y de un color más negro que el hollín, tienen el
pelo largo y del mismo color, poseen unos ojillos verdes, colmillos retorcidos, rabillo
prácticamente inapreciable y someros cuernecillos. Se viste con un manto rojo hecho
con cortezas de árbol cosidas con hiedra, lleva un gorro blanco y se asiste de un
bastoncillo de madera. Se entretienen tirando la harina, bebiendo la leche,
escondiendo las albarcas, corriendo las aldabas de las ventanas para que el viento las
haga chirriar durante la noche o requemar los guisos, entre otras cosas, pero siempre
acompañado de estridentes risas y fingidos lloriqueos.
Los Trentis son duendecillos traviesos de los bosques. Se visten con hojas, musgo y
raíces. Se esconden en los bardales para tirar de las sayas y pellizcar las pantorrillas a
las muchachas, escapando después entre los zarzales. Suelen ser bromistas pero
también ayudan al hombre pero sin que ellos lo sepan, tienen especial predilección
por los niños, auxilian al pastor cuando su ganado se pierde tras la tormenta, les
protegen de las maldades del Ojáncano, ayudan a las ancianas que no pueden valerse
por si mismas. Durante el invierno duerme al abrigo de las torcas y en verano bajo la
frescura de los árboles. Se alimenta de panojas y endrinas pero jamás bebe agua pues
es ponzoña para él.
Los Tentirujus son diablillos tentadores de orejas puntiagudas, ropajes encarnados y
boina en la cabeza. Se aprovechan de la invisibilidad que les producen los brotes
tiernos de mandrágora que siempre llevan para acariciar a las mozas y volverlas
descaradas.
Los Ventolines son geniecillos que tienen unas alas grandes y verdes, sus ojos son del
mismo color, viven sobre el mar en las nubes rojizas de poniente. Ayudan a los viejos
pescadores a recoger las redes, abrigándoles con sus alas cuando hace frío o mientras
sopla la suave brisa en la vela de la barca.
Los Caballucos del Diablo aparecen en la mágica noche de San Juan atravesando los
espacios entre las nubes de azufre emitiendo escalofriantes bramidos. Se dedican
principalmente a destruir los tréboles de cuatro hojas nacidos esa noche. Vuelan al
resplandor de las hogueras lo cual es señal de grandes desgracias. Ni siquiera las
Anjanas tienen poder suficiente ante sus galopadas ya que sólo podrá conjurarlas la
planta llamada verbena o yerbuca de San Juan, que es una planta sagrada que
ahuyenta los males.
Los Nuberos son geniecillos tan malignos como diminutos, de cara maliciosa y
ligeramente obsesos. Habitan en las nubes, controlando el tiempo a su voluntad, se
suelen divertir provocando tormentas y tempestades, obviamente, con pretensiones
malvadas, tanto para arruinar las cosechas con el granizo como para perjudicar a los
pescadores que salen y entran a la mar, además lanzan centellas a los animales. Si se
ven amenazados o molestados usan como arma los rayos que no dudan ni un
momento en utilizar en su propia defensa. La gente les atribuye las terribles noches de
aguaceros y tempestades, los lugareños, para ahuyentarlos durante las horas de
oscuridad, encienden cirios y hacen tañer las campanas. Los pescadores les culpan de
las galernas que les hacen regresar apresuradamente a puerto.
El Musgosu es un hombre alto, sombrío y con cierto aire cansado, se pasea por las
brañas vestido con una zamarra de musgo, sombrero de hojas y escarpines de piel de
lobo mientras toca una triste melodía con su flauta para guiar a los pastores que se
encuentran en apuros. Por las noches silba desde las cumbres cuando algún peligro se
cierne sobre ellos. Es compasivo y un trabajador infatigable, repara las chozas de los
vaqueros derribadas por el temporal.
La información que necesitas se encuentra aquí -->
d?3JhFCm1X5P6MXS"33)QFUo123
El Culebre es un ser legendario de la mitología cántabra, con forma de dragón o
serpiente alada. Tiene una gran boca de afilados dientes por la que escupe azufre y
fuego, sus ojos son ascuas incandescentes, todo su cuerpo está recubierto de escamas
y de su espalda nacen unas alas de murciélago. Vive en cuevas donde guarda tesoros.
El Ramidreju, animal legendario que nace cada cien años de las comadrejas o de las
rámilas. De cuerpo delgado y muy largo, piel rayada y verde, ojos amarillos y hocico
de jabalí que usa para excavar profundos agujeros en la tierra. Muy buscado en
Cantabria porque dicen que su piel cura todas las enfermedades y sirve para encontrar
tesoros escondidos.
En torno a estos personajes y a muchos más han surgido infinidad de leyendas y
relatos. Todos ellos son prueba de la mentalidad mística de una época que respondió a
la necesidad de los cántabros de expresar sus miedos a internarse en un bello entorno
natural a la vez que abrupto, hostil y peligroso. Lanzándose a la búsqueda de
respuestas que les diesen convencimiento y la conjugación de los poderes para velar
por su seguridad.
No obstante quedan cántabros que aún no han sustituido a las mitológicas Anjanas
por santos y vírgenes ya que le siguen atribuyendo ciertas buenaventuras a esta hada
buena de la Montaña. Hoy día aún se sigue amedrentando a los más pequeños de la
casa con el Ojáncano. Pero este fantástico mundo de significaciones y de valores se
ha ido diluyendo poco a poco con la modernidad y el paso del tiempo, sustituyendo
los antiguos mitos por otros más modernos y urbanos.
El .DMP es un volcado de memoria del proceso Paint.exe con una imagen abierta (el
fichero se llamará Paint.dmp para dar una pequeña pista o dentro del dmp meto una
string que ponga Paint para que no sea tan “fácil”). En dicha imagen habrá un texto
escrito. El volcado de memoria estará modificado en hexadecimal para que
herramientas de carving no puedan obtener ningún fichero (binwalk, foremost...). La
idea es que el participante descubra (buscando en Google lo encontrará espero) que si
abrimos el fichero en GIMP cambiando lo extensión a .DATA, podremos ver la imagen
que había en Paint abierta en el momento del volcado. También vera el siguiente texto
(véase captura) que le indicará cuál será el siguiente paso que tiene que hacer.
Hay que modificar el ancho y el alto para que se vea, si no, no verán nada.
Del CD obtendrán la siguiente imagen:
Imagen con estego
Esta imagen contiene esteganografía (eso lo tienen que suponer) y, también, contiene la
cadena de texto “L1nC3s_C4nT4Br0S” (con un strings sale). Para obtener el contenido
de la imagen, usamos steghide con la contraseña obtenida del pcap. De ahí,
obtendremos un keepass del año de la polka (.kdb, no kdbx), por lo que tendrán que
bajarse una versión antigua de keepass (la v 1.37). La contraseña maestra es
“L1nC3s_C4nT4Br0S”. Y ya habrán acabado.
Obtenemos el contenido con la pass del texto del PCAP.
Contraseña del Keepass obtenido.
Keepass con la FLag.
RECURSOS
• https://w00tsec.blogspot.com/2015/02/extracting-raw-pictures-from-memory.html
(Para ver la imagen, ver la parte del mspaint)
• https://keepass.info/news/n190102_1.37.html
• Necesitaran instalar GIMP y la extensión UFO Raw para poder cargar las imágenes en
formato .data.
PISTAS
Hay que hacer especial hincapié en que usen GIMP o algo por el estilo y que jueguen
con el ancho y el largo para que vean el contenido de la imagen.
Primera pista: Indicarles que el pcap contiene información
Segunda pista: Indicar que el fichero .dmp puede contener imágenes en memoria (que
usen algún manipulador de imágenes con licencia GNU)
Tercera pista: Indicar lo del ancho y el alto para que jueguen con ello.
FLAG: flag{C0nGr4tS_mY_n3w_l34d3r}
RETO #7
RESP. MISION: PABLO GONZALEZ
RECOMPENSA: 1000 SPACECOINS
Revisando visualmente la parte exterior de las instalaciones donde tenían retenido a
nuestro agente… pude observar una especie de código marcado con algo punzante en lo
que parecía ser una especie de ventana, o más bien un respiradero (debido a su pequeño
tamaño), fijando la vista en uno de los laterales reconocí al instante que él estaba allí,
era él, sólo mi gran amigo podría, junto a ese código, firmar con un Glider, siempre
decía que se demostró que el juego de la vida de John H. Conway es equivalente a
una maquina de Turing lo que le permitía, teóricamente, realizar cualquier
computación posible.
Una (Smart Lock) cerradura BLE era lo único que nos separaba de nuestro agente, solo
si interactuábamos con ella nos permitiría ponerlo a salvo. A esta cerradura le gustan las
# y los números en UTF-8 de interés. Eso sí, no nos daría paso, así como así. Debemos
jugar con la Smart Lock si queremos volver a ver a nuestro agente…
SOLUCION
En primer lugar, debemos encontrar la Micro:Bit en este estado. Luz naranja activa.
El display central estará apagado, como se puede ver en la imagen. No parece estar
activo, pero hay que ver que la luz naranja esté activa.
Se pueden utilizar diversas herramientas: gatttool, bettercap, homepwn. Incluso, se
puede hacer con un dispositivo móvil a través de herramientas como nRF Connect.
Si miramos con cualquier herramienta que permita escanear dispositivos Bluetooth (y
en este caso BLE) podemos encontrar una placa llamada Micro:Bit (coincide con lo que
vemos).
Podemos conectarnos directamente con ella sin ningún tipo de pairing ni autenticación.
Se puede ver la calidad de la señal, pero lo que más va a interesar es ver las
características del dispositivo BLE y los permisos que tiene cada característica
Habrá que fijarse en las de lectura directa (se puede obtener nombre del dispositivo y
otros valores informativos). Se pueden ver diferentes características de escritura. Se
probarán varias cosas y hay que ver cómo interactuar con la placa para que nos diga
algo, ya sea a través del display o a través de alguna característica de lectura o
notificación.
Cuando nos fijemos en UART TX char. Entendemos que podemos comunicarnos con la
placa y enviarle “algo”. Podemos probar diferentes configuraciones: bytes, números,
strings… Podemos probar a enviarles comandos o “requests”. Esto es probar y probar
para ver qué puede hacer la placa, tanto desde el punto de vista del display y desde los
valores que puede devolvernos a través de las características dónde la placa nos puede
devolver valores.
En este caso, nos devolverá información a través de UART RX char. Entonces,
escribiremos en UART TX y recibiremos valores en UART RX, siempre y cuando nos
hayamos subscrito (se ve más adelante).
Le mandamos un 0. En BLE debemos enviarle un delimitador (en este caso una #). En
el enunciado se decía que le gustaban las #, cuando se desarrolla se puede elegir el
delimitador. Esto es probar diferentes tipos de cadenas, números, etc y diferentes
delimitadores. Hasta que ocurre algo diferente.
Vemos que estamos subscritos a UART RX Char. Y cuando se envía el 0# a través de
UART TX char. Ocurre algo como esto. Recibimos “algo” en hexadecimal.
Si pasamos el hexadecimal por un hex to ASCII online obtenemos lo siguiente: “Zero?
Serious?” (Este paso puede que no se dé nunca, que alguien en vez de un 0 meta
cualquier número (más adelante, veremos qué pasa).
Si el usuario envía un 1# se obtiene un hexadecimal muy diferente al anterior. Al
convertirlo a ASCII se obtiene un número 78399491. ¿Qué es?
¿Y si se mete un -1#? Se obtiene un 78399493, ¿Qué quiere decir?
¿Y si se mete un 2#?
Se obtiene un 78399490. Parece que hay relación… Con un 3# se obtiene un
78399489. Ya está se va restando a un número. La placa propone un sencillo juego de
adivinar el número exacto programado. Quizá nos de algo más interesante si acertamos
el número.
Cuando introducimos el número 78399492# (es el número exacto) se nos devolverá el
siguiente valor.
Este valor en hexadecimal al pasarlo por el conversor nos devuelve el mensaje: “Flag:
ff00aa2387de” Aquí tenemos el flag
RECURSOS
La placa microbit será aportada por Pablo, se le devolverá a la finalización del CFT.
PISTAS
Pista 1: Para los que están muy perdidos: nRF Connect + mensajes con # como
delimitador o final de línea
Pista 2: Revisa los permisos de BLE (escritura, lectura, notificación). Mira cómo recibir
respuestas de dispositivos BLE a través de características
Pista 3: La fuerza bruta nunca fue un buen método. Utiliza la mente y piensa en los
números. Ellos te darán la solución (recuerda la # al final de tus apuestas…)
FLAG: ff00aa2387de
Diario de a bordo, día 25 de enero de 2020
RETO #8
RESP. MISION: N4xh4ch5
RECOMPENSA: 1500 SPACECOINS
Una vez tuviésemos a nuestro agente a salvo debíamos volver a nuestra nave, pero la
sorpresa sería inmensa para toda la tripulación cuando en la pantalla central viesen
correr una máquina virtual que debían explotar, otra prueba más de su valía, quería ver
hasta que punto eran capaces de explotar un OS y con qué clase de Tools estaban
familiarizados cada uno de ellos.
SOLUCION
Máquina 1: Resurection: https://fwhibbit.es/sh3llcon-ctf-write-up-resurrection
Máquina 2: F3nix : https://fwhibbit.es/sh3llcon-ctf-write-up-f3nix
¿Realmente está mi tripulación preparada para seguir adelante?
No paraba de rondarme esa incógnita por mi mente…
RETO #9 OFFLINE
RESP. MISION: GANZUANDO.ES
RECOMPENSA: 1000 SPACECOINS
Tanto el pensamiento lateral como la precisión son imprescindibles en la tripulación
final de esta aventura, deberán ganzuar todo aquello que esté a su alcance, quiero que
sus instintos, sensibilidad y tacto me muestren su paciencia y precisión, nunca
sabremos, una vez despeguemos, qué nos vamos a encontrar ahí fuera.
RECURSOS
Ganzúas facilitadas por la organización.
FLAG: Puntuación:
- 500 para las esposas
- 200 para cada candado de llave (2)
- 100 para candado numérico
RETO #10 OFFLINE
RESP. MISION: Kike y J (Organización Sh3llCON)
RECOMPENSA: 500 SPACECOINS
Mi única intención en esta prueba es ver hasta que punto son capaces de ayudarse unos
a otros ya que la lealtad es una virtud que no todos tienen, para ello serán encerrados en
una Scape The Room, sólo los mas nobles y aquellos que aprendan a compartir sus
conocimientos serán capaces de escapar para seguir con las siguientes pruebas.
RETO #11
RESP. MISION: ZEROLYNX (MrSquid)
RECOMPENSA: 1000 SPACECOINS
Mi cabeza no paraba de pensar en un sin fin de posibilidades… ¿Y qué pasaría si la
tripulación entrase en territorio hostil? Los seleccionados deben tener capacidades de
reconocimiento y adaptación vertiginosas para camuflarse en el ecosistema en el menor
tiempo posible. Quiero ponerles al límite y comprobar hasta donde llegan sus
habilidades de OSINT e Inteligencia para la misión que les espera. Un binario para mi
futura tripulación, su contenido en un “extraño” idioma.. Se requiere de técnicas de
debugging y desensamblado medias para resolverlo
SOLUCION
Reto de osint que lleva a un binario ELF.
Parte OSINT --> Los usuarios recibirán un repositorio descargado de Gitea (ver como
se lo facilitamos, o se hace una pequeña web para realizar fuerza bruta y que sea la
única carpeta accesible o se les proporciona el repositorio de manera manual. A
unas malas, puede facilitarse la URL y que ellos mismos intuyan que hay que
descargarselo (tendría que hacer público el repositorio).
Dentro del repositorio viene un fichero README.md. con un texto en chino.
Contenido repositorio Gitea (Aquí no tienen acceso)
Este readme lo que viene a decir es lo siguiente:
Como hemos sido excluidos de GitHub, publicaremos nuevos archivos aquí
de ahora en adelante.
Será mejor que no escriba lo que podría ser inseguro aquí.
Afortunadamente, está encriptado y súper seguro.
Si tiran de logs del commit, podrán ver que ha habido modificaciones en el fichero y
que en una versión anterior se podía ver una especie de contraseña (aparte de poder ver
el autor CorocottaMaster, que es el nombre de usuario).
Log del commit donde se ve la contraseña
Aquí se ve que se actualizo GitLab por GitHub (ha sido una pequeña ñapa, pero lia un poco más).
La contraseña pertenece al usuario CorocottaMaster y permite el acceso al repositorio al
que hace referencia en GitLab. La idea del comentario “está encriptado y super seguro”,
es para intentar liar a los participantes y que intenten conectarse con la contraseña en
texto plano (es el sha256 de c4s1_ac13rt4s). Una vez estén dentro del GitHub, podrán
descargarse el binario.
GitLab con el binario: Aquí tendrán usuario y contraseña para acceder.
El binario viene en un 7z con contraseña, que como se indica en el readme.md, es la
misma que el nombre del fichero (jeopardy).
Nota: Si veis que hay que cambiar algo o hacerlo más difícil, comentadme. Visto lo
que viene después, se haría muy largo entonces.
El binario (se llama Jeopardy, pero le podéis poner el nombre que queráis para adaptarlo
a la historia) viene empaquetado con UPX, por lo que primero debemos
desempaquetarlo.
Tirando un strings vemos que viene empaquetado con UPX
Lo desempaquetamos:
Con la opción upx -d se desempaqueta y ya en IDA se ve el flujo entero.
Una vez desempaquetado, si lo abrimos con IDA ya podremos ver cadenas de texto y
cosas interesantes:
Algunas de las strings que pueden ayudar a parchear
El binario en si es bastante estúpido. Os dejo un diagrama con todos los caminos y todas
las soluciones antes de continuar:
Diagrama con todas las opciones.
Como podéis observar, al ejecutar
el binario sin parchearlo, solo
tendremos acceso a las opciones 1
a 3 (y a todas sus combinaciones
posibles). Para obtener acceso a la
opción 4 y a la 5, habrá que
parchear el binario. Una vez
parcheado, en la opción 4 habra
que hacer debugging del binario
para obtener el valor aleatorio para
la opción 4.1. Si lo adivinamos,
nos dará la ultima parte de la flag
falsa.
Ejecución básica del binario
Si ejecutamos la opción 5, solo podremos acceder a las opciones 1 y 2, la opción 3 y la
4 son inaccesibles sin parchear también. AL parchear, podremos acceder a la opción 5.4
que nos meterá en la función final que nos devolverá la flag real.
Si parchearamos bien, podríamos saltar a la opción 4 y sus características
O a la 5 y sus opciones también.
Además de estos entresijos en ejecución, si miramos con detenimiento las strings del
binario tras desempaquetarlo, veremos algunas pistas (dos mensajes en rot13 que te
pueden apuntar hacia la opción 5 y algunos otros valores que simulan ser flags falsas y
otros que son cachos de la flag real. Es imposible reensamblar la flag sin parchear y solo
con un strings (creo/espero xD).
Seguimos con el binario. Una vez desempaquetado, imaginemos que nos hemos pegado
ya un rato y sabemos que hay que parchear. Empezamos.
Vamos al inicio del programa (función main en IDA). Es la primera caja de la imagen
(la grande). A partir de ahí. Vamos a ir modificando los jmp que hay para que el binario
vaya por donde nosotros queramos, metamos el valor que metamos.
Diagrama de flujo del binario sin parchear
Diagrama de flujo parcheado (las coloreadas).
Una vez tengamos el flujo identificado, al tratarse de condicionales (jumps), nos bastará
con modificar en ensamblador la última línea de cada caja (es decir, el jmp). Para ello,
primero nombraremos todas las cajas (desde la 2 a la 16. La 17 y 18 no hace falta pues
ya viene con un jmp simple) con el nombre que queramos para crear un puntero al que
apuntar el jmp. Luego, lo que haremos será modificar el jmp que haya en cada caja por
jmp “Nombre asignado a la siguiente caja”. Veamos un ejemplo.
Observacion: Esta sería la manera “guarra”. La solución elegante sería modificar
exactamente las cajas donde se realiza la comparación de las opciones y hacer que
permita meter todos los valores existentes. (Queremos la flag, no un premio al reverser
del mes).
Queremos que la caja 2 apunte a la caja3, hemos llamado a la caja 3 “Caja3”. Por ello,
cambiamos el jmp short loc_4021BF por jmp Caja3 y entonces, cuando parcheemos,
metamos lo que metamos, el flujo del binario irá hacia esa caja.
Caja 2 debe ir a Caja 3. Para cambiar el nombre pulsamos en la cajita que tiene el lápiz.
Ahora Caja2 va a ir siempre a Caja3. Para cambiar los valores en ensamblador, hay que ir al botón assemble (edit/patch program/assemble en IDA).
Si hacemos esto en todas las cajas del flujo, nos quedará el siguiente diagrama.
Diagrama final
Si ahora ensamblamos el binario y lo ejecutamos, llegamos a la opción 5.4 y se ejecuta
la función que nos devolverá la flag.
Aplicar parches al binario una vez modificado todo.
Tras pulsar varias veces control+C nos va devolviendo la flag a cachos. Con ctrl+z paramos el binario.
Como se puede ver en la imagen, metiendo cualquier valor, nos va a dirigir a la opción
5 y, a su vez, a la opción 4, que es la que ejecuta la fucnion con la flag. La flag esta
dada a cachos y hasheada en varios cifrados. Si el usuario hubiera obtenido la pista,
sabría que tiene que juntarla. De todas formas, si usamos cualquier página de cracking,
obtendremos su texto claro de manera sencilla.
Yo he usado esta: https://md5hashing.net/hash
Habilitando la opción mass decrypt nos devuelve todo de golpe y sin pensar.
Solución
PISTAS
OSINT: Pendiente / Binario: 3 pistas
Primera pista: para los que están muy perdidos y no han visto que hay que abrirlo con
un desensamblador.
Segunda pista: si no han visto que está empaquetado con UPX.
Tercera pista: para indicar que hay que parchear para obtener el camino correcto
FLAG: flag{T1m31sG0lD}
RETO #12 OFFLINE
RESP. MISION: a3n3rys_d
RECOMPENSA: 1000 SPACECOINS
Nuestro satélite secundario LossASat-1 estaba empezando a dar fallos inexplicables, lo
habíamos perdido… Como esta misma situación ya la había vivido en otras misiones,
aprendí que siempre hay que dejar una puerta trasera para reiniciarlo en casos de
emergencia, pero… estoy sin tiempo… demasiado en mi mente…ver cómo salir al
espacio exterior sin perder a ninguno de los miembros de la tripulación, asegurarme de
que nuestro agente está en perfecto estado, preparar la nave para la huida…
De nuevo serán ellos los que deberán encargarse de enviar un mensaje de reinicio al
satélite desde la estación de tierra.
SOLUCION La prueba tiene dos partes:
- OSINT/SIGINT: Los participantes tendrán que decodificar la información que está
enviando nuestro “satélite secundario” (un esp32). Para ello, deberán recabar datos
sobre el satélite “LossASat-1”. Lamentablemente, en Internet no se encuentra nada de
información sobre el mismo, pero sí de un satélite con un nombre similar, el “FossaSat-
1”.
Si por ejemplo miran en la guía de comunicación de Fossasat, verán que se hace alusión
al protocolo RTTY:
https://github.com/FOSSASystems/FOSSASAT-
1/blob/master/FOSSA%20Documents/FOSSASAT-1%20Comms%20Guide.pdf
Aunque existen distintos métodos para capturar y decodificar la señal, si capturan la
señal utilizando cualquier software de SDR durante un tiempo razonable y la almacenan
en un fichero de audio wav:
Y luego la traducen con un software como fldigi (o similar):
podrán conseguir los siguientes mensajes:
rtty.println("LOSSASAT-1_hardware_status");
rtty.println("LOSSASAT-1: batteryChargingVoltage error, batteryChargingCurrent
error, batteryVoltage error, solarCellAVoltage error, solarCellCVoltage error,
boardTemperature error, powerConfig malamente}");
rtty.println("LOSSASAT-1_backdoor_status");
rtty.println("LOSSASAT-1: Status:OK flag{1_w");
rtty.println("LOSSASAT-1_backdoor_system_status");
rtty.println("LOSSASAT-1: System Status:Failure");
En ellos viene la primera parte de la flag y dos llamadas a la backdoor:
LOSSASAT-1_backdoor_status
LOSSASAT-1_backdoor_system_status
Deberán hacer suposiciones para averiguar que la llamada correcta que deberán
escribir en la estación de tierra es “LOSSASAT-1_backdoor_system_reboot”.
- Hardware: Ahora llega la tarea fácil: escribir el mensaje en la estación de tierra para
que llegue el mensaje el satélite. El problema es que no tenemos teclado:
Pero en compensación, tenemos un ATTiny85 que puede emular un teclado sin
problemas. Para ello, creamos tiramos de tutorial:
https://fwhibbit.es/hackers-garage-box-3-conejizando-al-pato
Y una vez programado, lo enchufamos a la estación de tierra, reiniciamos el satélite y
nos dará la segunda parte de la flag:
RECURSOS
Gracias a la ponente a cada participante se le proporcionará un attiny85 ya que será
necesario para ejecutar la prueba.
PISTAS
Primera pista: Nuestro LossASat-1 ha sido diseñado por el primo segundo de Julián
Fernández utilizando protocolos similares a los de su satélite. ¿Has probado a analizar la
señal con un decodificador específico para este protocolo?
Segunda pista: Alguien se ha llevado el teclado…qué oportuno. Tal vez es hora de usar
algo que te dieron al inicio de esta aventura. ¡Esperemos que no lo hayas perdido por el
camino!
Tercera pista: Manda un mensaje de ‘reinicio’ utilizando la ‘backdoor’ que has
encontrado.
FLAG: flag{1_w4nt_to_b3l13v3}
RETO #13
RESP. MISION: GIBDEON
RECOMPENSA: 1000 SPACECOINS
Confío en ellos plenamente…
Sé que conseguirán salvar a nuestro agente, pero… en el hipotético caso de que no fuese
así… mi maldita cabeza no para de pensar en la gran cantidad de posibilidades de no
volver a ver a mi amigo y mentor, eso me aterraba, sin su ayuda seria complicado,
pero…
Aún tenemos una posibilidad de escapar con éxito…
Recuerdo que antes de partir entre risas mencionó algo que me dejó un poco inquieto:
“En caso de que la misión no salga como esperamos y no volvamos a
vernos… recuerda que en las entrañas de esta nave hay la suficiente
potencia y sabiduría para salir al espacio exterior, sólo el
conocimiento os hará libres“
Algo me dice que así es, hombre solitario, se relacionaba mejor con las máquinas que
con los humanos, amaba el reversing, su cerebro trabajaba siempre a bajo nivel, donde
el kernel era su mejor amigo y hablaban el mismo lenguaje, con su inteligencia sería
capaz de ver mas allá, no sería capaz de dejar esta misión sin un plan “B”, ¿porque
mencionaría las entrañas de la nave, porque haría referencia a la ejecución de un binario
en una fecha y un intervalo de horario concreto?
De nuevo sus palabras resonaban en mi mente…
Recordad siempre…
Si queremos que sh3llc0n forme parte de ese ciberespacio en
equilibro, solo un binario ejecutado el día 24 de Enero de 2020 entre
las 20:00:00 y las 23:59:59 podrá mostraros las entrañas de la nave,
recordad, solo el conocimiento os hará libres!!!
SOLUCION
gcc -o nave nave.c -lgmp -lcrypto
#include <stdio.h> #include <time.h> #include <gmp.h> #include <stdlib.h> #include <string.h> #include <openssl/aes.h> #include "arrays.h" void print_data(const char *tittle, const void* data, int len); int main() { unsigned char aes_key[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; //unsigned char aes_input[]={0x66,0x6c,0x61,0x67,0x7b,0x53,0x70,0x34,0x63,0x33,0x78,0x48,0x33,0x6c,0x6c,0x7d}; unsigned char aes_input[]={0x4f,0x1c,0x94,0x2c,0x69,0xd6,0x23,0x0b,0x0e,0xc2,0x78,0x37,0xbc,0xe7,0x15,0x60}; mpz_t total, suma; mpz_init(total); mpz_init_set_ui (suma, 0); unsigned long long int temp1; time_t t; struct tm *tm; char fechayhora[100]; //fecha de salida es 23:13:37 de 24 de enero de 2020 t=time(NULL); tm=localtime(&t); printf ("Fecha Estelar: Son las %d:%d:%d\n", tm->tm_hour, tm->tm_min, tm->tm_sec); for(int i=0;i<tm->tm_year + 1900;i++){ for(int j=0;j<tm->tm_mon+12;j++){ for(int k=0;k<tm->tm_mday;k++){ //mpz_out_str(stdout,10,suma); for(int l=0;l<=tm->tm_hour;l++){ for(int m=0;m<=tm->tm_min;m++){ for(int n=0;n<=tm->tm_sec;n++){ temp1 = struct1[n*m] * struct2[l*m] * struct2[n]; mpz_add_ui(suma,suma,temp1); //mpz_out_str(stdout,10,suma);
//mpz_add(total,suma,total); } } } } } } //mpz_out_str(stdout,10,suma); //printf("El total es %Zd",suma); /* Init vector */ unsigned char iv[AES_BLOCK_SIZE]; memset(iv, 0x00, AES_BLOCK_SIZE); /* Buffers for Encryption and Decryption */ //unsigned char enc_out[sizeof(aes_input)]; unsigned char dec_out[sizeof(aes_input)]; mpz_export(aes_key, NULL, 1, sizeof(char), 0, 0, suma); /* AES-128 bit CBC Encryption */ AES_KEY enc_key, dec_key; //AES_set_encrypt_key(aes_key, sizeof(aes_key)*8, &enc_key); //AES_cbc_encrypt(aes_input, enc_out, sizeof(aes_input), &enc_key, iv, AES_ENCRYPT); /* AES-128 bit CBC Decryption */ memset(iv, 0x00, AES_BLOCK_SIZE); // don't forget to set iv vector again, else you can't decrypt data properly AES_set_decrypt_key(aes_key, sizeof(aes_key)*8, &dec_key); // Size of key is in bits AES_cbc_encrypt(aes_input, dec_out, sizeof(aes_input), &dec_key, iv, AES_DECRYPT); /* Printing and Verifying */ //print_data("\n Original ",aes_input, sizeof(aes_input)); // you can not print data as a string, because after Encryption its not ASCII //print_data("\n Encrypted",enc_out, sizeof(enc_out)); print_data("\n Tu mensaje a esta hora del dia es",dec_out, sizeof(dec_out)); return 0; } void print_data(const char *tittle, const void* data, int len) { printf("%s : ",tittle); const unsigned char * p = (const unsigned char*)data; int i = 0; for (; i<len; ++i) printf("%c", *p++); printf("\n"); }
Ejecutamos el proceso y vemos que tarda un buen rato en procesar:
Abrimos IDA y vemos la clave con FF y los datos que luego pasa por AES como
entrada
Se ve claramente que necesitamos descifrar esos datos
Luego se ve un bucle que juega con el año, el mes, el día, la hora, los minutos y los
segundos
Suma los datos que busca en las estructuras de datos de la db
Estas estructuras la 1 y la 2 se pueden exportar con un editor hexadecimal o con IDA en
edit export data, las necesitaremos para resolver, las meteremos en un fichero llamado
arrays.h
Volviendo al blucle vemos que la ejecución del reto tarda unos segundos en realizar
todos los bucles pero si nos fijamos solo juega con los arrays de horas minutos y
segundos
total = struct1[n*m] * struct2[l*m] * struct2[n];
Por lo tanto podremos hacer fuerza bruta para sacar todas las posibles keys de AES y
forzar la extracción de la flag
Codigo de Write up
#include <stdio.h> #include <time.h> #include <gmp.h> #include <stdlib.h> #include <string.h> #include <openssl/aes.h> #include "arrays.h" void print_data(const char *tittle, const void* data, int len); void main() { unsigned long long int total; mpz_t suma; mpz_init_set_ui (suma, 1); unsigned char aes_key[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
unsigned char aes_input[]={0x4f,0x1c,0x94,0x2c,0x69,0xd6,0x23,0x0b,0x0e,0xc2,0x78,0x37,0xbc,0xe7,0x15,0x60}; /* Init vector */ unsigned char iv[AES_BLOCK_SIZE]; memset(iv, 0x00, AES_BLOCK_SIZE); AES_KEY enc_key, dec_key; /* Buffers for Encryption and Decryption */ unsigned char enc_out[sizeof(aes_input)]; unsigned char dec_out[sizeof(aes_input)]; for (int dia=79200;dia<=86400;dia++){ int hora = dia / 3600; int min = (dia - (3600*hora)) /60; int sec = (dia - (3600*hora)) - (min*60); mpz_mul_ui(suma,suma,2020*24*12); unsigned char dec_out[sizeof(aes_input)]; unsigned char aes_key[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; mpz_export(aes_key, NULL, 1, sizeof(char), 0, 0, suma); memset(iv, 0x00, AES_BLOCK_SIZE); // don't forget to set iv vector again, else you can't decrypt data properly AES_set_decrypt_key(aes_key, sizeof(aes_key)*8, &dec_key); // Size of key is in bits AES_cbc_encrypt(aes_input, dec_out, sizeof(aes_input), &dec_key, iv, AES_DECRYPT); print_data("\n Tu mensaje a esta hora del dia es",dec_out, sizeof(dec_out)); mpz_init_set_ui (suma, 0); for(int l=0;l<=hora;l++){ for(int m=0;m<=min;m++){ for(int n=0;n<=sec;n++){ total = struct1[n*m] * struct2[l*m] * struct2[n]; mpz_add_ui(suma,suma,total); } } } } } void print_data(const char *tittle, const void* data, int len) { printf("%s : ",tittle); const unsigned char * p = (const unsigned char*)data; int i = 0; for (; i<len; ++i) printf("%c", *p++); printf("\n"); }
Para compilar gcc -o write write.c -lgmp –lcrypto
He usado C por comodidad pero se puede realizar en cualquier lenguaje lo más lógico
seria sacar las estructuras de datos a Python y usar las librerías de Crypto AES 128
RECURSOS
Nave.OS será subida al server
PISTAS No hay pistas
FLAG: flag{Sp4c3xH3ll}
==============================================================
NOTA IMPORTATE!!!
TODOS AQUELLOS PARTICIPANTES QUE SOLICITEN PISTAS SE LES
RESTARAN 100 PUNTOS DE LA PUNTUACION FINAL DE AQUELLA
PRUEBA DONDE SE HAYA SOLICITADO LA PISTA