在 Linux 服务器入侵事件中,攻击者拿到初始访问权限后,最先做的事情之一就是建立持久化机制,确保即使系统重启或漏洞被修补,仍然能够重新控制目标主机。而在众多持久化手段中,利用 cron 定时任务是最经典、最隐蔽、也最容易被忽视的一种。本文将从排查角度出发,系统梳理攻击者如何滥用定时任务,以及运维和蓝队人员应如何发现和清除这类恶意持久化。
为什么攻击者偏爱 cron
cron 是 Linux 系统自带的定时任务调度服务,几乎每台服务器都会运行。它的优势对攻击者而言非常明显:
- 系统原生:不需要额外安装任何工具,不会引入可疑的二进制文件。
- 自动执行:设定好时间后,恶意载荷会在指定周期反复运行,无需攻击者手动触发。
- 权限继承:cron 任务以配置它的用户身份运行,如果是 root 配置的,载荷就拥有 root 权限。
- 隐蔽性强:普通管理员很少逐条审查 crontab 内容,尤其是系统级目录下的任务文件。
正因如此,cron 常被用于挖矿木马、反弹 Shell、下载后续载荷等场景。攻击者往往会在多个位置同时植入定时任务,形成冗余,增加清除难度。
攻击者常用的植入位置
排查之前,必须先清楚攻击者会在哪些地方动手。Linux 定时任务并非只有 crontab -e 一个入口,常见的恶意植入点包括:
- 用户级 crontab:位于
/var/spool/cron/crontabs/(Debian 系)或/var/spool/cron/(RHEL 系),每个文件对应一个用户。 - 系统级 crontab:
/etc/crontab,格式与用户级略有不同,多了一个用户名字段。 - cron.d 目录:
/etc/cron.d/,存放独立的系统级任务文件。 - 周期目录:
/etc/cron.hourly/、/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/,直接放置可执行脚本即可被周期调用。 - 其他调度机制:
systemd timer(/etc/systemd/system/*.timer)、at任务、anacron等,同样可实现定时执行。
值得注意的是,/etc/cron.d/ 和周期目录中的脚本往往被攻击者伪装成正常的系统维护脚本,文件名类似 logrotate、apt-compat 等,极具迷惑性。
排查思路与具体命令
第一步:全面列出所有定时任务
# 查看所有用户的 crontab
for user in $(cut -f1 -d: /etc/passwd); do
echo "=== $user ==="
crontab -l -u $user 2>/dev/null
done
# 查看系统级配置
cat /etc/crontab
ls -la /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/ /etc/cron.weekly/ /etc/cron.monthly/
# 查看每个文件内容
cat /etc/cron.d/*
在输出中,重点关注以下几类可疑特征:
- 执行
curl、wget下载远程文件并管道给bash/sh的命令; - 使用
base64解码、python -c、perl -e等混淆执行的命令; - 指向
/tmp、/dev/shm、/var/tmp等临时目录的脚本路径; - 反弹 Shell 特征,如
bash -i >& /dev/tcp/...; - 时间设置极为频繁(如每分钟执行一次)。
第二步:检查文件时间戳与权限
攻击者植入的文件通常具有异常的时间戳。可以按修改时间排序,快速定位近期被改动的 cron 相关文件:
find /etc/cron* /var/spool/cron -type f -mtime -30 -ls
同时检查是否有非 root 用户拥有系统级 cron 文件的写权限,或存在 SUID 位异常。
第三步:关联进程与网络行为
定时任务最终会落地为进程。结合进程树和网络连接,可以进一步确认恶意行为:
# 查看 cron 派生的子进程
ps -ef | grep -E "cron|CRON"
# 查看可疑外联
netstat -antp | grep ESTABLISHED
ss -antp | grep -E ":(4444|1337|8080)"
如果发现某个 cron 任务周期性拉起一个连接外部 IP 的进程,基本可以确认是恶意持久化。
第四步:检查 systemd timer 与 at 任务
systemctl list-timers --all
ls -la /etc/systemd/system/*.timer
atq
systemd timer 是较新的持久化方式,很多传统排查清单会遗漏,需要特别留意。
清除与加固建议
确认恶意任务后,清除步骤应当彻底,避免遗漏冗余入口:
- 删除恶意 crontab 条目或整个恶意文件,注意不要误删正常业务任务;
- 终止由恶意任务拉起的进程,并检查是否有守护进程会重新写回 cron;
- 检查
~/.bashrc、/etc/profile、/etc/rc.local等启动项是否也被植入; - 修改所有可能泄露的账号密码,尤其是 root 和具有 sudo 权限的账户;
- 修补入侵入口漏洞,否则清除后仍会被重新植入。
加固层面,建议:
- 使用
chattr +i锁定关键 cron 文件,防止被篡改; - 通过
rsyslog集中收集 cron 日志(/var/log/cron或/var/log/syslog),并配置告警规则; - 部署文件完整性监控(如 AIDE、Tripwire),对
/etc/cron*和/var/spool/cron做基线校验; - 限制
crontab使用权限,通过/etc/cron.allow和/etc/cron.deny控制哪些用户可以创建定时任务。
结语
Linux 定时任务本身是运维利器,但正因其普遍性和自动化特性,成为攻击者建立持久化的首选。排查的核心在于“全面”——不能只看 crontab -l,而要覆盖用户级、系统级、cron.d、周期目录以及 systemd timer 等所有调度入口。结合时间戳分析、进程关联和网络行为,才能有效识别并清除这类隐蔽的恶意持久化。在日常运维中,建立 cron 配置基线并持续监控变更,是防御此类攻击最务实的手段。
未经允许不得转载:任鹏个人博客 » Linux 定时任务中的恶意持久化排查


朋友圈点赞图在线生成源码