
Descifra las comunicaciones de Covenant C2 extrayendo claves privadas RSA de minidumps, recuperando claves de sesión AES y convirtiendo las capturas de red en texto plano.
CovenantDecryptor está diseñado para descifrar los datos de comunicación del tráfico de Covenant.
La extracción de la clave privada de la memoria es aplicable a otros C2, como Empire, dado su uso de
RSACryptoServiceProviderpara crear la clave.
La inicialización de la comunicación de Covenant consta de 3 etapas:
SetupAESKey, que está incrustada en un ejecutable malicioso. Antes de enviarla, formatea el texto como se describe en GruntHTTPStager con el tipo establecido en 0.SessionKey, cifrada con la clave pública RSA, para la comunicación posterior.SetupAESKey para descifrar el mensaje y luego emplea la clave privada RSA para descifrar la SessionKey. Después, cifra 4 bytes generados aleatoriamente con la SessionKey y los transmite. Antes de enviarlos, formatea el texto como se describe en GruntHTTPStager con el tipo establecido en 1.SessionKey, añade 4 bytes adicionales generados aleatoriamente y transfiere los 8 bytes resultantes al agente infectado.SessionKey. Posteriormente, comprueba si los primeros 4 bytes coinciden con los datos que había transmitido previamente y transfiere los últimos 4 bytes de vuelta al C2. Antes de enviarlos, formatea el texto como se describe en GruntHTTPStager con el tipo establecido en 2.Una vez completada la verificación, se pueden intercambiar datos.
CovenantDecryptor se compone de dos utilidades. El script extract_privatekey recupera los primos p y q de un archivo minidump para construir una clave privada RSA empleando el módulo público. El script decrypt_covenant_traffic consta de 3 comandos: modulus, key y decrypt. El primer comando extrae el módulo de la comunicación de Covenant, mientras que el segundo recupera la clave AES utilizada para cifrar el tráfico de datos. Por último, el tercer comando descifra el tráfico.
Extrae el módulo de la solicitud de la etapa 0 de un host infectado:
$ python3 decrypt_covenant_traffic.py modulus -i traffic.txt -k "EQCZiHdmVUQzIhEAmYh3ZlVEMyIRAJmId2ZVRDMiEQA=" -t base64
[+] Modulus:
19574201286059123715221634877085223155972629451020572575626246458715199192950082143183900970133840359007922584516900405154928253156404028820410452946729670930374022025730036806358075325420793866358986719444785030579682635785758091517397518826225327945861556948820837789390500920096562699893770094581497500786817915616026940285194220703907757879335069896978124429681515117633335502362832425521219599726902327020044791308869970455616185847823063474157292399830070541968662959133724209945293515201291844650765335146840662879479678554559446535460674863857818111377905454946004143554616401168150446865964806314366426743287
[+] Exponent: 65537
Recupera la clave privada RSA de un archivo minidump de un proceso Covenant infectado:
$ python3 extract_privatekey.py -i memory.dmp -m 19574201286059123715221634877085223155972629451020572575626246458715199192950082143183900970133840359007922584516900405154928253156404028820410452946729670930374022025730036806358075325420793866358986719444785030579682635785758091517397518826225327945861556948820837789390500920096562699893770094581497500786817915616026940285194220703907757879335069896978124429681515117633335502362832425521219599726902327020044791308869970455616185847823063474157292399830070541968662959133724209945293515201291844650765335146840662879479678554559446535460674863857818111377905454946004143554616401168150446865964806314366426743287 -o ./keys/
[+] Saved private key /home/user/privkey1.pem
El script intentará obtener p y q tanto en little como en big endian.
Recupera la SessionKey de la respuesta de la etapa 0 del C2 de Covenant, que se emplea para cifrar el tráfico de red:
$ python3 decrypt_covenant_traffic.py key -i traffic.txt --key "EQCZiHdmVUQzIhEAmYh3ZlVEMyIRAJmId2ZVRDMiEQA=" -t base64 -r mykey.pem -s 1
[+] New AES key : 0011223344556677889900112233445566778899001122334455667788990011
Descifra la comunicación de 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 - Analizar el archivo sin formato.extract_privatekey - Buscar claves privadas basándose en el encabezado (sin el módulo).Como se menciona en StackOverflow, el descifrado de datos también se puede lograr utilizando la clave privada RSA de Microsoft en bruto.