메모리 포렌식

2025. 2. 26. 03:28STUDY/forensics

320x100

-- 해당 내용은 드림핵의 디지털 포렌식 로드맵 강의를 정리한 내용입니다. --

 

 

아래의 실습을 진행할 도구는 가장 많이 사용되는 메모리 포렌식 도구인 Volatility 입니다.

아래 깃헙 링크에서 해당 도구를 다운받을 수 있습니다.

https://github.com/volatilityfoundation/volatility3

 

GitHub - volatilityfoundation/volatility3: Volatility 3.0 development

Volatility 3.0 development. Contribute to volatilityfoundation/volatility3 development by creating an account on GitHub.

github.com


 

실습 목표 : 메모리 덤프를 수행할 때 사용자는 무엇을 하고 있었나?

아래의 실습을 통해 메모리 덤프를 수행할 때 사용자가 무엇을 하고 있었는지 파악하기 위한 분석을 수행했습니다.

 

 

volatility를 실행했을 때 아래와 같이 출력되면 정상입니다.

/mnt/c/forensics/LAB0$ python3 /mnt/c/Tools/volatility3/vol.py
Volatility 3 Framework 2.16.0
usage: vol.py [-h] [-c CONFIG] [--parallelism [{processes,threads,off}]] [-e EXTEND] [-p PLUGIN_DIRS] [-s SYMBOL_DIRS]
              [-v] [-l LOG] [-o OUTPUT_DIR] [-q] [-r RENDERER] [-f FILE] [--write-config] [--save-config SAVE_CONFIG]
              [--clear-cache] [--cache-path CACHE_PATH] [--offline | -u URL] [--filters FILTERS
              [--hide-columns [HIDE_COLUMNS ...]] [--single-location SINGLE_LOCATION] [--stackers [STACKERS ...]]     
              [--single-swap-locations [SINGLE_SWAP_LOCATIONS ...]]                                                                   
PLUGIN ...                                                                                                
vol.py: error: Please select a plugin to run (see 'vol.py --help' for options

 

1. 프로세스 목록 확인

windows.pstree 플러그인으로 부모 프로세스와 자식 프로세스의 관계를 직접적으로 확인합니다.

해당 플러그인은 자식 프로세스가 * 표시를 기준으로 표시됩니다.

명령어 설명
-c --save-config config.json 옵션으로 저장한 config를 불러오는 옵션 
-f 분석할 파일을 지정하는 옵션

 

로그가 길기 때문에 리다이렉션( > )을 이용해 별도의 파일로 저장했으며,

결과가 출력된 파일을 확인하기 위해 cat 명령어를 사용했습니다.

 

실행 출력문을 보면,

파일 탐색기인 explorer.exe에서 메모리 덤프 도구인 DumpIt.exe를 실행한 것으로 보입니다.

/mnt/c/forensics/LAB0$ python3 /mnt/c/Tools/volatility3/vol.py -c config.json -f Challenge.raw windows.pstree > pstree.log
/mnt/c/forensics/LAB0$ cat pstree.log
Volatility 3 Framework 2.16.0

PID     PPID    ImageFileName   Offset(V)       Threads Handles SessionId       Wow64   CreateTime      ExitTime       Audit                        Cmd      Path
                                                        
324     1876    explorer.exe    0x85097870      33      827     1       False   2018-10-23 08:30:04.000000 UTC  N/A    \Device\HarddiskVolume2\Windows\explorer.exe  C:\Windows\Explorer.EXE C:\Windows\Explorer.EXE
* 1000  324     VBoxTray.exe    0x85135af8      14      159     1       False   2018-10-23 08:30:08.000000 UTC  N/A    \Device\HarddiskVolume2\Windows\System32\VBoxTray.exe "C:\Windows\System32\VBoxTray.exe"      C:\Windows\System32\VBoxTray.exe
* 2096  324     cmd.exe 0x851a6610      1       22      1       False   2018-10-23 08:30:18.000000 UTC  N/A     \Device\HarddiskVolume2\Windows\System32\cmd.exe     "C:\Windows\system32\cmd.exe"   C:\Windows\system32\cmd.exe
* 2412  324     DumpIt.exe      0x845a8d20      2       38      1       False   2018-10-23 08:30:48.000000 UTC  N/A    \Device\HarddiskVolume2\Users\hello\Desktop\DumpIt\DumpIt.exe "C:\Users\hello\Desktop\DumpIt\DumpIt.exe"      C:\Users\hello\Desktop\DumpIt\DumpIt.exe

 

DumpIt.exe 도구는 단순히 메모리 덤프를 생성하기 위한 목적으로 사용했기 때문에 더 이상 알아낼 내용은 없어 보입니다.

VBoxTray.exe는 가상 머신 프로그램 VirtualBox 관련이므로 관련이 없으니 제외합니다.

 

cmd.exe는 명령 프롬프트 프로그램으로 사용자가 원하는 명령어를 직접 실행할 수 있는 프로그램입니다.

사용자는 DumpIt.exe 프로그램을 실행하면서 cmd.exe를 이용해 무언가의 명령어를 실행한 것으로 추측됩니다.

따라서 현재 분석 대상은 cmd.exe 와 부모 프로세스 explorer.exe로 한정할 수 있습니다.

 

cmd.exe를 실행하면 conhost.exe가 자동으로 실행됩니다. conhost.exe cmd.exe에서 실행한 명령어를 해석하여 실행시켜 주는 프로그램이기 때문에 해당 프로그램도 분석 대상에 포함됩니다.

 

참고로 cmd.exe에서 파일 탐색기를 부모로 가지는 호출 관계 혹은, C:\Windows\System32\cmd.exe 경로에 위치하는 파일 경로는 정상입니다.


2. 프로세스 덤프

cmd.exe 프로세스의 PID 2096을 이용했습니다.

실행 명령어 설명 실행 결과
windows.handles --pid 옵션과 함께 사용되어 해당  프로세스가 열고 있는 핸들을 출력 - 프로세스 실행 중에 사용자(hello)의 홈 디렉토리를 참고하고 있음.
- 레지스트리 중 일부를 실행 중에 참고하고 있음.
windows.dlllist --pid 옵션과 함께 사용되어 해당 프로세스가 이용하는 DLL 목록을 출력 - 수상한 DLL 없었음
windows.dumpfiles --pid 옵션을 사용하여 해당 프로세스와 관련된 모든 파일들을 덤프함 - 덤프된 파일들이 file.[시작주소].[끝주소] .[획득방법] .[원본파일이름].img 구조로 저장됨
windows.memmap --dump 옵션을 사용하여 해당 프로세스의 메모리 전체를 파일로 덤프함 - 출력 폴더에 pid.2096.dmp 파일이 생성됨

 

4가지의 플러그인의 출력 결과에서 흔적을 찾을 수 없었습니다.


3. 기타 플러그인

실행 명령어 설명 실행 결과
windows.cmdline 사용자가 프로세스를 실행할 때 입력했던 명령어를 출력함 인자 값(Args 필드)에 비정상적인 문자열이 출력됨.
windows.filescan 메모리에 존재하는 모든 파일 목록을 출력함 0x3d4d1dc8 \Users\hello\Desktop\demon.py.txt
windows.dumpfiles 메모리에서 파일을 덤프함 python 스크립트를 발견함.
windows.envars 분석 대상 시스템의 환경 변수를 출력함  
windows.hashdump windows 시스템에 저장된, 사용자의 패스워드를 변환한 결과인 NTLM 해시 값을 추출함  

 

(1) windows.cmdline

위에서 windows.memmap 명령어 실행으로 생성한 프로세스 메모리 덤프 파일인 pid.2096.dmp에서 cmd.exe의 인자 값을 검색합니다.

cmd.exe를 유니코드 옵션으로 검색

 

위와 같은 방법으로 conhost.exe(PID 2104), conhost.exe(PID 2424), explorer.exe(PID 324)를 모두 확인해주면, C:\Windows\system32\cmd.exe C:\Python27\python.exe C:\Users\hello\Desktop\demon.py.txt 를 확인할 수 있습니다.

 

 

(2) windows.filescan

해당 명령어를 실행하면 첫 줄의 이상한 문자열 때문에 에러가 발생합니다.

CMD를 실행시켜 set PYTHONIOENCODING=utf-8 커맨드를 실행한 후 다시 해당 명령어를 실행하면

정상적으로 동작하게 됩니다.

0x3d4d1dc8 오프셋에서 \Users\hello\Desktop\demon.py.txt 를 확인할 수 있습니다.

windows.filescan

 

 

(3) windows.dumpfiles

해당 명령어로 생성된 파일을 읽어보면

플래그 같이 생긴 a 문자열을 연산해서 b 문자열로 만든 후 hex 형식으로 출력하는 스크립트를 확인할 수 있습니다.

해당 스크립트는 python2로 실행해야 하지만 저는 python3를 사용해야 했기 때문에

스크립트를 python3에 맞게 변형해서 실행을 해주었습니다.

windows.dumpfiles

 

 

(4) windows.envars

해당 명령어를 통해 환경 변수 내의 경로를 중심으로 특이한 경로가 있는지 찾아보았습니다.

실습 문제의 설정에서 타노스의 이데올로기를 싫어한다고 했는데,

Thanos라는 이름의 환경 변수에 xor and password라는 값이 저장되어 있음을 확인할 수 있습니다.

windows.envars

 

 

(5) windows.hashdump

해당 명령어로 NTLM 해시를 얻었고, HTLM 해시는 hashcat과 같은 무차별 대입 도구를 이용해 크랙이 가능합니다.

출제자는 특정 사이트에서 캐싱된 패스워드를 검색하는 방식을 의도했으나, 사이트 캐시가 만료되어 현재 이용이 불갛나 상황입니다. 그렇기에 드림핵에서는 원본 패스워드 플래그 값을 알려주었습니다.


 

이로써 환경 변수 Thanos에서 xor과 password라는 힌트를 발견하였고,

xor에서는 뒷부분의 플래그 절반을 획득하였으며,

password에서는 앞부분의 플래그 절반을 획득할 수 있었습니다.


 

Volatility 도구를 이용한 메모리 포렌식은

1. Windows 버전을 확인하고

2. 프로세스 목록을 확인한 후 수상한 프로세스를 탐색한다.

3. 수상한 프로세스를 대상으로 관련된 파일을 추출하거나 메모리는 덤프해 저장하고

4. 실행한 커맨드를 출력하고 관련된 파일을 직접 추출하거나 환경 변수를 출력한다.

 

 

320x100
320x100