◎ Miscellaneous : 기타 등등
 > strings : <decimal_offset>:<string> line 형식으로 된 주어진 Image와 File에서 해당 문자열을 찾을 수 있는 Process와 Virtual Address를 출력해 주는 명령어입니다.
  - 해당 명령의 입력은 Sysinternals의 Strings Utility 또는 유사한 Tool 들의 출력(offset:string)이며, 입력 Offset 은 File/Image의 시작 지점의 물리 Offset입니다.
  - Sysinternals 의 Strings는 Linux/MAC 에서 Wine을 이용하여 사용 가능하며, 이에 대한 출력은 File 형식으로 Volatility에게 Redirect 되어야 합니다. 
  - GNU 의 Strings 명령어를 사용한다면 -td Option을 통해 Offset을 10 진수로 출력 가능합니다.(GNU strings는 십육진 오프셋 미지원) 
  - File/Image 를 Sysinternals의 Strings Utility를 수행하면 많은 시간이 걸리며, -q와 -o는 Header 출력의 생략(-q)과 각 줄의 Offset(-o)을 구하기 위해 필수적인 Option입니다

 # wine strings.exe -q -o -accepteula image.vmem > image.vmem.txt
 # python vol.py -f image.vmem --profile=Win7SP1x64 strings -s export.txt

  - Default 로 PsActiveProcessHead를 이용해 Double-linked 형태로 Process 들을 출력하며, -S Option을 통해 Hidden Process 들도 출력 가능합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 strings -s export.txt --output-file=export_strings.txt -S

  - EPROCESS Offset 도 지원해 줍니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 strings -s export.txt --output-file=export_strings.txt -o 0x00000000

 

 > volshell : 메모리 덤프 파일 분석 시에 Windbg와 유사한 명령 형식으로 분석 할 수 있습니다.
 ※ 제공 기능
  - 프로세스들의 목록화(List processes)
  - 프로세스들의 문맥 교환(witch into a process's context)
  - 구조체와 객체들의 형식 출력(Display types of structures/objects)
  - 주어진 주소에 타입 덮어씌우기(Overlay a type over a given address)
  - 링크드 리스트 순회(Walk linked lists)
  - 주어진 주소의 코드 디스어셈(Disassemble code at a given address)
  - db, dd, dt, dis 명령어는 특정 주소 공간을 인자로 전달 가능하며, 사용하는 주소 공간에 따라 다른 결과를 출력하는 것을 확인 가능합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 volshell

 

 > bioskbd : Memory 의 BIOS 영역에서 Key 입력을 읽을 때 사용하는 명령어입니다.
  - Lenovo 의 BIOS와 SafeBoot, TrueCrypt, BitLocker에 입력한 비밀 번호를 확인 가능합니다.
  - 메모리 덤프 툴에 따라서 필요한 BIOS 영역을 포함할 수도 있고 아닐 수도 있습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 bioskbd

 

 > patcher : Patches memory based on page scans
  - patcher 플러그인을 실행할때, 명령줄에 쓰기 옵션(-w) 지정하지 않으면 수정이 안됩니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 patcher

 

 > pagecheck : pagecheck 플러그인은 커널 DTB (System/Idle 프로세스로부터)을 사용하고 페이지들(pages)이 위치하고 있는 메모리(AddressSpage.get_avaliable_pages 메서드를 사용) 정보를 출력하는 명령어입니다.
  - 각 페이지별로 그 페이지 데이터에 접근하는 것을 시도하고 자세하게 결과를 출력합니다. 만약 그 시도한 것이 실패되면 PDE, PTE 주소 정보들도 나타냅니다.
  - 이 플러그인은 기본적으로 지원되지 않고, contrib 디렉터리 안에 위치하고 있으며 non-PAE x86 주소 공간들에서 작동이 됩니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 --plugins=contrib/plugins/ -f pat-2009-11-16.mddramimage pagecheck

 

 > mftparser : 파일이 디스크에 있는지 확인하는 명령어입니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 mftparser

  - 내용이 상당히 길기 때문에 --output-file 옵션을 사용하여 파일에 저장하는 것이 좋습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 mftparser --output=body -D folder_name/ --output-file=mft.body
 # cat mft.body

 

Volatility 볼라틸리티 2.1 Plugins - 윈도우#01

◎ Image Identification : 이미지 식별

Volatility 볼라틸리티 2.1 Plugins - 윈도우#02

◎ Processes and DLLs : 프로세스와 DLLs 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#03

◎ Process Memory : 프로세스 메모리 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#04

◎ Kernel Memory and Objects : 커널 메모리와 오브젝트 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#05

◎ Networking : 네트워크 정보
Volatility 볼라틸리티 2.1 Plugins - 윈도우#06

◎ Registry : 단지 Registry data를 추출하는데 도움을 줍니다.
Volatility 볼라틸리티 2.1 Plugins - 윈도우#07

◎ Crash Dumps, Hibernation and Conversion : 크래쉬 덤프, 하이버네이션 정보확인 및 파일변환
Volatility 볼라틸리티 2.1 Plugins - 윈도우#08

◎ Malware and Rootkits : 맬웨어와 루트킷 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#09

◎ Miscellaneous : 기타 등등

 

◎ Malware and Rootkits : 맬웨어와 루트킷 분석
 > malfind : 사용자 모드 형태로 은폐되어 있거나 인젝션 된 코드 또는 DLL 정보를 분석하는 명령어입니다.
  - VAD 태그와 페이지 권한들 같은 문자들을 기반으로 사용자 모드 메모리에 숨겨져 있거나 삽입되어 있는 코드가 DLLs를 찾아냅니다.
  - CreateRemoteThread -> LoadLibrary로 사용되는 프로세스에 삽입되는 DLLs은 탐지하지 않습니다. 이 기술로 삽입된 DLLs는 숨겨지지  않으며 dlllist에서 이것들을 확인할 수 있습니다. 
  - malfind의 목적은 기본적인 메서드/도구들이 보지 못하는 것을 DLLs의 위치를 찾아내는 것입니다. malfind에 의해 인식되는 메모리 세그먼트의 압축된 복사 파일을 저장하고 싶다면 -D 옵션과 결과가 저장될 dir를 지정해주면 됩니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 malfind -p pid
 # python vol.py -f image.vmem --profile=Win7SP1x64 malfind -p pid -D folder_name/

 

 > yarascan : YARA를 이용하여, 사용자 및 커널 모드 메모리 영역에 포함된 바이트(Byte) 순서, ANSI 및 유니코드 (Unicode) 문자열 검색하는 명령어입니다.
  - 의심스러운 드라이버(xxx.sys)에 대한 메모리 스캔

 # python vol.py -f image.vmem --profile=Win7SP1x64 yarascan -Y "xxx.sys" --wide

  - YARA 패턴(Rules)을 만들 수 있고, --yara-file=RULESFILE 옵션을 이용하여 명시할 수 있습니다.
  - 프로세스에서 rules.yara 파일 내에 정의되어 있는 문자들을 검색하기 위해서 아래와 같은 명령어를 입력하고, 간단하게 결과를 확인할 수 있습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 yarascan --yara-file=/path/rules.yara

  - 프로세스에서 간단한 문자를 검색하고, 매칭 되는 문자가 포함되는 메모리 세그먼트들을 덤프 하기 위해서는 아래 명령어를 입력하면 됩니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 yarascan -D dump_files --yara-rules="stringtext"

  - 커널 메모리에서 바이트 패턴을 검색하기 위해서, 아래 명령어를 사용합니다.(kernel driver들에 의해 Load되어 있는 Memory만 탐색)

 # python vol.py -f image.vmem --profile=Win7SP1x64 yarascan --yara-rules="{8B 00 81 38 54 44 4C 33 75 5A}" -K

  - 각 프로세스 안에 있는 byte패턴을 얻기 위한 검색은 아래 예제와 같습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 yarascan --yara-rules="{eb 90 ff e4 88 32 0d}" --pid=624

  - 각 프로세스 안에 있는 정규 표현식에 대한 검색은 아래 예제와 같습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 yarascan --yara-rules="/my(regular|expression{0,2})" --pid=624

 

 > svcscan : Memory Image에 등록된 service 목록을 확인할 수 있는 명령어입니다.
  - Process ID, Service name, Service display name, Service type, Current status, Binary path을 확인할 수 있습니다.
  - Binary path의 경우 User-mode service 뿐만 아니라, Kernel-mode에서 사용된 service의 Driver 이름까지도 출력합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 svcscan

 

 > ldrmodules : 특정 프로세스나 DLL에 의해 은폐된 DLL 정보 분석하는 명령어입니다.
  - PEB 안의 linked list에서 Unlinking을 통해 DLL을 숨기는 기법의 경우 VAD(Virtual address Descriptor)에 정보(Base address, Full path)가 남아 있기 때문에 탐지가 가능합니다.
  - Unlinked 된 명령어를 출력해 주며, Memory mapping 된 PE File 이 PEB List에 존재하면 1, 하지 않으면 0을 출력해 줍니다.
  - 경로를 덮어쓰기 함으로써 악성코드가 DLL을 숨길 수 있으며, 이는 모든 Entry의 Full path를 보는 -v 또는 --verbose Option을 사용하여 확인할 수 있습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 ldrmodules
 # python vol.py -f image.vmem --profile=Win7SP1x64 ldrmodules -v

 

 > impscan : 코드가 import 하고 있는 함수를 보여줍니다.
  - Impscan은 PE의 IAT(Import Address Table)를 파싱 할 필요 없이 API들을 불러와 정의하며, 만약 악성코드가 완벽하게 PE Header를 지우고 커널 드라이브에서 실행되고 있다면 여기엔 나오지 않을 것입니다.
  - IAT(Import Address Table) :  프로그램에서 사용할 외부 라이브러리가 메모리에 로드되고 난 후, 해당 함수의 주소를 가지고 있는 테이블입니다.
  - 명령어 라인에  -b 또는 -base 옵션으로 탐색 시작 베이스 주소 지정이 가능합니다.(Kernel driver의 Base address 도 지정 가능) 만약 Base address를 지정해 주지 않으면, Process의 main module 끝까지 탐색할 것입니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 malfind -p pid 
 # python vol.py -f image.vmem --profile=Win7SP1x64 -p pid impscan -b [IAT 주소] 

  - 명령어 라인에 -D 옵션으로 modules 명령으로 확인한 base address를 통하여 Rebuild가 가능합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 modules | grep find_text
 # python vol.py -f image.vmem --profile=Win7SP1x64 impscan -b [IAT 주소] -D folder_name/

 

 > apihooks : 사용자 및 커널 모드에서 API 후킹 정보를 분석하는 명령어입니다.
  - IAT, EAT, Inline Hooking을 찾아낼 수 있습니다.
  - Inline Hooking을 탐지하기 위해서 CALL, JMP Operand 가 직접 또는 간접적으로 위치를 참조하는 것, PUSH/RET 명령어를 탐지하며, ntdll.dll의 syscall이나 Kernel memory의 unknown code page를 호출하는 것을 탐지합니다.
  - Kernel driver의 unknown code page를 CALL 하는 부분도 탐지할 수 있습니다.(cf. tcpip.sys 에 의심스러운 redirection)

 # python vol.py -f image.vmem --profile=Win7SP1x64 apihooks

 ※ hook을 포함하는 Code 추출 가이드
  - malfind 명령어가 자동으로 찾고 추출 가능한지 확인
  - volshell의 dd/db 명령어를 통해 MZ header를 찾은 후, dlldump를 --base 값과 함께 사용하여 추출
  - vaddump 명령어를 통해 모든 Code segment 들을 추출 한 후(File 명은 주소 범위) 해당 범위에 해당하는 Dump File을 찾음.

 

 > idt : System의 IDT(Interrupt Descriptor Table) 현재 주소, Module, Interrupt 목적 등을 보여주는 명령어입니다.
  - IDT(Interrupt Descriptor Table) : 인터럽트가 발생했을 때 처리해주는 함수의 루틴을 포함하고 있는 테이블입니다.
  - Inline Hooking을 탐지하기 위해 IDT Entry 들도 Check 합니다.
  - IDT 변경사항에 대해서 자세한 정보를 얻고 싶다면, --verbose 옵션을 사용합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 idt
 # python vol.py -f image.vmem --profile=Win7SP1x64 idt --verbose

 

 > gdt : System의 GDT(Global Descriptor Table)를 탐지하는 명령어입니다.
  - GDT(Global Descriptor Table) : 커널 모드 메모리 내에 존재하는 구조체입니다.
  -  호출 문(call gate)에 설치된 Alipop 같은 루트킷들을 탐지하는데 유용합니다.
  - 조금 더 많은 조사를 원한다면 volshell을 사용하면 됩니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 gdt
 # python vol.py -f image.vmem --profile=Win7SP1x64 volshell

 

 > threads : 각 Thread에 속한 Register 정보, Thread 시작 주소의 Disassemble Code 등 조사에 관련된 다양한 정보를 제공해주는 명령어입니다.(Investigate _ETHREAD and _KTHREADs)
- ETHREAD 객체의 가상 주소, pid, tid, Thread와 관련된 모든 tag(SystemThread, AttachedProcess, HookedSSDT), 생성/종료 시간, 상태, 순서, 시작 주소 등을 확인 가능하며 SSDT base 주소와 각 Service Table, Table 안의 Hook 된 함수도 출력해 줍니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 threads

  - 가능한 tags/filters의 리스트 항목을 보고 싶다면, -L 옵션을 사용합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 threads -L

  - Default로 모든 Thread에 대한 정보를 제공해 주기 때문에 정렬에 어려움이 있을 것이며, 이 때는 -F Option을 인자에 ", "를 이용하여 여러 개의 Filter를 적용 가능합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 threads -F AttachedProcess

 

 > callbacks : Rootkit, Anti-virus, Dynamic Analysis, Windows Monitoring Tool 들에 사용됩니다.
  - 중요한 알림 루틴(notification routines)과 커널 콜백(callbacks)의 모음을 출력할 수 있습니다.
 ※ Callbakck 모음
  - PsSetCreateProcessNotifyRoutine(process creation)
  - PsSetCreateThreadNotifyRoutine(thread creation)
  - PsSetImageLoadNotifyRoutine(DLL/image load)
  - IoRegisterFsRegistrationChange(file system registration)
  - KeRegisterBugCheack and KeRegisterBugCheackReasonCallback
  - CmRegisterCallback(registry callbacks on XP)
  - CmRegisterCallbackEx(registry callbacks on Vista and 7)
  - IoRegisterShutdownNotification(shutdown callbacks)
  - DbgSetDebugPrintCallback(debug print callbacks on Vista and 7)
  - DbgkLkmdRegisterCallback(debug callbacks on 7)

 # python vol.py -f image.vmem --profile=Win7SP1x64 callbacks

 

 > driverirp : Driver의 IRP(Major Function) Table을 보기 위해서 사용하는 명령어입니다.
  - 해당 명령어는 driverscan에 속해 있기 때문에 해당 DRIVER_OBJECT 들을 찾을 수 있으며, 이후 함수 Table을 통해 Cycle을 순회하면서 각 함수들의 목적, 주소, 주소의 소유 Module 들을 출력해 줍니다.
  - 해당 명령어는 IRP 함수의 Inline Hooking 탐지를 지원하며 -v 또는 --verbose Option으로 해당 IRP 주소의 명령어들을 Disassemble 하여 제공합니다.
  - 해당 명령어는 특정 정규 표현식을 사용하지 않는 경우 Default로 모든 Driver에 대해 출력해 줍니다

 # python vol.py -f image.vmem --profile=Win7SP1x64 driverirp
 # python vol.py -f image.vmem --profile=Win7SP1x64 driverirp -r vmscsi
 # python vol.py -f image.vmem --profile=Win7SP1x64 driverirp -r vmscsi --verbose

 

 > devicetree : Show device tree
  - 장치(_DRIVER_OBJECT.DeviceObject.NextDevice)를 통해 해당 Driver 또는 Device 들의 관계를 보여주며 첨부된 장치(_DRIVER_OBJECT.DeviceObject.AttachedDevice)를 통해 Attach 된 Device 들을 보여줍니다
  - Driver를 "DRV"로, Device를 "DEV"로 표현하며, Attached Device를 "ATT"로 표현합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 devicetree

 

 > psxview : pslist 및 psscan에서 확인한 프로세스 정보를 비교하여 나열함으로써, 은폐된 프로세스를 탐지하는 명령어입니다.
 ※ 비교대상
  - PsActiveProcessHead linked list
  - EPROCESS pool scanning
  - ETHREAD pool scanning(EPROCESS를 참조)
  - PspCidTable
  - Csrss.exe handle table(Vista,7 에서는 불가, 몇몇 XP image에서는 불가)
  - Csrss.exe internal linked list(Vista,7 에서는 불가, 몇몇 XP image에서는 불가)

 # python vol.py -f image.vmem --profile=Win7SP1x64 psxview

  - 해당 열에 0으로 나타난 것은 Process 가 손실된 것을 나타내며, pslist에서 제외된 것을 통해 수상한 것을 확인할 수 있는데, 각각의 프로세스에서 탐지가 되지 않는다면 칼럼에 “False”라고 표시된다.

 

 > ssdt_ex : Rootkit에 의해 설치된 SSDT hooking에 대한 흔적을 검색해주는 명령어입니다.
  - 자동으로 어떤 SSDT 함수가 Hooking 되었는지 확인해 주며, Hooking kernel driver를 디스크로 추출, IDA Script File 인 IDC File을 Rookit의 함수 Label을 포함하여 생성해 줍니다.
  - idag.exe(Windows), idal(Linux/OS X)가 $PATH에 있으면 IDB 파일을 Kernel driver로부터 생성하여 IDC Script를 실행할 수 있습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 ssdt_ex -D folder_name/

  - folder_name을 살펴보면 추출된 Kernel Driver(sys 파일), IDC Script(sys.idc 파일), IDA Database(idb 파일)를 확인할 수 있습니다.
  - IDB File을 열어 "Hook" 단어가 앞에 붙은 함수를 유심히 살펴보면 됩니다.

 

 > timers : Installed 된 Kernel times(KTIMER)와 관련된 DPC(Deferred Procedure Calls)를 출력해 주는 명령어입니다.
  - Zero Access, Rustock, Stuxnet 의 경우 DPC 를 이용하여 timer 를 등록합니다다. DPC 주소와 KTIMES 를 통해 악성코드가 다양한 방법으로 Kernel 공간에 숨어 있는 것을 빠르게 찾을 수 있습니다

 # python vol.py -f image.vmem --profile=Win7SP1x64 timers

  - Windows XP, 2003, 2008, VISTA 의 경우 times 를 전역 변수에 저장하지만, Windows 7 의 경우 KPCR(Kernel Processor Control Region)에 저장하고 있습니다. 
  - 그렇기 때문에 Windows7 에서 모든 timers 들을 확인 하려면 kpcrscan 을 통해 KPCR 주소들을 --kpcr Option 을 통해 인자로 넣어 주어야 합니다.
  - KPCR 에 따라 다른 timers 의 목록을 볼 수 있으며, 이는 각 Processor 가 자신만의 timers 의 set 을 가지고 있기 때문입니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 kpcrscan
 # python vol.py -f image.vmem --profile=Win7SP1x64 --kpcr=0x00000000

 

Volatility 볼라틸리티 2.1 Plugins - 윈도우#01

◎ Image Identification : 이미지 식별

Volatility 볼라틸리티 2.1 Plugins - 윈도우#02

◎ Processes and DLLs : 프로세스와 DLLs 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#03

◎ Process Memory : 프로세스 메모리 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#04

◎ Kernel Memory and Objects : 커널 메모리와 오브젝트 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#05

◎ Networking : 네트워크 정보
Volatility 볼라틸리티 2.1 Plugins - 윈도우#06

◎ Registry : 단지 Registry data를 추출하는데 도움을 줍니다.
Volatility 볼라틸리티 2.1 Plugins - 윈도우#07

◎ Crash Dumps, Hibernation and Conversion : 크래쉬 덤프, 하이버네이션 정보확인 및 파일변환
Volatility 볼라틸리티 2.1 Plugins - 윈도우#08

◎ Malware and Rootkits : 맬웨어와 루트킷 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#09

◎ Miscellaneous : 기타 등등

◎ Crash Dumps, Hibernation and Conversion : 크래쉬 덤프, 하이버네이션 정보확인 및 파일변환
 > crashinfo : Crash dump header 정보를 출력해주는 명령어입니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 crashinfo

 

 > hibinfo : Hibernation file 로 부터 정보를 출력해주는 명령어입니다.
  - Hibernation file 로 부터 Control Register 상태, file 생성시간, 상태, Hibernation 직전의 해당 Windows Version 과 같은 정보를 제공해주는 명령어입니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 hibinfo

 

 > imagecopy : 크래시/BSOD 등의 분석불가능한 덤프파일을 분석가능한 덤프파일로 바꿔주는 명령어입니다.
  - Windows XP SP2 가 아니라면 --profile Option 을 통하여 Profile 을 지정해줘야 하며, -O Option 을 통하여 output file 을 지정할 수 있습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 imagecopy -O Win7SP1x64.raw

 

 > raw2dmp : physical memory 덤프를 crash dump로 변환하는 명령어입니다.
  - WinDbg 커널 디버거에서 메모리를 불러올 때 유용합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 raw2dmp -O copy.dmp

 

Volatility 볼라틸리티 2.1 Plugins - 윈도우#01

◎ Image Identification : 이미지 식별

Volatility 볼라틸리티 2.1 Plugins - 윈도우#02

◎ Processes and DLLs : 프로세스와 DLLs 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#03

◎ Process Memory : 프로세스 메모리 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#04

◎ Kernel Memory and Objects : 커널 메모리와 오브젝트 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#05

◎ Networking : 네트워크 정보
Volatility 볼라틸리티 2.1 Plugins - 윈도우#06

◎ Registry : 단지 Registry data를 추출하는데 도움을 줍니다.
Volatility 볼라틸리티 2.1 Plugins - 윈도우#07

◎ Crash Dumps, Hibernation and Conversion : 크래쉬 덤프, 하이버네이션 정보확인 및 파일변환
Volatility 볼라틸리티 2.1 Plugins - 윈도우#08

◎ Malware and Rootkits : 맬웨어와 루트킷 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#09

◎ Miscellaneous : 기타 등등

◎ Registry : 단지 Registry data를 추출하는데 도움을 줍니다.
 > hivescan : Memory Dump로부터 CMHIVEs(Registry hives)의 Physical address를 찾아주는 명령어입니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 hivescan

 

 > hivelist : Memory Dump 로 부터 레지스터 하이브(Registry hives)의 가상 메모리 주소(Virtual address)와 Disk 상의 절대 경로를 알려주는 명령어입니다.
  - 만약 특정 하이브로부터 값을 표기하기 원한다면, 이 명령어를 실행시켜서 해당 되는 하이브 주소 값을 볼 수 있으며, 이 명령어를 통하여 Windows password를 크랙 할 수 있게 됩니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 hivelist

 

 > printkey : 특정 Registry key 의 subkeys, values, data, data type를 보여주는 명령어입니다.
  - 기본적으로 printkey 는 모든 hives로 부터 검색을 하여 찾아진 key information을 출력하므로, HKEY_LOCAL_MACHINE\Microsoft\Security Center\Svc key 안을 둘러보고 싶다면 -K Option을 통하여 포함 문자열을 함께 적어 주는 것이 좋습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 printkey -K "Microsoft\Security Center\Svc"

  - 특정한 하이브를 검색하는데 제한이 있다면, printkey는 하이브의 가상 주소를 통해 확인할 수 있으며, HKEY_LOCAL_MACHINE의 내용을 보고 싶다면 -o Option을 사용하면 됩니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 printkey -o 0xfffff8a000000000

 

 > hivedump : hive로부터 모든 subkey를 list 형태로 보여주는 명령어입니다.
  - 명령어 라인에 -o Option을 통해 원하는 hive의 Virtual address를 지정해 주면 해당 hive에 대한 subkey를 list 형태로 출력 가능합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 hivedump -o 0xfffff8a000000000

 

 > hashdump : 주로 SAM File을 추출할 때 쓰이는 명령어입니다.(Windows password 크랙)
  -  SYSTEM hive의 Virtual address를 -y Option을 통해 넣어주고 SAM hive의 Virtual address를 -s Option을 넣어줍니다.
  - Memory Dump로부터 registry key를 읽을 수 없는 경우는 "ERROR : volatility.plugins.registry.lsadump: Unable to rad hashes from registry"와 같은 Error를 확인할 수 있습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 hashdump -y [system의 virtual 주소] -s [sam의 virtual 주소]

  - 만약 SYSTEM의 "CurrentControlset\Control\lsa"와 SAM의 "Domains\Account\"에 올바른 key가 존재하는 것을 확인 가능하다면 volshell을 이용해 "CurrentControlSet"을 받아야 합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 volshell

  - 그 후, printkey 명령어를 사용하여 해당 data와 keys가 존재하는지 확인 가능합니다. 만약 key가 없다면 "The requested key could not be found in the hive(s) searched"라는 Error를 확인할 수 있습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 printkey -K "ControlSet001\Control\lsa" --no-cache
 # python vol.py -f image.vmem --profile=Win7SP1x64 printkey -K "SAM\Domains\Account" --no-cache

 

 > lsadump : Registry로부터 LSA dump를 수행하는 명령어입니다.
  - Default password, RDP public key, DPAPI credentials 등의 정보를 출력 가능합니다.
  - SYSTEM hive의 Virtual address를 -y Option을 통해 넣어주고 SECURITY hive의 Virtual address를 -s Option을 통해 넣어주면 출력이 가능합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 lsadump -y 0x00000000 -s 0x00000000

 

 > userassist : 메모리 덤프 파일에서 UserAssist 관련 레지스트리 키 정보 추출하는 명령어입니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 userassist

 

 > shellbags : ShellBags 정보를 추출하는 명령어입니다.
  - 특정 사용자가 호스트에서 수행 한 파일 또는 폴더 작업을 확인하는 데 매우 유용한 방법입니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 shellbags
 # python vol.py -f image.vmem --profile=Win7SP1x64 shellbags --output=body

 

 > shimcache : Application Compatibility Shim Cache 레지스트리 키를 분석하는 명령어입니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 shimcache

 

 > getservicesids : 컴퓨터의 서비스에 대한 SID를 계산하고 나중에 사용할 수 있도록 Python 사전 형식으로 출력합니다.
  - 서비스 이름은 레지스트리 ( "SYSTEM\CurrentControlSet\Services")에서 가져옵니다. 
  - 출력을 파일에 저장하려면 --output-file 옵션을 사용하면 됩니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 getservicesids

 

Volatility 볼라틸리티 2.1 Plugins - 윈도우#01

◎ Image Identification : 이미지 식별

Volatility 볼라틸리티 2.1 Plugins - 윈도우#02

◎ Processes and DLLs : 프로세스와 DLLs 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#03

◎ Process Memory : 프로세스 메모리 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#04

◎ Kernel Memory and Objects : 커널 메모리와 오브젝트 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#05

◎ Networking : 네트워크 정보
Volatility 볼라틸리티 2.1 Plugins - 윈도우#06

◎ Registry : 단지 Registry data를 추출하는데 도움을 줍니다.
Volatility 볼라틸리티 2.1 Plugins - 윈도우#07

◎ Crash Dumps, Hibernation and Conversion : 크래쉬 덤프, 하이버네이션 정보확인 및 파일변환
Volatility 볼라틸리티 2.1 Plugins - 윈도우#08

◎ Malware and Rootkits : 맬웨어와 루트킷 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#09

◎ Miscellaneous : 기타 등등

◎ Networking : 네트워크 정보
 > connections : 활성화 상태의 네트워크 연결 정보를 나열합니다. (Windows XP, Windows 2003 Server 만 사용 가능)
  - 네트워크의 pslist와 비슷합니다. 오프셋은 기본적으로 _TCPT_OBJECT 가상 주소로 출력되지만 물리적인 주소를 얻고 싶다면 -P 명령어를 추가적으로 사용합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 connections
 # python vol.py -f image.vmem --profile=Win7SP1x64 connections -P

 

 > connscan : Pool tag scanning을 통하여 connection 구조체를 찾는 명령어입니다.(Windows XP, Windows 2003 Server 만 사용 가능)
  - 활성화 상태의 네트워크 연결 정보와 함께 이미 종료된 네트워크 연결 정보도 나열합니다. 그러나 몇몇 Field에서 부분적으로 덮어쓰기 된 것과 같은 오탐(False Positive)이 존재합니다.
  - psscan과 유사하며 풀 태그 스캐닝을 사용하여 _TCPT_OBJECT 구조체를 찾기 위해 사용됩니다. 이 명령어는 이미 종료되어버린 연결들로부터 아티팩트를 찾아낼 수 있고 게다가 활성화된 것들도 찾아낼 수 있습니다. 부분적으로 덮여 쓰인 필드를 발견할 수 있지만 전체적으로 신뢰할 수 있는 정보입니다. 따라서 오탐이 발견될 수 있지만 많은 정보를 찾을 수 있다는 장점이 있습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 connscan

 

 > sockets : TCP, UDP, RAW 등의 protocol에서 listening Socket 들을 찾아내는 명령어입니다. (Windows XP, Windows 2003 Server 만 사용 가능)
  - 기본적으로 출력은 _ADDRESS_OBJECT 가상 주소를 포함하고 있으며, -P switch를 이용하여 물리적 주소를 확인 가능합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 sockets
 # python vol.py -f image.vmem --profile=Win7SP1x64 sockets -P

 

 > sockscan : Pool tag scanning을 통하여 _ADDRESS_OBJECT 구조체를 찾는 명령어입니다. (Windows XP, Windows 2003 Server 만 사용 가능)
  - 이전의 socket으로부터 존재했던 데이터와 아티펙트들을 추출할 수 있습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 sockscan

 

 > netscan : Pool tag scanning을 통하여 활성화 상태의 네트워크 연결 정보를 보여줍니다. (Windows Vista, 7, Windows 2008 Server만 사용 가능)
  - TCP endpoints, TCP listeners, UDP endpoints, and UDP listeners를 찾아줍니다.
  - IPv4와 IPv6을 구별하며 Local과 Remote IP(가능하다면), Local 과 Remote 포트(가능하다면), 소켓이 bind 되거나 연결이 수립된 시간, 그리고 현재 상태(TCP 연결만 지원)를 보여줍니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 netscan

 

Volatility 볼라틸리티 2.1 Plugins - 윈도우#01

◎ Image Identification : 이미지 식별

Volatility 볼라틸리티 2.1 Plugins - 윈도우#02

◎ Processes and DLLs : 프로세스와 DLLs 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#03

◎ Process Memory : 프로세스 메모리 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#04

◎ Kernel Memory and Objects : 커널 메모리와 오브젝트 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#05

◎ Networking : 네트워크 정보
Volatility 볼라틸리티 2.1 Plugins - 윈도우#06

◎ Registry : 단지 Registry data를 추출하는데 도움을 줍니다.
Volatility 볼라틸리티 2.1 Plugins - 윈도우#07

◎ Crash Dumps, Hibernation and Conversion : 크래쉬 덤프, 하이버네이션 정보확인 및 파일변환
Volatility 볼라틸리티 2.1 Plugins - 윈도우#08

◎ Malware and Rootkits : 맬웨어와 루트킷 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#09

◎ Miscellaneous : 기타 등등

◎ Kernel Memory and Objects : 커널 메모리와 오브젝트 분석
 > modules : System에 load된 kernel driver들을 보여주는 명령어입니다.
  - PSLoadedModuleList가 가리키는 LDR_DATA_TABLE_ENTRY를 통해 doubly-linked 형태로 동작하며 hidden/unlinked kernel driver는 출력해 주지 않습니다.
  - 기본적으로 Virtual address 로 출력하며, Physical address 를 보고 싶다면 -P Option 을 추가하면 됩니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 modules
 # python vol.py -f image.vmem --profile=Win7SP1x64 modules -P

 

 > modscan : Kernel module 을 Physical address 로 보여주는 명령어입니다.
  -  pool 태그로 물리적 메모리 스캐닝을 함으로써 LDR_DATA_TABLE_ENTRY 구조들을 찾을 수 있습니다.
  -  이전에 load 되었던 driver, Rootkit 에 의해 hidden/unlinked 된 Driver 도 출력해 줍니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 modscan

 

 > moddump : Kernel driver 를 File 로 dump 해 주는 명령어입니다.
  - 정규 표현 식과, Physical Offset 을 이용한 Filter 를 지원해 줍니다.
  - 모든 driver 들을 dump 하고 싶다면 아무런 Filter 를 적용하지 않으면 됩니다.
  - 명령어 라인에 -D 또는 --dump-dir=DIR 로 출력 디렉토리를 제공합니다.
  - dlldump 와 비슷하게, PE 헤더의 중요한 부분이 메모리 상주가 아니라면 드라이버의 재구축 또는 추출은 아마 실패 할 것입니다.(2.1버전)

 # python vol.py -f image.vmem --profile=Win7SP1x64 moddump -D folder_name/

 

 > ssdt : Native 와 GUI SSDT 의 함수들을 list 시켜주는 명령어입니다.
  - index, function name, SSDT 에서 각각의 entry 를 소유하고 있는 driver owner 를 출력해 줍니다.
  - Windows 는 4 개의 SSDT 를 가지고 있으나 NT module 의 Native Function, win32k.sys module 의 GUI function 만을 사용하고 있습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 ssdt

 

 > driverscan : Memory 의 DRIVER_OBJECT 를 pool 태그 스캐닝하는 명령어입니다.
  - 모든 kernel module 이 DRIVER_OBJECT 와 관련된 것은 아닙니다.
  - DRIVER_OBJECT : 드라이버를 나타내는 데이터 구조체입니다. DEVICE_OBJECT를 포함하고 있으며, 하나의 드라이버가 동일한 장치 여러 개를 관리 할 수 있습니다.
  - DEVICE_OBJECT : 드라이버를 통해서 관리되는 장치를 표현하는 구조체입니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 driverscan

 

 > filescan : pool 태그 스캐닝을 사용하여 물리적 메모리에서 FILE_OBJECT를 스캐닝하는 명령어입니다.
  - Rootkit 이 디스크에 File 을 hiding 하였거나, 실제 System 의 open handle 을 hooking 하였더라도 open File 을 찾을 수 있습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 filescan

 

 > mutantscan : Memory 에서 KMUTANT 객체를 pool 태그 스캐닝을 사용해 스캐닝하는 명령어입니다.
  - 모든 오브젝트들을 보여주지만 mutexexs 로 명명된 것만 볼 수 있도록 -s 또는 --silent 를 사용할 수 있습니다.
  - CID column 은 Process ID 와 Thread ID 를 보여줍니다.
  - Volatility 는 mutexes 들이 random 한 이름을 가지기 때문에 의심 가는 mutexes 를 판단하는 것이 어렵다는 것을 알고, sqlite3 database 를 통해 해당 Memory dump 에 이미 DB 에 존재하는 이름이 있으면 강조해주는 기능을 가지고 있습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 mutantscan -s

 

 > symlinkscan : Symbolic link 객체들을 pool 태그 스캐닝을 사용해 스캐닝하는 명령어입니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 symlinkscan

 

 > thrdscan : Memory 의 ETHREAD 객체를 pool 태그 스캐닝을 사용해 스캐닝하는 명령어입니다.
  - ETHREAD 는 부모 process 를 식별할 수 있는 정보를 가지고 있기 때문에 이는 hidden Process 를 찾는데 도움을 주기도 합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 thrdscan

 

Volatility 볼라틸리티 2.1 Plugins - 윈도우#01

◎ Image Identification : 이미지 식별

Volatility 볼라틸리티 2.1 Plugins - 윈도우#02

◎ Processes and DLLs : 프로세스와 DLLs 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#03

◎ Process Memory : 프로세스 메모리 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#04

◎ Kernel Memory and Objects : 커널 메모리와 오브젝트 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#05

◎ Networking : 네트워크 정보
Volatility 볼라틸리티 2.1 Plugins - 윈도우#06

◎ Registry : 단지 Registry data를 추출하는데 도움을 줍니다.
Volatility 볼라틸리티 2.1 Plugins - 윈도우#07

◎ Crash Dumps, Hibernation and Conversion : 크래쉬 덤프, 하이버네이션 정보확인 및 파일변환
Volatility 볼라틸리티 2.1 Plugins - 윈도우#08

◎ Malware and Rootkits : 맬웨어와 루트킷 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#09

◎ Miscellaneous : 기타 등등

◎ Process Memory : 프로세스 메모리 분석
 > memmap : 해당 Image에서 할당된 Memory 주소 Map을 보여주는 명령어입니다.
  - 정확히 어떤 페이지가 메모리 상주인지 상세한 프로세스 DTB(또는 대기상태나 시스템 프로세스에서 이 플러그인을 쓴다면 커널 DTB)를 보여줍니다. 
  - 페이지의 가상주소, 페이지의 일치하는 물리적 오프셋, 그리고 페이지 사이즈를 보여줍니다. 
  - 맵 정보는 근본적인 주소 공간의 get_available_addresses 방법을 사용해 플러그인으로써 발생됩니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 memmap -p 1111

 

 > memdump : Process의 다양한 Memory Segment에서 모든 Data를 추출하여 dump 하는 명령어입니다.
  - 특정 출력 디렉토리를 설정하려면, --dump-dir=DIR 또는 -D DIR을 사용합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 memdump -p 1111 -D folder_name/

 

 > procmemdump : 실행 가능한 Process(Slack space 포함)을 dump 하는 명령어입니다.
  - PE header 검증을 하지 않은 체로 dump 하려면 -u 또는 --unsafe를 사용하면 가능합니다.
  - 몇몇 악성코드는 PE 헤더에서 의도적으로 사이즈 필드를 위조해서 메모리 덤핑 툴이 실패하게 만듭니다.
  - 슬랙 공간(Slack space) : 저장 매체의 물리적인 구조와 논리적인 구조의 차이로 발생하는 낭비 공간. 물리적으로 할당된 공간이지만 논리적으로는 사용할 수 없는 공간을 말합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 procmemdump -p 1111 -D folder_name/

 

 > procexedump : 실행 가능한 Process(Slack space 미포함)을 dump 하는 명령어입니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 procexecdump -p 1111 -D folder_name/

 

 > vadinfo : 프로세스의 VAD 노드들에 대한 확장된 정보를 보여주기 위한 명령어로 아래와 같은 정보를 보여줍니다.
  - VAD(Virtual Address Descriptor) : 프로세스 주소 공간에서 가상 주소가 예약되어 있는지 여부를 추적할 수 있게 관리하는 데이터 구조체 집합입니다.
  - 커널 메모리에서 MMVAD 구조체 주소
  - MMVAD(Memory Manager Virtual Address Descriptors) : 메모리 관리자 가상 주소 설명 자라는 이진트리 항목
  - 윈도우 메모리 관리자(Windows Memory Manager)는 실제 메모리에 액세스 하기 전 각 프로세스(프로세스 관리자가 프로세스를 관리하기 위해 필요한 정보를 포함하는 EPROCESS 구조)의 가상 주소 공간에 액세스 하기 위한 정보를 이진트리(MMVAD 구조로 메모리 세그먼트의 가상 메모리 기본 주소 및 크기와 같은 MM 관련 정보 포함) 형태로 관리합니다.
  - MMVAD 구조가 적용되는 프로세스 메모리에서의 시작과 끝 지점의 가상주소(Virtual Address)
  - VAD 태그
  - VAD 플래그와 컨트롤 플래그 등
  - 매핑된 메모리(memory map File)의 이름(존재할 경우)
  - 커널 메모리(Kernel Memory)의 MMVAD 구조체 주소
  - Memory Protection(only original protection) : PAGE_NOACCESS 로 메모리 할당 시 보호를 하였다 하더라도, 이것이 현재 메모리 상태를 나타내는 것이 아닐 수 도 있습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 vadinfo -p 1111

 

 > vadwalk : VAD nodes 들을 보여주는 명령어입니다.
  - VAD tree(Virtual Address Descriptor tree) : 자체 밸런싱 바이너리 트리를 말하며 특정 노드의 왼쪽은 특정 노드보다 낮은 값의 노드, 오른쪽은 특정 노드보다 높은 값의 노드로 이루어져 있는 트리를 말합니다. Windows memory manager에서 프로세스가 할당받은 메모리를 표현하기 위해 사용됩니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 vadwalk -p 1111

 

 > vadtree : VAD nodes 들을 Tree 형태로 보여주는 명령어입니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 vadtree -p 1111

 

 > vaddump : memdump 와 유사한 명령어로서, 각각의 VAD Segment에서 포함된 Data를 dump 하는 명령어입니다.
  - memdump 와는 달리 dump 되는 dmp File 의 이름이 Memory 주소 영역으로 되어 있습니다.
  - 해당 File 명은 ProcessName.PhysicialOffset.StartingVPN.EndingVPN.dmp 와 같은 포맷으로 되어 있습니다.
  - PhysicalOffset 이 File 명에 들어가는 이유는 같은 이름을 가진 2 개 이상의 Process 들을 구분하기 위해서입니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 vaddump -D folder_name/

 

 > evtlogs : Windows 이벤트 로그 추출 명령어입니다. (XP/2003 only)

 # python vol.py -f image.vmem --profile=Win7SP1x64 evtlogs --dump-dir=folder_name/
 # cat folder_name/appevent.txt

 

Volatility 볼라틸리티 2.1 Plugins - 윈도우#01

◎ Image Identification : 이미지 식별

Volatility 볼라틸리티 2.1 Plugins - 윈도우#02

◎ Processes and DLLs : 프로세스와 DLLs 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#03

◎ Process Memory : 프로세스 메모리 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#04

◎ Kernel Memory and Objects : 커널 메모리와 오브젝트 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#05

◎ Networking : 네트워크 정보
Volatility 볼라틸리티 2.1 Plugins - 윈도우#06

◎ Registry : 단지 Registry data를 추출하는데 도움을 줍니다.
Volatility 볼라틸리티 2.1 Plugins - 윈도우#07

◎ Crash Dumps, Hibernation and Conversion : 크래쉬 덤프, 하이버네이션 정보확인 및 파일변환
Volatility 볼라틸리티 2.1 Plugins - 윈도우#08

◎ Malware and Rootkits : 맬웨어와 루트킷 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#09

◎ Miscellaneous : 기타 등등

◎ Processes and DLLs : 프로세스와 DLLs 분석
 > pslist : PsActiveProcessHead가 가리키는 이중 연결 목록(doubly-linked list)을 살펴보고 오프셋, 프로세스 이름, ID, 부모 프로세스 ID(PPID), 쓰레드의 수, 핸들의 수, 프로세스 시작 시간과 종료 시간 등 실행 중인 프로세스 정보를 나열합니다. 다만 프로세스가 은닉되거나 연결이 끊어진 프로세스는 출력해주지 않습니다.

  - doubly-linked list : 노드와 노드가 양방향으로 연결되어 있어 양방향으로 탐색이 가능합니다.

  - Time은 Process의 시작 시간을 의미하며 Thds와 Hnds가 0이면 해당 Process는 활성화 상태가 아님을 뜻합니다

  - System 과 smss.exe 는 세션 ID 를 가지지 않는데 System 은 세션들이 자리 잡기 이전에 시작되고 smss.exe 는 자기 스스로가 세션 관리자이기 때문입니다.
  - Offset은 Virtual address를 기본으로 보여주고 있기 때문에, Physical 주소를 보고 싶다면 -P Option을 주면 가능합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 pslist -P

 

 > pstree : 부모(Parent) 프로세스와 자식(Child Process) 프로세스 간의 상관 관계를 5642138-마침표(.)를 통하여 트리 형태로 출력해줍니다.
  - pslist 와 유사하며 은닉되거나 연결이 끊긴 프로세스는 출력해주지 않습니다.
  - 자식 프로세스들은 "."(마침표)를 이용하여 Tree 형태로 보여줍니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 pstree

 

 > psscan : 실행 중인 프로세스 정보와 함께 이미 종료된 프로세스 정보를 나열합니다.
  - pslist, pstree 와 유사하지만 풀 태그 스캐닝(pool tag scanning)을 사용하여 프로세스를 출력해줍니다.
  - pool tag scanning : 커널 개체 할당을 찾기 위해 메모리 분석에서 일반적으로 사용되며 높은 정확도를 유지하면서 커널 데이터 구조를 훨씬 빠르게 스캔합니다.
  - 종료된 프로세스(interactive Process)나 비활성화 되어있는 프로세스, 루트 킷에 의해 숨겨(hidden)지거나 연결이 끊긴 프로세스(unlinked Process)들을 찾을 수 있습니다.
  - 프로세스가 이미 종료되었다면, 종료시간(Time exited) 항목에서 종료시간을 볼 수 있습니다.
  - 숨겨진 프로세스(프로세스의 DLL)에 대해서 조사하고 싶다면 해당 프로세스의 물리주소(Offset(P))로 이동하여 EPROCESS 구조체의 물리 오프셋 정보(헤더 시그니처 03 00 58 00 위에 풀태그 시그니처 50 72 6F E3 변조여부)를 확인하면 됩니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 psscan

 

 ※ EPROCESS(Executive Process) 구조체
  - 직접 적인 접근이 가능하며, 커널 모드(Kernel Mode)에서 프로세스 정보를 지닌 구조체입니다.
  - 시스템이 프로세스를 실행하고 관리하기 위한 모든 정보가 들어있습니다.
  - 프로세스가 생성되면 해당 프로세스의 정보를 가지고 있는 EPROCESS 라는 구조체가 커널 메모리에 생성됩니다.
  - 모든 프로세스(Process)는 각자의 EPROCESS 구조체를 하나씩 가지고 자신이 사용하는 쓰레드(Thread)의 개수만큼 ETHREAD 구조체를 가집니다.
  - Process : 메모리에 올라와 실행되고 있는 프로그램을 의미합니다.(Code, Data, Stack, Heap의 구조로 되어 있는 독립된 메모리 영역)
  - Thread : 프로세스가 할당받은 자원을 이용하는 여러 실행의 흐름으로 프로세스 내의 주소 공간이나 자원들을 프로세스 내 쓰레드끼리 공유하면서 실행됩니다.(Stack만 따로 할당받고 Code, Data, Heap 영역은 공유)
  - ETHREAD(Executive Thread Block) : 쓰레드가 속한 포인터와 그 쓰레드가 실행을 시작해야할 루틴의 주소 등과 KTHREAD의 포인터를 가집니다.
  - EPROCESS 와 ETHREAD 내부에는 각각 PCB = KPROCESS, TCB = KTHREAD란 이름의 구조체가 존재합니다.
  - KPROCESS : NULL 동기화 객체와 관련된 디스패처 객체 헤더(DISPATCHER_HEADER), 가상 메모리의 CR3 레지스터 값, 프로세스에 속해 있는 스레드 리스트 헤더, CPU에 대한 종속성(Affinity), 프로세스 우선순위, 프로세스에 서 생성되는 스레드의 기본 실행 시간 값 등과 같은 정보를 저장합니다.
  - PCB(Process Control Block) : DISPATCHER_HEADER, 디렉토리 테이블 주소, KTHREAD 목록, 우선순위, 커널/유저 CPU 시간 등에 대한 정보를 가지고 있습니다.
  - KTHREAD(Kernel Thread Block) : 쓰레드의 스케줄링 및 동기화 정보, 이 쓰레드가 커널 모드에서 실행될 때 사용되는 커널 스택과 TEB 포인터, 스레드 우선순위, 스케줄러에 의해 실행을 준비하고 있는 스레드 리스트, 퀀텀 값등의 정보를 저장합니다.
  - TCB(Thread Control Block) : 쓰레드별를 관리하는 자료구조입니다.
  - PEB(Process Environment Block) : 사용자 모드(User Mode, 빠른 연산 가능)에서 프로세스 실행에 필요한 정보(환경 설정 포인터 값)들을 담고 있으며, BaseAddress, Module List, Heap/Stack 정보가 들어있습니다.
  - TEB(Thread Environment Block) : 쓰레드 식별자, 사용자 모드(User Mode) 스택 및 쓰레드별 데이터를 저장하기 위한 배열을 가지고 있습니다.
  - ActiveProcessLinks : ActiveProcess List를 구성하는 이중 링크드 리스트로 프로세스의 목록을 얻을 수 있습니다. 작업관리자를 열면 보이는 System(PID 4) 프로세스는 윈도우 커널을 의미하며, 언제나 ActiveProcessLink의 첫번째 프로세스가 됩니다.
  - DISPATCHER_HEADER : 프로세스들 사이의 동기화에 필요한구조체이며 메모리 덤프에서 오브젝트를 찾을 때 중요한 역할을 합니다.

 

 > psdispscan : psscan과 비슷하지만 pool tag 대신 DISPATCHER_HEADER를 조사하여 프로세스들을 열거합니다.(only windows xp x86)
  - 명령어라인에 --plugins=contrib/plugins를 꼭 입력해야 합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 psdispscan

 

 > dlllist : 특정 프로세스에서 로드 한 DLL의 정보를 분석합니다.
  - 특정 프로세스 DLL을 보기 위해서는 -p 또는 -pid 명령어를 통하여 볼 수 있으며 이는 PEB_LDR_DATA의 InLoadOrderModuleList에서 가리키는 LDR_DATA_TABLE_ENTRY(=LDR_MODULE) 구조체들의 이중연결리스트를 지닙니다. DLL들은 한 프로세스에서 LoadLibrary(또는 LdrLoadDll 과 같은 몇몇 파생함수)를 호출할 때 이 리스트에 자동으로 추가되며 FreeLibrary가 호출되거나 레퍼런스 카운트가 0이 될 때까지 제거되지 않습니다.
  - PEB_LDR_DATA : 로드된 모듈에 대한 정보를 제공(InLoadOrderModuleList, InMemoryOrderModuleList, InInitializationOrderModuleList)
  - InLoadOrderModuleList : 메모리에 로드된 순서, InMemoryOrderModuleList : 메모리에 위치한 순서, InInitializationOrderModuleList : 초기화된 순서
  - LDR_DATA_TABLE_ENTRY : 프로세스의 PE Image 정보를 담고있니다.
  - LoadLibrary : 프로세스의 주소 공간에 라이브러리(DLL) 모듈을 로드합니다.
  - LdrLoadDll : LoadLibrary와 같이 프로세스로 DLL을 로드하는 하위 수준의 함수입니다.
  - FreeLibrary : DLL 모듈이 더 이상 필요하지 않은 경우 프로세스의 주소 공간으로부터 DLL 파일을 unload하는 함수입니다.
  - 특정 Process에 대한 Dll list를 보려면 -p 또는 --pid Option을 사용하여 확인이 가능합니다
  - 루트킷에 의해 숨겨지거나 연결이 끊어진 프로세스들의 DLL들을 보기위해서는 psscan 명령어로 물리 주소를 획득하고 --offset=OFFSET 으로 확인합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 dilllist
 # python vol.py -f image.vmem --profile=Win7SP1x64 dilllist -p 1111
 # python vol.py -f image.vmem --profile=Win7SP1x64 dilllist --pid 1111
 # python vol.py -f image.vmem --profile=Win7SP1x64 dilllist --offset=0x주소(physical
offsets)

 

 > dlldump : 모든 프로세스에서 로드한 DLL을 바이너리 형태로 추출합니다.
  - 특정 출력 디렉토리를 설정하려면, --dump-dir=DIR 또는 -D DIR 을 사용합니다.
  - 특정 프로세스로부터 모든 DLL을 덤프 뜨려면 -p 또는 --pid=PID 을 사용합니다.
  - 프로세스 메모리의 아무위치로부터 PE 를 덤프 뜨려면 --base=BASEADDR 을 사용합니다.
  - 숨겨지거나 연결이 끊어진 프로세스로부터 모든 DLL을 덤프 뜨려면 -o 또는 --offset=OFFSET 을 사용합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 dlldump -D folder_name/
 # python vol.py -f image.vmem --profile=Win7SP1x64 dlldump --pid 1111 -D folder_name/ --base=0x주소
 # python vol.py -f image.vmem --profile=Win7SP1x64 dlldump -o 0x주소 -D folder_name/ --base=0x주소

 

 > handles : 의심되는 process 분석 시 어떤 경로에 이미지파일이 있는지, 어떤 파일을 이용하는지 등 Image로 부터 열려 있는 handle을 보여주는 명령어입니다. 악성코드 분석에 유용합니다.
  - 특정 Process에 대한 handle만을 출력하고 싶다면, -p 또는 --pid 또는 --physical-offset=OFFSET 을 사용합니다.
  - 특정 type에 대한 handle만을 출력하고 싶다면, -t 또는 --object-type=OBJECTTYPE 을 사용합니다.
  - 결과에 object 이름이 없어 공백으로 나오는 경우를 없애고 싶다면 --silent 를 사용합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 handles

 

 > getsids : 각 프로세스의 소유자를 표시합니다.
  - SID(Security ID, 보안식별자)들을 보기 위해 getsids 라는 명령어를 사용합니다.
  - 권한 상승과 같은 의심 가는 부분을 확인할 수 있습니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 getsids

 

 > cmdscan : 공격자가 콘솔 쉘(cmd.exe)을 통해 입력한 명령어들을 찾기위해 _COMMAND_HISTORY을 스캐닝하여 아래와 같은 정보를 보여줍니다.
  - 콘솔 호스트 프로세스(csrss.exe 또는 conhost.exe)의 이름
  - 콘솔로 사용되고 있는 어플리케이션의 이름(어떤 프로세스든 cmd.exe 를 사용함)
  - 명령어 히스토리 버퍼들의 위치, 현재 버퍼 카운트, 마지막으로 추가된 명령어, 그리고 마지막으로 보여진 명령어
  - 어플리케이션 프로세스 핸들

 # python vol.py -f image.vmem --profile=Win7SP1x64 cmdscan

 

 > consoles : 공격자가 cmd.exe 에서 입력하거나 백도어를 경유하여 실행되는 명령어들을 찾기위해 _CONSOLE_INFORMATION을 스캐닝하여 아래와 같은 정보를 보여줍니다.
  - 공격자가 입력한 명령을 출력해줄뿐만 아니라, 스크린 버퍼(입력과 출력)를 모두 수집합니다.
  - 원본 콘솔 창 이름과 현재 콘솔 창 이름
  - 첨부된 프로세스들의 pid 와 이름(하나가 아닐 경우 LIST_ENTRY 를 순회하면서 열거합니다)
  - 특정 명령어 실행과 연관된 앨리어스. 예를 들면, 공격자는 "hello" 입력시 실제로는 "cd system"이 실행되는 앨리어스를 등록 할 수 있습니다.
  - cmd.exe 콘솔의 화면 위치

 # python vol.py -f image.vmem --profile=Win7SP1x64 consoles

 

 > envars : 프로세스의 환경변수들을 보여줍니다.
  - CPU 수, 하드웨어 아키텍처, 프로세스의 현재 디렉토리, 임시 디렉토리, 세션 이름, 컴퓨터 이름, 유저 이름 등등을 보여줍니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 envars

 

 > verinfo : PE File에 저장된 정보들을 보여주는 명령어입니다.
  - 모든 PE File들이 version 정보를 가지지 않습니다.
  - 해당 명령어는 -p 와 -o 옵션을 지원합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 verinfo

 

 > enumfunc : 프로세스들, DLL들, 그리고 커널 드라이브들에서 불러오고 내보내는 함수들을 열거합니다.
  - 풀 스캐너를 이용하려면 -s 옵션을 사용하며, 숨겨진 드라이버들 또는 숨겨진 프로세스들의 함수들을 열거하는데 유용합니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 enumfunc -s

  - 프로세스 메모리의 내보낸 함수들을 보여줍니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 enumfunc -P -E

  - 커널 메모리의 불러온 함수들을 보여줍니다.

 # python vol.py -f image.vmem --profile=Win7SP1x64 enumfunc -K -I

 

