
서명된 바이너리에 셸코드를 임베딩하고 AppDomain Manager 인젝션을 결합하여 레드 팀 페이로드에 대한 EDR/AV 탐지를 우회합니다.
지난 며칠 동안 AppDomain Manager injection 기법을 실험해보았고, 이전 Red Team 활동에서 특정 EDR을 상대로 꽤 성공적이었습니다. 이 방법은 초기 접근 벡터로 아주 좋지만, 셸코드를 다른 곳에 숨길 수 있는 POC를 공개하고 싶었습니다. 더 이상 셸코드가 포함된 DLL 파일은 없습니다!
이 기법은 단독으로 사용할 때는 훌륭하지만, ISO/ZIP/VHD/VHDX 파일 안에 C# ClickOnce를 전송하는 전달 기법과 결합될 때 문제가 발생합니다. 실제 문제는 10번 중 1번꼴로 앱도메인용 DLL이 AV/EDR의 AI/ML 휴리스틱에 탐지된다는 점입니다. 그 이유는 앱도메인을 초기화하기 전에 DLL 파일을 디스크에 드롭해야 하기 때문입니다. (.config의 UNC 경로를 통한 원격 DLL 로드는 일단 무시하고) 앱도메인용 DLL에는 셸코드가 포함되어 있어 정적 탐지의 원인이라고 강하게 느꼈습니다. 나머지 WINAPI 호출 코드는 동적으로 해석되고 꽤 잘 난독화될 수 있기 때문입니다.
저는 DLL이 초기에 보유하는 내용을 최소화하는 방향으로 이 기법을 개선하고자 했습니다. 암호화된 셸코드를 인젝터 DLL과 함께 별도 파일로 디스크에 드롭하는 것으로 시작했지만, Checkpoint의 Zloader 캠페인에 관한 훌륭한 블로그를 발견했습니다.
요약: PE 내 특정 필드에 서명을 손상시키지 않는 방식으로 임의의 데이터를 삽입할 수 있습니다. 따라서 데이터가 임베드되어도 exe는 여전히 디지털 서명된 상태로 유지됩니다.
More info on this - https://www.blackhat.com/docs/us-16/materials/us-16-Nipravsky-Certificate-Bypass-Hiding-And-Executing-Malware-From-A-Digitally-Signed-Executable-wp.pdf
따라서 아이디어는 암호화된 셸코드 스텁을 알려진 서명된 실행 파일에 삽입하고 Zloader 악성코드처럼 서명을 유지하는 것입니다. 이렇게 하면 AppDomain Manager DLL은 더 이상 셸코드를 자체적으로 포함하지 않고, 로드하는 PE 바이너리에서 셸코드를 추출하여 복호화하고 별도 스레드로 실행하는 로직만 갖게 됩니다. 이렇게 하면 DLL에 대한 정적 탐지율을 낮출 수 있는 반면, 셸코드는 서명된 바이너리 내에 안전하게 위치합니다.
저는 VirusTotal에서 얻은 ZLoader 샘플을 수동으로 조작하여 이를 시도했지만, 나중에 이러한 모든 기술을 꽤 잘 구현한 프로젝트인 Sigflip을 발견했습니다. 이 POC에서는 Sigflip의 로더 코드를 활용하여 AppDomain DLL을 구축하고 SigFlip 인젝터를 사용하여 암호화된 셸코드를 C# exe에 임베드했습니다.
Cobalt Strike의 Stageless 셸코드와 같은 대용량 셸코드 블롭이 더 이상 디스크의 서명되지 않은 DLL에 상주하지 않습니다. 사용된 난독화/인코딩 기술과 관계없이 말이죠. DLL은 더 깔끔하고, 작고, 최소한의 코드로 은밀해져 탐지 가능성이 줄어듭니다.
SigFlip.exe -i "Z:\ZLoader\CasPol.exe" "Z:\ZLoader\x64-stageless.bin" "Z:\ZLoader\update.exe" "S3cretK3y"update.exe라는 (Windows 서명된?) 바이너리를 갖게 됩니다. 이는 암호화된 셸코드가 내장된 디지털 서명 PE입니다.csc /target:library /out:test.dll test.cs이 POC는 완전히 다른 두 가지 방어 회피 기술을 결합하여 저와 다른 Red Teamer들이 운영을 위한 더 나은 초기 실행 페이로드를 구축하는 데 도움이 되도록 생각한 아이디어일 뿐입니다. 이 프로젝트는 AppDomain Manager Injection을 예시로 사용하지만, 이 아이디어는 DLL SideLoading, DLL Hijacking 등 다른 인젝션 기술에도 적용 가능합니다.
모든 크레딧은 med0x2e에게 있습니다. 이 POC는 그의 SigFlip 프로젝트를 기반으로 구축되었습니다.