
Covenant C2 통신을 해독하여 미니덤프에서 RSA 개인 키를 추출하고, AES 세션 키를 복구하며, 네트워크 캡처를 평문으로 변환합니다.
CovenantDecryptor는 Covenant 트래픽의 통신 데이터를 복호화하도록 설계되었습니다.
메모리에서 개인 키를 추출하는 방법은
RSACryptoServiceProvider를 사용하여 키를 생성하는 특성상 Empire와 같은 다른 C2에도 적용할 수 있습니다.
Covenant 통신 초기화는 3단계로 구성됩니다 :
SetupAESKey로 암호화된 공개 키를 전송하여 RSA 세션을 시작합니다. 전송하기 전에 GruntHTTPStager에 설명된 대로 텍스트를 형식화하고 type을 0으로 설정합니다.SessionKey를 전송합니다.SetupAESKey를 사용하여 메시지를 복호화한 다음, RSA 개인 키를 사용하여 SessionKey를 복호화합니다. 그 후 무작위로 생성된 4바이트를 SessionKey로 암호화하여 전송합니다. 전송하기 전에 GruntHTTPStager에 설명된 대로 텍스트를 형식화하고 type을 1로 설정합니다.SessionKey를 사용하여 4바이트를 복호화하고, 무작위로 생성된 4바이트를 추가하여 결과 8바이트 데이터를 감염된 에이전트에게 전송합니다.SessionKey로 8바이트를 복호화합니다. 그런 다음 첫 번째 4바이트가 이전에 전송한 데이터와 일치하는지 확인하고, 마지막 4바이트를 C2로 다시 전송합니다. 전송하기 전에 GruntHTTPStager에 설명된 대로 텍스트를 형식화하고 type을 2로 설정합니다.검증이 완료되면 데이터를 교환할 수 있습니다.
CovenantDecryptor는 두 가지 유틸리티로 구성됩니다. extract_privatekey 스크립트는 미니덤프 파일에서 p와 q 소수를 검색하여 공개 모듈러스를 사용해 RSA 개인 키를 구성합니다. decrypt_covenant_traffic 스크립트는 modulus, key, decrypt의 3가지 명령으로 구성됩니다. 첫 번째 명령은 Covenant 통신에서 모듈러스를 추출하고, 두 번째 명령은 데이터 트래픽을 암호화하는 데 사용되는 AES 키를 복구합니다. 마지막으로 세 번째 명령은 트래픽을 복호화합니다.
감염된 호스트의 stage 0 요청에서 모듈러스를 추출합니다 :
$ python3 decrypt_covenant_traffic.py modulus -i traffic.txt -k "EQCZiHdmVUQzIhEAmYh3ZlVEMyIRAJmId2ZVRDMiEQA=" -t base64
[+] Modulus:
19574201286059123715221634877085223155972629451020572575626246458715199192950082143183900970133840359007922584516900405154928253156404028820410452946729670930374022025730036806358075325420793866358986719444785030579682635785758091517397518826225327945861556948820837789390500920096562699893770094581497500786817915616026940285194220703907757879335069896978124429681515117633335502362832425521219599726902327020044791308869970455616185847823063474157292399830070541968662959133724209945293515201291844650765335146840662879479678554559446535460674863857818111377905454946004143554616401168150446865964806314366426743287
[+] Exponent: 65537
감염된 Covenant 프로세스의 미니덤프 파일에서 RSA 개인 키를 검색합니다 :
$ python3 extract_privatekey.py -i memory.dmp -m 19574201286059123715221634877085223155972629451020572575626246458715199192950082143183900970133840359007922584516900405154928253156404028820410452946729670930374022025730036806358075325420793866358986719444785030579682635785758091517397518826225327945861556948820837789390500920096562699893770094581497500786817915616026940285194220703907757879335069896978124429681515117633335502362832425521219599726902327020044791308869970455616185847823063474157292399830070541968662959133724209945293515201291844650765335146840662879479678554559446535460674863857818111377905454946004143554616401168150446865964806314366426743287 -o ./keys/
[+] Saved private key /home/user/privkey1.pem
스크립트는 p와 q를 little endian과 big endian 방식으로 모두 가져오려고 시도합니다.
Covenant C2의 stage 0 응답에서 SessionKey를 복구하여 네트워크 트래픽을 암호화합니다 :
$ python3 decrypt_covenant_traffic.py key -i traffic.txt --key "EQCZiHdmVUQzIhEAmYh3ZlVEMyIRAJmId2ZVRDMiEQA=" -t base64 -r mykey.pem -s 1
[+] New AES key : 0011223344556677889900112233445566778899001122334455667788990011
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 - 원시 파일 파싱.extract_privatekey - 헤더 기반 개인 키 검색(모듈러스 없이).StackOverflow에 언급된 바와 같이, 원시 Microsoft RSA 개인 키를 사용하여 데이터를 복호화하는 것도 가능합니다.