系统级任务检查
除了用户自己的 crontab,Linux 还有三处系统级定时任务入口:/etc/crontab 主表、/etc/cron.d 目录下的独立片段、以及 /etc/cron.hourly 这类由 run-parts 拉起的目录。它们不隶属于任何用户,因此删除或禁用账号都不会影响其生效,是攻击者藏任务时很喜欢的落点。排查时要特别注意格式差异:系统级任务在时间字段之后多一个执行用户字段。
基本信息
| 文件一 | /etc/crontab:系统级主表,含执行用户字段 |
|---|---|
| 目录二 | /etc/cron.d/:每个文件是一条独立任务,格式与主表一致 |
| 目录三 | /etc/cron.hourly、daily、weekly、monthly:目录内脚本会被 run-parts 执行 |
| 格式差异 | 系统级为「分 时 日 月 星期 用户 命令」,用户级没有用户字段 |
| 排查手段 | 读文件内容、看文件 mtime 与属主、与基线比对 |
| 常见藏法 | 文件名伪装成系统包风格,或写成隐蔽的随机名 |
典型使用场景
- 木马反复复活时确认是否被写成系统级任务
- 挖矿清理后复查,防止下载脚本仍被定期执行
- 排查谁在固定时间拉起进程,与进程启动时间对照
- 做基线时留存系统级任务清单供日后差异比对
- 审计第三方软件安装时留下的计划任务
检查系统级任务
检查系统级任务
sudo cat /etc/crontab # 系统级主表
sudo ls -la /etc/cron.d/ # 目录内容与时间戳
for f in /etc/cron.d/*; do echo "== $f"; sudo cat "$f"; done 2>/dev/null
sudo ls -lt --time-style=full-iso /etc/cron.d/ /etc/cron.hourly/ 2>/dev/null | head -n 20
sudo grep -rEn 'curl|wget|base64|/tmp/|/dev/shm' /etc/cron.d/ /etc/crontab 2>/dev/null | head -n 20
sudo grep -i cron /var/log/cron 2>/dev/null | tail -n 20 # RHEL 系的执行记录格式读法
| 位置 | 字段构成 | 注意点 |
|---|---|---|
| /etc/crontab | 分 时 日 月 星期 用户 命令 | 多一个用户字段,按五段解析会读错 |
| /etc/cron.d/文件 | 分 时 日 月 星期 用户 命令 | 与主表格式相同,文件名任意但会被直接加载 |
| /etc/cron.hourly 等 | 无时间字段,整个脚本就是任务内容 | 由 run-parts 按目录周期执行,脚本需有执行权限 |
| 用户 crontab | 分 时 日 月 星期 命令 | 没有用户字段,容易与系统级混淆 |
| @ 简写 | @reboot 等替代时间字段 | 系统级同样支持,@reboot 是后门常用形态 |
别只看时间字段:系统级任务里的执行用户列决定了命令以谁的身份运行,root 用户配合下载执行类命令是最典型的组合。同时核对文件属主与权限,正常片段多为 root 属主且不可被普通用户写入。
删除前先复制原文与记录 mtime:任务内容本身就是证据,删掉后既无法说明攻击方式,也无法对其他主机做同样的检索。