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 :
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 :
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)
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"))
đŠFLAG
404CTF{k3rn3lR00tk1t_b3tt3r_th@n_fir3f0x}
La suite de ce challenge nous donne une capture rÊseau en plus du dump de l'.
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 pour voir rapidement ce qu'il fait :
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