
Pyramidは以下で構成されています:
Pyramidは、署名済みバイナリ(例:python.exe)から攻撃ツールを実行し、その依存関係をメモリ内にインポートすることで、回避的にポストエクスプロイトタスクを実行するのに役立ちます。これは以下の理由で実現できます:
詳細については、DEFCON30 - Adversary village talk "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インタプリタを使用するか、公式のEmbeddable 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証明書を使用する場合は、以下の点に注意してください:
例として、Pyramidでpythonmemorymoduleを使用する場合、ペイロードを Delivery_files フォルダに配置し、pythonmemorymodule.pyを開いてスクリプト上部の必要なパラメータ(ペイロードファイル名やPEロード後に呼び出すプロシージャなど)を設定します。
Pyramidサーバーが起動し、ベーススクリプトの準備ができたら、Agent/cradle.py ファイル内の変数 pyramid_module を設定し、ターゲット上で実行します。
クラッドルはPython標準ライブラリで動作するように設計されています。
SSL証明書を使用し、基本認証を提供し、配信ファイルをChaChaで暗号化し、サーバー設定を自動生成し、pythonmemorymodule用の貼り付け可能なクラッドルを出力するPyramid HTTPサーバーの実行例:
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
可視のpython.exeプロンプトを表示せずにPyramidを実行するには、同じWindows Embeddable Packageに含まれているpythonw.exeを利用できます。pythonw.exeは実行時にコンソールウィンドウを開きません。以下の画像は、リモートマシン上でpythonw.exeを使用してbase-tunnel-socks5.pyを実行し、python.exeのコンソールウィンドウを開かない例を示しています。

Pythonモジュールの動的ロードは、本質的にはdllである*.pydファイルのインポートをネイティブにサポートしていません。私の知る限り、この問題を解決する唯一の公開ソリューションは、CPythonインタプリタを再設計したScythe(in-memory-execution)によって提供されています。デジタル署名を失わないためには、ネイティブのPython Embeddableパッケージを使用可能にするために、必要なpydファイルやホイールをディスクにドロップする方法が解決策の一つです。これはほとんどの場合、重大なOPSEC上の影響を与えるべきではありませんが、以下のpydファイルを含むホイールは動的ロードを完了するためにディスクにドロップされることに注意してください:
Python.exeは評判の良い署名済みバイナリであり、Pythonの動的コードに関する可視性を提供しません。Pyramidはこれらの回避特性を利用して、同じpython.exeプロセス内から攻撃タスクを実行します。
そのため、最も効果的な解決策の一つは、Python Foundationによって署名されたバイナリとdllをデフォルトでブロックし、実際にPythonバイナリを使用する必要があるユーザーのみに例外を作成することです。
Embeddableパッケージのダウンロードに関するアラートも発報可能です。
PEP-578の導入も可能ですが複雑です。こちらは実装例です。ただし、stockのpythonバイナリの使用をブロックせずにPEP-578を導入すると、この対策が無効になる可能性があります。