应优先通过网络连接反推进程再定位/tmp脚本:用ss命令筛选可疑外连,结合/proc/pid/exe、cmdline、cwd确认进程来源,检查/tmp下新近创建的可疑文件内容及内存字符串,并排查定时任务与残留启动项。

直接从/tmp目录入手排查反弹Shell脚本,关键不是“找文件”,而是“追连接”——因为恶意脚本常被删、重命名或内存驻留,但外连行为很难完全抹除。重点盯住网络连接反推进程,再定位到/tmp里的脚本。
先抓活跃的可疑外连
反弹Shell的本质是服务器主动连出,所以第一步必须锁定这类连接:
- 运行 ss -tnp | grep ':9999\|:4444\|:5555\|:6767'(常见反弹端口),特别留意 ESTABLISHED 状态且目标 IP 不在业务白名单中的条目
- 若没看到明确端口,用 ss -tnp | awk '$5 !~ /127\.0\.0\.1|::1/ && $1 ~ /ESTAB/' 筛出所有非本地外连,人工核对IP归属(如114.114.114.121这类非业务IP)
- 确认连接对应 PID 后,立刻执行 ls -l /proc/PID/exe —— 如果显示 "No such file" 或指向 /tmp/xxx、/dev/shm/xxx,基本就是目标
顺藤摸瓜定位/tmp里的脚本
很多反弹脚本会自我清理,但落地痕迹还在:
- 对刚发现的 PID,运行 cat /proc/PID/cmdline | tr '\0' ' ',看是否含 python -c、bash -i、/dev/tcp/、nc -e 等关键词
- 查该进程工作目录:readlink /proc/PID/cwd,90%以上会指向 /tmp 或子目录(如 /tmp/.X291-unix)
- 进对应目录,用 ls -ltr --full-time 按时间倒序列出文件,重点关注最近1小时内创建、权限为755、名字带随机字符(如 a.sh、1.py、shell)的文件
验证是不是反弹Shell脚本
别只看文件名,要验内容和行为:
- 用 file 脚本名 确认类型(bash script / Python script / ELF binary)
- 如果是文本脚本,head -20 脚本名 查关键特征:是否有 /dev/tcp/、exec 5/dev/tcp/、bash -i >&/dev/tcp/、subprocess.call(["/bin/bash","-i"])
- 运行 strings /proc/PID/mem 2>/dev/null | grep -E "(bash -i|/dev/tcp|nc -e|python -c)" —— 内存里有这些字符串,基本坐实
别漏掉定时任务和残留启动项
脚本可能只是入口,持久化藏在别处:
- 检查 crontab -l 和 ls /var/spool/cron/,找命令里含 /tmp/ 路径的定时任务
- 查 systemctl list-timers --all,看是否有自定义 timer 单元调用 tmp 下脚本
- 运行 find /tmp -name "*.sh" -o -name "*.py" -o -name ".*" -mtime -1 2>/dev/null,一次性扫出所有新近隐藏脚本











