Bypass FS protections: read-only / no-exec / Distroless
ハッキングキャリアに興味がある方や 解読不能なものをハックしたい方 - 採用中です!(流暢なポーランド語の読み書きが必要です)。
動画
以下の動画では、このページで言及されているテクニックについてより詳しく説明されています:
読み取り専用 / 実行不可シナリオ
読み取り専用(ro)ファイルシステム保護が Linuxマシンで より一般的になってきており、特にコンテナ内では 設定が簡単であるためです。これは、securitycontext
で readOnlyRootFilesystem: true
を設定するだけでコンテナを roファイルシステムで実行できるためです:
しかし、ファイルシステムが ro でマウントされていても、/dev/shm
は書き込み可能のままなので、ディスクに書き込むことができないというのは偽物です。ただし、このフォルダは 実行不可保護 でマウントされるため、ここにバイナリをダウンロードしても 実行できません。
レッドチームの観点からすると、これは既存のシステムにないバイナリ(バックドアや kubectl
のような列挙ツール)を ダウンロードして実行するのが複雑になります。
最も簡単なバイパス: スクリプト
バイナリを言及しましたが、インタプリタがマシン内にある限り、シェルスクリプト(sh
があれば)や Pythonスクリプト(python
がインストールされていれば)など、任意のスクリプトを実行できます。
ただし、これだけではバイナリバックドアや実行する必要がある他のバイナリツールを実行するのには十分ではありません。
メモリバイパス
ファイルシステムがそれを許可していない場合にバイナリを実行したい場合、メモリから実行するのが最善です。なぜなら、保護がそこには適用されないからです。
FD + exec シスコールバイパス
Python、Perl、Ruby などの強力なスクリプトエンジンがマシン内にある場合、メモリにバイナリをダウンロードして実行し、これらの保護によって保護されないメモリファイルディスクリプタ(create_memfd
シスコール)に保存し、その後 exec
シスコール を呼び出して fd を実行するファイル として指定します。
これには、プロジェクト fileless-elf-exec を簡単に使用できます。バイナリを渡すと、バイナリが b64エンコード された スクリプト が生成され、create_memfd
シスコールを呼び出して fd に保存されたバイナリを デコードおよび解凍 する手順が記述され、それを実行する exec シスコールが呼び出されます。
これは、PHPやNodeなどの他のスクリプト言語では、スクリプトから 生のシスコールを呼び出すデフォルトの方法 がないため、create_memfd
を呼び出して バイナリを保存するメモリfd を作成することができません。
また、/dev/shm
内のファイルで 通常のfd を作成しても、実行不可保護 が適用されるため、実行できません。
DDexec / EverythingExec
DDexec / EverythingExec は、自分自身のプロセスの /proc/self/mem
を上書きすることで、プロセスが実行しているアセンブリコードを制御し、 シェルコード を書き込んでプロセスを 任意のコードを実行 するように "変異" させる技術です。
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
Distrolessとは
Distrolessコンテナには、特定のアプリケーションやサービスを実行するために必要な最小限のコンポーネントだけが含まれており、パッケージマネージャーやシェル、システムユーティリティなどのより大きなコンポーネントは除外されています。
Distrolessコンテナの目標は、不要なコンポーネントを排除し、悪用される可能性のある脆弱性の数を最小限に抑えることによって、コンテナの攻撃面を縮小することです。
リバースシェル
Distrolessコンテナでは、通常のシェルを取得するためのsh
やbash
などが見つからないかもしれません。ls
、whoami
、id
などのバイナリも見つかりません...通常システムで実行するすべてのものが含まれていません。
したがって、通常どおりにリバースシェルを取得したり、システムを列挙することはできません。
ただし、侵害されたコンテナが例えばflask webを実行している場合、Pythonがインストールされているため、Pythonリバースシェルを取得できます。Nodeを実行している場合はNodeリバースシェルを取得でき、ほとんどのスクリプト言語でも同様です。
スクリプト言語を使用すると、言語の機能を使用してシステムを列挙することができます。
read-only/no-exec
の保護がない場合、リバースシェルを悪用してファイルシステムにバイナリを書き込み、それらを実行することができます。
ただし、この種のコンテナでは通常これらの保護が存在しますが、以前のメモリ実行技術を使用してそれらをバイパスすることができます。
いくつかのRCE脆弱性を悪用して、スクリプト言語のリバースシェルを取得し、メモリからバイナリを実行する方法の例は、https://github.com/carlospolop/DistrolessRCEにあります。
ハッキングキャリアに興味がある方や、解読不能なものをハックしたい方 - 採用中です!(流暢なポーランド語の読み書きが必要です)。
Last updated