Volatility 볼라틸리티 2.1 Plugins - 윈도우#01

◎ Image Identification : 이미지 식별

Volatility 볼라틸리티 2.1 Plugins - 윈도우#02

◎ Processes and DLLs : 프로세스와 DLLs 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#03

◎ Process Memory : 프로세스 메모리 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#04

◎ Kernel Memory and Objects : 커널 메모리와 오브젝트 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#05

◎ Networking : 네트워크 정보
Volatility 볼라틸리티 2.1 Plugins - 윈도우#06

◎ Registry : 단지 Registry data를 추출하는데 도움을 줍니다.
Volatility 볼라틸리티 2.1 Plugins - 윈도우#07

◎ Crash Dumps, Hibernation and Conversion : 크래쉬 덤프, 하이버네이션 정보확인 및 파일변환
Volatility 볼라틸리티 2.1 Plugins - 윈도우#08

◎ Malware and Rootkits : 맬웨어와 루트킷 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#09

◎ Miscellaneous : 기타 등등

◎ Image Identification : 이미지 식별
 > imageinfo : 생성한 메모리 덤프 파일의 운영체제와 하드웨어에 대한 프로파일(기본 정보)을 나열합니다.
  - PAE(Physical Address Extension, 물리주소확장) : 4GB 메모리 어드레싱 가능 여부
  - DTB(Directory Table Base) : 가상주소를 물리 주소로 변환하기 위한 디렉터리 테이블의 주소 값

  - KDBG(_KDDEBUGGER_DATA64) : 운영체제의 정보를 가지고 있는 구조체이며, Process 활성화 상태, Handle 오픈 여부, Kernel변수의 Memory 주소 등의 정보를 확인할 수 있습니다. 

  - KDBG(_KDDEBUGGER_DATA64) : 운영체제의 정보를 가지고 있는 구조체이며, Process 활성화 상태, Handle 오픈 여부, Kernel변수의 Memory 주소 등의 정보를 확인할 수 있습니다. 

  - KPCR(Kernel Processor Control Region): CPU의 정보를 가지고 있는 구조체이며, 멀티코어 시스템에서는 각각의 프로세서마다 KPCR을 가지고 있습니다.

  - KUSER_SHARED_DATA : 커널모드와 유저 모드 사이에 공통으로 매핑되어 있는 메모리, 커널단에서는 0 xFFDF0000 주소로, 사용자 영역에서는 0x7FFE0000 주소로 참조 가능한 물리적 페이지 메모리 영역이며, 4 Kbyte 영역 중 1 Kbyte만을 시스템이 사용 중이므로 나머지 3 Kbyte의 공간은 비어있음

 # python vol.py -f image.vmem imageinfo

 

 > kdbgscan : 정확한 프로파일과 커널 디버거 데이터 블록(_KDDEBUGGER_DATA64)의 특징을 찾고 분석합니다.
  - Offset (V) : virtual offsets(offsets : 메모리 주소를 표현하는 방식)
  - Offset (P) : physical offsets
  - KDBG 주소(만약 여러 개가 있다면) 중 0 프로세스, 0 모듈은 유효하지 않음
  - 유효한 KDBG 주소를 pslist플러그인에 '--kdbg=0x주소(virtual offsets)' 로 제공
  - PsActiveProcessHead : 활성화된 프로세스의 헤드 목록에 대한 주소(Pointer to the list head of active processes)
  - PsLoadedModuleList : 로드된 커널 모듈 목록에 대한 주소(Pointer to the list of loaded kernel modules)
  - KDBG 를 통해 OS 정보 식별: 32bit의 경우 8Byte의 0x00으로 시작, 64bit의 경우 0 xfffff800으로 시작
  - KernelBase : 커널주소
  - Major (OptionalHeader) : OS 버전 앞자리
  - Minor (OptionalHeader) : OS 버전 뒷자리
  - Microsoft Windows [Version 6.1.7601]인 경우 => Major : 6, Minor : 1

 # python vol.py -f image.vmem --profile=Win7SP1x64 kdbgscan

 

 > kprcscan : CPU의 정보를 가지고 있는 구조들을 스캔합니다.
  - KdVersionBlock : 커널의 전역 변수로 디버깅 시스템에 대한 버전 정보를 지닌 _DBGKD_GET_VERSION64 구조체의 주소를 가지고 있습니다. 또한 이 구조체의 DebuggerDataList 필드는 _KDDEBUGGER_DATA64 구조체의 Linked list에 포함되어 있습니다.
  - IDT(Interrupt Descriptor Table) : 인터럽트 디스크립터 테이블, CPU에서 트러블이 발생하면, 임시로 처리를 스위칭하는 기능으로 인터럽트 번호는 0~255까지 설정되어 있습니다.
  - GDT(Global segment Descriptor Table) : 글로벌 디스크립터 테이블, 세그먼트는 메모리의 구역을 정확히 나누어서 메모리의 이용 범위를 안 겹치게 하는 방법으로 4GB의 메모리를 분할한 뒤 각 블록의 처음 시작 번지를 0으로 하여 다루는 기능입니다.
  - CurrentThread : 현재 수행중인 쓰레드

  - IdleThread : 유휴 스레드
  - TID(ThreadID) : 운영체제 관점에서 쓰레드의 식별자
  - Details : CPU 벤더, 속도

  - CR3/DTB : CPU의 레지스터 페이지 디렉터리의 시작 위치로 페이지 디렉토리(PD) 혹은 페이지 디렉토리 포인터 테이블(PDPT)을 가리키기 위해 CR3 레지스터가 사용되며, 이 값을 Directory Table Base라 부릅니다. DTB는 _EPROCESS.Pcr.DirectoryTableBase 필드에도 존재

 # python vol.py -f image.vmem --profile=Win7SP1x64 kprcscan

 

