
Decifra le comunicazioni Covenant C2 estraendo le chiavi private RSA dai minidump, recuperando le chiavi di sessione AES e convertendo le catture di rete in testo in chiaro.
CovenantDecryptor è progettato per decrittare i dati di comunicazione del traffico Covenant.
L'estrazione della chiave privata dalla memoria è applicabile ad altri C2, come Empire, dato il suo utilizzo di
RSACryptoServiceProviderper creare la chiave.
L'inizializzazione della comunicazione Covenant consiste in 3 fasi :
SetupAESKey, che è incorporata in un eseguibile dannoso. Prima dell'invio, formatta il testo come descritto in GruntHTTPStager con il tipo impostato a 0.SessionKey, crittografata con la chiave pubblica RSA, per le comunicazioni successive.SetupAESKey per decrittare il messaggio e poi sfrutta la chiave privata RSA per decrittare la SessionKey. Successivamente, crittografa 4 byte generati casualmente con la SessionKey e li trasmette. Prima dell'invio, formatta il testo come descritto in GruntHTTPStager con il tipo impostato a 1.SessionKey, aggiunge 4 byte aggiuntivi generati casualmente e trasferisce gli 8 byte risultanti all'agente infetto.SessionKey. Successivamente, verifica se i primi 4 byte corrispondono ai dati precedentemente trasmessi e procede a trasferire gli ultimi 4 byte al C2. Prima dell'invio, formatta il testo come descritto in GruntHTTPStager con il tipo impostato a 2.Una volta completata la verifica, i dati possono essere scambiati.
CovenantDecryptor è composto da due utilità. Lo script extract_privatekey recupera i primi p e q da un file minidump per costruire una chiave privata RSA utilizzando il modulo pubblico. Lo script decrypt_covenant_traffic è composto da 3 comandi: modulus, key e decrypt. Il primo comando estrae il modulo dalla comunicazione Covenant, mentre il secondo recupera la chiave AES utilizzata per crittografare il traffico dati. Infine, il terzo comando decritta il traffico.
Estrai il modulo dalla richiesta dello stage 0 di un host infetto :
$ python3 decrypt_covenant_traffic.py modulus -i traffic.txt -k "EQCZiHdmVUQzIhEAmYh3ZlVEMyIRAJmId2ZVRDMiEQA=" -t base64
[+] Modulus:
19574201286059123715221634877085223155972629451020572575626246458715199192950082143183900970133840359007922584516900405154928253156404028820410452946729670930374022025730036806358075325420793866358986719444785030579682635785758091517397518826225327945861556948820837789390500920096562699893770094581497500786817915616026940285194220703907757879335069896978124429681515117633335502362832425521219599726902327020044791308869970455616185847823063474157292399830070541968662959133724209945293515201291844650765335146840662879479678554559446535460674863857818111377905454946004143554616401168150446865964806314366426743287
[+] Exponent: 65537
Recupera la chiave privata RSA da un file minidump di un processo Covenant infetto :
$ python3 extract_privatekey.py -i memory.dmp -m 19574201286059123715221634877085223155972629451020572575626246458715199192950082143183900970133840359007922584516900405154928253156404028820410452946729670930374022025730036806358075325420793866358986719444785030579682635785758091517397518826225327945861556948820837789390500920096562699893770094581497500786817915616026940285194220703907757879335069896978124429681515117633335502362832425521219599726902327020044791308869970455616185847823063474157292399830070541968662959133724209945293515201291844650765335146840662879479678554559446535460674863857818111377905454946004143554616401168150446865964806314366426743287 -o ./keys/
[+] Saved private key /home/user/privkey1.pem
Lo script proverà a ottenere p e q come little e big endian.
Recupera la SessionKey dalla risposta dello stage 0 del C2 Covenant, utilizzata per crittografare il traffico di rete :
$ python3 decrypt_covenant_traffic.py key -i traffic.txt --key "EQCZiHdmVUQzIhEAmYh3ZlVEMyIRAJmId2ZVRDMiEQA=" -t base64 -r mykey.pem -s 1
[+] New AES key : 0011223344556677889900112233445566778899001122334455667788990011
Decritta la comunicazione 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 - Analizza il file raw.extract_privatekey - Cerca chiavi private in base all'header (senza il modulo).Come menzionato su StackOverflow, la decrittazione dei dati è ottenibile anche utilizzando la chiave privata RSA Microsoft raw.