快速定位可疑 cron 定时任务需覆盖全路径:/etc/crontab、/etc/cron.d/、/etc/cron./、/var/spool/cron{,/crontabs}/ 及各用户 crontab;用 sudo grep -r -e "(bash.-i|/dev/tcp/|python.socket|perl.io::socket)" /etc/cron* /var/spool/cron\ 2>/dev/null 扫描,结合日志分析与进程校验。

如何快速定位可疑的 cron 定时任务
Linux 上隐藏的反弹 Shell 通常通过 cron 持久化,但不会出现在用户常规编辑的 crontab -e 中——攻击者更倾向写入系统级位置或绕过日志。直接查 /etc/crontab 或 /etc/cron.d/ 目录远远不够。
真正要覆盖的路径包括:/etc/crontab、/etc/cron.d/ 下所有文件、/etc/cron.hourly/、/etc/cron.daily/ 等运行目录(注意:这些是脚本,不是 crontab 格式)、以及每个用户的 crontab 缓存文件(如 /var/spool/cron/ 下的用户名文件)。
- 用
sudo crontab -l -u all查所有用户的 crontab(部分系统不支持all,需配合cut -d: -f1 /etc/passwd | xargs -I{} sudo crontab -l -u {} 2>/dev/null) -
ls -la /etc/cron*看是否有非常规命名文件(如.cron、__tmp、带空格或不可见字符的文件名) - 检查
/var/spool/cron/crontabs/(Debian/Ubuntu)和/var/spool/cron/(RHEL/CentOS)是否权限异常(比如非 root 可写)
识别反弹 Shell 的典型 cron 表达式特征
攻击者写的定时任务往往刻意“看起来无害”,但行为可疑。重点不是语法是否合法,而是执行内容是否反常。
- 命令中含
bash -i、/bin/bash -i、sh -i、nc -e、mkfifo+cat+exec组合、python -c "import socket,subprocess,os;..."等 - 时间字段过于频繁且不规律,例如
* * * * *(每分钟)、*/3 * * * *(每3分钟),尤其出现在/etc/cron.d/中 - 路径使用短随机名或隐藏路径,如
/tmp/.X11-unix/、/dev/shm/.log、/var/tmp/.cache,且文件权限为700或755但属主异常 - 命令末尾带
&>/dev/null &或重定向到/dev/null,刻意屏蔽输出
用 grep 配合正则快速扫描可疑字符串
单纯肉眼翻文件效率低,要用带上下文的搜索。注意:必须加 sudo,否则读不到系统级 crontab 和其他用户任务。
sudo grep -r -n -E "(bash.*-i|sh.*-i|nc.*-e|/dev/tcp/|/dev/udp/|mkfifo.*\|.*cat.*exec|python.*socket.*subprocess|perl.*IO::Socket|php.*fsockopen)" /etc/cron* /var/spool/cron* 2>/dev/null
补充说明:
-
/etc/cron*包括/etc/cron.d/、/etc/cron.hourly/等;/var/spool/cron*覆盖不同发行版路径 - 如果发现
python -c类命令,别急着删——先sudo python -c "..."执行看是否真连外网(在隔离环境做),有些是运维工具 - 某些样本会 base64 编码命令,可追加
| grep -E "[a-zA-Z0-9+/]{20,}=="辅助排查,再用base64 -d解码验证
检查 cron 日志与实际执行痕迹
即使没找到明显恶意条目,也要确认 cron 是否被篡改过二进制或加载了恶意模块——有些高级后门会 hook fork() 或 patch cron 进程内存。
- 查 cron 日志:先确认
/var/log/syslog或/var/log/cron是否启用(grep "CRON" /var/log/syslog),然后搜异常 IP 或高频执行记录 - 用
ps auxf | grep cron看进程树,正常只有/usr/sbin/cron;若出现/usr/sbin/cron -f(前台模式)、或路径带.so、.tmp后缀,高度可疑 - 检查
systemctl status cron或service crond status输出中 Binary path 是否被替换(如指向/tmp/cron) - 运行
md5sum /usr/sbin/cron,对比干净系统的哈希值(或用rpm -V cronie/dpkg --verify cron)
真正的难点不在“找得到”,而在“找得全”——攻击者可能只在特定时间触发、或依赖环境变量判断是否真实主机,静态扫描容易漏掉条件型 payload。











