Detects rootkits on compromised systems by identifying hidden processes, hooked syscalls, modified kernel structures, hidden files, and covert connections using memory forensics, cross-view detection, and integrity checks.
npx claudepluginhub killvxk/cybersecurity-skills-zhThis skill uses the workspace's default tool permissions.
- 系统出现入侵迹象,但标准工具(任务管理器、netstat)未显示异常
Detects rootkits via cross-view hidden process analysis, system call hooks, kernel integrity checks, and memory forensics with Volatility, Sysinternals, rkhunter.
Detects rootkits on compromised Linux/Windows systems via Volatility memory forensics, cross-view hidden process detection, system call hooking analysis, kernel integrity checks. For threats evading standard tools.
Analyzes Linux memory dumps using Volatility3 plugins (check_syscall, lsmod, hidden_modules), rkhunter scans, and /proc-/sys diffs to detect kernel rootkits via hooked syscalls, hidden modules, and tampered structures.
Share bugs, ideas, or general feedback.
不适用于作为一线检测方法;应先进行标准恶意软件分类,当怀疑存在隐藏行为时再升级为 Rootkit 分析。
比较来自不同数据源的进程列表以发现差异:
# Volatility:比较进程枚举方法
# pslist - 遍历 ActiveProcessLinks(EPROCESS 链表,Rootkit 操纵的目标)
vol3 -f memory.dmp windows.pslist > pslist_output.txt
# psscan - 扫描物理内存中的 EPROCESS 池标签(具有 Rootkit 抵抗性)
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
识别系统服务描述符表(SSDT)和导入地址表(IAT)中的钩子:
# 检查 SSDT 中被钩挂的系统调用
vol3 -f memory.dmp windows.ssdt
# 识别指向 ntoskrnl.exe 或 win32k.sys 之外的钩子
vol3 -f memory.dmp windows.ssdt | grep -v "ntoskrnl\|win32k"
# 检查内联钩子(绕道修补)
vol3 -f memory.dmp windows.apihooks --pid 4 # System 进程
# IDT(中断描述符表)分析
vol3 -f memory.dmp windows.idt
# 检查驱动程序上的 IRP(I/O 请求包)钩挂
vol3 -f memory.dmp windows.driverscan
vol3 -f memory.dmp windows.driverirp
Rootkit 钩挂类型:
━━━━━━━━━━━━━━━━━━━━━
SSDT 钩挂: 修改系统服务描述符表条目,将系统调用重定向
至 Rootkit 代码(过滤进程/文件列表)
IAT 钩挂: 修补进程的导入地址表,在 API 调用到达内核
之前拦截它们
内联钩挂: 用跳转指令覆写函数开头的字节,跳转至 Rootkit
代码(绕道/跳板技术)
IRP 钩挂: 在驱动层拦截 I/O 请求包,过滤磁盘/网络操作
DKOM: 直接内核对象操控——无需钩挂即可解除
EPROCESS 等结构的链接
识别可能是 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
识别被 Rootkit 隐藏的文件和注册表键:
# Linux Rootkit 检测(使用 rkhunter)
rkhunter --check --skip-keypress --report-warnings-only
# chkrootkit 扫描
chkrootkit -q
# Windows:比较文件系统视图
# 实时系统文件列表 vs Volatility filescan
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"
发现隐藏的网络连接和后门:
# 基于内存的网络连接枚举
vol3 -f memory.dmp windows.netscan
# 与实时 netstat 对比(如可用)以发现隐藏连接
# 隐藏连接:存在于内存中但不被 netstat 显示
# 查找原始套接字(Rootkit 常用于隐蔽通信)
vol3 -f memory.dmp windows.netscan | grep RAW
# 检查网络过滤驱动(NDIS 钩挂)
vol3 -f memory.dmp windows.driverscan | grep -i "ndis\|tcpip\|afd"
# 分析驱动注册的回调例程
vol3 -f memory.dmp windows.callbacks
验证系统文件和内核完整性:
# 检查内核代码完整性(对比内存中的内核与磁盘副本)
vol3 -f memory.dmp windows.moddump --base 0xFFFFF80070000000 --dump
# 比较转储的 ntoskrnl.exe 的 SHA-256 与已知正常副本
# Windows:系统文件检查器(在实时系统上)
sfc /scannow
# Linux:软件包完整性验证
rpm -Va # 基于 RPM 的系统
debsums -c # 基于 Debian 的系统
# 对比关键系统二进制文件
find /bin /sbin /usr/bin /usr/sbin -type f -exec sha256sum {} \; > current_hashes.txt
# 与基线对比:diff baseline_hashes.txt current_hashes.txt
# 使用 YARA 扫描已知 Rootkit 签名
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 |
背景:防火墙日志显示终端向已知 C2 IP 发出信标,但本地 EDR、任务管理器和 netstat 未显示任何可疑进程或连接。已获取内存转储进行分析。
方法:
psscan 并与 pslist 对比,识别通过 DKOM 隐藏的进程windows.ssdt 检查过滤进程和网络列表的系统调用钩子windows.malfind 检测合法进程中的注入代码windows.netscan 发现对用户态工具隐藏的网络连接windows.driverscan 识别启用隐藏的恶意内核驱动注意事项:
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 完整性以排查启动持久化
- 对于内核级别的入侵建议完整重建系统