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: 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):
Dump ra định dạng RAW (.bin):
Cá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 Technologies
Lưu ý định dạng RAW
Định dạng RAW (.bin) được coi là legacy/obsolete. Khuyến nghị dùng định dạng Microsoft Crash Dump (.dmp) để tương thích tốt hơn với các công cụ phân tích.
Dump 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.bin
Output 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:
Linux:
macOS:
3.3 Cú pháp cơ bản¤
| 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:
Ví dụ liệt kê tiến trình:
Profile là gì?
Profile cho Volatility biết cách giải mã cấu trúc dữ liệu kernel. Mỗi phiên bản Windows có layout bộ nhớ khác nhau. Nếu dùng sai profile, kết quả sẽ sai hoặc không có dữ liệu. Để tự động nhận diện profile, dùng plugin imageinfo.
4. 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:
4.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.
Plugin 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¤
Output 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 ...
Hạn chế của pslist
pslist chỉ duyệt ActiveProcessLinks. Nếu mã độc dùng kỹ thuật DKOM để unlink _EPROCESS khỏi danh sách, tiến trình đó sẽ không hiện trong pslist.
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ữa
DKOM đò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.
Kỹ 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:
Cá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 IDs
Tại sao pstree quan trọng?
Mã độc thường giả danh (masquerading) bằng cách đặt tên giống tiến trình hệ thống như svchost.exe. Nhưng svchost.exe hợp lệ phải có services.exe làm cha. Nếu thấy svchost.exe có cha là explorer.exe hay cmd.exe, đó là dấu hiệu đáng ngờ.
4.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:
Các nguồn kiểm tra trong output:
| 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 |
Phát hiện tiến trình ẩn với psxview
Nếu một tiến trình xuất hiện False trong cột pslist nhưng True trong các cột khác, đó là bằng chứng rõ ràng rằng tiến trình đang bị ẩn bằng DKOM.
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 880
Output 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.ddf
Dấu hiệu đáng ngờ
DLL imageik.ddf trong ví dụ trên nằm trong thư mục AppData của người dùng thay vì System32. Đây là dấu hiệu rất đáng ngờ và cần điều tra thêm.
6.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:
Ba 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
...
Giải thích TDSSoiqh.dll
DLL này có InLoad=False và InInit=False nhưng vẫn được map vào bộ nhớ (InMem=True). Điều này có nghĩa nó không được nạp qua cơ chế load thông thường — dấu hiệu điển hình của rootkit/DLL injection thủ công.
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ớ
Quan trọng
File thực thi trong bộ nhớ thường khác với file trên đĩa, vì nhiều packer/obfuscator giải nén code vào RAM lúc chạy. Dump từ bộ nhớ cho ta code thực sự đang chạy.
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:
Kiểm tra loại file:
file dump/executable.3832.exe
# Output: PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows
7.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.dll
8. 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)¤
Output:
Offset(V) Local Address Remote Address Pid
0x81549748 192.168.1.100:1037 X.X.32.230:443 756
Xác định tiến trình liên quan:
8.2 Plugin connscan¤
Dùng Pool Tag Scanning để tìm kết nối đã đóng hoặc bị ẩn:
Offset(P) Local Address Remote Address Pid
0x093812b0 192.168.1.100:1032 XX.XXX.92.121:80 880
8.3 Plugin netscan (Windows Vista/7 trở lên)¤
Proto 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.exe
Phân tích ví dụ DarkComet
dmt.exe kết nối đến cổng 81 là rất đáng ngờ. DarkComet là một RAT (Remote Access Trojan) nổi tiếng. Tên tiến trình viết tắt + kết nối đến cổng không tiêu chuẩn là chỉ dấu rõ ràng.
So 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 Run key
- 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ớ:
Output 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\SOFTWARE
9.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.exe
Key Run và mã độc
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run chứa danh sách chương trình tự động khởi động khi mọi user đăng nhập. Đây là vị trí phổ biến nhất để mã độc thiết lập persistence. Cũng cần kiểm tra HKCU\...\Run cho persistence theo từng user.
9.3 Plugin hashdump¤
Trích xuất password hash từ SAM registry hive:
Output:
Administrator:500:aad3b435b51404ee:31d6cfe0d16ae931b73c59d7e8c089c0:::
Guest:501:aad3b435b51404ee:31d6cfe0d16ae931b73c59d7e8c089c0:::
seven:1001:aad3b435b51404ee:2d20d252a479f485cdf5e171d93985bf:::
Ứng dụng trong điều tra
Hash dump giúp phát hiện backdoor account ẩn (tài khoản không nên tồn tại). Hash sau đó có thể bị crack bằng hashcat/john để lấy plaintext password, phục vụ điều tra.
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):
Cung 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):
Mỗ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:
10. 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¤
Thô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.exe
Phân tích ví dụ độc hại
svchost.exe hợp lệ phải chạy từ C:\Windows\System32\svchost.exe. Trong ví dụ trên, nó chạy từ C:\Windows\svchost.exe (thiếu System32). Đây là kỹ thuật masquerading rất phổ biến.
10.2 Service dưới dạng DLL¤
Với -v (verbose) để xem DLL đầy đủ:
Service 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 netsvcs
10.3 Service Hijacking — Ví dụ BlackEnergy¤
BlackEnergy là malware nổi tiếng sử dụng kỹ thuật service hijacking:
1. Thay thế driver kernel hợp lệ aliide.sys trên đĩa bằng driver độc hại
2. Sửa registry entry của service aliide từ DEMAND_START thành AUTO_START
3. 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!
Phương pháp phát hiện
Duy trì baseline (danh sách service từ hệ thống sạch) và so sánh với hệ thống bị nghi ngờ. Bất kỳ thay đổi nào về Start type hoặc binary path đều cần điều tra.
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):
Output:
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:
Ví dụ phát hiện Mimikatz
CommandHistory Application: net.exe
Cmd #0: privilege::debug
Cmd #1: sekurlsa::logonpasswords
Attacker đã đổi tên mimikatz.exe thành net.exe để tránh phát hiện. Nhưng lệnh privilege::debug và sekurlsa::logonpasswords vẫn lộ danh tính Mimikatz!
11.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:
Output 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: cleartext
Wdigest và plaintext passwords
Trong Windows 7 và các hệ thống cũ (hoặc nếu wdigest được enable), Mimikatz có thể lấy password dưới dạng cleartext từ LSASS memory. Đây là lý do tại sao Microsoft khuyến nghị disable wdigest trong các hệ thống hiện đại.
Tổ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ớ dumpfiles
Câ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
Đáp án & Giải thích
Đáp án: B
Memory Acquisition là quá trình thu thập bộ nhớ tạm thời (RAM — volatile) sang bộ lưu trữ cố định (file trên đĩa). Điều này cần thực hiện trước khi tắt máy vì RAM mất dữ liệu khi mất nguồn.
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
Đáp án & Giải thích
Đáp án: C
WinPmem là công cụ open source, là một phần của Rekall Memory Forensic Framework. Các công cụ còn lại hoặc free with registration (DumpIt, FTK Imager) hoặc commercial (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
Đáp án & Giải thích
Đáp án: B
Tùy chọn /T RAW (hoặc /TYPE RAW) tạo ra định dạng Raw Memory Dump (.bin). Tuy nhiên, DumpIt cảnh báo đây là định dạng obsolete/legacy. Mặc định DumpIt tạo Microsoft Crash Dump (.dmp).
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
Đáp án & Giải thích
Đáp án: B
--profile cho Volatility biết memory image đến từ hệ điều hành nào và kiến trúc nào (VD: Win7SP1x64, WinXPSP3x86). Mỗi phiên bản Windows có cấu trúc dữ liệu kernel khác nhau, nếu sai profile sẽ không phân tích được đúng.
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>
Đáp án & Giải thích
Đáp án: B
Cú pháp chuẩn: python vol.py -f <memory_image_file> --profile=<PROFILE> <PLUGIN> [ARGS]
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
Đáp án & Giải thích
Đáp án: B
_EPROCESS (Executive Process) là cấu trúc C nội bộ trong Windows kernel, lưu trong kernel space, chứa mọi thông tin về một tiến trình: PID, PPID, tên file, thời gian tạo, con trỏ đến PEB, v.v.
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
Đáp án & Giải thích
Đáp án: B
ActiveProcessLinks là LIST_ENTRY (doubly-linked list) chứa Flink (forward link) và Blink (backward link), nối tất cả các _EPROCESS của tiến trình đang chạy thành một vòng danh sách. Plugin pslist duyệt danh sách này.
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
Đáp án & Giải thích
Đáp án: B
pslist duyệt qua danh sách liên kết đôi ActiveProcessLinks, bắt đầu từ PsActiveProcessHead. Đây là cùng cơ chế mà Task Manager và Microsoft PsList sử dụng — và cũng là điểm yếu mà DKOM khai thác.
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
Đáp án & Giải thích
Đáp án: B
DKOM là kỹ thuật tấn công mức kernel. Attacker sửa trực tiếp ActiveProcessLinks của _EPROCESS để unlink một tiến trình độc hại khỏi danh sách liên kết đôi, khiến pslist không thể thấy nó.
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
Đáp án & Giải thích
Đáp án: B
Attacker đặt EPROCESS_prev.Flink → EPROCESS_next và EPROCESS_next.Blink → EPROCESS_prev, bỏ qua EPROCESS của tiến trình độc hại. Tiến trình vẫn chạy trong RAM nhưng biến mất khỏi danh sách liệt kê.
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
Đáp án & Giải thích
Đáp án: B
psscan dùng Pool Tag Scanning — quét toàn bộ không gian bộ nhớ tìm tag Proc của các _EPROCESS. Vì không dựa vào ActiveProcessLinks, nó không bị ảnh hưởng bởi DKOM.
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
Đáp án & Giải thích
Đáp án: B
Kernel Windows thêm Pool Tag (4 ký tự) vào header của mỗi vùng nhớ được cấp phát trong Pool. Ví dụ: _EPROCESS có tag Proc. psscan quét RAM tìm pattern này.
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ứ
Đáp án & Giải thích
Đáp án: B
Paged Pool có thể swap (page out) ra đĩa khi RAM đầy. Non-Paged Pool luôn nằm trong RAM, dùng cho dữ liệu cần truy cập nhanh và liên tục (như interrupt handlers, DPC routines).
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
Đáp án & Giải thích
Đáp án: B
pstree hiển thị quan hệ parent-child giữa các tiến trình. Rất hữu ích để phát hiện mã độc masquerading (VD: svchost.exe có cha không phải services.exe).
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
Đáp án & Giải thích
Đáp án: C
psxview so sánh qua 7 nguồn: pslist, psscan, thrdproc, pspcid, csrss, session, deskthrd. Nếu một tiến trình thiếu trong một số nguồn nhưng hiện trong nguồn khác, đó là dấu hiệu đáng ngờ.
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
Đáp án & Giải thích
Đáp án: B
Handle là một số nguyên (index) đại diện cho một kernel object trong bảng handle của tiến trình. Tiến trình dùng handle để tương tác với objects (file, mutex, registry key...) mà không cần biết địa chỉ kernel thực.
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
Đáp án & Giải thích
Đáp án: B
Bảng handle của mỗi tiến trình được lưu trong kernel space. User space không thể truy cập trực tiếp mà phải thông qua system calls.
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
Đáp án & Giải thích
Đáp án: B
DLL — Dynamic Link Library là file thực thi chia sẻ chứa code và data, có thể được nhiều ứng dụng sử dụng đồng thời mà không cần sao chép riêng.
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
Đáp án & Giải thích
Đáp án: B
dlllist truy cập cấu trúc PEB (Process Environment Block) của tiến trình. PEB chứa Ldr (loader data) với ba danh sách linked list của các module DLL đã load.
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
Đáp án & Giải thích
Đáp án: A
Ba danh sách: InLoadOrderModuleList, InInitializationOrderModuleList, InMemoryOrderModuleList. Plugin ldrmodules so sánh cả ba danh sách này với VADs để phát hiện DLL ẩn.
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
Đáp án & Giải thích
Đáp án: B
ldrmodules so sánh InLoad, InInit, InMem của PEB với VADs. Nếu một module được map vào bộ nhớ (có trong VAD) nhưng không xuất hiện trong các danh sách PEB (InLoad=False, InInit=False), đó là DLL bị ẩn.
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
Đáp án & Giải thích
Đáp án: B
InMem=True nghĩa là DLL được map vào không gian địa chỉ. Nhưng InLoad=False và InInit=False nghĩa là nó không đi qua Windows loader bình thường. Đây là dấu hiệu của DLL injection thủ công — kỹ thuật mà rootkit như TDSS sử dụng.
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
Đáp án & Giải thích
Đáp án: B
procdump sao chép file thực thi của tiến trình từ bộ nhớ ra file .exe để phân tích tĩnh. Quan trọng vì file trong bộ nhớ có thể khác với file trên đĩa (đã được unpack/decrypt).
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
Đáp án & Giải thích
Đáp án: B
Malware thường dùng packer (như UPX) hoặc custom obfuscator để ẩn code thực sự. Trên đĩa là code đã được pack. Khi chạy, code được giải nén vào RAM. Dump từ RAM cho ta code thực sự đang chạy.
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
Đáp án & Giải thích
Đáp án: B
Cú pháp dlldump cần -p <PID>, -b <base_address> để chỉ định DLL cụ thể, và -D <output_dir>.
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
Đáp án & Giải thích
Đáp án: B
Plugin connections chỉ dùng cho Windows XP và 2003. Từ Vista trở đi, cấu trúc dữ liệu mạng thay đổi nên cần dùng netscan.
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
Đáp án & Giải thích
Đáp án: B
netscan dùng Pool Tag Scanning (tương tự psscan cho tiến trình), cho phép tìm cả kết nối đang hoạt động và đã đóng, tương tự connscan nhưng cho Vista+.
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ệ
Đáp án & Giải thích
Đáp án: B
dmt.exe (viết tắt bất thường) kết nối ra ngoài qua cổng 81 (không chuẩn, HTTP dùng 80) là dấu hiệu rõ ràng của mã độc. Trong trường hợp này đây chính là DarkComet RAT.
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
Đáp án & Giải thích
Đáp án: B
Mục tiêu chính là persistence — đảm bảo mã độc tự động chạy lại sau mỗi lần reboot. Ngoài ra còn lưu cấu hình C&C, khóa mã hóa. Nhưng persistence là mục tiêu số 1.
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
Đáp án & Giải thích
Đáp án: B
hivelist liệt kê địa chỉ ảo, địa chỉ vật lý và đường dẫn của tất cả registry hives đang được load trong bộ nhớ kernel.
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
Đáp án & Giải thích
Đáp án: B
Key Run chứa danh sách chương trình tự động chạy khi mọi user đăng nhập vào hệ thống. Đây là vị trí persistence cổ điển và phổ biến nhất của mã độc.
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
Đáp án & Giải thích
Đáp án: B
hashdump trích xuất LM/NTLM password hash của tất cả tài khoản local từ SAM (Security Account Manager) hive. Hữu ích để phát hiện backdoor account và crack password.
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
Đáp án & Giải thích
Đáp án: B
UserAssist lưu thông tin về các chương trình đã được thực thi qua Windows Explorer, bao gồm đường dẫn (ROT-13 encoded), số lần chạy, và thời điểm cuối cùng chạy. Hữu ích để xác định malware binary đã thực thi.
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
Đáp án & Giải thích
Đáp án: B
Shellbags lưu "folder access logs" — thông tin về các folder đã xem qua Explorer (kể cả folder trên USB đã rút, network share, folder đã bị xóa). Rất hữu ích trong điều tra vì cung cấp evidence về những gì user/attacker đã truy cập.
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
Đáp án & Giải thích
Đáp án: B
svcscan liệt kê các Windows Services từ memory image, bao gồm: tên service, display name, loại service, trạng thái, loại khởi động, và binary path.
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
Đáp án & Giải thích
Đáp án: B
svchost.exe hợp lệ LUÔN chạy từ C:\Windows\System32\svchost.exe. Đặt một executable độc hại tên svchost.exe ở C:\Windows\ là kỹ thuật masquerading cổ điển để tránh bị phát hiện.
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
Đáp án & Giải thích
Đáp án: B
BlackEnergy thay thế driver aliide.sys hợp lệ bằng driver độc hại, rồi sửa registry service entry từ DEMAND_START thành AUTO_START. Sau reboot, driver độc hại tự động load, rất khó phát hiện.
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
Đáp án & Giải thích
Đáp án: B
Duy trì baseline (danh sách service từ hệ thống sạch đã biết tốt) và so sánh với hệ thống đáng ngờ. Bất kỳ thay đổi nào về binary path, Start type, hoặc service mới không mong đợi đều cần điều tra.
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
Đáp án & Giải thích
Đáp án: B
cmdline hiển thị command line đầy đủ (bao gồm tất cả arguments) của từng tiến trình, trích xuất từ PEB. Khác với cmdscan — chuyên về lịch sử lệnh trong cmd.exe console.
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
Đáp án & Giải thích
Đáp án: B
cmdscan quét bộ nhớ để tìm cấu trúc COMMAND_HISTORY (theo mô tả trong slide: "Extract command history by scanning for COMMAND_HISTORY").
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
Đáp án & Giải thích
Đáp án: B
cmdscan cho biết lệnh nào đã được gõ. consoles còn cung cấp toàn bộ output hiển thị trong cửa sổ console, cho phép xác nhận lệnh đã thành công hay chưa (VD: thấy password cleartext trong output Mimikatz).
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
Đáp án & Giải thích
Đáp án: B
cmdscan liệt kê lịch sử lệnh của net.exe và thấy privilege::debug, sekurlsa::logonpasswords — đây là lệnh đặc trưng của Mimikatz, dù ứng dụng đã được đổi tên.
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
Đáp án & Giải thích
Đáp án: B
Output consoles sau khi Mimikatz chạy sekurlsa::logonpasswords có thể chứa: username, domain, NTLM hash, SHA1 hash, và đặc biệt là password cleartext nếu wdigest được bật trên hệ thống.
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
Đáp án & Giải thích
Đáp án: B
WinObj (Sysinternals) cho phép người dùng browse Object Manager namespace của Windows kernel — xem tất cả named objects như events, mutants, semaphores, devices, drivers, v.v.
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
Đáp án & Giải thích
Đáp án: B
python vol.py -h (hoặc --help) hiển thị tất cả plugin được hỗ trợ cùng mô tả ngắn gọn.
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
Đáp án & Giải thích
Đáp án: B
dt nt!_EPROCESS (display type) hiển thị toàn bộ layout cấu trúc _EPROCESS bao gồm tên trường và offset. Từ đây ta thấy ActiveProcessLinks ở offset +0x448.
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
Đáp án & Giải thích
Đáp án: B
PsActiveProcessHead là exported symbol trong kernel (nt!PsActiveProcessHead), là điểm bắt đầu của vòng danh sách liên kết đôi ActiveProcessLinks. Đây là nơi pslist bắt đầu duyệt.
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
Đáp án & Giải thích
Đáp án: B
pslist=False nghĩa là tiến trình không xuất hiện khi duyệt ActiveProcessLinks. psscan=True nghĩa là cấu trúc _EPROCESS vẫn tồn tại trong RAM. Kết hợp lại → tiến trình đã bị unlink khỏi danh sách bằng DKOM.
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
Đáp án & Giải thích
Đáp án: A
connections duyệt danh sách liên kết (nhanh, chỉ thấy kết nối đang active). connscan dùng Pool Tag Scanning (chậm hơn nhưng có thể tìm cả kết nối đã đóng hoặc bị ẩn). Cả hai chỉ dùng cho XP/2003.
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
Đáp án & Giải thích
Đáp án: B
Fileless malware tồn tại hoàn toàn trong RAM, không ghi file ra đĩa. Antivirus truyền thống không thể phát hiện. Memory Forensics với Volatility là phương pháp duy nhất để thu thập bằng chứng từ những trường hợp này trước khi máy tắt.
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
Đáp án & Giải thích
Đáp án: B
Plugin imageinfo phân tích memory image và đề xuất các profile phù hợp dựa trên các signature trong bộ nhớ.
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
Đáp án & Giải thích
Đáp án: C
SAM hive (\SystemRoot\System32\Config\SAM) chứa thông tin tài khoản local và password hash (LM/NTLM). Plugin hashdump trích xuất dữ liệu từ hive này.
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
Đáp án & Giải thích
Đáp án: B
Với -v, svcscan in thêm ServiceDll path — đường dẫn đến file DLL thực sự được load bởi svchost.exe cho shared-process services. Hữu ích để phát hiện DLL service độc hại.
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
Đáp án & Giải thích
Đáp án: A
SERVICE_AUTO_START: service tự động khởi động khi Windows boot. SERVICE_DEMAND_START: service chỉ chạy khi được kích hoạt thủ công hoặc bởi ứng dụng. Trong trường hợp BlackEnergy, attacker đổi từ DEMAND thành AUTO để đảm bảo persistence.
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
Đáp án & Giải thích
Đáp án: B
MRU — Most Recently Used. Trong Shellbags, giá trị MRU chỉ ra thứ tự sử dụng gần đây nhất của file/folder. Khi MRU thay đổi, timestamp "last updated" được cập nhật.