排查隐蔽SO后门关键在于确认“本不该加载某库的服务却实际加载了它”,需优先检查LD_PRELOAD环境变量、用户/系统配置及PAM模块,验证sshd等关键服务是否被劫持,并用busybox/strace等绕过工具交叉验证真实端口与行为。

排查由隐蔽动态链接库(SO)引发的服务端口后门,关键不是只看端口有没有、进程存不存在,而是要确认“哪个服务本不该加载那个库,却实际加载了它”——因为后门常通过劫持 ls、ss、ps 等命令的底层函数,让常规检查完全失真。
先揪出被强制预加载的恶意 SO 文件
LD_PRELOAD 是最常见入口,它能让任意动态程序在启动时悄悄载入指定 .so。新手应优先查三处:
- 运行
echo $LD_PRELOAD,若输出非空且路径含/tmp/.x.so、/dev/shm/libhook.so等,立即记下 - 搜用户和系统级配置:
grep -r "LD_PRELOAD=" /home/*/.bashrc /root/.bashrc /etc/profile* /etc/environment 2>/dev/null - 重点检查 PAM 环境模块:
grep -A2 "LD_PRELOAD" /etc/security/pam_env.conf,若出现DEFAULT=@{HOME}/.pam.so类规则,基本可定性为后门
验证关键服务是否已被劫持
sshd、sudo、login 这类服务一旦被注入,所有后续命令输出都不可信。必须直接读其内存环境:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 查主 sshd 进程:
cat /proc/$(pidof sshd)/environ | xargs -0 -n1 | grep LD_PRELOAD - 查所有 sshd 子进程(每个连接一个):
for pid in $(pgrep sshd); do cat /proc/$pid/environ 2>/dev/null | xargs -0 -n1 | grep LD_PRELOAD && echo "PID: $pid"; done - 对 sudo、su 同样操作;若发现某子进程有 LD_PRELOAD 而主进程没有,说明攻击者已通过会话级注入完成横向渗透
定位端口与恶意库的映射关系
即使删了 .so 文件,只要进程还在跑,后门就仍在监听。需用 inode 和 maps 双向锁定:
- 用
ss -tunlp找出显示 PID 为-的监听端口(如0.0.0.0:4444) - 将端口号转为小写十六进制(例:4444 → 115c),再查
awk '$2 ~ /:115c/ {print $10}' /proc/net/tcp得到 inode - 遍历所有进程 fd:
for i in /proc/[0-9]*; do ls -l $i/fd/ 2>/dev/null | grep -q "socket:\[INODE\]" && echo $i; done,若无结果,说明该连接来自内核模块或 raw socket - 同时执行:
grep "/tmp/.x.so" /proc/[0-9]*/maps 2>/dev/null | cut -d/ -f3,看哪些 PID 映射了该库;再用cat /proc/PID/cmdline | tr '\0' ' '确认是不是 sshd 或 bash
用未劫持工具交叉验证真实行为
被 SO 劫持的 ss、netstat、ps 都可能过滤输出。必须换不走 libc 的方式验证:
- 用 busybox 绕过:执行
busybox ss -tunlp,对比原ss输出差异;若 busybox 显示了原命令没列的端口,说明已被篡改 - 用 strace 看真实系统调用:
strace -e trace=bind,listen,accept /bin/bash -c "sleep 1" 2>&1 | grep -E "(4444|115c)",可捕获 bind() 调用是否发生在可疑库中 - 若系统有
lsof,运行lsof -iTCP -Pn -sTCP:LISTEN,它依赖 /proc/net 直读,比用户态命令更可靠

















