
Descriptografa as comunicações do Covenant C2 extraindo chaves privadas RSA de minidumps, recuperando chaves de sessão AES e convertendo capturas de rede em texto simples.
CovenantDecryptor é projetado para descriptografar os dados de comunicação do tráfego Covenant.
A extração da chave privada da memória é aplicável a outros C2, como Empire, dado o seu uso do
RSACryptoServiceProviderpara criar a chave.
A inicialização da comunicação Covenant consiste em 3 estágios :
SetupAESKey, que está embutida em um executável malicioso. Antes de enviar, ele formata o texto conforme descrito em GruntHTTPStager com o tipo definido como 0.SessionKey, criptografada com a chave pública RSA, para comunicação subsequente.SetupAESKey para descriptografar a mensagem e, em seguida, utiliza a chave privada RSA para descriptografar a SessionKey. Depois, ele criptografa 4 bytes gerados aleatoriamente com a SessionKey e os transmite. Antes de enviar, ele formata o texto conforme descrito em GruntHTTPStager com o tipo definido como 1.SessionKey, acrescenta 4 bytes adicionais gerados aleatoriamente e transfere os 8 bytes resultantes para o agente infectado.SessionKey. Subsequentemente, ele verifica se os primeiros 4 bytes correspondem aos dados que ele havia transmitido anteriormente e prossegue transferindo os últimos 4 bytes de volta ao C2. Antes de enviar, ele formata o texto conforme descrito em GruntHTTPStager com o tipo definido como 2.Uma vez que a verificação é concluída, os dados podem ser trocados.
CovenantDecryptor é composto por dois utilitários. O script extract_privatekey recupera os primos p e q de um arquivo minidump para construir uma chave privada RSA empregando o módulo público. O script decrypt_covenant_traffic consiste em 3 comandos modulus, key e decrypt. O primeiro comando extrai o módulo da comunicação Covenant, enquanto o segundo recupera a chave AES usada para criptografar o tráfego de dados. Por último, o terceiro comando descriptografa o tráfego.
Extraia o módulo da solicitação do estágio 0 de um host infectado :
$ python3 decrypt_covenant_traffic.py modulus -i traffic.txt -k "EQCZiHdmVUQzIhEAmYh3ZlVEMyIRAJmId2ZVRDMiEQA=" -t base64
[+] Modulus:
19574201286059123715221634877085223155972629451020572575626246458715199192950082143183900970133840359007922584516900405154928253156404028820410452946729670930374022025730036806358075325420793866358986719444785030579682635785758091517397518826225327945861556948820837789390500920096562699893770094581497500786817915616026940285194220703907757879335069896978124429681515117633335502362832425521219599726902327020044791308869970455616185847823063474157292399830070541968662959133724209945293515201291844650765335146840662879479678554559446535460674863857818111377905454946004143554616401168150446865964806314366426743287
[+] Exponent: 65537
Recupere a chave privada RSA de um arquivo minidump de um processo Covenant infectado :
$ python3 extract_privatekey.py -i memory.dmp -m 19574201286059123715221634877085223155972629451020572575626246458715199192950082143183900970133840359007922584516900405154928253156404028820410452946729670930374022025730036806358075325420793866358986719444785030579682635785758091517397518826225327945861556948820837789390500920096562699893770094581497500786817915616026940285194220703907757879335069896978124429681515117633335502362832425521219599726902327020044791308869970455616185847823063474157292399830070541968662959133724209945293515201291844650765335146840662879479678554559446535460674863857818111377905454946004143554616401168150446865964806314366426743287 -o ./keys/
[+] Saved private key /home/user/privkey1.pem
O script tentará obter p e q como little e big endian.
Recupere a SessionKey da resposta do estágio 0 do C2 Covenant, que é empregada para criptografar o tráfego de rede :
$ python3 decrypt_covenant_traffic.py key -i traffic.txt --key "EQCZiHdmVUQzIhEAmYh3ZlVEMyIRAJmId2ZVRDMiEQA=" -t base64 -r mykey.pem -s 1
[+] New AES key : 0011223344556677889900112233445566778899001122334455667788990011
Descriptografe a comunicação 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 - Analisar arquivo bruto.extract_privatekey - Procurar chaves privadas com base no cabeçalho (sem o módulo).Como mencionado no StackOverflow, a descriptografia de dados também é alcançável utilizando a chave privada RSA bruta da Microsoft.