
Déchiffre les communications Covenant C2 en extrayant les clés privées RSA des minidumps, en récupérant les clés de session AES et en convertissant les captures réseau en texte clair.
CovenantDecryptor est conçu pour déchiffrer les données de communication du trafic Covenant.
L'extraction de la clé privée depuis la mémoire est applicable à d'autres C2, comme Empire, étant donné son utilisation de
RSACryptoServiceProviderpour créer la clé.
L'initialisation de la communication Covenant se compose de 3 étapes :
SetupAESKey, qui est intégrée dans un exécutable malveillant. Avant l'envoi, il formate le texte comme décrit dans GruntHTTPStager avec le type défini à 0.SessionKey, chiffrée avec la clé publique RSA, pour les communications ultérieures.SetupAESKey pour déchiffrer le message, puis se sert de la clé privée RSA pour déchiffrer la SessionKey. Ensuite, il chiffre 4 octets générés aléatoirement avec la SessionKey et les transmet. Avant l'envoi, il formate le texte comme décrit dans GruntHTTPStager avec le type défini à 1.SessionKey, ajoute 4 octets supplémentaires générés aléatoirement et transfère les 8 octets résultants à l'agent infecté.SessionKey. Ensuite, il vérifie si les 4 premiers octets correspondent aux données précédemment transmises, puis renvoie les 4 derniers octets au C2. Avant l'envoi, il formate le texte comme décrit dans GruntHTTPStager avec le type défini à 2.Une fois la vérification terminée, les données peuvent être échangées.
CovenantDecryptor est composé de deux utilitaires. Le script extract_privatekey récupère les nombres premiers p et q à partir d'un fichier minidump pour construire une clé privée RSA en employant le module public. Le script decrypt_covenant_traffic se compose de 3 commandes : modulus, key et decrypt. La première commande extrait le module de la communication Covenant, tandis que la seconde récupère la clé AES utilisée pour chiffrer le trafic de données. Enfin, la troisième commande déchiffre le trafic.
Extraire le module de la requête de l'étape 0 d'un hôte infecté :
$ python3 decrypt_covenant_traffic.py modulus -i traffic.txt -k "EQCZiHdmVUQzIhEAmYh3ZlVEMyIRAJmId2ZVRDMiEQA=" -t base64
[+] Modulus:
19574201286059123715221634877085223155972629451020572575626246458715199192950082143183900970133840359007922584516900405154928253156404028820410452946729670930374022025730036806358075325420793866358986719444785030579682635785758091517397518826225327945861556948820837789390500920096562699893770094581497500786817915616026940285194220703907757879335069896978124429681515117633335502362832425521219599726902327020044791308869970455616185847823063474157292399830070541968662959133724209945293515201291844650765335146840662879479678554559446535460674863857818111377905454946004143554616401168150446865964806314366426743287
[+] Exponent: 65537
Récupérer la clé privée RSA à partir d'un fichier minidump d'un processus Covenant infecté :
$ python3 extract_privatekey.py -i memory.dmp -m 19574201286059123715221634877085223155972629451020572575626246458715199192950082143183900970133840359007922584516900405154928253156404028820410452946729670930374022025730036806358075325420793866358986719444785030579682635785758091517397518826225327945861556948820837789390500920096562699893770094581497500786817915616026940285194220703907757879335069896978124429681515117633335502362832425521219599726902327020044791308869970455616185847823063474157292399830070541968662959133724209945293515201291844650765335146840662879479678554559446535460674863857818111377905454946004143554616401168150446865964806314366426743287 -o ./keys/
[+] Saved private key /home/user/privkey1.pem
Le script essaiera d'obtenir p et q en little et big endian.
Récupérer la SessionKey à partir de la réponse de l'étape 0 du C2 Covenant, utilisée pour chiffrer le trafic réseau :
$ python3 decrypt_covenant_traffic.py key -i traffic.txt --key "EQCZiHdmVUQzIhEAmYh3ZlVEMyIRAJmId2ZVRDMiEQA=" -t base64 -r mykey.pem -s 1
[+] New AES key : 0011223344556677889900112233445566778899001122334455667788990011
Déchiffrer la communication Covenant :
$ python3 decrypt_covenant_traffic.py decrypt -i traffic.txt -k "0011223344556677889900112233445566778899001122334455667788990011" -t hex -s 2
[...]
[*] Response message 10 : {"status":"2","output":"Hello.\r\n"}
[...]
extract_privatekey - Analyser un fichier brut.extract_privatekey - Rechercher les clés privées en fonction de l'en-tête (sans le module).Comme mentionné sur StackOverflow, le déchiffrement des données est également possible en utilisant la clé privée RSA brute de Microsoft.