Bài 8.2: Hunting Malware using Memory Forensics
1. Tổng quan về Memory Forensics
Memory Forensics (Pháp y bộ nhớ) là quá trình thu thập, phân tích bộ nhớ RAM của hệ thống nhằm phát hiện các dấu hiệu tấn công, mã độc hoặc hành vi bất thường mà không thể tìm thấy trên đĩa cứng.
Tại sao Memory Forensics quan trọng?
Nhiều loại mã độc hiện đại hoạt động hoàn toàn trong RAM (fileless malware), không ghi gì ra đĩa. Các thông tin nhạy cảm như khóa mã hóa, credentials, lệnh shell đã thực thi — tất cả đều tồn tại trong bộ nhớ tạm thời. Khi máy tắt, toàn bộ bằng chứng này biến mất, do đó việc thu thập bộ nhớ kịp thời là cực kỳ quan trọng.
Hai bước chính
Memory Acquisition → Memory Analysis
(Thu thập RAM) (Phân tích dump)Memory Acquisition: Thu thập toàn bộ nội dung RAM sang file trên đĩa (memory dump / image). Có thể thực hiện trên máy thật đang nhiễm mã độc, hoặc trong môi trường lab (máy ảo).
Memory Analysis: Dùng các công cụ như Volatility để phân tích file dump đã thu thập, trích xuất thông tin về tiến trình, mạng, registry, lệnh đã chạy, v.v.
2. Memory Acquisition
Khái niệm
Memory Acquisition là quá trình sao chép nội dung của bộ nhớ vật lý (RAM — volatile/tạm thời) vào một file lưu trữ cố định trên đĩa cứng để phân tích về sau. Bởi vì RAM là volatile (mất khi mất nguồn), việc thu thập phải được thực hiện trước khi tắt máy hoặc ngay khi phát hiện sự cố.
Các công cụ phổ biến
| Công cụ | Loại | Nền tảng |
|---|---|---|
| DumpIt (Comae Memory Toolkit) | Free (đăng ký) | Windows |
| Belkasoft RAM Capturer | Free (đăng ký) | Windows |
| FTK Imager | Free (đăng ký) | Windows |
| Memoryze (FireEye) | Free (đăng ký) | Windows |
| WinPmem | Open source | Windows |
| Surge Collect (Volexity) | Commercial | Windows/Linux |
| OSForensics | Commercial | Windows |
2.1 Sử dụng DumpIt
DumpIt là thành phần của Comae Memory Toolkit, cho phép dump bộ nhớ vật lý của Windows chỉ với một vài lệnh đơn giản.
Dump ra định dạng Crash Dump (mặc định .dmp):
DumpIt.exe /O memory.dmpDump ra định dạng RAW (.bin):
DumpIt.exe /T RAW /O memory.binCác tùy chọn quan trọng:
/TYPE, /T Chọn loại dump: RAW hoặc DMP (mặc định: DMP)
/OUTPUT, /O Đường dẫn file đầu ra
/QUIET, /Q Không hỏi xác nhận
/COMPRESS, /R Nén file dump
/NOLYTICS, /N Không gửi analytics đến Comae TechnologiesDump trên Linux:
./dumpitforlinux [OPTIONS] [Output Path]
# Ví dụ:
./dumpitforlinux /tmp/memory.dmp
# Dump ra stdout:
./dumpitforlinux --to-stdout
# Dump dạng raw core dump:
./dumpitforlinux --raw /tmp/memory.binOutput của DumpIt thành công sẽ bao gồm:
- SHA-256 hash của file dump (để xác thực tính toàn vẹn)
- Kích thước file, số trang đã ghi
- File JSON metadata đi kèm
3. Volatility Framework
3.1 Giới thiệu
Volatility là framework phân tích bộ nhớ mã nguồn mở, viết bằng Python, được sử dụng rộng rãi nhất trong lĩnh vực memory forensics và phân tích mã độc.
Đặc điểm nổi bật:
- Hỗ trợ đa nền tảng: Windows, macOS, Linux
- Phân tích cả hệ điều hành 32-bit và 64-bit
- Hàng trăm plugin cho các tác vụ khác nhau
- Mã nguồn mở, cộng đồng lớn
Tải xuống: https://volatilityfoundation.org/the-volatility-framework/
3.2 Cài đặt và chạy
Windows:
volatility_2.6_win64_standalone.exe -hLinux:
./volatility_2.6_lin64_standalone -hmacOS:
./volatility_2.6_mac64_standalone -hYêu cầu Python 2.7 và các dependency:
pip install pycrypto
pip install distorm3
pip install Pillow
# Xem thêm tại: https://github.com/volatilityfoundation/volatility/wiki/Installation
python vol.py -h3.3 Cú pháp cơ bản
python vol.py -f <memory_image_file> --profile=<PROFILE> <PLUGIN> [ARGS]| Tham số | Ý nghĩa |
|---|---|
-f | Đường dẫn đến file memory image (dump) |
--profile | Chỉ định hệ điều hành và kiến trúc nguồn (VD: Win7SP1x64, WinXPSP3x86) |
<PLUGIN> | Tên plugin muốn chạy (VD: pslist, netscan) |
Ví dụ xem danh sách plugin:
python vol.py -hVí dụ liệt kê tiến trình:
python vol.py -f memory.dmp --profile=Win7SP1x64 pslist4. Enumerating Processes (Liệt kê tiến trình)
Liệt kê tiến trình là bước đầu tiên và quan trọng nhất trong phân tích mã độc qua bộ nhớ. Tương đương với việc xem Task Manager, nhưng chi tiết và khó giả mạo hơn nhiều.
Mục đích:
- Phát hiện tiến trình độc hại (tên giả, đường dẫn bất thường)
- Theo dõi hành vi của mã độc
- Xác định tiến trình có kết nối mạng ra ngoài
- Kiểm tra sự tương tác với các tiến trình hệ thống quan trọng (như
svchost.exe,lsass.exe)
4.1 Cấu trúc _EPROCESS
Mỗi tiến trình trên Windows được đại diện bởi một cấu trúc kernel gọi là _EPROCESS. Đây là cấu trúc C nội bộ, lưu trong không gian kernel, chứa toàn bộ thông tin về tiến trình.
Các trường quan trọng trong _EPROCESS:
_EPROCESS
├── +0x000 Pcb (KPROCESS - thông tin scheduling)
├── +0x440 UniqueProcessId (PID)
├── +0x448 ActiveProcessLinks (LIST_ENTRY - danh sách liên kết đôi)
├── +0x5a8 ImageFileName (tên file thực thi, tối đa 15 ký tự)
├── +0x3e0 Peb (Process Environment Block)
└── ...Xem cấu trúc bằng WinDbg:
dt nt!_EPROCESS4.1.2 ActiveProcessLinks và cách Volatility liệt kê tiến trình
ActiveProcessLinks là một LIST_ENTRY (danh sách liên kết đôi) nối tất cả các _EPROCESS đang hoạt động lại với nhau. Kernel Windows duyệt danh sách này để biết có bao nhiêu tiến trình đang chạy.
PsActiveProcessHead <--> EPROCESS_1 <--> EPROCESS_2 <--> EPROCESS_3Plugin pslist hoạt động bằng cách: Bắt đầu từ PsActiveProcessHead, duyệt qua ActiveProcessLinks.Flink (forward link) để liệt kê từng tiến trình. Đây là cách Task Manager và PsList của Microsoft cũng hoạt động.
Tính toán địa chỉ _EPROCESS từ LIST_ENTRY:
Địa chỉ _EPROCESS = Địa chỉ LIST_ENTRY (Flink) - Offset(ActiveProcessLinks)
= Flink - 0x448# Ví dụ script Python xác minh:
offset = 0x448
memory_addresses = [0xffffc509c5488488, 0xffffc509c54f64c8, 0xffffc509c8373488]
for address in memory_addresses:
result = address - offset
print(hex(result))4.2 Plugin pslist
python vol.py -f memory.dmp --profile=Win7SP1x64 pslistOutput mẫu:
Offset(V) Name PID PPID Thds Hnds Sess Wow64 Start
0xbf0f64a63080 System 4 0 108 ... ... False ...
0xbf0f64bc6040 Registry 108 4 4 ... ... False ...
0xbf0f66967040 smss.exe 396 4 2 ... ... False ...
0xbf0f6adb6080 csrss.exe 492 484 13 ... ... False ...4.2.1 DKOM — Direct Kernel Object Manipulation
DKOM là kỹ thuật tấn công mức kernel, cho phép attacker ẩn tiến trình bằng cách sửa trực tiếp cấu trúc dữ liệu trong kernel space.
Cách ẩn tiến trình bằng DKOM:
TRƯỚC DKOM:
A.Flink → B → C
C.Blink → B → A
SAU DKOM (ẩn B):
A.Flink → C (bỏ qua B)
C.Blink → A (bỏ qua B)
B vẫn tồn tại trong RAM nhưng không ai trỏ đến nó nữaDKOM đòi hỏi attacker phải có quyền truy cập kernel (ring 0), thường thông qua exploit kernel hoặc driver độc hại.
4.2.2 Plugin psscan và Pool Tag Scanning
psscan khắc phục điểm yếu của pslist bằng cách quét toàn bộ không gian bộ nhớ để tìm cấu trúc _EPROCESS, thay vì duyệt danh sách liên kết.
python vol.py -f memory.dmp --profile=Win7SP1x64 psscanKỹ thuật Pool Tag Scanning:
Trong Windows, mỗi khi kernel cấp phát bộ nhớ cho một object, nó thêm một Pool Tag (4 ký tự) vào header của vùng nhớ đó. Ví dụ, _EPROCESS có pool tag là Proc.
Paged Pool / Non-Paged Pool
┌─────────────────────────────────────┐
│ Pool Header: "Proc" (4 bytes tag) │
├─────────────────────────────────────┤
│ _EPROCESS structure │
│ (UniqueProcessId, ImageFileName...)│
└─────────────────────────────────────┘- Paged Pool: Vùng nhớ kernel có thể swap ra đĩa
- Non-Paged Pool: Vùng nhớ kernel KHÔNG được swap, dùng cho dữ liệu cần truy cập nhanh liên tục
psscan quét toàn bộ RAM để tìm signature Proc, sau đó phân tích cấu trúc xung quanh đó. Vì vậy nó có thể tìm thấy tiến trình ẩn và thậm chí cả tiến trình đã kết thúc (nếu bộ nhớ chưa bị ghi đè).
So sánh pslist và psscan:
| Tiêu chí | pslist | psscan |
|---|---|---|
| Phương pháp | Duyệt ActiveProcessLinks | Pool Tag Scanning |
| Tốc độ | Nhanh | Chậm hơn |
| Phát hiện tiến trình ẩn (DKOM) | Không | Có |
| Phát hiện tiến trình đã kết thúc | Không | Có thể |
| Phát hiện tiến trình giả | Không | Có thể |
4.3 Plugin pstree
Hiển thị quan hệ cha-con giữa các tiến trình dưới dạng cây:
python vol.py -f memory.dmp --profile=Win7SP1x64 pstreeCác tùy chọn bổ sung:
pstree -a # Hiển thị command line arguments
pstree -p # Hiển thị PIDs
pstree -c # Mở rộng các nhánh giống nhau
pstree -n # Phân loại theo PID
pstree -u # Hiển thị user của tiến trình
pstree -h # Highlight tiến trình đang chạy
pstree -g # Hiển thị Group IDs4.4 Plugin psxview
psxview là plugin đặc biệt, nó kiểm tra sự hiện diện của tiến trình qua nhiều phương pháp khác nhau đồng thời và hiển thị kết quả để so sánh:
python vol.py -f memory.dmp --profile=WinXPSP3x86 psxviewCác nguồn kiểm tra trong output:
Offset(P) Name PID pslist psscan thrdproc pspcid csrss session deskthrd| Cột | Nguồn kiểm tra |
|---|---|
| pslist | ActiveProcessLinks |
| psscan | Pool Tag Scanning |
| thrdproc | Duyệt qua các thread |
| pspcid | PspCidTable (bảng PID hệ thống) |
| csrss | Danh sách tiến trình trong CSRSS |
| session | Danh sách session |
| deskthrd | Desktop thread handles |
5. Listing Process Handles
Khái niệm Handle
Trong Windows, Handle là một tham chiếu gián tiếp đến một kernel object. Khi một tiến trình muốn truy cập vào file, registry key, mutex, pipe, hay tiến trình khác, nó phải mở một handle đến object đó thông qua các API như CreateFile, OpenProcess, CreateMutex.
Tiến trình (User Space)
↓ handle (số nguyên - index)
Handle Table (Kernel Space)
↓ con trỏ
Kernel Object (_FILE_OBJECT, _KEY_OBJECT, ...)Bảng Handle (Handle Table):
- Mỗi tiến trình có một bảng handle riêng trong kernel space
- Khi kernel tạo object, con trỏ đến object được đặt vào slot trống đầu tiên
- Chỉ số của slot đó được trả về cho tiến trình làm handle value
Phân tích handle với Volatility
# Liệt kê tất cả handles của tiến trình PID 880
python vol.py -f memory.dmp --profile=Win7SP1x86 handles -p 880
# Lọc theo loại object cụ thể
python vol.py -f memory.dmp --profile=Win7SP1x86 handles -p 880 -t File
python vol.py -f memory.dmp --profile=Win7SP1x86 handles -p 880 -t MutantÝ nghĩa trong phân tích mã độc
Bằng cách liệt kê handles của một tiến trình đáng ngờ, điều tra viên có thể xác định:
- Tiến trình đang mở những file nào (có thể là file hệ thống mà nó đang inject vào)
- Mutex nào đang được giữ (mã độc thường dùng mutex để chống chạy nhiều instance)
- Pipe, socket, registry key nào đang được truy cập
Process Hacker là công cụ GUI cho phép xem handles và DLLs của tiến trình trực quan, hỗ trợ tìm kiếm theo tên handle.
6. Listing DLLs
DLL là gì?
Dynamic Link Library (DLL) là file thực thi chia sẻ (.dll) chứa code và data có thể được nhiều chương trình sử dụng đồng thời. Khi một chương trình cần chức năng từ DLL, Windows nạp DLL vào không gian địa chỉ của tiến trình đó.
Tại sao phân tích DLL quan trọng?
Mã độc thường:
- Inject DLL độc hại vào tiến trình hợp lệ (DLL Injection)
- Ẩn DLL khỏi danh sách load (DLL Hiding via rootkit)
- Nạp DLL không hợp lệ từ đường dẫn bất thường
6.1 Plugin dlllist
Trích xuất danh sách DLL từ cấu trúc Process Environment Block (PEB) của tiến trình:
# Liệt kê DLLs của tất cả tiến trình
python vol.py -f memory.dmp --profile=Win7SP1x86 dlllist
# Lọc theo PID cụ thể
python vol.py -f memory.dmp --profile=Win7SP1x86 dlllist -p 880Output mẫu:
svchost.exe pid: 880
Command line: C:\Windows\system32\svchost.exe -k netsvcs
Base Size LoadCount Path
0x00f30000 0x8000 0xffff C:\Windows\system32\svchost.exe
0x76f60000 0x13c000 0xffff C:\Windows\SYSTEM32\ntdll.dll
0x75530000 0xd4000 0xffff C:\Windows\system32\kernel32.dll
...
0x10000000 0x26000 0x1 c:\users\test\application data\...\imageik.ddf6.2 Phát hiện DLL ẩn với ldrmodules
Plugin ldrmodules so sánh thông tin DLL từ ba danh sách trong PEB với Virtual Address Descriptors (VADs) trong kernel để phát hiện DLL bị ẩn:
python vol.py -f memory.dmp --profile=WinXPSP3x86 ldrmodules -p 880Ba danh sách PEB:
PEB
├── Ldr.InLoadOrderModuleList (InLoad) - thứ tự load
├── Ldr.InInitializationOrderModuleList (InInit) - thứ tự init
└── Ldr.InMemoryOrderModuleList (InMem) - thứ tự địa chỉ bộ nhớOutput mẫu với DLL ẩn:
Base InLoad InInit InMem MappedPath
0x10000000 False False True \WINDOWS\system32\TDSSoiqh.dll
...7. Dumping Executable và DLL
Khái niệm
Khi muốn phân tích sâu một tiến trình hoặc DLL đáng ngờ, ta cần dump (sao chép) nó từ bộ nhớ ra file để:
- Phân tích tĩnh (static analysis) với IDA Pro, Ghidra
- So sánh hash với VirusTotal
- Kiểm tra code đã được unpack/decrypt trong bộ nhớ
7.1 Dump tiến trình với procdump
# Dump tiến trình PID 3832
python vol.py -f perseus.vmem --profile=Win7SP1x86 procdump -p 3832 -D dump/
# Dump theo địa chỉ vật lý (khi PID không rõ)
python vol.py -f infected.vmem --profile=WinXPSP3x86 procdump -o 0x00000000016ba360 -D dump/Kết quả dump:
Process(V) ImageBase Name Result
0x8503f0e8 0x00b90000 svchost.exe OK: executable.3832.exeKiểm tra loại file:
file dump/executable.3832.exe
# Output: PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows7.2 Dump DLL với dlldump
# Dump DLL tại địa chỉ base 0x10000000 từ tiến trình PID 880
python vol.py -f ghost.vmem --profile=Win7SP1x86 dlldump -p 880 -b 0x10000000 -D dump/Output:
Name Module Base Module Name Result
svchost.exe 0x010000000 imageik.ddf module.880.ea13030.10000000.dll8. Listing Network Connections and Sockets
Tại sao quan trọng?
Mã độc thường cần kết nối ra ngoài để:
- Nhận lệnh từ C&C (Command & Control) server
- Exfiltrate (rò rỉ) dữ liệu
- Download payload bổ sung
- Liên lạc với attacker (reverse shell)
Phân tích kết nối mạng từ bộ nhớ giúp liên kết tiến trình đang chạy với các IP/port đáng ngờ quan sát được trên mạng.
8.1 Plugin connections (Windows XP/2003)
python vol.py -f be3.vmem --profile=WinXPSP3x86 connectionsOutput:
Offset(V) Local Address Remote Address Pid
0x81549748 192.168.1.100:1037 X.X.32.230:443 756Xác định tiến trình liên quan:
python vol.py -f be3.vmem --profile=WinXPSP3x86 pslist -p 756
# → svchost.exe PID:756 PPID:5808.2 Plugin connscan
Dùng Pool Tag Scanning để tìm kết nối đã đóng hoặc bị ẩn:
python vol.py -f tdl3.vmem --profile=WinXPSP3x86 connscanOffset(P) Local Address Remote Address Pid
0x093812b0 192.168.1.100:1032 XX.XXX.92.121:80 8808.3 Plugin netscan (Windows Vista/7 trở lên)
python vol.py -f darkcomet.vmem --profile=Win7SP1x86 netscanProto Local Address Foreign Address State Pid Owner
TCPv4 0.0.0.0:139 0.0.0.0:0 LISTENING 4 System
TCPv4 0.0.0.0:49155 0.0.0.0:0 LISTENING 496 services.exe
TCPv4 192.168.1.60:49162 XX.XXX.228.199:81 ESTABLISHED 3768 dmt.exeSo sánh các plugin mạng:
| Plugin | Hệ điều hành | Phương pháp | Ghi chú |
|---|---|---|---|
connections | XP/2003 | Duyệt danh sách | Chỉ kết nối đang hoạt động |
connscan | XP/2003 | Pool Tag Scan | Tìm cả kết nối đã đóng |
sockets | XP/2003 | Duyệt danh sách | Socket đang mở |
sockscan | XP/2003 | Pool Tag Scan | Socket đã đóng |
netscan | Vista+ | Pool Tag Scan | Kết nối + socket |
9. Inspecting Registry
Tại sao mã độc dùng Registry?
Registry là cơ sở dữ liệu cấu hình trung tâm của Windows. Mã độc sử dụng registry để:
- Persistence (tồn tại qua reboot): Thêm entry vào
Runkey - Lưu trữ cấu hình: Khóa mã hóa, địa chỉ C&C
- Backdoor: Tạo tài khoản ẩn hoặc sửa chính sách hệ thống
9.1 Plugin hivelist
Liệt kê tất cả registry hives đang được load vào bộ nhớ:
python vol.py -f memory.dmp --profile=Win7SP1x64 hivelistOutput mẫu:
Virtual Physical Name
0xfffff8a000318010 0x000000003f8ac010 \SystemRoot\System32\Config\SECURITY
0xfffff8a001072010 0x000000001016de10 \??\C:\Users\seven\ntuser.dat
0xfffff8a00108a420 0x0000000045d1420 \??\C:\Users\seven\AppData\...\UsrClass.dat
0xfffff8a000024010 0x0000000003cf0010 \REGISTRY\MACHINE\SYSTEM
0xfffff8a000257010 0x000000003b7a4010 \SystemRoot\System32\Config\SOFTWARE9.2 Plugin printkey
In ra nội dung của một registry key cụ thể:
python vol.py -f memory.dmp --profile=Win7SP1x64 printkey -K "Microsoft\Windows\CurrentVersion\Run"Output:
Registry: \SystemRoot\System32\Config\SOFTWARE
Key name: Run (S)
Last updated: 2021-12-31 04:39:42 UTC+0000
Values:
REG_EXPAND_SZ VBoxTray (S) %SystemRoot%\system32\VBoxTray.exe9.3 Plugin hashdump
Trích xuất password hash từ SAM registry hive:
python vol.py -f memory.dmp --profile=Win7SP1x64 hashdumpOutput:
Administrator:500:aad3b435b51404ee:31d6cfe0d16ae931b73c59d7e8c089c0:::
Guest:501:aad3b435b51404ee:31d6cfe0d16ae931b73c59d7e8c089c0:::
seven:1001:aad3b435b51404ee:2d20d252a479f485cdf5e171d93985bf:::9.4 Plugin userassist
UserAssist là registry key lưu lịch sử các chương trình đã được thực thi bởi từng user (ROT-13 encoded):
python vol.py -f memory.dmp --profile=Win7SP1x64 userassistCung cấp: đường dẫn executable, số lần chạy, thời điểm cuối cùng chạy.
9.5 Plugin shellbags
Shellbags là “folder access logs” — Windows lưu thông tin về các folder người dùng đã mở (kể cả trên USB, network share, thậm chí đã bị xóa):
python vol.py -f memory.dmp --profile=Win7SP1x64 shellbagsMỗi “bag” có giá trị MRU (Most Recently Used) và timestamp “last updated”.
9.6 Plugin shimcache
Shimcache (Application Compatibility Cache) lưu danh sách executable đã từng chạy trên hệ thống, kể cả những file đã bị xóa:
python vol.py -f memory.dmp --profile=Win7SP1x64 shimcache10. Investigating Service
Mã độc và Services
Services (dịch vụ Windows) là nơi mã độc thường thiết lập persistence vì:
- Chạy ngầm, không cần user đăng nhập
- Tự khởi động cùng hệ thống
- Ít bị chú ý hơn tiến trình thông thường
10.1 Plugin svcscan
python vol.py -f memory.dmp --profile=Win7SP1x86 svcscanThông tin hiển thị cho mỗi service:
Offset: 0x58e660
Order: 396
Start: SERVICE_AUTO_START
Process ID: 4080
Service Name: svchost
Display Name: svchost
Service Type: SERVICE_WIN32_OWN_PROCESS
Service State: SERVICE_RUNNING
Binary Path: C:\Windows\svchost.exe10.2 Service dưới dạng DLL
Với -v (verbose) để xem DLL đầy đủ:
python vol.py -f memory.dmp --profile=Win7SP1x86 svcscan -vService có thể là một DLL được host bởi svchost.exe:
Service Name: FastUserSwitchingCompatibility
Service Type: SERVICE_WIN32_SHARE_PROCESS
Service State: SERVICE_START_PENDING
Binary Path: [ServiceDll]
ServiceDll: C:\Windows\system32\FastUserSwitchingCompatibilityex.dll
ImagePath: %SystemRoot%\System32\svchost.exe -k netsvcs10.3 Service Hijacking — Ví dụ BlackEnergy
BlackEnergy là malware nổi tiếng sử dụng kỹ thuật service hijacking:
- Thay thế driver kernel hợp lệ
aliide.systrên đĩa bằng driver độc hại - Sửa registry entry của service
aliidetừDEMAND_STARTthànhAUTO_START - Sau reboot, driver độc hại tự động load
So sánh clean vs infected:
# Clean system:
# Service aliide: Start=SERVICE_DEMAND_START, State=SERVICE_STOPPED
# Infected system (BlackEnergy):
# Service aliide: Start=SERVICE_AUTO_START, State=SERVICE_STOPPED
# → Sau reboot sẽ tự load driver độc hại!11. Extracting Command History
Tại sao lịch sử lệnh quan trọng?
Sau khi xâm nhập, attacker thường chạy các lệnh để:
- Liệt kê user accounts, groups, network shares
- Thu thập credentials (ví dụ: Mimikatz)
- Di chuyển ngang (lateral movement)
- Exfiltrate dữ liệu
Lịch sử lệnh trong bộ nhớ cung cấp bằng chứng trực tiếp về những gì attacker đã làm.
11.1 Plugin cmdline
Hiển thị command line của từng tiến trình (bao gồm arguments):
python vol.py -f memory.dmp --profile=Win7SP1x64 cmdline -p 1512Output:
WinRAR.exe pid: 1512
Command line: "C:\Program Files\WinRAR\WinRAR.exe" "C:\Users\Alissa Simpson\Documents\Important.rar"
cmd.exe pid: 1984
Command line: "C:\Windows\system32\cmd.exe"11.2 Plugin cmdscan
Quét bộ nhớ để tìm cấu trúc COMMAND_HISTORY — lưu lịch sử các lệnh đã gõ trong cmd.exe:
python vol.py -f memory.dmp --profile=Win7SP1x64 cmdscan11.3 Plugin consoles
Cung cấp thông tin chi tiết hơn cmdscan: không chỉ lệnh mà còn cả output (kết quả) hiển thị trên màn hình console:
python vol.py -f memory.dmp --profile=Win7SP1x64 consolesOutput mẫu (Mimikatz credentials dump):
mimikatz # privilege::debug
Privilege '20' OK
mimikatz # sekurlsa::logonpasswords
Authentication Id: 0 ; 269689
Session: Interactive from 1
UserName: test
Domain: PC
Logon Time: 5/4/2018 10:00:59 AM
msv:
Username: test
Domain: PC
NTLM: 2187e7dcda37749436191aebe0cfe5f
wdigest:
Username: test
Password: cleartext ← MẬT KHẨU RÕ RÀNG!
kerberos:
Username: test
Password: cleartextTổng kết các Plugin Volatility
Mục đích Plugin
─────────────────────────────────────────────
Liệt kê tiến trình pslist, psscan, pstree, psxview
Process handles handles
DLL đã load dlllist, ldrmodules
Dump tiến trình/DLL procdump, dlldump
Kết nối mạng connections, connscan, sockets,
sockscan, netscan
Registry hivelist, printkey, hashdump,
userassist, shellbags, shimcache
Services svcscan
Command history cmdline, cmdscan, consoles
File trong bộ nhớ dumpfilesCâu hỏi trắc nghiệm
Câu 1. Memory Acquisition là gì?
- A. Quá trình phân tích file log trên đĩa cứng
- B. Quá trình sao chép nội dung RAM sang file lưu trữ cố định
- C. Quá trình mã hóa bộ nhớ để bảo mật
- D. Quá trình cài đặt công cụ phân tích mã độc
Câu 2. Công cụ nào sau đây là open source và là một phần của Rekall Memory Forensic Framework?
- A. DumpIt
- B. FTK Imager
- C. WinPmem
- D. Surge Collect
Câu 3. Khi chạy DumpIt.exe /T RAW, loại file output nào được tạo ra?
- A. Microsoft Crash Dump (.dmp)
- B. Raw Memory Dump (.bin)
- C. ZIP archive
- D. VMEM file
Câu 4. Trong Volatility, tùy chọn --profile dùng để làm gì?
- A. Chọn loại output (text, JSON, csv)
- B. Cho Volatility biết hệ điều hành và kiến trúc của memory image
- C. Chỉ định thư mục plugin bổ sung
- D. Đặt mức độ verbose của output
Câu 5. Cú pháp đúng để chạy Volatility với file memory dump là?
- A.
volatility -p <plugin> -f <file> --profile=<profile> - B.
python vol.py -f <file> --profile=<profile> <plugin> - C.
python vol.py --file=<file> -p <profile> <plugin> - D.
volatility analyze -f <file> -os <profile> <plugin>
Câu 6. _EPROCESS là gì?
- A. Một file thực thi độc hại
- B. Cấu trúc dữ liệu C trong kernel đại diện cho một tiến trình
- C. Một loại pool tag trong Windows
- D. Tên của một plugin Volatility
Câu 7. ActiveProcessLinks trong _EPROCESS là gì?
- A. Danh sách các kết nối mạng của tiến trình
- B. Danh sách liên kết đôi nối tất cả _EPROCESS đang hoạt động
- C. Bảng handle của tiến trình
- D. Danh sách DLL đã được load
Câu 8. Plugin pslist của Volatility hoạt động bằng cách nào?
- A. Quét toàn bộ RAM để tìm pool tag “Proc”
- B. Duyệt danh sách ActiveProcessLinks bắt đầu từ PsActiveProcessHead
- C. Đọc file
System32\config\SYSTEM - D. Truy vấn Win32 API
EnumProcesses
Câu 9. DKOM (Direct Kernel Object Manipulation) là gì?
- A. Công cụ dump bộ nhớ mã nguồn mở
- B. Kỹ thuật sửa trực tiếp cấu trúc dữ liệu kernel để ẩn objects
- C. Giao thức truyền file trong Windows
- D. Loại virus lây lan qua mạng
Câu 10. Để ẩn tiến trình bằng DKOM, attacker cần làm gì?
- A. Xóa file thực thi trên đĩa
- B. Sửa Flink của EPROCESS trước và Blink của EPROCESS sau để bỏ qua EPROCESS độc hại
- C. Tắt Windows Defender
- D. Mã hóa tiến trình bằng AES
Câu 11. Tại sao psscan có thể phát hiện tiến trình ẩn mà pslist không thể?
- A. psscan dùng API Windows cao cấp hơn
- B. psscan quét toàn bộ RAM tìm pool tag, không phụ thuộc vào danh sách liên kết
- C. psscan chạy với quyền SYSTEM
- D. psscan sử dụng machine learning
Câu 12. Pool Tag Scanning dựa trên nguyên lý nào?
- A. Mỗi process có một magic number duy nhất trong header của nó
- B. Windows gán một chuỗi 4 ký tự (pool tag) vào mỗi vùng nhớ kernel được cấp phát
- C. Mỗi DLL có một checksum đặc biệt
- D. Kernel lưu danh sách tất cả objects trong một file ẩn
Câu 13. Sự khác biệt giữa Paged Pool và Non-Paged Pool là gì?
- A. Paged Pool nhanh hơn, Non-Paged Pool chậm hơn
- B. Paged Pool có thể swap ra đĩa, Non-Paged Pool không thể swap
- C. Paged Pool chỉ dành cho user space, Non-Paged Pool chỉ cho kernel
- D. Không có sự khác biệt, đây là tên gọi khác của cùng một thứ
Câu 14. Plugin pstree trong Volatility dùng để làm gì?
- A. Vẽ đồ thị kết nối mạng
- B. Liệt kê tiến trình dưới dạng cây cha-con
- C. Quét pool tag trong bộ nhớ
- D. Hiển thị registry tree
Câu 15. Plugin psxview kiểm tra sự hiện diện của tiến trình qua bao nhiêu phương pháp trong ví dụ trình bày?
- A. 2
- B. 5
- C. 7
- D. 10
Câu 16. Handle trong Windows là gì?
- A. Tên của một tiến trình
- B. Tham chiếu gián tiếp đến một kernel object
- C. Địa chỉ bộ nhớ của một DLL
- D. Loại file được mã hóa
Câu 17. Bảng handle (Handle Table) được lưu ở đâu?
- A. Trong user space của tiến trình
- B. Trong kernel space
- C. Trên đĩa cứng
- D. Trong registry
Câu 18. DLL là viết tắt của gì?
- A. Data Link Layer
- B. Dynamic Link Library
- C. Direct Load Library
- D. Distributed Logic Layer
Câu 19. Plugin dlllist trích xuất thông tin DLL từ đâu?
- A. Pool tag trong Non-Paged Pool
- B. Process Environment Block (PEB)
- C. NTFS Master File Table
- D. System registry
Câu 20. Ba danh sách trong PEB Loader Data là gì?
- A. InLoad, InInit, InMem
- B. InActive, InPending, InComplete
- C. InUser, InKernel, InShared
- D. InPaged, InNonPaged, InCached
Câu 21. Plugin ldrmodules phát hiện DLL ẩn bằng cách nào?
- A. Quét pool tag “DLL” trong Non-Paged Pool
- B. So sánh ba danh sách PEB với Virtual Address Descriptors (VADs)
- C. Kiểm tra file signature trên đĩa
- D. Truy vấn VirusTotal API
Câu 22. Trong ví dụ ldrmodules, TDSSoiqh.dll có InLoad=False, InInit=False, InMem=True. Điều này có nghĩa gì?
- A. DLL chưa được nạp vào bộ nhớ
- B. DLL được nạp thủ công vào bộ nhớ, không qua cơ chế Windows loader thông thường
- C. DLL đã được giải phóng khỏi bộ nhớ
- D. DLL là một file hợp lệ của Windows
Câu 23. Plugin procdump trong Volatility dùng để làm gì?
- A. Liệt kê tiến trình
- B. Dump (sao chép) file thực thi của một tiến trình từ bộ nhớ ra file
- C. Quét mạng
- D. Đọc registry
Câu 24. Tại sao dump tiến trình từ bộ nhớ thường khác với file trên đĩa?
- A. Windows nén file khi load vào RAM
- B. Nhiều malware dùng packer/obfuscator, giải nén code chỉ trong RAM lúc chạy
- C. Filesystem NTFS tự động mã hóa file
- D. Không có sự khác biệt
Câu 25. Lệnh nào dùng để dump DLL tại địa chỉ base 0x10000000 từ tiến trình PID 880?
- A.
python vol.py -f ghost.vmem --profile=Win7SP1x86 dlldump -p 880 -D dump/ - B.
python vol.py -f ghost.vmem --profile=Win7SP1x86 dlldump -p 880 -b 0x10000000 -D dump/ - C.
python vol.py -f ghost.vmem --profile=Win7SP1x86 procdump -p 880 -b 0x10000000 -D dump/ - D.
python vol.py -f ghost.vmem --profile=Win7SP1x86 dlllist -p 880 --dump
Câu 26. Plugin connections của Volatility áp dụng cho hệ điều hành nào?
- A. Windows Vista và sau đó
- B. Windows XP và 2003
- C. Tất cả phiên bản Windows
- D. Chỉ Windows 10
Câu 27. Plugin netscan sử dụng phương pháp nào?
- A. Duyệt danh sách liên kết kernel
- B. Pool Tag Scanning
- C. Đọc file
\system32\drivers\etc\hosts - D. Truy vấn WMI
Câu 28. Từ output của netscan, bạn thấy dmt.exe kết nối đến cổng 81. Đây có phải dấu hiệu đáng ngờ không?
- A. Không, cổng 81 là cổng chuẩn
- B. Có, tên tiến trình viết tắt + kết nối cổng không chuẩn là dấu hiệu mã độc
- C. Không, miễn là kết nối là ESTABLISHED thì ổn
- D. Không, DarkComet là phần mềm hợp lệ
Câu 29. Mã độc thường ghi vào registry để làm gì chính?
- A. Tăng hiệu suất hệ thống
- B. Đảm bảo persistence (tồn tại qua reboot)
- C. Tạo backup dữ liệu người dùng
- D. Cải thiện bảo mật Windows
Câu 30. Plugin hivelist dùng để làm gì?
- A. Liệt kê tất cả file
.hivetrên đĩa - B. Liệt kê các registry hives đang được load trong bộ nhớ
- C. Crack password hash từ SAM
- D. Tìm kiếm registry key theo từ khóa
Câu 31. Registry key HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run chứa gì?
- A. Danh sách driver đã cài đặt
- B. Danh sách chương trình tự khởi động khi user đăng nhập
- C. Cấu hình mạng Windows
- D. Danh sách update đã cài
Câu 32. Plugin hashdump cung cấp thông tin gì?
- A. Hash của file executable
- B. Password hash của tài khoản Windows từ SAM registry hive
- C. Hash của memory dump file
- D. Checksum của DLL
Câu 33. UserAssist registry key lưu trữ thông tin gì?
- A. Lịch sử trình duyệt web
- B. Lịch sử các executable đã chạy (đường dẫn, số lần, thời điểm cuối)
- C. Danh sách phần mềm đã cài đặt
- D. Cấu hình font chữ Windows
Câu 34. Shellbags là gì?
- A. Các file tạm thời của Windows Update
- B. Registry key lưu thông tin về các folder mà người dùng đã mở
- C. Danh sách USB device đã kết nối
- D. Log file của Windows Firewall
Câu 35. Plugin svcscan trong Volatility dùng để làm gì?
- A. Quét virus trong bộ nhớ
- B. Liệt kê các Windows Service và thông tin của chúng từ memory image
- C. Scan tất cả socket đang mở
- D. Kiểm tra tính toàn vẹn của system files
Câu 36. Trong ví dụ malware với svcscan, tại sao svchost.exe chạy từ C:\Windows\ thay vì C:\Windows\System32\ là dấu hiệu độc hại?
- A. Tất cả
svchost.exephải chạy từSystem32 - B. Đây là kỹ thuật masquerading — mã độc giả danh tên tiến trình hệ thống nhưng chạy từ đường dẫn sai
- C.
C:\Windows\không tồn tại - D. Tên
svchostbị cấm dùng cho service
Câu 37. BlackEnergy sử dụng kỹ thuật gì để persistence?
- A. DLL Injection vào explorer.exe
- B. Service Hijacking — thay thế driver kernel hợp lệ và sửa registry để tự khởi động
- C. Thêm entry vào Run registry key
- D. Tạo scheduled task
Câu 38. Phương pháp tốt nhất để phát hiện service hijacking là gì?
- A. Chạy antivirus
- B. So sánh danh sách service từ baseline sạch với hệ thống bị nghi ngờ
- C. Kiểm tra file
hosts - D. Reinstall Windows
Câu 39. Plugin cmdline trong Volatility hiển thị gì?
- A. Command history của shell
- B. Command line arguments của từng tiến trình khi được khởi động
- C. Danh sách lệnh Windows có sẵn
- D. Script Powershell đã chạy
Câu 40. Plugin cmdscan tìm kiếm cấu trúc gì trong bộ nhớ?
- A. _EPROCESS
- B. COMMAND_HISTORY
- C. CONSOLE_INFORMATION
- D. CMD_LINE_ENTRY
Câu 41. Sự khác biệt chính giữa cmdscan và consoles là gì?
- A. cmdscan dùng cho Linux, consoles dùng cho Windows
- B. cmdscan chỉ liệt kê lệnh đã gõ; consoles còn cung cấp cả output hiển thị trên màn hình console
- C. consoles nhanh hơn cmdscan
- D. Không có sự khác biệt
Câu 42. Trong ví dụ Mimikatz, attacker đổi tên mimikatz.exe thành net.exe. Plugin nào phát hiện điều này?
- A. pslist
- B. cmdscan — thấy lệnh
privilege::debugvàsekurlsa::logonpasswordstừnet.exe - C. netscan
- D. hivelist
Câu 43. Thông tin nào có thể thấy trong output của consoles khi Mimikatz chạy thành công?
- A. Chỉ tên tài khoản
- B. Password dạng cleartext (plaintext), NTLM hash, và thông tin authentication
- C. Chỉ địa chỉ IP của attacker
- D. Chỉ thời gian thực thi
Câu 44. WinObj là công cụ dùng để làm gì?
- A. Dump bộ nhớ Windows
- B. Xem và kiểm tra các loại kernel objects trong Windows
- C. Phân tích malware trực tuyến
- D. Quản lý registry
Câu 45. Trong Volatility, để xem plugin nào được hỗ trợ, ta dùng lệnh nào?
- A.
python vol.py --list-plugins - B.
python vol.py -h - C.
python vol.py --show - D.
python vol.py plugins
Câu 46. Để xem thông tin về offset 0x448 của ActiveProcessLinks trong _EPROCESS, ta dùng lệnh WinDbg nào?
- A.
!process 0 0 - B.
dt nt!_EPROCESS - C.
lm n - D.
!peb
Câu 47. PsActiveProcessHead là gì?
- A. Tiến trình đầu tiên khởi động trên Windows
- B. Con trỏ kernel đánh dấu đầu của danh sách ActiveProcessLinks
- C. Tên plugin Volatility
- D. Registry key chứa danh sách tiến trình
Câu 48. Một tiến trình có pslist=False, psscan=True trong output psxview. Điều này chỉ ra điều gì?
- A. Tiến trình đã kết thúc bình thường
- B. Tiến trình đang bị ẩn khỏi
ActiveProcessLinks— dấu hiệu DKOM - C. Tiến trình là một system process hợp lệ
- D. Đây là lỗi của Volatility
Câu 49. Mệnh đề nào đúng về connscan so với connections?
- A. connscan chậm hơn nhưng có thể tìm kết nối đã đóng
- B. connections tốt hơn connscan trong mọi trường hợp
- C. Cả hai đều dùng Pool Tag Scanning
- D. connscan chỉ dùng cho Windows 7
Câu 50. Trong trường hợp mã độc là fileless (không có file trên đĩa), phương pháp điều tra nào là cần thiết nhất?
- A. Quét antivirus toàn bộ đĩa cứng
- B. Memory Forensics — phân tích RAM vì đây là nơi duy nhất code độc hại tồn tại
- C. Kiểm tra log file của Windows
- D. Reinstall hệ thống
Câu 51. Để xác định profile đúng cho một memory image chưa biết, plugin nào nên dùng?
- A.
pslist - B.
imageinfo - C.
hivelist - D.
psscan
Câu 52. Registry hive nào chứa thông tin tài khoản và password hash của local users?
- A. SYSTEM
- B. SOFTWARE
- C. SAM (Security Account Manager)
- D. SECURITY
Câu 53. Tùy chọn -v (verbose) trong svcscan cung cấp thêm thông tin gì?
- A. Version của Volatility
- B. Đường dẫn đầy đủ của ServiceDll cho service chạy dưới dạng DLL
- C. Verbose logging cho debug
- D. Virtual address của service
Câu 54. Điểm khác biệt giữa SERVICE_AUTO_START và SERVICE_DEMAND_START là gì?
- A. AUTO_START chạy tự động khi boot; DEMAND_START phải khởi động thủ công
- B. AUTO_START chỉ dành cho kernel drivers; DEMAND_START cho user-mode services
- C. Không có sự khác biệt
- D. AUTO_START an toàn hơn DEMAND_START
Câu 55. MRU trong context của Shellbags là viết tắt của gì?
- A. Memory Resource Unit
- B. Most Recently Used
- C. Master Registry Update
- D. Malware Registry Utility