SSH 爆破成功后的清理链
确定爆破已经得手之后,清理必须按链条走:从会话与来源入手,再处理攻击者留下的账号与密钥,然后是让它复活的计划任务与登录脚本,最后清理它带上来的工具与下载物。只处理其中一个环节都会复发——例如只删掉后门账号,却留下了攻击者写入的免密公钥。每一步都要先留证再动手,因为这些都是判断「他做了什么」的直接依据。
基本信息
| 会话层 | w、who、last 对照陌生来源 IP 与时间,确认是否有会话仍在 |
|---|---|
| 账号层 | /etc/passwd 与 shadow 的新增条目、sudoers 变更、组成员变化 |
| 密钥层 | 各账号 authorized_keys 中新增行,尤其带 command= 前缀的 |
| 自启层 | cron、systemd、登录脚本、ld.so.preload 等持久化入口 |
| 工具层 | 家目录与 /tmp、/dev/shm 下的扫描器、隧道工具、挖矿程序 |
| 留证要求 | 清理前记录文件内容、时间戳与哈希,家目录整体打包 |
典型使用场景
- 日志确认某账号被爆破成功后按链条清理
- 处置后复查:确认没有残留的密钥与计划任务
- 把攻击者工具与地址整理成 IOC,横向检索其他主机
- 评估是否需要重置该账号及相关服务的全部凭据
- 向业务方说明清理了哪些入口,交付可核验的清单
核查会话、账号、密钥与自启
核查会话、账号、密钥与自启
sudo w -i; sudo last -aiF -n 20 # 1 会话与登录历史
sudo awk -F: '$3==0 {print $1}' /etc/passwd # 2 UID 0 账号
sudo ls -lt --time-style=full-iso /etc/passwd /etc/shadow /etc/sudoers # 3 账号文件改动时间
sudo grep -RIn 'command=\|from=' /root/.ssh /home/*/.ssh 2>/dev/null | head # 4 带限制前缀的密钥
crontab -l 2>/dev/null; sudo ls -la /etc/cron.d/ # 5 计划任务
sudo grep -rEn 'curl|wget|/dev/tcp' /etc/profile /etc/profile.d/ /root/.bashrc 2>/dev/null
find /tmp /dev/shm /var/tmp -type f -mtime -7 -ls 2>/dev/null | head -n 20 # 6 攻击者工具检查点与判据
| 检查点 | 正常状态 | 可疑信号 |
|---|---|---|
| 在线会话 | 只有本单位账号与已知来源 | 陌生来源的活跃会话 |
| 账号与组 | 与台账一致 | 新增账号、加入 sudo 或 wheel 组 |
| 密钥文件 | 只含台账内的指纹 | 新增公钥,尤其带 command= 前缀 |
| 计划任务 | 与基线一致 | 短周期下载执行类条目 |
| 登录脚本 | 内容与基线一致 | 尾部出现下载执行或反弹写法 |
| 临时目录 | 无异常可执行文件 | 扫描器、隧道工具、挖矿程序 |
清理账号前先把它的家目录整体打包留存:命令历史、脚本与他人交互的痕迹都在里面,删掉之后再也拿不到。密钥文件同样先复制内容与时间戳再删除。
不要只盯 SSH:同一批扫描往往同时试探数据库、中间件与面板服务,处置时要顺手核对这些服务的登录日志与账号列表,否则只是堵住了其中一扇门。