ps 在取证中的位置
ps 从 /proc 读取内核维护的进程视图,输出 PID、父进程、属主、启动时间与命令行。它的价值在于两条线索:一是按启动时间排序后,最近被拉起的进程往往对应攻击者的动作时间点;二是父子关系可以还原「谁起了谁」,把 shell、下载器、后门进程串成一条链。ps 是即时快照类证据,进程退出后命令行与父子关系就消失,因此需要尽早采集并落盘。
基本信息
| 适用平台 | Linux、BSD、macOS;busybox 环境参数较少 |
|---|---|
| 常用组合 | ps auxww、ps -ef --forest、ps -eo pid,ppid,user,lstart,etime,cmd |
| 排序 | 支持按启动时间、CPU、内存排序,便于定位最近拉起的进程 |
| 关联位置 | /proc/<pid>/ 下的 cmdline、exe、cwd、fd、environ、status |
| 替代工具 | pstree -p 看树形结构、top 看实时占用、/proc 目录直接抽样 |
| 采集建议 | 固定输出字段后再落盘,两次快照可做差集对比 |
典型使用场景
- 定位最近拉起的可疑进程,与文件落地时间互相印证
- 还原父子链:从 Web 服务进程一路向下找到反弹 shell
- 确认进程真实程序路径,识破改了名字的伪装进程
- 通过 /proc/<pid>/cwd 找出程序运行目录,进而定位同目录下的其他文件
- 两次快照取差集,捕捉短生命周期进程
- 与 ss 配合:把外联连接对应的 PID 落到具体命令行
进程快照采集
进程快照采集
# 固定字段并落盘:含属主、启动时间、已运行时长与完整命令行
ps -eo pid,ppid,user,lstart,etime,cmd --sort=start_time | tail -30
# 树形视图,重点看异常进程挂在哪个父进程下
ps -ef --forest | head -40
# 完整命令行(w 放大宽度,避免长命令被截断)
ps auxww | grep -v grep | head -30
# 逐个核对可疑进程的真实程序与工作目录
ls -l /proc/<pid>/exe; cat /proc/<pid>/cmdline | tr '\0' ' '; ls -l /proc/<pid>/cwd
# 用 /proc 目录列表反查是否有进程未出现在 ps 输出中
ls /proc | grep -E '^[0-9]+$' | wc -l; ps -e --no-headers | wc -l输出逐列读法
| 列 | 含义 | 判读要点 |
|---|---|---|
| PID/PPID | 进程号与父进程号 | PPID 为 1 表示被 init 接管,常见于守护化后门;PPID 不存在说明父进程已退出 |
| USER | 属主账号 | 服务账号出现交互式 shell 命令需重点解释 |
| LSTART/ETIME | 启动时间与已运行时长 | 启动时间落在入侵窗口内的进程优先排查 |
| CMD | 命令行(含参数) | 参数里的 URL、IP、编码串是最直接的线索 |
| TTY | 关联终端 | 服务进程带 TTY 说明可能是从终端手工拉起 |
处置前先记录可疑进程的 PID、完整命令行、程序哈希与父子关系。直接 kill 会让内存中的解密密钥、连接信息与行为痕迹一起消失,应先采集再处置。
ps 显示的是 /proc 的内容,内核级后门可能让某些进程不出现在列表里。排查时用 /proc 目录计数与 ps 行数对比,必要时用静态编译的工具或从另一台机器远程读取。