
자동 스캐너로, Windows 실행 파일에서 DLL 검색 순서 하이재킹 후보를 발견합니다. 임포트 테이블 파싱, 런타임 모듈 열거, Microsoft Detours를 통한 API 후킹 기능을 제공합니다.
DLL Hijack SCanner - DLL 검색 순서 하이재킹 후보를 자동으로 발견하고 리드를 생성하는 도구
이 저장소에는 도구(DLLHSC)의 Visual Studio 프로젝트 파일, API 후킹 기능(detour)의 프로젝트 파일, 페이로드의 프로젝트 파일, 그리고 x86 및 x64 아키텍처용으로 컴파일된 실행 파일(이 저장소의 릴리스 섹션에 있음)이 포함되어 있습니다. 코드는 Visual Studio Community 2019로 작성 및 컴파일되었습니다.
소스에서 도구를 컴파일하려면 DLLHSC, detour 및 payload 프로젝트를 컴파일해야 합니다. DLLHSC는 이 도구의 핵심 기능을 구현합니다. detour 프로젝트는 API를 후킹하는 데 사용되는 DLL을 생성합니다. 그리고 payload 프로젝트는 검사 대상 실행 파일이 검색 순서 하이재킹을 통해 로드할 수 있는지 확인하기 위한 개념 증명으로 사용되는 DLL을 생성합니다. 생성된 페이로드는 DLLHSC 및 detour와 같은 디렉터리에 배치되어야 하며, x86 아키텍처의 경우 payload32.dll, x64 아키텍처의 경우 payload64.dll로 이름을 지정해야 합니다.
도구는 아래 설명된 3가지 작동 모드를 구현합니다.
실행 파일 이미지를 메모리에 로드하고, Import 테이블을 파싱한 다음, Import 테이블에서 참조된 모든 DLL을 페이로드 DLL로 대체합니다.
도구는 애플리케이션 디렉터리에, 애플리케이션 디렉터리에 존재하지 않고, WinSxS에 속하지 않으며, KnownDLLs에 속하지 않는 모듈(DLL)만 배치합니다.
페이로드 DLL은 실행 시 다음 경로에 파일을 생성합니다: C:\Users\%USERNAME%\AppData\Local\Temp\DLLHSC.tmp. 이는 실행 증거로 사용됩니다. 도구는 애플리케이션을 실행하고, 임시 파일이 존재하는지 확인하여 페이로드 DLL이 실행되었는지 보고합니다. 일부 실행 파일은 로드하는 DLL에서 함수를 가져오므로, 제공된 DLL이 해당 함수를 내보내지 못하여 제공된 이미지의 종속성을 충족하지 못할 경우 오류 메시지 상자가 나타날 수 있습니다. 그러나 메시지 상자는 종속성이 충족되면 DLL이 페이로드 실행에 적합한 후보가 될 수 있음을 나타냅니다. 이 경우 추가 분석이 필요합니다. 이러한 메시지 상자의 제목에는 Ordinal Not Found 또는 Entry Point Not Found 문자열이 포함될 수 있습니다. DLLHSC는 이러한 문자열이 포함된 창을 찾아서, 나타나는 즉시 닫고 결과를 보고합니다.
제공된 실행 파일 이미지로 프로세스를 생성하고, 이 프로세스의 주소 공간에 로드된 모듈을 열거한 후 필터를 적용하여 결과를 보고합니다.
도구는 System 디렉터리에서 로드되었지만 KnownDLLs에 속하지 않는 모듈만 보고합니다. 결과는 추가 분석이 필요한 리드입니다. 분석가는 보고된 모듈을 애플리케이션 디렉터리에 배치한 후 애플리케이션이 대신 제공된 모듈을 로드하는지 확인할 수 있습니다.
Microsoft Detours를 통해 LoadLibrary 및 LoadLibraryEx API를 후킹하고 런타임에 로드된 모듈을 보고합니다.
검사 대상 애플리케이션이 LoadLibrary 및 LoadLibraryEx를 호출할 때마다 도구는 호출을 가로채서 요청된 모듈을 C:\Users\%USERNAME%\AppData\Local\Temp\DLLHSCRTLOG.tmp 파일에 기록합니다. LoadLibraryEx가 LOAD_LIBRARY_SEARCH_SYSTEM32 플래그와 함께 특별히 호출된 경우 파일에 출력이 기록되지 않습니다. 모든 가로채기가 완료되면 도구는 파일을 읽고 결과를 출력합니다. 추가 분석에 관심이 있는 모듈은 KnownDLLs 레지스트리 키에 존재하지 않는 모듈, System 디렉터리에 존재하지 않는 모듈, 전체 경로가 없는 모듈(이러한 모듈의 경우 로더가 일반 검색 순서를 적용합니다)입니다.
소스에서 도구를 컴파일하기로 선택한 경우 Visual Studio Community 2019에서 컴파일하는 것이 좋습니다. 도구가 제대로 작동하려면 DLLHSC, detour 및 payload 프로젝트가 동일한 아키텍처로 컴파일된 후 동일한 디렉터리에 배치되어야 합니다. payload 프로젝트에서 생성된 DLL은 32비트 아키텍처의 경우 payload32.dll로, 64비트 아키텍처의 경우 payload64.dll로 이름을 바꿔야 합니다.
이 애플리케이션의 도움말 메뉴
NAME
dllhsc - DLL Hijack SCanner
SYNOPSIS
dllhsc.exe -h
dllhsc.exe -e <executable image path> (-l|-lm|-rt) [-t seconds]
DESCRIPTION
DLLHSC scans a given executable image for DLL Hijacking and reports the results
It requires elevated privileges
OPTIONS
-h, --help
display this help menu and exit
-e, --executable-image
executable image to scan
-l, --lightweight
parse the import table, attempt to launch a payload and report the results
-lm, --list-modules
list loaded modules that do not exist in the application's directory
-rt, --runtime-load
display modules loaded in run-time by hooking LoadLibrary and LoadLibraryEx APIs
-t, --timeout
number of seconds to wait for checking any popup error windows - defaults to 10 seconds
이 섹션에서는 DLLHSC를 실행하는 방법과 보고되는 결과에 대한 예제를 제공합니다. 이를 위해 합법적인 Microsoft 유틸리티 OleView.exe (MD5: D1E6767900C85535F300E08D76AAC9AB)가 사용되었습니다. 더 나은 결과를 위해 제공된 실행 파일 이미지를 설치 디렉터리 내에서 스캔하는 것이 좋습니다.
-l 플래그는 제공된 실행 파일의 Import 테이블을 파싱하고, 필터를 적용하며, 애플리케이션의 현재 디렉터리에 페이로드 DLL을 배치하여 가져온 모듈을 무기화하려고 시도합니다. 스캔된 실행 파일은 페이로드 DLL에 대한 종속성(내보낸 함수)이 충족되지 않을 때 오류 상자를 표시할 수 있습니다. 이 경우 오류 메시지 상자가 나타납니다. DLLHSC는 기본적으로 메시지 상자가 열렸는지 10초 동안 확인하거나 사용자가 -t 플래그로 지정한 시간(초) 동안 확인합니다. 오류 메시지 상자는 종속성이 충족되면 모듈을 무기화할 수 있음을 나타냅니다.
다음 스크린샷은 OleView.dll이 페이로드 DLL을 로드할 때 생성된 오류 메시지 상자를 보여줍니다:

도구는 최대 10초 또는 -t초 동안 기다려 프로세스 초기화가 완료되고 메시지 상자가 생성되었는지 확인합니다. 그런 다음 메시지 상자를 감지하고 닫은 후 결과를 보고합니다:

-lm 플래그는 제공된 실행 파일을 실행하고, KnownDLLs 목록에도 WinSxS 종속성에도 속하지 않는 로드된 모듈을 출력합니다. 이 모드는 페이로드로 사용될 수 있는 DLL에 대한 아이디어를 제공하기 위한 것이며, 분석가를 위한 리드를 생성하기 위해서만 존재합니다.

-rt 플래그는 제공된 실행 파일 이미지가 프로세스로 시작될 때 주소 공간에 로드하는 모듈을 출력합니다. 이는 Microsoft Detours를 통해 LoadLibrary 및 LoadLibraryEx API를 후킹하여 달성됩니다.

이 도구에 대한 피드백은 GitHub Issues 섹션을 이용해 주십시오.