Toortik Triflexation [2/2]
Last updated
Was this helpful?
Last updated
Was this helpful?
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)
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"))
Nous avons donc retrouver ces donnÊes, et malheureusement, elles sont bien chiffrÊes
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