| name | detecting-rootkit-activity |
| description | 通过识别隐藏进程、被钩挂的系统调用、被修改的内核结构、隐藏文件和隐蔽网络连接, 检测受攻陷系统上的 Rootkit 存在情况,使用内存取证、交叉视图检测和完整性校验技术。 适用于 Rootkit 检测、隐藏进程发现、内核完整性校验或系统调用钩挂分析等请求场景。
|
| domain | cybersecurity |
| subdomain | malware-analysis |
| tags | ["malware","rootkit","detection","kernel-analysis","memory-forensics"] |
| version | 1.0.0 |
| author | mahipal |
| license | Apache-2.0 |
检测 Rootkit 活动
适用场景
- 系统出现入侵迹象,但标准工具(任务管理器、netstat)未显示异常
- 防病毒/EDR 检测到 Rootkit 签名,但无法识别具体的隐藏机制
- 内存取证发现内核数据结构与用户态工具输出之间存在差异
- 调查能在修复尝试和系统重启后存活的持久性威胁
- 在疑似内核级别失陷后验证系统完整性
不适用于作为一线检测方法;应先进行标准恶意软件分类,当怀疑存在隐藏行为时再升级为 Rootkit 分析。
前置条件
- Volatility 3,用于内存取证和内核结构分析
- GMER 或 Rootkit Revealer(Windows),用于实时系统扫描
- rkhunter 和 chkrootkit(Linux),用于文件系统和进程完整性检查
- Sysinternals 工具(Process Explorer、Autoruns、RootkitRevealer),用于 Windows 分析
- 来自被怀疑系统的内存转储(WinPmem、LiME)
- 用于对比的干净操作系统基线(已知正常的内核模块哈希)
工作流程
步骤 1:针对隐藏进程进行交叉视图检测
比较来自不同数据源的进程列表以发现差异:
vol3 -f memory.dmp windows.pslist > pslist_output.txt
vol3 -f memory.dmp windows.psscan > psscan_output.txt
python3 << 'PYEOF'
pslist_pids = set()
psscan_pids = set()
with open("pslist_output.txt") as f:
for line in f:
parts = line.split()
if len(parts) > 1 and parts[1].isdigit():
pslist_pids.add(int(parts[1]))
with open("psscan_output.txt") as f:
for line in f:
parts = line.split()
if len(parts) > 1 and parts[1].isdigit():
psscan_pids.add(int(parts[1]))
hidden = psscan_pids - pslist_pids
if hidden:
print(f"[!] HIDDEN PROCESSES DETECTED (in psscan but not pslist):")
for pid in hidden:
print(f" PID: {pid}")
else:
print("[*] No hidden processes detected via cross-view analysis")
PYEOF
步骤 2:检测系统调用钩挂
识别系统服务描述符表(SSDT)和导入地址表(IAT)中的钩子:
vol3 -f memory.dmp windows.ssdt
vol3 -f memory.dmp windows.ssdt | grep -v "ntoskrnl\|win32k"
vol3 -f memory.dmp windows.apihooks --pid 4
vol3 -f memory.dmp windows.idt
vol3 -f memory.dmp windows.driverscan
vol3 -f memory.dmp windows.driverirp
Rootkit 钩挂类型:
━━━━━━━━━━━━━━━━━━━━━
SSDT 钩挂: 修改系统服务描述符表条目,将系统调用重定向
至 Rootkit 代码(过滤进程/文件列表)
IAT 钩挂: 修补进程的导入地址表,在 API 调用到达内核
之前拦截它们
内联钩挂: 用跳转指令覆写函数开头的字节,跳转至 Rootkit
代码(绕道/跳板技术)
IRP 钩挂: 在驱动层拦截 I/O 请求包,过滤磁盘/网络操作
DKOM: 直接内核对象操控——无需钩挂即可解除
EPROCESS 等结构的链接
步骤 3:分析内核模块和驱动
识别可能是 Rootkit 组件的未授权内核驱动:
vol3 -f memory.dmp windows.modules
vol3 -f memory.dmp windows.driverscan
vol3 -f memory.dmp windows.modscan > modscan.txt
vol3 -f memory.dmp windows.modules > modules.txt
vol3 -f memory.dmp windows.verinfo
vol3 -f memory.dmp windows.moddump --base 0xFFFFF80012340000 --dump
步骤 4:检测文件和注册表隐藏
识别被 Rootkit 隐藏的文件和注册表键:
rkhunter --check --skip-keypress --report-warnings-only
chkrootkit -q
vol3 -f memory.dmp windows.filescan > mem_files.txt
vol3 -f memory.dmp windows.registry.hivelist
vol3 -f memory.dmp windows.registry.printkey --key "SYSTEM\CurrentControlSet\Services"
vol3 -f memory.dmp windows.svcscan | grep -i "kernel"
步骤 5:网络连接分析
发现隐藏的网络连接和后门:
vol3 -f memory.dmp windows.netscan
vol3 -f memory.dmp windows.netscan | grep RAW
vol3 -f memory.dmp windows.driverscan | grep -i "ndis\|tcpip\|afd"
vol3 -f memory.dmp windows.callbacks
步骤 6:完整性验证
验证系统文件和内核完整性:
vol3 -f memory.dmp windows.moddump --base 0xFFFFF80070000000 --dump
sfc /scannow
rpm -Va
debsums -c
find /bin /sbin /usr/bin /usr/sbin -type f -exec sha256sum {} \; > current_hashes.txt
vol3 -f memory.dmp yarascan.YaraScan --yara-file rootkit_rules.yar
核心概念
| 术语 | 定义 |
|---|
| Rootkit | 旨在维持持久特权访问同时对系统管理员和安全工具隐藏自身存在的恶意软件 |
| DKOM | 直接内核对象操控;通过修改内核数据结构(如解除 EPROCESS 链接)来隐藏对象而无需钩挂 |
| SSDT 钩挂 | 替换系统服务描述符表中的条目以拦截和过滤系统调用结果(隐藏进程、文件、连接) |
| 内联钩挂 | 用跳转到 Rootkit 代码的指令修补函数的起始指令;Rootkit 可以在返回之前过滤函数输出 |
| 交叉视图检测 | 比较多种枚举方法的结果(链表遍历 vs 内存扫描)以识别因隐藏而产生的差异 |
| 内核驱动 | 在内核态(Ring 0)运行、具有完整系统访问权限的代码;Rootkit 使用恶意驱动获得内核级控制权 |
| Bootkit | 感染启动过程(MBR、VBR 或 UEFI 固件)以在操作系统和安全工具之前加载的 Rootkit |
工具与系统
- Volatility:内存取证框架,提供交叉视图检测、SSDT 分析和内核结构检查以用于 Rootkit 检测
- GMER:免费的 Windows Rootkit 检测工具,扫描 SSDT 钩子、IDT 钩子、IRP 钩子及隐藏的进程/文件/注册表
- rkhunter:Linux Rootkit 检测工具,检查已知 Rootkit 签名、可疑文件和系统二进制文件修改
- chkrootkit:通过基于签名和基于异常的检测来检测 Rootkit 存在的 Linux 工具
- Sysinternals RootkitRevealer:微软工具,通过比较 Windows API 结果与原始文件系统/注册表扫描来发现差异
常见场景
场景:调查标准工具显示无入侵的系统
背景:防火墙日志显示终端向已知 C2 IP 发出信标,但本地 EDR、任务管理器和 netstat 未显示任何可疑进程或连接。已获取内存转储进行分析。
方法:
- 运行 Volatility
psscan 并与 pslist 对比,识别通过 DKOM 隐藏的进程
- 运行
windows.ssdt 检查过滤进程和网络列表的系统调用钩子
- 运行
windows.malfind 检测合法进程中的注入代码
- 运行
windows.netscan 发现对用户态工具隐藏的网络连接
- 运行
windows.driverscan 识别启用隐藏的恶意内核驱动
- 转储 Rootkit 驱动并使用 Ghidra 分析其钩挂机制
- 检查启动持久化(MBR/VBR 修改、UEFI 固件植入)
注意事项:
- 不要在已受攻陷的实时系统上运行检测工具(Rootkit 可能对其隐藏或颠覆)
- 不要因未发现 SSDT 钩子就假设内核完整(Rootkit 可能使用 DKOM 或内联钩子)
- 不要只检查用户态或内核态 Rootkit 组件(许多 Rootkit 两者兼有)
- 不要相信在实时系统上运行的 Rootkit 扫描器结果;务必通过离线内存取证进行验证
输出格式
ROOTKIT 检测分析报告
====================================
转储文件: memory.dmp
系统: Windows 10 21H2 x64
分析工具: Volatility 3.2
交叉视图检测
进程列表对比:
pslist 进程数: 127
psscan 进程数: 129
[!] 隐藏进程:2 个
PID 6784:sysmon64.exe(隐藏的 Rootkit 组件)
PID 6812:netfilter.exe(隐藏的网络过滤器)
SSDT 钩挂分析
[!] 条目 0x004A(NtQuerySystemInformation)被钩挂 -> driver.sys+0x1200
[!] 条目 0x0055(NtQueryDirectoryFile)被钩挂 -> driver.sys+0x1400
[!] 条目 0x0119(NtDeviceIoControlFile)被钩挂 -> driver.sys+0x1600
钩挂目标:driver.sys 位于 0xFFFFF800ABCD0000(未签名,可疑)
内核驱动分析
[!] driver.sys - 无数字签名,加载于 0xFFFFF800ABCD0000
大小:45,056 字节
SHA-256:abc123def456...
IRP 钩挂:IRP_MJ_CREATE, IRP_MJ_DEVICE_CONTROL
注册表:HKLM\SYSTEM\CurrentControlSet\Services\MalDriver
隐藏网络连接
PID 6812:10.1.5.42:49152 -> 185.220.101.42:443(ESTABLISHED)
- 无法通过 netstat 或用户态工具看到
- 被 NtDeviceIoControlFile SSDT 钩子过滤
ROOTKIT 功能
- 进程隐藏(DKOM + SSDT)
- 文件隐藏(NtQueryDirectoryFile 钩子)
- 网络连接隐藏(NtDeviceIoControlFile 钩子)
- 内核态持久化(驱动服务)
修复措施
- 从干净介质启动进行离线修复
- 从离线注册表中移除恶意驱动
- 验证 MBR/VBR/UEFI 完整性以排查启动持久化
- 对于内核级别的入侵建议完整重建系统