Pyramid 由以下几部分组成:
Pyramid 可用于以规避检测的方式执行后渗透任务,通过从签名的二进制文件(如 python.exe)中导入依赖,在内存中运行进攻性工具。 这之所以可行,是因为:
更多信息请查看 DEFCON30 - Adversary village 演讲 "Python vs Modern Defenses" 幻灯片 以及我博客上的这篇文章。
此工具旨在演示一种基于某些盲点假设的 EDR 绕过策略。它是对已有技术和工具的一种(据我所知)新颖组合,可以帮助逃避防御。该工具的唯一目的是帮助社区提高对此类用法的认识,并加速问题的解决。这不是零日漏洞,也不是功能齐全的炫酷 C2,Pyramid 利用了可能是 EDR 盲点的领域,该工具公开是为了揭示这些问题。 文中包含了一个防御段落,希望经验丰富的蓝队成员能够帮助贡献,并为 Pyramid 旨在强调的问题提供更好的解决方案。所有信息仅供教育目的。请自行承担使用风险。作者及其雇主不对任何直接或间接的损害或损失负责,无论是由个人还是组织造成的。
Pyramid 的内存加载功能最初受 xorrior 的 Empyre - Finder Class 启发并在此基础上扩展。
snovvcrash 构建了以下模块:mod-DonPAPI.py、mod-LaZagne.py、mod-clr.py
Pyramid 模块的能力可以直接从 Python 解释器中执行,目前包括:
Pyramid HTTP 服务器的主要功能:
下载器的主要功能:
Pyramid 可以与目标机器上已有的 Python 解释器一起使用,或者解压官方的可嵌入 Python 包,然后运行 python.exe 执行 Python 下载器。这是一种避免创建不常见进程树模式并看起来像正常 Python 应用程序用法的简单方法。
在 Pyramid 中,下载器用于通过 HTTP/S 连接 Pyramid 服务器以获取模块和依赖。
模块针对你想要使用的功能而特定,包含:
Python 依赖已经过固定和修改,以便在内存中导入而不冲突。
目前有 8 个 Pyramid 模块可用:
git clone https://github.com/naksyn/Pyramid
为 HTTP 服务器生成 SSL 证书:
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
如果你希望使用自己的签名 SSL 证书,请确保:
例如,如果你想将 pythonmemorymodule 与 Pyramid 一起使用,将你的载荷放入 Delivery_files 文件夹,然后打开 pythonmemorymodule.py 并在脚本顶部配置所需参数,比如载荷文件的名称以及加载 PE 后要调用的过程。
一旦 Pyramid 服务器运行并且基础脚本准备就绪,你可以在 Agent/cradle.py 文件中设置变量 pyramid_module,然后在目标上执行它。
下载器设计为使用 Python 标准库运行。
使用 SSL 证书运行 Pyramid HTTP 服务器的示例,提供基本身份验证、使用 ChaCha 加密传递文件、自动生成服务器配置到模块并打印出可粘贴的 pythonmemorymodule 下载器:
python3 pyramid.py -p 443 -ssl -u testuser -pass Sup3rP4ss! -enc "chacha20" -passenc "TestPass1" -server "192.168.1.2" -generate -setcradle pythonmemorymodule.py
启动时,pyramid.py 会解析自己的文件夹结构以查找 key.pem、cert.pem,并从 Server 文件夹传递文件。
https://github.com/naksyn/Pyramid/assets/59816245/4fbc997e-af2d-4ead-881b-ee108c91d195
要执行 Pyramid 而不显示可见的 python.exe 提示符,你可以利用 pythonw.exe,它不会在运行时打开控制台窗口,并且包含在相同的 Windows 可嵌入包中。 下图展示了使用 pythonw.exe 在远程机器上执行 base-tunnel-socks5.py 而不打开 python.exe 控制台窗口的示例用法。

动态加载 Python 模块本身不支持导入 *.pyd 文件,这些文件本质上是 dll。据我所知,唯一公开解决此问题的方案是 Scythe 的(内存执行),通过重新设计 CPython 解释器。为了不丢失数字签名,一种允许使用原生 Python 可嵌入包的解决方案是将所需的 pyd 文件或 wheel 文件释放到磁盘上。这在大多数情况下不应有重大的 OPSEC 影响,但请注意,以下包含 pyd 文件的 wheel 会被释放到磁盘上以完成动态加载: *. Cryptodome - 由 Bloodhound-Python、Impacket、DonPAPI 和 LaZagne 所需 *. bcrypt、cryptography、nacl、cffi - 由 paramiko 所需
Python.exe 是一个具有良好声誉的签名二进制文件,并且不提供对 Python 动态代码的可视性。Pyramid 利用这些规避特性,在同一个 python.exe 进程内执行进攻性任务。
因此,最有效的解决方案之一是从默认情况下阻止由 Python 基金会签名的二进制文件和 dll,仅为实际需要使用 python 二进制文件的用户创建例外。
也可以对可嵌入包的下载发出警报。
部署 PEP-578 也是可行的,尽管复杂,这是一个示例实现。然而,如果不阻止使用 stock python 二进制文件,部署 PEP-578 可能会使这种对策失效。