[Tool] Volatility
(1) Volatility란?
-
메모리 포렌식에서 메모리 덤프 파일을 분석할 때, 가장 많이 사용되고 있는 도구
-
오픈 소스 기반으로 CLI 인터페이스를 제공하는 메모리 분석 도구
-
컴퓨터(노트북)에서 덤프 된 파일을 분석 가능하며, 프로세스 정보와 네트워크 정보 등을 확인할 수 있음
-
유용 정보들이 자세하게 나오기 때문에 많이 사용
-
프로세스 덤프 기능을 제공하여 기존 컴퓨터나 노트북에서 실행되고 있던 프로세스 내용 확인 가능
볼라틸리티 도구는 현재 3 베타 버전까지 출시 되었지만, 필자는 2.6 버전대를 많이 사용하였으므로, 2.6 버전 소개 기준이다.
그리고 운영체제는 Windows 환경 기준이다.
설치 / 참조 사이트 : https://www.volatilityfoundation.org/
(2) 메모리 덤프
2-1. 물리 메모리 덤프
-
하드웨어를 이용한 덤프 : FireWire(IEEE 1394)를 이용한 메모리 덤프
-
장점 : 악성 프로그램에 영향을 받지 않으며, 빠른 메모리 덤프와 무결성 최소화
-
단점 : 안전성에 대한 검증이 필요하며, 간혹 시스템 크래시 발생
2-2. 소프트웨어 메모리 덤프
-
DD, MDD, Winen, WIN32(64)DD & DumpIt, Memorize ProDiscovery, HBGary, FastDumpPro etc...
-
장점 : 추가 장치 불필요, 오픈 소스 및 프리웨어, 사용 제품의 경우 원격 덤프 가능
-
단점 : 커널 루트킷에 취약, OS 제약, 수집 시 메모리에 흔적 남음
2-3. 크래시 덤프
-
시스템 유지에 치명적인 영향을 주는 문제가 발생하였을 때, 문제의 원인을 찾기 위해 윈도우가 자동 생성하는 메모리 덤프
-
Blue Screen of Death
(3) 설치 & 사용법
3-1. https://www.volatilityfoundation.org/ 접속
-
Releases > 2.6 선택
-
Volatility 2.6 Windows Standalone Executable (x64) 선택
3-2. 파일 압축 풀기
-
저장 경로 선택
-
zip 파일 압축 풀기
3-3. 덤프 파일 폴더 안에 넣기
-
내가 분석할 덤프 파일(dmp, vmss, vmem 등)을 압축 풀어준 폴더 안에 넣기
3-4. cmd 창(명령 프롬프트) 켜기
-
검색 기능을 이용하여 cmd(명령 프롬프트) 창 켜기
-
내가 저장한 경로로 이동 (cd 명령어)
3-5. 덤프 파일 시스템 정보 확인
-
사용 방법 1 : volatility_2.6_win64_standalone.exe -f [덤프 파일명] imageinfo 명령어 입력
-
덤프 파일의 시스템 및 프로파일 정보 확인
추가 내용 설명
-
KDBG : Debugger data block의 Header에 포함된 Signature
-
KPCR : 사용하고 있는 CPU의 정보를 담고 있는 구조체
3-5-1. Image 정보 확인
-
kdbgscan : KDBG 구조체 확인
-
volatility_2.6_win64_standalone.exe --profile=[프로파일명] -f [덤프 파일 경로] kdbgscan > [저장 할 텍스트 파일 이름]
필자는 이미 덤프 파일이 해당 폴더에 있고, 해당 폴더에 저장할 것이기 때문에 따로 경로를 지정해주지 않았지만, 필요하면 덤프 파일 경로와 저장 할 텍스트 파일 경로를 지정해주어야 한다.
3-5-2. Image 정보 확인
-
kpcrscan : 사용하고 있는 CPU의 정보를 담고 있는 구조체
-
volatility_2.6_win64_standalone.exe --profile=[프로파일명] -f [덤프 파일 경로] kpcrscan > [저장 할 텍스트 파일 이름]
덤프 파일 경로와 저장 할 텍스트 파일 경로에 대한 내용은 위 내용인 kdbgscan과 동일하다.
(4) 플러그인
이제 본격적으로 볼라틸리티 플러그인을 사용해보고, 내용을 확인해보자.
4-1. pslist
-
시스템에서 사용하고 있는 프로세스 리스트 (가상 주소)
-
-P 옵션은 물리적 주소를 확인할 때 사용
-
Offset(V) : 가상 주소
-
Start : Process 시작 시간
-
Exit : Process 종료 시간
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] pslist
4-2. psscan
-
이미 종료된(Interactive) 프로세스와 루트킷에 의한 hidden / unlinked 프로세스 확인 가능
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] psscan
4-3. pstree
-
hidden / unlinked 프로세스까지 확인 가능
-
자식 프로세스는 . 을 통해 트리 형태로 보여줌
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] pstree
4-4. psxview
-
psscan과 pslist 등에서 True나 False로 보여줌
-
수상한 프로세스를 찾을 때 유용한 플러그인
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] psxview
4-5. dlllist
-
Image에서 DLL 리스트를 보여줌
-
-p 옵션을 통해 pid를 넣어주면, 그에 해당하는 dll 리스트 보기도 가능
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] dlllist
4-6. ldrmodules
-
PEB 안의 linkedl list에서 link를 끊는 것을 통해 DLL을 숨기는 DKOM 기법의 경우, VAD(Virtual address Descriptor)에 정보가 남아 있기 때문에 이를 탐지 가능
-
이 명령어는 unlinked 된 명령어를 출력
-
해당 명령어 결과에서 Memory Mapping 된 PE 파일이 PEB List에 존재하면 True, 존재하지 않으면 False을 출력
-
-v 또는 -verbose option을 사용하여 모든 Entry의 Full Path를 확인 가능
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] ldrmodules
4-7. handles
-
프로세스에 의해 열린 핸들의 목록을 나타냄
-
프로세스는 CreateFile 같은 함수를 사용하여 핸들을 획득
-
그러한 핸들은 CloseHandle 함수가 호출되기 전까지 유효하게 사용
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] handles
4-8. memdump
-
해당 명령어를 사용해서 프로세스의 다양한 Memory Segment에서 모든 데이터를 추출하여 덤프 파일로 생성
-
명령어에서 사용하는 ./는 해당 경로에 덤프 파일을 저장한다는 뜻
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] -p [PID] memdump -D ./
4-9. vadwalk
-
VAD tree(Virtual Address Descriptor tree)란 자체 밸런싱 바이너리 트리를 뜻함
-
이는 특정 노드의 왼쪽은 특정 노드보다 낮은 값의 노드, 오른쪽은 특정 노드보다 높은 값의 노드로 이루어져 있는 트리를 뜻함
-
Windows memory manager에서 프로세스가 할당 받은 메모리를 표현하기 위해 사용
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] -p [PID] vadwalk
4-10. vadtree
-
vad 노드들을 트리 형태로 보여주는 명령어
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] -p [PID] vadtree
4-11. vadinfo
-
Virtual address의 시작/끝, Tag, Flag, Kernel Memory의 MMVAD 구조체 주소, Memory Protection 등을 보여주는 명령어
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] -p [PID] vadinfo
4-12. vaddump
-
각각의 VAD Segment에 포함된 Data를 dump하는 명령어
-
memdump와는 달리 두 도구에서 dump되는 dmp 파일의 이름이 Memory 주소 영역으로 되어 있음
-
PhysicalOffset이 파일명에 들어가는 이유는 같은 이름을 가진 2개 이상의 프로세스들을 구분하기 위함
-
명령어에서 사용하는 ./는 해당 디렉토리에 저장한다는 의미
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] -p [PID] vaddump -D ./
4-13. modules
-
시스템에 로드된 커널 드라이버들을 보여주는 명령어
-
이 명령어는 PsLoadedModuleList가 가리키는 _LDR_DATA_TABLE_ENTRY 구조의 이중 연결 목록을 살펴봄
-
hidden/unliked kernel driver는 출력하지 않음
-
기본적으로 Virtual Address로 출력하며, Physical Address를 확인하려면 -P 옵션을 추가
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] modules
4-14. modscan
-
해당 명령어는 실제 메모리에서 풀 태그를 검색하여 LDR_DATA_TABLE_ENTRY 구조를 찾음
-
이전에 로드 되었던 드라이버, 루트킷에 의해 hidden/unlinked 된 드라이버도 출력
-
Volatility에서는 Physical Address로 출력
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] modscan
4-15. moddump
-
해당 명령어는 커널 드라이버를 파일로 덤프해주는 명령어
-
이 명령어는 정규 표현식과 Physical Offset을 이용한 필터를 지원
-
모든 드라이버들을 덤프하고 싶으면 아무런 필터를 적용하지 않으면 됨
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] moddump
4-16. ssdt
-
SSDT(System Service Descriptor Table)는 유저 영역과 커널 영역 사이의 주된 인터페이스
-
과거에는 악성코드가 SSDT 후킹을 시도하곤 했지만, MS사에서 PatchGuard를 발표하면서 지금은 거의 사라진 후킹 방법
-
해당 명령어는 Native/GUI SSDT의 함수들을 list 시켜주는 명령어
-
ETHREAD 객체를 스캔한 후, 모든 유일한 ETHREAD.Tcb.ServiceTable Pointer들을 모아서 확인하기 때문에 루트킷에 의해 덮어 쓰거나 복사된 SSDT 미탐을 탐지 가능
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] ssdt
4-17. driverscan
-
해당 명령어는 메모리의 DRIVER_OBJECT를 스캔하는 명령어
-
이는 커널 모듈을 찾을 수 있는 또 다른 방법이며, 모든 커널 모듈이 DRIVER_OBJECT와 관련된 것은 아님
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] driverscan
4-18. filescan
-
해당 명령어는 메모리의 FILE_OBJECT를 스캔하는 명령어
-
이는 루트킷이 디스크 파일을 숨기고, 루트킷이 실제 시스템의 open handle을 숨기는 기능을 하는 API 함수들을 후킹하더라도 open File을 찾을 수 있음
-
FILE_OBJECT와 offset, file name, number of pointers to the object 등을 결과로 출력
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] filescan
4-19. mutantscan
-
해당 명령어는 메모리에서 KMUTANT 객체를 스캔하는 명령어
-
mutant는 윈도우에서 named semaphore를 구현한 것
-
이것은 악성코드의 단일 복사본이 동시에 실행되도록 하기 위해 악성코드가 사용
-
CID 컬럼은 Process ID가 Thread ID를 보여줌
-
특정 악성코드 가닥이 사용하는 mutant의 이름을 분석하면, 악성코드가 시스템에서 실행 중인지 즉시 알 수 있음
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] mutantscan
4-20. thrdscan
-
해당 명령어는 메모리의 ETHREAD 객체를 스캔하여 보여주는 명령어
-
ETHREAD는 부모 프로세스를 식별할 수 있는 정보를 가지고 있기 때문에 이는 hidden Process를 찾는데 도움을 줌
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] thrdscan
4-21. threads
-
해당 명령어는 모든 프로세스를 반복하고, 모든 프로세스의 모든 스레드를 나열하는 명령어
-
각 쓰레드에 속한 레지스터 정보, 쓰레드 시작 주소와 디스어셈블 코드 등 조사에 관련된 다양한 정보를 제공해주는 명령어
-
ETHREAD 객체 가상 주소, PID, TID, Thread와 관련된 모든 tag(SystemThread, AttachedProcess, HookedSSDT), 생성/종료 시간, 상태, 순서, 시작 주소 등을 확인 가능
-
SSDT base 주소와 각 Service Table, Hook 된 함수도 출력해 줌
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] threads
4-22. netscan
-
해당 명령어는 Vista, 2008, Windows 7 이미지에서 connections와 socket을 확인할 수 있는 명령어
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] netscan
4-23. hivescan
-
해당 명령어는 메모리 덤프로부터 CMHIVEs(Registry hives)의 Physical Address를 찾아주는 명령어
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] hivescan
4-24. hivelist
-
해당 명령어는 메모리 덤프로부터 Registry hives의 Virtual Address와 Disk상의 절대 경로를 출력해주는 명령어
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] hivelist
4-25. userassist
-
해당 명령어는 시스템에서 실행되었던 프로그램의 목록과 실행 횟수, 그리고 마지막 실행 시간 등의 정보를 출력해주는 명령어
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] userassist
4-26. malfind
-
해당 명령어는 일반적인 방법이나 툴로 찾아내지 못하는 Code/DLLs를 VAD tag나 Page Permission과 같은 특성에 기반하여 확인 가능
-
malfind의 목적은 일반적인 Method/Tool로는 확인할 수 없는 DLL들을 찾는 것
-
CreateRemoteThread > LoadLibrary를 이용하여 삽입된 DLL은 hidden 상태가 아니므로 dlllist 명령어를 사용해서 확인 필요
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] -p [PID] malfind
4-27. svcscan
-
해당 명령어는 메모리에 어떤 서비스가 등록되었는지 확인하는 명령어
-
각 윈도우 서비스에 대한 프로세스 ID와 서비스 이름, 서비스 타임, 서비스의 현재 상태 등을 확인 가능
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] svcscan
4-28. callbacks
-
해당 명령어는 다양한 소스들로부터 설치된 콜백 루틴들을 단순히 열거하는 명령어
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] callbacks
4-29. driverirp
-
IRP Major Function Table을 보기 위해서 사용하는 명령어
-
해당 명령어는 드라이버의 IRP Inline Hooking을 감지하기 위한 명령어
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] driverirp
4-30. devicetree
-
_DRIVER_OBJECT.DeviceObject.NextDevice를 통해 드라이버 객체와 장치의 관계를 보여줌
-
_DRIVER_OBJECT.DeviceObject.AttachedDevice를 통해 연결된 장치 관계를 보여줌
-
Windows는 계층화된 Driver Architecture 또는 Driver chain을 사용하므로, 여러 개의 Driver를 검사 또는 IRP에 응답 가능
-
RootKit은 Driver나 Device를 이러한 Chain에 검사 우회의 목적으로 삽입
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] devicetree
4-31. timers
-
해당 명령어는 Kernel times(KTIMER)와 관련된 DPC(Deferred Procedure Calls)를 출력해주는 명령어
-
DPC 주소와 KTIMES를 통해 악성코드가 다양한 방법으로 커널 공간에 숨어 있는 것을 빠르게 찾을 수 있음
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] timers
4-32. memmap
-
해당 image에서 할당 된 Memory 주소 Map을 보여줌
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] -p [PID] memmap
4-33. getsids
-
Process와 관련된 Security ID를 보여주며, 권한 상승과 같은 의심 부분을 확인 가능
-
보안 식별자는 [그림 72]와 같음
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] getsids
4-34. verinfo
-
PE 파일에 저장된 정보를 보여주며, 모든 PE 파일들이 버전 정보를 가지고 있지는 않음
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] verinfo
4-35. procdump
-
실행 가능한 Process를 덤프
-
악성코드가 의도적으로 PE Header의 size 필드를 위조 시에도 확인 가능
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] -p [PID] procdump
4-36. symlinkscan
-
Symbolic Link 객체 Scan
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] symlinkscan
4-37. connscan
-
Pool tag scanning을 통하여 connection 구조체를 찾아 줌
-
이미 종료된 연결 정보도 찾을 수 있는 장점이 있음
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] connscan
4-38. printkey
-
특정 레지스트리 키의 서브키, 값, 데이터, 데이터 타입 등을 보여줌
-
레지스트리 하이브의 가상 주소와 디스크 상의 절대 경로 확인 가능
-
해당 키를 출력하려면 -o [주소값] 옵션을 활용하면 됨
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] printkey
4-39. consoles
-
마지막으로 사용한 콘솔 창의 명령어 확인
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] consoles
(5) 추가 플러그인
-
해당 플러그인들은 실습 덤프 파일로 분석한 결과, 제대로 된 결과가 나오지 않아 참고하기 위한 플러그인
5-1. crashinfo
-
해당 명령어는 Crash dump header 정보를 출력해주는 명령어
-
Crash dump는 프로그램이 죽었을 때의 메모리 내용이 파일로 남기는 것을 뜻함
-
이 파일을 분석하면 어떤 프로그램의 오류 때문에 죽었는지 분석 가능
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] crashinfo
5-2. apihooks
-
User-mode 또는 Kernel-mode에서의 API Hooking을 탐지하기 위해서 사용하는 명령어
-
IAT, EAT, Hooking을 찾아낼 수 있음
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] apihooks
5-3. impscan
-
import 된 function에 대한 call을 검색하는 명령어
-
Base address를 지정해주지 않으면 프로세스의 main module 끝까지 검색
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] impscan
5-4. volshell
-
WinDBG와 비슷한 인터페이스 제공
-
Memory Image를 대화 형식으로 조사 가능
사용법은 다음과 같다.
volatility_2.6_win64_standalone.exe --profile=[프로 파일명] -f [덤프 파일명] volshell
(6) DKOM을 이용한 프로세스 은닉 기법
-
커널 오브젝트란 커널에서 관리하는 정보를 담은 데이터 블록
-
윈도우는 실행 중인 프로세스를 EPROCESS 구조체로 관리하며, 이는 연결 리스트로 이어져 있음
-
EPROCESS 구조체 안에 LIST_ENTRY의 구조체 멤버에서 FLINK와 BLINK를 수정하여 프로세스를 은닉 시킴
(7) Volatility를 사용해 메모리를 분석할 때, 효율적인 분석을 위한 절차
-
침해 사고가 발생해 악성코드 감염이 의심되는 시스템에서 생성한 메모리 덤프 파일을 분석하기 위해서는 위와 같은 6단계의 절차를 이용하여 메모리 분석을 진행
# Reference
https://www.volatilityfoundation.org/
MEMORY ANALYSIS TOOLS BY C-Lab
'Tool' 카테고리의 다른 글
[Tool] 디지털 포렌식 유용 도구 소개 (Digital Forensics Tool) (0) | 2020.05.11 |
---|---|
[Tool] FTK Imager (0) | 2020.03.01 |
[Tool] HxD Editor (0) | 2020.03.01 |