6.4 深入检查
ls -l /etc/init.d/ 查看所有启动脚本,重点检查近期修改的文件md5sum /bin/ls 对关键命令做完整性校验
如果 /etc/init.d/ 下多了你不认识的服务脚本,别犹豫,查到底。
//03 定时任务:藏在计划里的恶意代码
定时任务是攻击者最喜欢的持久化手段之一。通过crontab或anacron,恶意脚本可以定时执行反弹Shell、数据外传、挖矿等操作。
7.1 基础操作
crontab -l 列出当前用户的定时任务crontab -e 编辑定时任务crontab -r 删除所有定时任务(谨慎操作!)
默认的 crontab 文件保存在/var/spool/cron/用户名。
7.2 排查重点目录(逐一看!)
/var/spool/cron/* 每个用户的 crontab/etc/crontab 系统级crontab/etc/cron.d/* 系统级cron配置目录/etc/cron.daily/* 每日执行/etc/cron.hourly/* 每小时执行/etc/cron.monthly/* 每月执行/etc/cron.weekly/ 每周执行/etc/anacrontab anacron配置/var/spool/anacron/* anacron任务池
排查要点:
- 看脚本内容,是否有 curl、wget下载恶意文件
8.1 先扫敏感目录
ls -al /tmpls -al /var/tmpls -al /dev/shm
这三个目录所有用户可读可写,是攻击者藏文件的重灾区。特别注意以..命名的隐藏文件夹。
8.2 根据时间范围搜索
如果已经发现了Webshell或木马文件,可以根据其创建时间来查找同一时间段内的其他可疑文件:
查找 /opt 下一天内访问过的文件find /opt -iname ”*” -atime 1 -type f查找最近 24 小时内修改过的 PHP 文件find /var/www -name ”*.php” -mtime -1
8.3 查看文件详细属性
stat 可疑文件路径 查看创建时间、修改时间、访问时间
如果一个图片文件最近被修改过,或者一个 PHP 的修改时间比网站部署时间还晚,那就要留个心眼了。
//05 系统日志:还原入侵全过程的"时间机器"
日志分析是应急响应中最重要、也最考验功底的一环。日志不会说谎,就看你会不会读。
9.1 日志在哪?
日志默认存放在/var/log/,核心文件包括:
日志文件 | 说明 |
/var/log/secure(或auth.log) | 认证授权日志,SSH登录、su、sudo都在这里 |
/var/log/cron | 定时任务执行日志 |
/var/log/message | 系统重要信息日志,出问题优先看它 |
/var/log/btmp | 登录失败记录(二进制,用 lastb 查看) |
/var/log/wtmp | 登录/注销/重启记录(二进制,用 last查看) |
/var/log/lastlog | 每个用户最后一次登录记录(用lastlog查看) |
9.2 实战日志分析命令
1. 定位SSH爆破
# 统计爆破 root 的 IPgrep ”Failed password for root” /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more# 统计所有爆破 IPgrep ”Failed password” /var/log/secure | grep -E -o ”(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)” | uniq -c# 看攻击者用了哪些用户名爆破grep ”Failed password” /var/log/secure | perl -e 'while($_=<>){ /for(.*?) from/; print ”$1\n”;}' | uniq -c | sort -nr
2. 查看登录成功的记录
# 统计成功登录的 IPgrep ”Accepted ” /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more# 查看登录成功的日期、用户名、IPgrep ”Accepted ” /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
3. 查看用户增删和提权操作
grep ”useradd” /var/log/secure# 新增用户grep ”userdel” /var/log/secure# 删除用户grep ”sudo” /var/log/secure# sudo 提权操作
日志里的su切换记录长这样:
Jul 10 00:38:13 localhost su: session opened for user good by root(uid=0)
sudo授权执行:
Jul 10 00:43:09 localhost sudo: good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now
如果你需要一份可以对着逐一打勾的排查清单,看这里:
系统基本信息
uname -a && cat /etc/redhat-release # 内核版本和系统版本stat /lost+found/ # 系统安装时间rpm -qa # 所有已安装的RPM包rpm -Va # 校验所有RPM包完整性iptables-save > /tmp/iptables.bak # 备份防火墙规则ps aux && ls /proc # 进程检查(注意隐藏进程)lsmod # 内核模块检查
网络信息
ip a # 网卡信息cat /etc/resolv.conf # DNS配置route -n # 路由表arp -a # ARP表netstat -pantule # 网络连接cat /etc/hosts # hosts文件
关键命令完整性校验
以下命令如果被替换(比如ps被替换成不显示恶意进程的版本),排查就全白做了:
md5sum /bin/lsmd5sum /bin/psmd5sum /usr/sbin/lsofmd5sum /bin/netstatmd5sum /usr/sbin/ssmd5sum /usr/bin/pstreemd5sum /usr/sbin/sshdmd5sum /usr/bin/ssh
自启动&定时任务
systemctl list-unit-files --type=service | grep enabledls -l /etc/init.d/cat /etc/rc.localcat /var/spool/cron/*
用户登录痕迹
cat /home/*/.ssh/authorized_keys # 检查SSH免密登录公钥last # 登录/注销记录lastb # 登录失败记录who # 当前登录用户
//07 结尾
应急响应的核心不是工具,而是思路。
永远记住这个顺序:问清现象 → 反推路径 → 逐项验证 → 溯源根因。不要上来就"拔网线",也不要盲目敲命令。每一行日志、每一个异常进程、每一条历史命令,都可能是还原攻击链的关键拼图。
更重要的是,事前加固远胜事后救火。把历史命令格式优化做好、把关键文件MD5提前存好、把日志集中收集起来,这些"无聊"的工作,才是应急响应时你最大的底气。
END
作者 | 剁椒Muyou鱼头
I like you,but just like you.
我喜欢你,仅仅如此,喜欢而已~