Bypass FS protections: read-only / no-exec / Distroless
Last updated
Last updated
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する: HackTricks Training GCP Red Team Expert (GRTE)
ハッキングキャリアに興味があり、ハッキング不可能なものをハッキングしたい方 - 私たちは採用しています! (流暢なポーランド語の読み書きが必要です)。
以下の動画では、このページで言及された技術がより深く説明されています:
Linuxマシンが読み取り専用(ro)ファイルシステム保護でマウントされていることがますます一般的になっています。特にコンテナでは、**readOnlyRootFilesystem: true
**をsecuritycontext
に設定するだけで、roファイルシステムでコンテナを実行することができます:
しかし、ファイルシステムがroとしてマウントされていても、/dev/shm
は書き込み可能であるため、ディスクに何も書き込めないというのは偽りです。ただし、このフォルダはno-exec保護でマウントされるため、ここにバイナリをダウンロードしても実行することはできません。
レッドチームの観点から見ると、これはシステムに既に存在しないバイナリをダウンロードして実行することを複雑にします(バックドアやkubectl
のような列挙ツールなど)。
バイナリについて言及したことに注意してください。インタープリタがマシン内にある限り、任意のスクリプトを実行できます。例えば、sh
が存在する場合はシェルスクリプト、python
がインストールされている場合はPythonスクリプトです。
しかし、これはあなたのバイナリバックドアや他のバイナリツールを実行するには十分ではありません。
バイナリを実行したいがファイルシステムがそれを許可していない場合、最良の方法はメモリから実行することです。なぜなら、保護はそこには適用されないからです。
マシン内にPython、Perl、またはRubyのような強力なスクリプトエンジンがある場合、メモリから実行するためにバイナリをダウンロードし、メモリファイルディスクリプタ(create_memfd
システムコール)に保存できます。これはこれらの保護によって保護されないため、exec
システムコールを呼び出して実行するファイルとしてfdを指定できます。
これには、プロジェクトfileless-elf-execを簡単に使用できます。バイナリを渡すと、バイナリが圧縮され、b64エンコードされ、create_memfd
システムコールを呼び出して作成されたfdでデコードおよび解凍するための指示を含むスクリプトが指定された言語で生成されます。
これは、PHPやNodeのような他のスクリプト言語では機能しません。なぜなら、スクリプトから生のシステムコールを呼び出すデフォルトの方法がないため、バイナリを保存するためのメモリfdを作成するためにcreate_memfd
を呼び出すことができないからです。
さらに、/dev/shm
にファイルを持つ通常のfdを作成しても機能しません。なぜなら、no-exec保護が適用されるため、実行することが許可されないからです。
DDexec / EverythingExecは、プロセスの**/proc/self/mem
を上書きすることによって自分のプロセスのメモリを変更する**技術です。
したがって、プロセスによって実行されているアセンブリコードを制御することができ、シェルコードを書き込み、プロセスを「変異」させて任意のコードを実行することができます。
DDexec / EverythingExecを使用すると、メモリから自分のシェルコードや任意のバイナリをロードして実行できます。
For more information about this technique check the Github or:
DDexec / EverythingExecMemexec は DDexec の自然な次のステップです。これは DDexec シェルコードのデーモン化 であり、異なるバイナリを 実行したいとき に DDexec を再起動する必要はなく、DDexec テクニックを介して memexec シェルコードを実行し、このデーモンと通信して新しいバイナリを読み込んで実行する ことができます。
memexec を使用して PHP リバースシェルからバイナリを実行する方法の例 は https://github.com/arget13/memexec/blob/main/a.php で見つけることができます。
DDexec と同様の目的を持つ memdlopen テクニックは、メモリにバイナリを読み込む より簡単な方法を提供します。依存関係を持つバイナリを読み込むことも可能です。
Distroless コンテナは、特定のアプリケーションやサービスを実行するために必要な 最小限のコンポーネント のみを含み、ライブラリやランタイム依存関係を含みますが、パッケージマネージャー、シェル、システムユーティリティなどの大きなコンポーネントは除外されます。
Distroless コンテナの目的は、不要なコンポーネントを排除することによってコンテナの攻撃面を減少させ、悪用可能な脆弱性の数を最小限に抑えることです。
Distroless コンテナでは、通常のシェルを取得するための sh
や bash
が見つからないかもしれません。また、ls
、whoami
、id
などのバイナリも見つかりません... システムで通常実行するすべてのものです。
したがって、リバースシェルを取得したり、通常のようにシステムを列挙したりすることはできません。
しかし、もし侵害されたコンテナが例えばフラスクウェブを実行している場合、Python がインストールされているため、Python リバースシェルを取得できます。ノードを実行している場合は、Node リバースシェルを取得でき、ほとんどの スクリプト言語でも同様です。
スクリプト言語を使用することで、言語の機能を利用してシステムを列挙することができます。
もし read-only/no-exec
保護がなければ、リバースシェルを悪用して ファイルシステムにバイナリを書き込み、実行することができます。
ただし、この種のコンテナでは通常これらの保護が存在しますが、以前のメモリ実行テクニックを使用してそれらを回避することができます。
RCE 脆弱性を悪用してスクリプト言語のリバースシェルを取得し、メモリからバイナリを実行する方法の例 は https://github.com/carlospolop/DistrolessRCE で見つけることができます。
ハッキングキャリアに興味があり、ハッキング不可能なものをハッキングしたい方 - 私たちは採用中です! (流暢なポーランド語の読み書きが必要です)。
AWS ハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCP ハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)