直接用lsof查反弹Shell效果有限,它仅显示合法socket,无法识别LD_PRELOAD、ptrace等劫持行为;须聚焦ESTABLISHED出站连接、进程命令行、内存映射及流量协议交叉验证。

直接用 lsof 查反弹 Shell 连接效果有限,它只能看到“合法存在的 socket”,无法识别进程是否已被劫持或注入——比如通过 LD_PRELOAD、ptrace 或 inline hook 实现的隐蔽外连。真正有效的检测必须聚焦“行为异常”,而非单纯找陌生端口。
盯住 ESTABLISHED 出站连接,过滤高风险目标 IP 和端口
反弹 Shell 的本质是服务器主动向外建立 TCP 连接,所以活跃的出站 ESTABLISHED 状态是最强信号:
- 执行
ss -tunp | grep ESTAB或netstat -tunp | grep ESTAB,优先关注目标 IP 不在业务白名单内(如非 CDN、非监控、非日志上报地址)的连接 - 用
lsof -iTCP -sTCP:ESTABLISHED -Pn禁用解析,输出更干净;配合lsof -i :4444或lsof -i @203.208.60.1快速定位可疑端口或 IP - 特别警惕目标端口为
4444、5555、9999、6767、8080等常见 C2 默认端口的连接 - Web 服务(
nginx、apache)、数据库(mysqld、postgres)或系统守护进程(cron、rsyslog)建立的出站连接,基本都属于异常行为
查进程命令行和内存映射,确认是否被注入或伪装
很多反弹 Shell 进程看起来“正常”,但命令行参数或内存段暴露了真实意图:
- 用
ps -eo pid,ppid,comm,args --sort=-pid完整显示命令行,搜dev/tcp、bash -i、sh -i、subprocess.call、os.system(.*curl)等典型载荷特征 - 对可疑 PID,检查
/proc/[PID]/cmdline:运行cat /proc/1234/cmdline | tr '\0' ' ',有些恶意参数会被ps截断,这里才能看到全貌 - 运行
ls -l /proc/[PID]/exe,若指向[deleted]或/tmp/xxx.py,基本可判定为后门脚本 - 检查可写+可执行内存段:
cat /proc/[PID]/maps | grep -E "(rwx|rw.x)",出现这类段是 shellcode 注入的强提示
联动 tcpdump 和 strace,验证流量与行为是否匹配
lsof 显示的是“有连接”,但不能说明“这个连接干了什么”。必须交叉验证协议内容和系统调用:
- 对可疑连接抓包:
tcpdump -i any -n host TARGET_IP and port TARGET_PORT -w suspicious.pcap,看实际流量是否符合该进程预期协议(例如httpd发送非 HTTP 流量就是问题) - 用
strace -p PID -e trace=connect,sendto,recvfrom监控进程网络行为,若发现进程本身无网络逻辑却频繁调用connect(),大概率已被劫持 - 检查动态库加载:
cat /proc/[PID]/maps | awk '{print $6}' | grep '\.so$' | sort -u,留意路径含/tmp、/dev/shm、/var/tmp的异常.so文件
别忽略定时任务和用户级持久化入口
反弹 Shell 很少裸奔,常通过定时任务、shell 配置文件或 systemd 服务实现自启:
- 检查当前用户定时任务:
crontab -l 2>/dev/null;检查系统级任务:ls /etc/cron.d/ /etc/cron.hourly/ 2>/dev/null - 扫描用户主目录下的历史和配置文件:
find /root /home -maxdepth 2 -name ".*history" -o -name ".*rc" -o -name ".*profile" 2>/dev/null,搜curl、wget、nc、bash -i等关键词 - 检查 SSH 公钥是否被篡改:
ls -la /root/.ssh/authorized_keys /home/*/.ssh/authorized_keys 2>/dev/null,比对是否有新增、无注释的长公钥
最易被忽略的一点:攻击者可能让反弹 Shell 走 DNS 隧道、ICMP 或 HTTPS 封装,此时 lsof 和 ss 都看不到传统 TCP 连接。这种情况下,必须结合 DNS 日志、eBPF 实时监控(如 tracee)或内存 dump 分析才能确认。











