Linux 定时任务中的恶意持久化排查

在 Linux 服务器入侵事件中,攻击者拿到初始访问权限后,最先做的事情之一就是建立持久化机制,确保即使系统重启或漏洞被修补,仍然能够重新控制目标主机。而在众多持久化手段中,利用 cron 定时任务是最经典、最隐蔽、也最容易被忽视的一种。本文将从排查角度出发,系统梳理攻击者如何滥用定时任务,以及运维和蓝队人员应如何发现和清除这类恶意持久化。

为什么攻击者偏爱 cron

cron 是 Linux 系统自带的定时任务调度服务,几乎每台服务器都会运行。它的优势对攻击者而言非常明显:

  • 系统原生:不需要额外安装任何工具,不会引入可疑的二进制文件。
  • 自动执行:设定好时间后,恶意载荷会在指定周期反复运行,无需攻击者手动触发。
  • 权限继承:cron 任务以配置它的用户身份运行,如果是 root 配置的,载荷就拥有 root 权限。
  • 隐蔽性强:普通管理员很少逐条审查 crontab 内容,尤其是系统级目录下的任务文件。

正因如此,cron 常被用于挖矿木马、反弹 Shell、下载后续载荷等场景。攻击者往往会在多个位置同时植入定时任务,形成冗余,增加清除难度。

攻击者常用的植入位置

排查之前,必须先清楚攻击者会在哪些地方动手。Linux 定时任务并非只有 crontab -e 一个入口,常见的恶意植入点包括:

  1. 用户级 crontab:位于 /var/spool/cron/crontabs/(Debian 系)或 /var/spool/cron/(RHEL 系),每个文件对应一个用户。
  2. 系统级 crontab/etc/crontab,格式与用户级略有不同,多了一个用户名字段。
  3. cron.d 目录/etc/cron.d/,存放独立的系统级任务文件。
  4. 周期目录/etc/cron.hourly//etc/cron.daily//etc/cron.weekly//etc/cron.monthly/,直接放置可执行脚本即可被周期调用。
  5. 其他调度机制systemd timer/etc/systemd/system/*.timer)、at 任务、anacron 等,同样可实现定时执行。

值得注意的是,/etc/cron.d/ 和周期目录中的脚本往往被攻击者伪装成正常的系统维护脚本,文件名类似 logrotateapt-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/*

在输出中,重点关注以下几类可疑特征:

  • 执行 curlwget 下载远程文件并管道给 bash/sh 的命令;
  • 使用 base64 解码、python -cperl -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 是较新的持久化方式,很多传统排查清单会遗漏,需要特别留意。

清除与加固建议

确认恶意任务后,清除步骤应当彻底,避免遗漏冗余入口:

  1. 删除恶意 crontab 条目或整个恶意文件,注意不要误删正常业务任务;
  2. 终止由恶意任务拉起的进程,并检查是否有守护进程会重新写回 cron;
  3. 检查 ~/.bashrc/etc/profile/etc/rc.local 等启动项是否也被植入;
  4. 修改所有可能泄露的账号密码,尤其是 root 和具有 sudo 权限的账户;
  5. 修补入侵入口漏洞,否则清除后仍会被重新植入。

加固层面,建议:

  • 使用 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 定时任务中的恶意持久化排查

赞 (0) 打赏

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