应急响应——让Linux下的隐藏手段(Rootkit)无所遁形
字数 1748 2025-08-20 18:18:10

Linux Rootkit隐藏手段分析与应急响应指南

0x01 前言

本文全面总结Linux系统下黑灰产及恶意软件常用的Rootkit隐藏技术,涵盖五种主要隐藏手段的原理、实现方式、排查方法和恢复措施:

  1. 通过文件挂载实现隐藏
  2. 通过用户层劫持链接器或链接库实现隐藏
  3. 通过劫持系统环境变量实现隐藏
  4. 通过内核层劫持实现隐藏
  5. 通过eBPF完成的动态劫持内核逻辑实现隐藏

0x02 Rootkit隐藏技术详解

一、通过挂载/proc/pid实现pid隐藏

原理

  • ps、netstat等命令通过遍历/proc目录获取进程信息
  • 攻击者将目标pid对应的/proc/pid目录挂载到隐藏目录

实现方法

mount -o bind /home/.hidden /proc/9212

现象特征

  • netstat显示网络连接但PID和Programname为空
  • ps命令无法显示目标进程

排查方法

  1. 检查挂载信息:
cat /proc/
$$
/mountinfo
  1. 检查/proc目录异常:
ls -lai /proc

恢复方法

umount /proc/9212

二、用户层劫持加载器/连接器隐藏进程

原理

Linux动态库加载顺序:

  1. LD_PRELOAD环境变量指定的库
  2. /etc/ld.so.preload文件指定的库
  3. LD_LIBRARY_PATH环境变量路径
  4. /lib64等系统库路径

攻击者常用三种劫持方式:

  1. 通过LD_PRELOAD劫持
  2. 通过/etc/ld.so.preload劫持
  3. 替换关键系统库如libc.so.6

实现示例(/etc/ld.so.preload劫持)

  1. 编译恶意.so文件,重写readdir/readdir64函数
  2. 修改/etc/ld.so.preload添加恶意库路径
  3. 特定进程名称不返回结果

现象特征

  • netstat显示连接但无PID和进程名
  • ps命令完全无法发现目标进程

排查方法

  1. 检查环境变量:
echo $LD_PRELOAD
  1. 检查预加载文件:
cat /etc/ld.so.preload
  1. 检查动态链接器完整性:
readelf -l /bin/ps | grep interpreter
ls -l /lib64/ld-*
rpm -Vf /lib64/ld-2.17.so

快速排查技巧

  1. 检查命令依赖库:
ldd /usr/bin/ps
  1. 使用strace追踪:
strace -o result.txt -e trace=file -f ps

恢复方法

  1. 清除LD_PRELOAD:
unset LD_PRELOAD
  1. 清理/etc/ld.so.preload
  2. 修复被篡改的系统库

绕过隐藏技巧

  1. 强制指定LD_PRELOAD:
LD_PRELOAD=/lib64/libc.so.6 ps
  1. 使用静态编译工具如busybox

三、劫持shell环境实现隐藏

原理

  • 修改/etc/profile.d/下的shell脚本
  • 劫持环境变量覆盖常见命令(ps/ls/lsof等)

实现方法

  1. 在/etc/profile.d/添加恶意脚本
  2. 重定义命令别名或函数

现象特征

  • 交互式shell下命令行为异常
  • 特定文件/进程无法显示

排查方法

strace -e trace=file ls

恢复方法

  1. 检查并清理/etc/profile.d/可疑脚本
  2. 重新加载配置:
source /etc/profile

四、LKM内核劫持实现隐藏

原理

通过内核模块(LKM)劫持系统调用:

  1. 修改syscall表中的函数指针
  2. 常见劫持目标:getdents/getdents64/kill等

典型Rootkit案例

  • Diamorphine(TeamTNT使用)
  • Reptile(针对韩国公司)
  • Adore-ng(APT41使用)
  • Skidmap(针对Redis)

实现示例(Diamorphine)

  1. 编译加载内核模块
  2. 信号控制隐藏/显示:
kill -31 PID # 隐藏进程
kill -63 0   # 显示模块

排查方法

  1. 使用rootkit检测工具:
./chkrootkit | grep Warning
  1. 加载检测模块检查syscall表
  2. 检查内核日志:
dmesg | grep -i 'module'
  1. 检查/sys/module目录:
ls /sys/module

恢复方法

  1. 使用工具自带卸载功能
  2. 反向劫持恢复syscall表
  3. 计算原始函数地址:
cat /boot/System.map-$(uname -r) | grep sys_getdent

五、eBPF实现进程隐藏

原理

  • 通过eBPF程序hook系统调用
  • 篡改getdent/getdent64返回结果

实现示例

  1. 编写eBPF程序修改getdent64
  2. 加载运行隐藏程序

排查方法

  1. 检查可疑进程参数
  2. 分析异常进程行为

