Toortik Triflexation [2/2]
Catégorie: Analyse forensique - Difficulté: Extrême
Description:

Solution:
La suite de ce challenge nous donne une capture réseau en plus du dump de l'étape précédente.
Pour cela, revenons sur nos pas et essayons de reverse le spyware lancé sur la machine. Une fois le binaire extrait du dump mémoire, nous allons l'envoyer sur DogBolt pour voir rapidement ce qu'il fait :
Nous voyons rapidement qu'il chiffre les données avant l'envoi des données vers sont serveur distant. Nous allons donc devoir comprendre comment elles ont été chiffrées dans un premier temps, puis retrouver ces données (chiffrées) et enfin les déchiffrer (ouais y a de la réflexion là :p).
Dans le binaire de tout à l'heure, il était évoqué un fichier SSLKEYLOGFILE, qui contient très probablement les clés pour déchiffrer le flux SSL/TLS de la trame Wireshark.
Mais en même temps, le binaire est bien fait car il efface ce fichier à la fin de son exécution :

Nous allons donc devoir procéder autrement, et tout comme dans la première partie du challenge, nous allons utiliser les strings du dump, car elles contiendront très certainement ces données.
En regardant sur internet et sur d'anciens WU nous voyons que le fichier SSLKEY contient toujours un SERVER_HANDSHAKE_TRAFFIC_SECRET
, nous allons donc chercher ça dans les strings.
Grâce à cela, nous trouvons tout le contenu que nous cherchions :
SERVER_HANDSHAKE_TRAFFIC_SECRET 4e9152602145711b9af18fec5cd0e270386509b8e41e1b0e4a54206b6cd2b86b a77af2eea2726ffd6fe63fe8662fa2233b12ca182c7ca0f641b86937ea821b1a7c2138eca63e2963c66ea559eb85cffe
EXPORTER_SECRET 4e9152602145711b9af18fec5cd0e270386509b8e41e1b0e4a54206b6cd2b86b 0dd78f3e40cb00a51c8d33ecde17d52f181054a6274c3e59181ae024815932c89aeb4136c19c14c46c36e2786ee8577e
SERVER_TRAFFIC_SECRET_0 4e9152602145711b9af18fec5cd0e270386509b8e41e1b0e4a54206b6cd2b86b 0efc9918b3e23872a7cb1458b8f19802d3e3ee3abe4c1a7dd7555a1a8929ec95d84cf67d604725f10b70aa7531e45436
CLIENT_HANDSHAKE_TRAFFIC_SECRET 4e9152602145711b9af18fec5cd0e270386509b8e41e1b0e4a54206b6cd2b86b 021e1b83b338a2ff782de1e5c438a9050b70b86c13a0bbedc12a480dcde1e8f80e4347b1323aca0dd553acbc427265
CLIENT_TRAFFIC_SECRET_0 4e9152602145711b9af18fec5cd0e270386509b8e41e1b0e4a54206b6cd2b86b 8bd3531ac9764f9250a12f85c5220815a8f6a8510c046f8bc2ff022c92fdbdb778972697993e8e60d4bd58a2dfb85125
Nous essayons donc d'importer un fichier sslkeys.log dans les paramètres de Wireshark afin de déchiffrer le flux SSL. Mais malheureusement, ça ne fonctionne pas, bizarre cette histoire...
Arrivé à cette étape, je suis resté bloqué plusieurs jours, jusqu'à revenir sur une info donnée dans l'énoncé : "certaines informations soient tronquées dans la capture de la mémoire vive".
J'ai donc fait attention à ces fameuses valeurs que nous venons de trouver et là quelle surprise :
SERVER_HANDSHAKE_TRAFFIC_SECRET 4e[...]6b a7[...]fe --> 96 caractères
EXPORTER_SECRET 4e[...]6b 0d[...]7e --> 96 caractères
SERVER_TRAFFIC_SECRET_0 4e[...]6b 0e[...]36 --> 96 caractères
CLIENT_HANDSHAKE_TRAFFIC_SECRET 4e[...]6b 02[...]65 --> 94 caractères !!!
CLIENT_TRAFFIC_SECRET_0 4e[...]6b 8b[...]25 --> 96 caractères
Notre CLIENT_HANDSHAKE_TRAFFIC_SECRET
est incomplet et il lui manque 2 caractères hexa...
Je suis donc parti à la recherche de ces fameux 2 caractères manquants, et tester 162 possibilités a donc été la merveilleuse solution que j'ai trouvé et choisi...
Comble du hasard, c'est la valeur fb
(l'une des toutes dernières) qui m'a permis d'avancer en déchiffrant le flux SSL/TLS :

Pour retrouver ces données, allons voir la capture réseau pour des données qui ont été envoyées (POST)

Nous avons donc retrouver ces données, et malheureusement, elles sont bien chiffrées 😂
cd0fa1ae97c509acf24caf2ba33f5b9d22c713623fd730f1b0f4c2e8b25b9a136575cc9d31d6e2c173f988bdec915c5870c5967f3adec8bed69e6c04daaf9f8430245b2a9bf444fc51aa76b4f56fcc10cd7b553b39166007f56cfb3121a25f9a90ae6ff8d88db65b7c3d603ccb2b783989533ecef4d2d3ae465d2336f67324e3bfe45408a10e24223f360fa4ad8aaa3db96e05173c237d2f1ab6f4377a66a1a98d356007420bc573a2030efddba9ddcd8b3d904bae7dff1886bdbd2911b86b99412c0b6c0739cc213beb33110351943cfd348c0dacf2719c30aee65282fc24d28c0871b82941e3bf48c0d6709b49cebca37031e6b7031685b5dca996b5b7ff6a24c7fadf8e12e6a0005d1c821f73105a03a0360c807e5854e46e93fe1191f3de1a022a0c27ebadb683647bdf1556eb2873f79c0e086cfc988684cfe0671164c88b7fdcd434d59b581f96e26e9c5857d63471f3c387ab3e1d55cff8cb07f503a57a97af772de30fbf0d93dbb6189fa796f0d5b30c3c614bb16fa611143d40ce8d2f6e05eb6b07ab2d5004fd4b9e95e020
Maintenant, nous allons créer un petit script Python qui reprends les éléments du binaire ainsi que les données chiffrées afin de le retrouver en clair :
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
cipher_hex = (
"cd0fa1ae97c509acf24caf2ba33f5b9d22c713623fd730f1b0f4c2e8b25b9a13"
"6575cc9d31d6e2c173f988bdec915c5870c5967f3adec8bed69e6c04daaf9f84"
"30245b2a9bf444fc51aa76b4f56fcc10cd7b553b39166007f56cfb3121a25f9a"
"90ae6ff8d88db65b7c3d603ccb2b783989533ecef4d2d3ae465d2336f67324e3"
"bfe45408a10e24223f360fa4ad8aaa3db96e05173c237d2f1ab6f4377a66a1a9"
"8d356007420bc573a2030efddba9ddcd8b3d904bae7dff1886bdbd2911b86b99"
"412c0b6c0739cc213beb33110351943cfd348c0dacf2719c30aee65282fc24d2"
"8c0871b82941e3bf48c0d6709b49cebca37031e6b7031685b5dca996b5b7ff6a"
"24c7fadf8e12e6a0005d1c821f73105a03a0360c807e5854e46e93fe1191f3de"
"1a022a0c27ebadb683647bdf1556eb2873f79c0e086cfc988684cfe0671164c8"
"8b7fdcd434d59b581f96e26e9c5857d63471f3c387ab3e1d55cff8cb07f503a5"
"7a97af772de30fbf0d93dbb6189fa796f0d5b30c3c614bb16fa611143d40ce8d"
"2f6e05eb6b07ab2d5004fd4b9e95e020"
)
# Clé / IV
key_be = "8E2D7A4C1E9B3F6A6C8A4E1D7B3A0C5F8F5E1A7C3D4F9E2B1E7B3F4E9A2C6D0B"
iv_be = "8B7A6F5E4D3C2B1A0FFCEBDACFBEAD9C"
# Petites fonctions d’inversion « mot par mot »
def swap_u64_chunks(hex_str):
return b"".join(
int(hex_str[i : i + 16], 16).to_bytes(8, "little")
for i in range(0, len(hex_str), 16)
)
key = swap_u64_chunks(key_be)
iv = swap_u64_chunks(iv_be)
cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = unpad(cipher.decrypt(bytes.fromhex(cipher_hex)), AES.block_size)
print(plaintext.decode("utf-8", errors="replace"))

Quel miracle, nous avons toutes les valeurs du keylogger en clair. Il suffit simplement de faire un peu le ménage en enlevant les _CTRL_
, _HAUT_
, _MAJ_
, _RETOUR_
, _ALTGR_
...
Une fois le nettoyage fait, nous avons le flag en clair 🎉
Last updated
Was this helpful?