
Entschlüsselt Covenant-C2-Kommunikation, indem RSA-Private Keys aus Minidumps extrahiert, AES-Sitzungsschlüssel wiederhergestellt und Netzwerk-Mitschnitte in Klartext umgewandelt werden.
CovenantDecryptor dient dazu, die Kommunikationsdaten des Covenant-Datenverkehrs zu entschlüsseln.
Die Extraktion des privaten Schlüssels aus dem Speicher ist auch auf andere C2 anwendbar, wie z. B. Empire, da dort
RSACryptoServiceProviderzur Erstellung des Schlüssels verwendet wird.
Die Initialisierung der Covenant-Kommunikation besteht aus 3 Stufen :
SetupAESKey verschlüsselt ist, welcher in einer schädlichen ausführbaren Datei eingebettet ist. Vor dem Senden formatiert er den Text wie in GruntHTTPStager beschrieben, wobei der Typ auf 0 gesetzt wird.SessionKey, der mit dem öffentlichen RSA-Schlüssel verschlüsselt ist, für die nachfolgende Kommunikation.SetupAESKey, um die Nachricht zu entschlüsseln, und nutzt dann den privaten RSA-Schlüssel, um den SessionKey zu entschlüsseln. Anschließend verschlüsselt er 4 zufällig generierte Bytes mit dem SessionKey und überträgt sie. Vor dem Senden formatiert er den Text wie in GruntHTTPStager beschrieben, wobei der Typ auf 1 gesetzt wird.SessionKey, fügt 4 zusätzliche zufällig generierte Bytes hinzu und überträgt die resultierenden 8 Bytes Daten an den infizierten Agenten.SessionKey. Anschließend prüft er, ob die ersten 4 Bytes mit den zuvor übertragenen Daten übereinstimmen, und überträgt die letzten 4 Bytes zurück an den C2. Vor dem Senden formatiert er den Text wie in GruntHTTPStager beschrieben, wobei der Typ auf 2 gesetzt wird.Sobald die Überprüfung abgeschlossen ist, können Daten ausgetauscht werden.
CovenantDecryptor besteht aus zwei Dienstprogrammen. Das Skript extract_privatekey extrahiert die Primzahlen p und q aus einer Minidump-Datei, um mithilfe des öffentlichen Modulus einen privaten RSA-Schlüssel zu konstruieren. Das Skript decrypt_covenant_traffic besteht aus den 3 Befehlen modulus, key und decrypt. Der erste Befehl extrahiert den Modulus aus der Covenant-Kommunikation, während der zweite den zur Verschlüsselung des Datenverkehrs verwendeten AES-Schlüssel wiederherstellt. Schließlich entschlüsselt der dritte Befehl den Datenverkehr.
Extrahiere den Modulus aus der Stage-0-Anfrage eines infizierten Hosts :
$ python3 decrypt_covenant_traffic.py modulus -i traffic.txt -k "EQCZiHdmVUQzIhEAmYh3ZlVEMyIRAJmId2ZVRDMiEQA=" -t base64
[+] Modulus:
19574201286059123715221634877085223155972629451020572575626246458715199192950082143183900970133840359007922584516900405154928253156404028820410452946729670930374022025730036806358075325420793866358986719444785030579682635785758091517397518826225327945861556948820837789390500920096562699893770094581497500786817915616026940285194220703907757879335069896978124429681515117633335502362832425521219599726902327020044791308869970455616185847823063474157292399830070541968662959133724209945293515201291844650765335146840662879479678554559446535460674863857818111377905454946004143554616401168150446865964806314366426743287
[+] Exponent: 65537
Ermittle den privaten RSA-Schlüssel aus einer Minidump-Datei eines infizierten Covenant-Prozesses :
$ python3 extract_privatekey.py -i memory.dmp -m 19574201286059123715221634877085223155972629451020572575626246458715199192950082143183900970133840359007922584516900405154928253156404028820410452946729670930374022025730036806358075325420793866358986719444785030579682635785758091517397518826225327945861556948820837789390500920096562699893770094581497500786817915616026940285194220703907757879335069896978124429681515117633335502362832425521219599726902327020044791308869970455616185847823063474157292399830070541968662959133724209945293515201291844650765335146840662879479678554559446535460674863857818111377905454946004143554616401168150446865964806314366426743287 -o ./keys/
[+] Saved private key /home/user/privkey1.pem
Das Skript versucht, p und q als Little- und Big-Endian zu ermitteln.
Stelle den SessionKey, der zur Verschlüsselung des Netzwerkverkehrs verwendet wird, aus der Stage-0-Antwort des Covenant-C2 wieder her :
$ python3 decrypt_covenant_traffic.py key -i traffic.txt --key "EQCZiHdmVUQzIhEAmYh3ZlVEMyIRAJmId2ZVRDMiEQA=" -t base64 -r mykey.pem -s 1
[+] New AES key : 0011223344556677889900112233445566778899001122334455667788990011
Entschlüssle die Covenant-Kommunikation :
$ 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 - Rohdatei parsen.extract_privatekey - Private Schlüssel anhand des Headers suchen (ohne den Modulus).Wie auf StackOverflow erwähnt, ist die Entschlüsselung von Daten auch mithilfe des rohen privaten RSA-Schlüssels von Microsoft möglich.