
메모리에 DLL과 EXE를 주입하기 위한 Excel 4.0 (XLM) 매크로 생성기.
| \ / / | | | _ __ | || _ \ ___ _ __ _ | | | | \ / | | | | | | ' | | | | |/ _ | ' | | | | | | | / \ || || |__| | | | || || | () | | | | || | | |_____//__|||| ||_|____/ _/|| ||_,|__| by @JoeLeonJr (@FortyNorthSec)
EXCELntDonut는 XLM(Excel 4.0) 매크로 생성기입니다. C# 소스 코드(EXE)로 시작하여 메모리에서 코드를 실행할 XLM(Excel 4.0) 매크로를 생성합니다. XLM(Excel 4.0) 매크로는 .XLS 파일에 저장할 수 있습니다.
chmod +x install.sh
./install.sh
설치되는 것은?
만약 EXCELntDonut을 Python 스크립트로만 실행하려면, "pandas"와 "donut-shellcode" 두 패키지가 포함된 가상 환경을 설정해야 합니다. 또한, apt-get install mono-complete를 실행하고 python3로 drive.py 스크립트를 호출해야 합니다. ./install.sh 배시 스크립트를 사용하는 것을 권장하지만, 선택은 여러분의 몫입니다.
사용법:
$ EXCELntDonut -f exe_source.cs -r System.Windows.Forms.dll --sandbox --obfuscate
플래그:
(필수)
-f C# 소스 코드 파일 경로 (EXE 전용)
-r C# 코드 컴파일에 필요한 참조 (Linux에서 mcs로 컴파일할 때와 동일)
(예: -r 'System.Management')
(선택)
-o 출력 파일 이름
--sandbox
기본적인 샌드박스 검사를 수행합니다. 새로운 접근 방식이 발견되면 업데이트됩니다.
--obfuscate
기본적인 매크로 난독화를 수행합니다.
C# 파일(예: Cobalt Strike 비콘 페이로드를 실행하는 Main 메서드가 있는 EXE)을 제공합니다. 해당 C# 파일은 MCS를 사용하여 x86 및 x64 두 개의 .NET 어셈블리로 컴파일됩니다. 컴파일 후, 훌륭한 도구인 Donut(x86용)과 CLRvoyance(x64용)가 각 어셈블리를 위치 독립적인 셸코드로 변환합니다. 다음으로, 모든 널바이트가 제거됩니다. XLM(Excel 4.0) 매크로는 널바이트와 잘 작동하지 않으며, 페이로드는 255자(x86) 또는 10자(x64) 이하의 라인으로 분할됩니다.
셸코드가 준비되면, 기본적인 프로세스 인젝션 함수(VirtualAlloc, WriteProcessMemory, CreateThread)와 대상 시스템에서 실행할 페이로드(x86 또는 x64)를 결정하는 아키텍처 검사 함수와 결합됩니다. 샌드박스 검사 또는 기본 난독화를 실행하기로 선택하면 해당 함수들이 매크로를 업데이트합니다. 마지막으로, 출력은 CSV 파일(.txt로 저장됨)에 저장됩니다.
EXCELntDonut에서 출력 파일을 받은 후, 텍스트 편집기에서 출력 파일을 열고 전체를 복사합니다(Ctrl-A, Ctrl-C). Windows VM에서 Excel을 열고, "Sheet 1"을 마우스 오른쪽 버튼으로 클릭한 후 "삽입"을 선택합니다. "MS Excel 4.0 매크로"를 선택합니다. 셀 A1로 이동하여 EXCELntDonut 출력을 붙여넣습니다. 모든 데이터는 한 열에 붙여넣어질 가능성이 높습니다. 데이터는 세미콜론 ";"으로 구분됩니다. "데이터" 탭으로 이동하여 "텍스트 나누기"를 클릭합니다. "구분 기호로 분리됨"을 선택하고 다음 화면에서 "세미콜론"을 선택한 후 "마침"을 클릭합니다. 매크로가 적절한 열과 행으로 분산됩니다.
(참고 - "--obfuscate" 플래그를 선택한 경우, 난독화 로직의 일부로 매크로가 워크시트의 임의의 섹션으로 이동되므로 실제 코드를 찾으려면 가로로 꽤 스크롤해야 합니다.)
이 시점에서 두 가지를 권장합니다:
파일(.xls)을 저장하고 열어보십시오. 페이로드가 자동으로 실행되어야 합니다.
이 검사들은 실제 위협 행위자들이 멀웨어에서 사용하는 것을 기반으로 합니다.
=FORMULA(D3&D23&D54&D23&D44,E45)
FORMULA 함수를 사용하면 나중에 실행할 수 있는 수식을 다른 셀에 배치할 수 있습니다. 따라서 이 경우 프로세스 인젝션 명령을 넣고 FORMULA 함수를 사용하여 실제 함수를 실행할 다른 셀에 배치합니다. 이렇게 하면 방어자가 정적 분석을 통해 "VirtualAlloc"과 같은 내용을 보지 못하게 됩니다.
root@excelntdonut-test:/opt# EXCELntDonut -f test.cs
_______ ______ _____ _ _ ____ _
| ____\ \/ / ___| ____| | _ __ | |_| _ \ ___ _ __ _ _| |_
| _| \ / | | _| | | | '_ \| __| | | |/ _ \| '_ \| | | | __|
| |___ / \ |___| |___| |___| | | | |_| |_| | (_) | | | | |_| | |_
|_____/_/\_\____|_____|_____|_| |_|\__|____/ \___/|_| |_|\__,_|\__|
by @JoeLeonJr (@FortyNorthSec)
[i] x86 .NET 어셈블리 생성 중.
warning CS8001: SDK 경로를 확인할 수 없습니다.
test.cs(2,14): error CS0234: 'System' 네임스페이스에 'Management' 형식 또는 네임스페이스 이름이 존재하지 않습니다. 어셈블리 참조가 누락되었습니까?
이 오류는 대부분 mono를 사용한 컴파일 중 참조 어셈블리가 누락되었음을 의미합니다. 해결하려면 -r 플래그에 언급된 네임스페이스를 전달하면 됩니다. 이 경우 명령줄에 -r 'System.Management'를 추가합니다. 새 명령은 다음과 같습니다:
root@excelntdonut-test:/opt# EXCELntDonut -f test.cs -r 'System.Management'
root@excelntdonut-test:/opt# EXCELntDonut -f test.cs -r System.Management
_______ ______ _____ _ _ ____ _
| ____\ \/ / ___| ____| | _ __ | |_| _ \ ___ _ __ _ _| |_
| _| \ / | | _| | | | '_ \| __| | | |/ _ \| '_ \| | | | __|
| |___ / \ |___| |___| |___| | | | |_| |_| | (_) | | | | |_| | |_
|_____/_/\_\____|_____|_____|_| |_|\__|____/ \___/|_| |_|\__,_|\__|
by @JoeLeonJr (@FortyNorthSec)
[i] x86 .NET 어셈블리 생성 중.
warning CS8001: SDK 경로를 확인할 수 없습니다.
error CS0006: 메타데이터 파일 'System.Management'을(를) 찾을 수 없습니다.
[x] MCS를 사용한 x86 .NET 어셈블리 생성 중 오류 발생. 위의 오류 메시지를 참조하십시오.
이 오류는 install.sh 배시 스크립트를 사용하지 않고 EXCELntDonut을 실행할 때만 발생합니다. 그런 경우 직접 mono-complete를 수동으로 설치해야 합니다. 이렇게 하면 관련 종속성이 다운로드됩니다. 다음과 같이 apt를 사용하여 설치할 수 있습니다:
apt-get install mono-complete
root@kali:~/Desktop# EXCELntDonut -f test.cs
_______ ______ _____ _ _ ____ _
| ____\ \/ / ___| ____| | _ __ | |_| _ \ ___ _ __ _ _| |_
| _| \ / | | _| | | | '_ \| __| | | |/ _ \| '_ \| | | | __|
| |___ / \ |___| |___| |___| | | | |_| |_| | (_) | | | | |_| | |_
|_____/_/\_\____|_____|_____|_| |_|\__|____/ \___/|_| |_|\__,_|\__|
by @JoeLeonJr (@FortyNorthSec)
[i] x86 .NET 어셈블리 생성 중.
error CS5001: 프로그램 '_excelntdonut_GJAoNuVPMcX.exe'에 진입점에 적합한 정적 'Main' 메서드가 포함되어 있지 않습니다.
[x] MCS를 사용한 x86 .NET 어셈블리 생성 중 오류 발생. 위의 오류 메시지를 참조하십시오.
현재 EXCELntDonut는 Main 함수에 페이로드가 있는 C# 파일만 허용합니다.
@InQuest의 Yara 규칙 몇 가지:
매우 숨겨진 시트 찾기
https://github.com/InQuest/yara-rules/blob/master/Excel_Hidden_Macro_Sheet.rule
Auto_Open 문자열 찾기
https://github.com/Neo23x0/signature-base/blob/master/yara/general_officemacros.yar
XLM 파일을 검토하는 데 OLEDUMP.py를 사용하는 게시물이 많습니다. 다음 게시물을 참조하십시오:
https://clickallthethings.wordpress.com/2020/04/06/covid-19-excel-4-0-macros-and-sandbox-detection/
Outflank(@outflanknl) 분들의 훌륭한 작업 덕분에 이 프로젝트가 우리의 레이더에 들어오지 않았을 것입니다. 이 프로젝트의 통찰력을 제공해 주신 @StanHacked에게 특별히 감사드립니다. 또한, 이 프로젝트는 Donut(@TheWover 및 @odzhan)과 관련 Python 라이브러리(@byt3bl33d3r) 없이는 불가능했을 것입니다. 관련하여 Accenture 팀은 CLRvoyance를 만들어 Donut + XLM 4.0 매크로로 해결할 수 없었던 x64 문제를 해결했습니다. 마지막으로, XLM 매크로를 64비트 Excel과 호환되도록 만드는 멋진 연구를 해주신 Cybereason의 Philip Tsukerman에게 감사드립니다.
우리는 이 도구의 오용에 대해 책임을 지지 않습니다. 이 도구는 교육 및 승인된 테스트 목적으로, C# 소스 코드가 XLM(Excel 4.0) 매크로를 사용하여 메모리에 인젝션될 수 있는 방법을 시연하기 위해 생성되었습니다. 이 프로젝트의 궁극적인 목표는 (1) 레드 팀에게 실제 적들이 현재 사용하는 것을 모방할 수 있는 또 다른 피싱 페이로드 옵션을 제공하고, (2) 방어자에게 분석 및 완화 조치를 구축하기 위한 참조 프레임워크를 제공하는 것입니다. 이 유형의 페이로드를 신속하게 생성할 수 있는 도구가 없다면, 방어자들이 실제로 다가올 위협에 적절히 대비하지 못할 것이라고 생각합니다. 책임감 있게 행동해 주십시오.
이 폴더에 있는 라이선스 파일을 참조하십시오. 이 도구는 Donut 및 CLRvoyance를 포함한 두 개의 다른 오픈 소스 도구를 통합하고 있습니다.