排查反弹Shell不能仅依赖lsof -i,关键在于识别连接与进程身份是否匹配异常行为,如非联网进程主动外连、目标IP/端口可疑,并需结合proc信息、启动参数、内存段及临时文件综合验证。

直接用 lsof -i 查反弹 Shell 效果有限,它只能显示当前 socket 文件描述符,无法识别进程是否已被劫持、注入或伪造。真正的排查关键不是“有没有连接”,而是“这个连接是否符合该进程的正常行为”。需聚焦可疑行为特征,再用 lsof -i 辅助定位,而非依赖它做最终判断。
重点看连接与进程身份是否匹配
反弹 Shell 的核心特征是:本不该联网的进程主动连了外网,且目标地址/端口异常。例如:
-
/usr/bin/python3连了185.143.222.77:4444(非业务 IP + Cobalt Strike 默认端口) -
rsyslogd建立了到104.28.15.19:5555的ESTABLISHEDTCP 连接(系统日志进程无外联逻辑) -
nginx连向境外 CDN 以外的 IP,且协议明显不是 HTTP/HTTPS(如无 TLS 握手、无 Host 头) -
cron进程关联的 socket 目标端口为8080或9999,但服务器未配置任何对外服务监听这些端口
用 lsof -i 锁定高风险连接,不扫全量
避免 lsof -i 输出过载,只查真正可疑的维度:
-
lsof -iTCP -sTCP:ESTABLISHED -Pn:只看活跃 TCP 连接,禁用解析,输出干净可读 -
lsof -i @185.143.222.77:针对已知恶意 C2 IP 快速反查所有关联进程 -
lsof -i :4444或lsof -i :5555:常见反弹端口,一查即出对应 PID -
lsof -p 1234 -i:对某个疑似被劫持的 PID(比如命令行含dev/tcp的 python 进程)单独检查其 socket 表
查完连接必须验证进程真实性
仅靠 lsof -i 输出的 PID 不足以确认恶意,必须立刻交叉验证:
-
ls -la /proc/1234/exe:若指向/tmp/.X11-unix/.a.py (deleted)或(deleted),基本就是落地后门 -
cat /proc/1234/cmdline | tr '\0' ' ':还原完整启动参数,搜bash -i、/dev/tcp/、base64、subprocess等关键词 -
ps -eo pid,ppid,comm,args --sort=-pid | grep 1234:看父进程是否异常(如sh启动python3,而sh本身无合法业务) -
cat /proc/1234/maps | grep -E "(rwx|rw.x)":存在可执行+可写内存段,极可能是 shellcode 注入痕迹
别忘了临时目录里的“活体”脚本
很多反弹 Shell 是纯内存运行或由临时文件拉起:
-
find /tmp /dev/shm -type f -name "*.py" -mtime -3 2>/dev/null -
find /var/tmp -type f -name ".*" -mtime -1 2>/dev/null - 对命中文件执行
head -n 25 文件名 | grep -E "(socket\.|subprocess\.|os\.popen|base64\.b64decode|/dev/tcp)"
不复杂但容易忽略

















