◎ 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 : 기타 등등