Linux权限维持狩猎:Systemd生成器
1 介绍在本文中,将讨论一种披露较少的特殊权限维持技术,并围绕“引导或登录初始化脚本:systemd-generators”主题展开。 本文将给出示例命令,介绍如何实现这些权限维持技术,以及如何使用诸如auditd、sysmon和auditbeats等开源解决方案产生告警。2 引导或登录初始化脚本:systemd-generators在MITRE ATT&CK矩阵中没有相应的专门子技术。只是在浏览systemd文档和研究rc.local、init.d脚本时偶然所获。 2.1 systemd-generators是什么通过参考debian的帮助页可知systemd.generator是: 生成器是放置在/lib/systemd/system-Generators/和[下面]列出的其他目录中的小型可执行程序。Systemd(1)将在系统引导的早期和配置重新加载时执行二进制文件——也早于单元文件的加载。
这些目录可以在手册页中找到,下面将他们列出来: /etc/systemd/system-generators/* /usr/local/lib/systemd/system-generators/* /lib/systemd/system-generators/* /etc/systemd/user-generators/* /usr/local/lib/systemd/user-generators/* /usr/lib/systemd/user-generators/*
systemd-rc-local-generator和system-sysv-generator分别用于处理rc.local和init.d脚本。这些可执行程序通过解析传统启动脚本并在系统引导时创建包装器service单元文件,将它们转换为systemd服务。这是systemd运行任何服务之前的预处理步骤。 其他模块也可以将自己的可执行文件放在上述位置之一,这也会在系统引导或systemd配置重新加载时执行。例如,安装openvpn时会生成/usr/lib/systemd/system-generators/openvpn-generator。对于后门来说,这是一个具有吸引力的位置,因为systemd生成器在系统引导过程的早期就能执行。事实上,这是所发现的最早的不需要进入内核或安装rootkit就可以运行可执行文件的地方。生成器可执行程序在任何服务启动之前运行,因此,当防御者使用日志记录器和其他传感器服务(如syslog、auditd、sysmon或auditbeat)来监视主机时,它们不会运行以捕获生成器的行为。此外,恶意生成器可能会在服务单元文件运行之前篡改它们。 不过还是有限制的,手册页给出了这样的注释: 生成器在系统引导的非常早期运行,不能依赖任何外部服务。它们不会与任何其他进程进行通信。可以做一些简单的事情,比如记录到syslog(3)或systemd本身(这意味着没有systemctl(1))。像/var/和/home/这样的非必要文件系统在生成器运行后才挂载。但是,生成器可以依赖最基本的内核功能,以及挂载的/sys/、/proc/、/dev/、/usr/和/run/文件系统。 2.2 创建恶意生成器目标如下:假设脚本/opt/beacon.sh已经存在。可以用不同的路径替换ExecStart,甚至直接添加反弹shell。然后将一个简单的可执行脚本放在/lib/systemd/system-generators/system-network-generator中。当它运行时将: 疑问是:“为什么需要创建服务单元文件?为什么不直接在后台运行/opt/beacon.sh呢?”
这是systemd生成器推荐的运行方式。例如,在执行生成器时,网络功能可能还没有准备好。因此,采用生成服务文件来代替对network.target的依赖。可以在系统引导时创建一个长时间运行的后台进程;它要么等待,要么重试,直到必要的操作系统功能可用。 生成的服务文件非常简单。如果想了解更多信息,请阅读之前的文章中最小化服务文件章节。 - [Unit]
- Description=networking.service
- [Service]
- ExecStart=/opt/beacon.sh
- [Install]
- WantedBy=multi-user.target
复制代码
下次重新启动,networking.service服务将运行。- $ systemctl status networking
- ● networking.service
- Loaded: loaded (/run/systemd/system/networking.service; enabled; vendor preset: enabled)
- Active: active (running) since Wed 2022-02-02 06:42:47 UTC; 19s ago
- Main PID: 374 (beacon.sh)
- Tasks: 2 (limit: 4651)
- Memory: 15.7M
- CGroup: /system.slice/networking.service
- ├─374 /bin/bash /opt/beacon.sh
- └─377 bash -l
复制代码
当然,可以将ExecStart的值或/opt/beacon.sh的内容修改为想要的任何脚本。 也因为在/run/systemd/generator.early/写入了新的sysmon.service和auditbeat.service,它们优先于/etc/systemd/system和/lib/systemd/system(参见system-analyze unit-paths中的顺序)。sysmon和auditbeat没有运行正确的守护进程。- $ systemctl status auditbeat
- ● auditbeat.service - "Skipped"
- Loaded: loaded (/run/systemd/generator.early/auditbeat.service; generated)
- Active: inactive (dead) since Wed 2022-02-02 07:15:30 UTC; 15s ago
- Process: 377 ExecStart=/usr/bin/echo Skipped (code=exited, status=0/SUCCESS)
- Main PID: 377 (code=exited, status=0/SUCCESS)
- Feb 02 07:15:30 host systemd[1]: Started "Skipped".
- Feb 02 07:15:30 host echo[377]: Skipped
- Feb 02 07:15:30 host systemd[1]: auditbeat.service: Succeeded.
- $ systemctl status sysmon
- ● sysmon.service - "Skipped"
- Loaded: loaded (/run/systemd/generator.early/sysmon.service; generated)
- Active: inactive (dead) since Wed 2022-02-02 07:15:30 UTC; 26s ago
- Process: 380 ExecStart=/usr/bin/echo Skipped (code=exited, status=0/SUCCESS)
- Main PID: 380 (code=exited, status=0/SUCCESS)
- Feb 02 07:15:30 host systemd[1]: Started "Skipped".
- Feb 02 07:15:30 host echo[380]: Skipped
- Feb 02 07:15:30 host systemd[1]: sysmon.service: Succeeded.
复制代码
添加的仿冒服务文件只是echo "Skipped",而不是运行sysmon和auditbeat守护进程。 - [Unit]
- Description="Skipped"
- [Service]
- ExecStart=echo "Skipped"
- [Install]
- WantedBy=multi-user.target
复制代码
2.3 检测systemd生成器的创建很难监视systemd生成器的执行,因为它们在系统引导时运行,甚至在sysmon或auditd运行之前。因此,要解决这个问题的主要方法是寻找systemd生成器的创建和修改。2.3.1 auditd这不是Neo23x0/auditd中的一部分,不过可以使用以下审计规则监视rc.local的创建或修改。- -w /etc/systemd/system-generators/ -p wa -k systemd_generator
- -w /usr/local/lib/systemd/system-generators/ -p wa -k systemd_generator
- -w /lib/systemd/system-generators/ -p wa -k systemd_generator
- -w /usr/lib/systemd/system-generators -p wa -k systemd_generator
- -w /etc/systemd/user-generators/ -p wa -k systemd_generator
- -w /usr/local/lib/systemd/user-generators/ -p wa -k systemd_generator
- -w /usr/lib/systemd/user-generators/ -p wa -k systemd_generator
复制代码
2.3.2 sysmon类似的,microsoft/MSTIC-Sysmon中也没有sysmon规则。但是可以创建一个规则来检测系统或用户创建的文件。 - <FileCreate onmatch="include">
- <Rule name="TechniqueID=T1037,TechniqueName=Boot or Logon Initialization Scripts: systemd-generators" groupRelation="or">
- <TargetFilename condition="contains">/etc/systemd/system-generators/</TargetFilename>
- <TargetFilename condition="contains">/usr/local/lib/systemd/system-generators/</TargetFilename>
- <TargetFilename condition="contains">/lib/systemd/system-generators/</TargetFilename>
- <TargetFilename condition="contains">/usr/lib/systemd/system-generators/</TargetFilename>
- <TargetFilename condition="contains">/etc/systemd/user-generators/</TargetFilename>
- <TargetFilename condition="contains">/usr/local/lib/systemd/user-generators/</TargetFilename>
- <TargetFilename condition="contains">/usr/lib/systemd/user-generators/</TargetFilename>
- </Rule>
- </FileCreate>
复制代码
上面的命令将生成如下日志:- <Event>
- <System>
- <Provider Name="Linux-Sysmon" Guid="{ff032593-a8d3-4f13-b0d6-01fc615a0f97}"/>
- <EventID>11</EventID>
- <Version>2</Version>
- <Level>4</Level>
- <Task>11</Task>
- <Opcode>0</Opcode>
- <Keywords>0x8000000000000000</Keywords>
- <TimeCreated SystemTime="2022-02-06T13:10:59.597085000Z"/>
- <EventRecordID>3056</EventRecordID>
- <Correlation/>
- <Execution ProcessID="5963" ThreadID="5963"/>
- <Channel>Linux-Sysmon/Operational</Channel>
- <Computer>persistence-blog</Computer>
- <Security UserId="0"/>
- </System>
- <EventData>
- <Data Name="RuleName">TechniqueID=T1037,TechniqueName=Boot or Logon Initializa</Data>
- <Data Name="UtcTime">2022-02-06 13:10:59.595</Data>
- <Data Name="ProcessGuid">{8491267f-c8e3-61ff-89a1-493c44560000}</Data>
- <Data Name="ProcessId">6897</Data>
- <Data Name="Image">/usr/bin/bash</Data>
- <Data Name="TargetFilename">+/usr/lib/systemd/system-generators/systemd-network-generator</Data>
- <Data Name="CreationUtcTime">2022-02-06 13:10:59.595</Data>
- <Data Name="User">root</Data>
- </EventData>
- </Event>
- 不确定的是,为什么日志中目标文件名的开头有个+。
- <TargetFilename condition="begin with">/usr/lib/systemd/system-generators/</TargetFilename>
- 这将导致上述规则失败,这也是为何要最终使用condition="contains"的原因。
- 2.3.3 auditbeats
- 默认情况下,auditbeat能监视上面的任何目录。也可试着把每一个都包括进去。
- - module: file_integrity
- paths:
- ...
- - /etc/systemd/system-generators/
- - /usr/local/lib/systemd/system-generators/
- - /lib/systemd/system-generators/
- - /etc/systemd/user-generators/
- - /usr/local/lib/systemd/user-generators/
- - /usr/lib/systemd/user-generators/
- # recursive: true
复制代码
请注意,其中一些目录默认可能不存在,如/etc/systemd/user-generators/、/local/lib/systemd/system-generators/或/usr/local/lib/systemd/user-generators/。 2.3.4 osquery- SELECT path, filename, size, atime, mtime, ctime, md5
- FROM file
- JOIN hash
- USING(path)
- WHERE file.directory IN (
- '/etc/systemd/system-generators/',
- '/usr/local/lib/systemd/system-generators/',
- '/lib/systemd/system-generators/',
- '/etc/systemd/user-generators/',
- '/usr/local/lib/systemd/user-generators/',
- '/usr/lib/systemd/user-generators/'
- )
- ORDER BY mtime DESC;
复制代码
3 下一步在下一篇文章中,将用其他的权限维持技术进行整体总结。
|