恢复方法

终止可疑eBPF相关进程

0x03 总结与最佳实践

综合排查流程

  1. 从用户层到内核层逐级排查
  2. 结合静态分析与动态追踪
  3. 使用多种工具交叉验证

推荐工具

  • chkrootkit:rootkit检测
  • Rkhunter:rootkit扫描
  • strace:系统调用追踪
  • busybox:静态编译工具集

关键防御措施

  1. 定期校验系统关键文件完整性
  2. 监控/proc、/sys等特殊目录变更
  3. 限制非特权用户的模块加载能力
  4. 实施最小权限原则

通过深入理解Rootkit技术原理,建立系统化的排查思路,结合自动化工具与手动分析,可有效应对Linux系统下的高级隐藏威胁。

Linux Rootkit隐藏手段分析与应急响应指南 0x01 前言 本文全面总结Linux系统下黑灰产及恶意软件常用的Rootkit隐藏技术,涵盖五种主要隐藏手段的原理、实现方式、排查方法和恢复措施: 通过文件挂载实现隐藏 通过用户层劫持链接器或链接库实现隐藏 通过劫持系统环境变量实现隐藏 通过内核层劫持实现隐藏 通过eBPF完成的动态劫持内核逻辑实现隐藏 0x02 Rootkit隐藏技术详解 一、通过挂载/proc/pid实现pid隐藏 原理 ps、netstat等命令通过遍历/proc目录获取进程信息 攻击者将目标pid对应的/proc/pid目录挂载到隐藏目录 实现方法 现象特征 netstat显示网络连接但PID和Programname为空 ps命令无法显示目标进程 排查方法 检查挂载信息: 检查/proc目录异常: 恢复方法 二、用户层劫持加载器/连接器隐藏进程 原理 Linux动态库加载顺序: LD_ PRELOAD环境变量指定的库 /etc/ld.so.preload文件指定的库 LD_ LIBRARY_ PATH环境变量路径 /lib64等系统库路径 攻击者常用三种劫持方式: 通过LD_ PRELOAD劫持 通过/etc/ld.so.preload劫持 替换关键系统库如libc.so.6 实现示例(/etc/ld.so.preload劫持) 编译恶意.so文件,重写readdir/readdir64函数 修改/etc/ld.so.preload添加恶意库路径 特定进程名称不返回结果 现象特征 netstat显示连接但无PID和进程名 ps命令完全无法发现目标进程 排查方法 检查环境变量: 检查预加载文件: 检查动态链接器完整性: 快速排查技巧 检查命令依赖库: 使用strace追踪: 恢复方法 清除LD_ PRELOAD: 清理/etc/ld.so.preload 修复被篡改的系统库 绕过隐藏技巧 强制指定LD_ PRELOAD: 使用静态编译工具如busybox 三、劫持shell环境实现隐藏 原理 修改/etc/profile.d/下的shell脚本 劫持环境变量覆盖常见命令(ps/ls/lsof等) 实现方法 在/etc/profile.d/添加恶意脚本 重定义命令别名或函数 现象特征 交互式shell下命令行为异常 特定文件/进程无法显示 排查方法 恢复方法 检查并清理/etc/profile.d/可疑脚本 重新加载配置: 四、LKM内核劫持实现隐藏 原理 通过内核模块(LKM)劫持系统调用: 修改syscall表中的函数指针 常见劫持目标:getdents/getdents64/kill等 典型Rootkit案例 Diamorphine(TeamTNT使用) Reptile(针对韩国公司) Adore-ng(APT41使用) Skidmap(针对Redis) 实现示例(Diamorphine) 编译加载内核模块 信号控制隐藏/显示: 排查方法 使用rootkit检测工具: 加载检测模块检查syscall表 检查内核日志: 检查/sys/module目录: 恢复方法 使用工具自带卸载功能 反向劫持恢复syscall表 计算原始函数地址: 五、eBPF实现进程隐藏 原理 通过eBPF程序hook系统调用 篡改getdent/getdent64返回结果 实现示例 编写eBPF程序修改getdent64 加载运行隐藏程序 排查方法 检查可疑进程参数 分析异常进程行为 恢复方法 终止可疑eBPF相关进程 0x03 总结与最佳实践 综合排查流程 从用户层到内核层逐级排查 结合静态分析与动态追踪 使用多种工具交叉验证 推荐工具 chkrootkit:rootkit检测 Rkhunter:rootkit扫描 strace:系统调用追踪 busybox:静态编译工具集 关键防御措施 定期校验系统关键文件完整性 监控/proc、/sys等特殊目录变更 限制非特权用户的模块加载能力 实施最小权限原则 通过深入理解Rootkit技术原理,建立系统化的排查思路,结合自动化工具与手动分析,可有效应对Linux系统下的高级隐藏威胁。