Volatility 볼라틸리티 2.1 Plugins - 윈도우#01

◎ Image Identification : 이미지 식별

Volatility 볼라틸리티 2.1 Plugins - 윈도우#02

◎ Processes and DLLs : 프로세스와 DLLs 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#03

◎ Process Memory : 프로세스 메모리 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#04

◎ Kernel Memory and Objects : 커널 메모리와 오브젝트 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#05

◎ Networking : 네트워크 정보
Volatility 볼라틸리티 2.1 Plugins - 윈도우#06

◎ Registry : 단지 Registry data를 추출하는데 도움을 줍니다.
Volatility 볼라틸리티 2.1 Plugins - 윈도우#07

◎ Crash Dumps, Hibernation and Conversion : 크래쉬 덤프, 하이버네이션 정보확인 및 파일변환
Volatility 볼라틸리티 2.1 Plugins - 윈도우#08

◎ Malware and Rootkits : 맬웨어와 루트킷 분석
Volatility 볼라틸리티 2.1 Plugins - 윈도우#09

◎ Miscellaneous : 기타 등등

1. profiles을 생성하기 위해 폴더 이동

 # cd [volatility directory]/tools/linux

설치시 경로를 별도로 지정하지 않았다면 /usr/tools/linux를 확인해 보시기 바랍니다.

 

