首页/安全/应急响应速查/检查 /etc/crontab 与 /etc/cron.d

检查 /etc/crontab 与 /etc/cron.d

系统级任务除了 crontab -l 还有三处:/etc/crontab、/etc/cron.d 单文件、各 cron.* 目录;cron.d 里的小文件最不易察觉。

应急响应速查安全更新于 2026-10-13

系统级任务检查

除了用户自己的 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:任务内容本身就是证据,删掉后既无法说明攻击方式,也无法对其他主机做同样的检索。

易错点

  • 只看 /etc/crontab:cron.d 目录才是更常见的藏点,必须整个目录逐个打开
  • 按用户级五段格式解析系统级任务:字段错位会把用户名字段当成命令的一部分
  • 忽略 cron.hourly 这类目录:目录内脚本不需要时间字段,直接就是一个任务
  • 不看文件 mtime:新增或改动的片段时间戳与入侵时间吻合,是最直接的线索
  • 清理时不看执行日志:/var/log/cron 里的执行记录能确认任务是否真的跑过、跑了几次

数据来源与参考

  • crontab(5) 手册:系统级任务格式

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