目录
技能展示
文章
日记
时间线
项目展示
分类
标签
Android Bash Burp C++ CS CTF DLL劫持 Docker Fastjson Fastjson2 FNV-1a FreeCMS FRP GetShell GitHub IPv6 Java JNDI John JS加密 JS逆向 K8s Kafka Kali lama-cleaner Linux mitmproxy MSF MySQL Nim Nmap NPS Office OID Payload Phar PHP phpMyAdmin POP链 PWN Pyinstaller Python RCE RSA Shellcode SNMP SQL注入 SSH SSRF Ubuntu USB Web Webshell Web安全 Windows XSS YAML Zookeeper 主机探测 代码审计 伪协议 免杀 内网 内网穿透 加密 加解密 参数 反序列化 反弹shell 命令 哈希碰撞 图像处理 域渗透 字符串逃逸 容器 密码学 密码破解 提权 数据库 文件上传 日志分析 未授权访问 权限维持 汇总 流量分析 消息队列 溯源 漏洞 漏洞分析 漏洞利用 端口扫描 编译 网络管理 资产探测 跨平台 运维 进程隐藏 逆向
目录
目录
1582 字
8 分钟
Linux 隐藏进程
Linux 隐藏进程
一、概述
Linux 系统中的进程隐藏是攻击者在入侵后维持持久化和规避检测的常用手段。隐藏进程的方法从简单的用户态技巧到复杂的内核级 rootkit,层次各异。本文梳理常见的隐藏技术及对应的检测方法。
二、进程隐藏的常见方法
2.1 用户态隐藏
2.1.1 LD_PRELOAD Hook
通过 LD_PRELOAD 注入共享库,劫持 readdir、fopen 等 libc 函数,使 ps、top、ls /proc 等命令无法看到指定进程。
1# 示例:注入恶意 so2export LD_PRELOAD=/tmp/libhide.so特点:仅对使用动态链接 libc 的程序生效,对静态编译的工具(如 busybox)无效。
2.1.2 Mount Namespace 隔离
利用 mount namespace 将 /proc 替换为伪造的 procfs,使同一个 namespace 内的工具无法看到真实进程。
1# 创建新的 mount namespace2unshare -m /bin/bash3# 挂载伪造的 /proc4mount -t proc none /proc特点:docker/k8s 环境下较常见,仅隔离当前 namespace 的视图。
2.1.3 进程名伪装 (argv[0] Spoof)
修改进程的 argv[0],使进程在 ps 输出中显示为系统正常进程名。
1// 伪代码:修改 argv[0]2memset(argv[0], 0, strlen(argv[0]));3strcpy(argv[0], "[kworker/0:0]");2.1.4 /proc/PID 隐藏 — 利用 prctl
使用 prctl(PR_SET_MM, ...) 等接口修改进程属性,或利用 /proc 文件系统的特性干扰枚举。
2.2 内核态隐藏
2.2.1 内核模块 Rootkit
通过可加载内核模块(LKM)直接挂钩内核函数,是最彻底的隐藏方式:
- Syscall Table Hook:替换
getdents64、kill、read等系统调用 - VFS Hook:挂钩
/proc文件系统的readdir操作,过滤特定进程 - Netfilter Hook:隐藏特定端口和网络连接
1// 伪代码:hook getdents64 过滤隐藏进程2asmlinkage long hooked_getdents64(unsigned int fd, struct linux_dirent64 *dirp,3 unsigned int count) {4 long ret = original_getdents64(fd, dirp, count);5 // 遍历 dirp,删除包含指定 PID 的目录项6 return ret;7}2.2.2 常见公开 Rootkit
| Rootkit | 隐藏能力 | 特点 |
|---|---|---|
| Diamorphine | 进程、文件、模块、端口 | 开源,支持 Linux 5.x+ |
| Reptile | 进程、文件、网络 | 支持反弹 shell、端口 knocking |
| Suterusu | 进程、网络 | ARM/x86 均支持 |
| khook | 通用框架 | 通过 kprobe 方式挂钩 |
2.2.3 BPF/eBPF 隐藏
利用 eBPF 程序挂钩内核函数,实现无 LKM 的进程隐藏:
- 通过
bpf_probe_write_user修改用户态返回数据 - 利用 TC / XDP hook 过滤网络流量
- 无需加载内核模块,绕过部分检测
三、检测方法
3.1 交叉比对 /proc 扫描
遍历所有 PID 与 ps 输出对比:
1# 遍历 /proc 下所有数字目录2for pid in /proc/[0-9]*/; do3 pid=$(basename $pid)4 if [ -f /proc/$pid/comm ]; then5 echo "$pid $(cat /proc/$pid/comm)"6 fi7done > /tmp/proc_list.txt8
9# 与 ps 输出对比10ps aux > /tmp/ps_list.txt11diff <(sort /tmp/proc_list.txt) <(awk '{print $2, $11}' /tmp/ps_list.txt | sort)此方法可发现用户态 LD_PRELOAD 隐藏,但对内核级 rootkit(直接 hook getdents)无效。
3.2 使用 busybox(静态编译工具)
ubuntu 的 ps、top 等命令动态链接 libc,容易被 LD_PRELOAD 劫持。busybox 是静态编译的,不受影响。
1# 安装 busybox2wget https://busybox.net/downloads/binaries/1.21.1/busybox-x86_643chmod +x busybox-x86_644mv busybox-x86_64 /usr/bin/busybox5
6# 若上面下载地址失效,可使用如下地址:7curl -o /usr/bin/busybox https://blog.tag.gg/soft/busybox-x86_648chmod +x /usr/bin/busybox9
10# 执行如下命令即可运行 busybox:11busybox top12busybox ps13busybox ls /proc14busybox netstat -anp3.3 unhide 系列工具
专门用于检测隐藏进程的工具,支持多种检测方法:
1# 安装2apt install unhide3
4# brute 模式:遍历所有可能的 PID5unhide brute6
7# proc 模式:对比 /proc、/bin/ps、系统调用8unhide proc9
10# procall 模式:通过系统调用的不同方式交叉验证11unhide procall12
13# sys 模式:检查被劫持的系统调用14unhide sys15
16# 反向模式:检测哪些 PID 只出现在 ps 中但 /proc 中不存在17unhide reverse同类工具补充:
1# unhide-tcp:检测隐藏的 TCP/UDP 端口2unhide-tcp3
4# unhide-linux:Linux 专用5unhide-linux -v3.4 Rootkit 扫描工具
1# rkhunter:检查 rootkit 签名、文件完整性2rkhunter --check --sk3
4# chkrootkit:检测已知 rootkit5chkrootkit6
7# 更新特征库8rkhunter --update9chkrootkit --update3.5 Sysdig / SystemTap 动态追踪
对 eBPF/内核级 rootkit 更有效的检测手段:
1# sysdig 查看所有进程事件2sysdig -c topprocs_cpu3sysdig -c lscontainers4
5# 查看隐藏进程产生的系统调用6sysdig proc.name!="ps" and evt.type=execve7
8# 列出通过内核事件获取的进程列表9sysdig -p"%proc.pid %proc.name" evt.type=execve | sort -u3.6 内核模块对比
1# 列出已加载模块2lsmod > /tmp/lsmod.txt3
4# 读取内核模块链表5cat /proc/modules > /tmp/proc_modules.txt6
7# 检测异常:名字随机、无签名、未使用、来源可疑8modinfo <module_name>3.7 进程记账 (psacct)
1# 安装2apt install acct3
4# 启动记账5accton /var/log/account/pacct6
7# 查看最近执行的命令8lastcomm | head -509
10# 汇总统计11sa记账在进程创建/退出时记录,rootkit 很难完全阻止,可作为事后追溯手段。
3.8 网络连接交叉验证
1# 多个工具对比网络连接2ss -tunap > /tmp/ss.txt3netstat -anp > /tmp/netstat.txt4lsof -i -n -P > /tmp/lsof_net.txt5
6# busybox netstat 对比7busybox netstat -anp > /tmp/busybox_net.txt8
9# diff 对比差异10diff /tmp/ss.txt /tmp/busybox_net.txt四、应急响应检测流程
4.1 快速筛查
1# 1. 使用 busybox 快速对比2busybox ps auxf3
4# 2. 检查 /proc 是否完整5busybox ls /proc | grep -E '^[0-9]+$' | wc -l6ls /proc | grep -E '^[0-9]+$' | wc -l7# 两者数量应一致8
9# 3. 检查可疑进程10busybox ps aux | grep -vE '^root|^daemon|^www|^mysql' | grep -v '^\['11
12# 4. 高 CPU 进程排查13busybox top -b -n 1 | head -204.2 深入排查
1# 5. 运行 unhide2unhide brute3unhide procall4
5# 6. Rootkit 扫描6rkhunter --check --sk7
8# 7. 检查 LD_PRELOAD9cat /proc/self/maps | grep -i ld_preload10cat /proc/1/environ | tr '\0' '\n' | grep -i ld_preload11
12# 8. 检查可疑内核模块13lsmod | sort | while read mod size used; do14 echo "=== $mod ==="15 modinfo $mod 2>/dev/null | grep -E 'description|author|license|version'16done17
18# 9. 检查异常计划任务和自启动19crontab -l 2>/dev/null20ls -la /etc/cron.* 2>/dev/null21systemctl list-units --type=service --state=running | grep -vE '^(●| )'4.3 内存取证
1# 使用 avml 或 LiME 采集内存镜像2# avml: https://github.com/microsoft/avml3avml /tmp/memory.dmp4
5# 用 volatility3 分析6vol -f /tmp/memory.dmp linux.pslist7vol -f /tmp/memory.dmp linux.psscan # 与 pslist 对比找隐藏8vol -f /tmp/memory.dmp linux.check_afinfo9vol -f /tmp/memory.dmp linux.hidden_modules五、注意事项
- busybox 不是万能:如果 rootkit 在内核层面 hook 了
getdents64,busybox 也无法看到隐藏进程。 - 交叉验证是关键:单一工具不可靠,必须用多个独立工具交叉比对。
- 疑似挖矿进程:重点排查高 CPU 占用、伪装成系统进程名的进程。用
busybox top和cat /proc/*/comm对比。 - 内存取证是最后手段:对于高级内核 rootkit,只有通过内存取证(volatility)才能发现。
- 保留现场:在检测前先保存
ps、lsmod、/proc等快照,避免 rootkit 感知后自行销毁。
部分信息可能已经过时
目录
技能展示
文章
日记
时间线
项目展示
分类
标签
Android Bash Burp C++ CS CTF DLL劫持 Docker Fastjson Fastjson2 FNV-1a FreeCMS FRP GetShell GitHub IPv6 Java JNDI John JS加密 JS逆向 K8s Kafka Kali lama-cleaner Linux mitmproxy MSF MySQL Nim Nmap NPS Office OID Payload Phar PHP phpMyAdmin POP链 PWN Pyinstaller Python RCE RSA Shellcode SNMP SQL注入 SSH SSRF Ubuntu USB Web Webshell Web安全 Windows XSS YAML Zookeeper 主机探测 代码审计 伪协议 免杀 内网 内网穿透 加密 加解密 参数 反序列化 反弹shell 命令 哈希碰撞 图像处理 域渗透 字符串逃逸 容器 密码学 密码破解 提权 数据库 文件上传 日志分析 未授权访问 权限维持 汇总 流量分析 消息队列 溯源 漏洞 漏洞分析 漏洞利用 端口扫描 编译 网络管理 资产探测 跨平台 运维 进程隐藏 逆向
目录