2. profiles를 생성하기 위해 make 명령어 실행

 # make

make를 진행하면 module.dwarf 파일과 system map file이 생성됩니다.
system map file은 /boot 폴더에 생성되며 현재 커널버전과 동일하게 만들어집니다.


※ profiles 생성 전 확인 사항

# uname -a 

Linux localhost.localdomain 3.10.0-693.2.2.el7.x86_64 #1 SMP Tue Sep 12 22:26:13 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

 

3. make 명령 실행 후 확인사항

 # ls /boot | grep System
 System.map-3.10.0-693.2.2.el7.x86_64

 

4. profiles를 생성하기 위해 zip 명령어 실행 및 이동

 # zip [profile name 지정] ./module.dwarf /boot/[make 이후 만들어진 system map file]

make 이후 생성된 module.dwarf 파일과 system map file을 zip으로 묶는 작업입니다.
완료되면 해당 파일을 [volatility directory]/volatility/plugins/overlays/linux로 이동합니다.

 

5. zip 파일 확인

 # ls /[volatility directory]/volatility/plugins/overlays/linux | grep .zip
 CentOS7x64.zip

 

6. profiles 확인

 # python ./vol.py --info | grep LinuxCent

 Profiles
 --------
 LinuxCentOS7x64    - A Profile for Linux CentOS7x64 x64

info 명령을 통해 생성한 profiles을 확인합니다.

 

+ Recent posts