NFS no_root_squash/no_all_squash misconfiguration PE
_ /etc/exports _ ファイルを読み取り、no_root_squash として構成されたディレクトリがある場合、それをクライアントとしてアクセスし、そのディレクトリ内にローカルのrootであるかのように書き込むことができます。
no_root_squash: このオプションは、クライアントのrootユーザーにNFSサーバー上のファイルにアクセスする権限を与えます。これには深刻なセキュリティ上の問題が発生する可能性があります。
no_all_squash: これはno_root_squash オプションに類似していますが、非rootユーザーに適用されます。例えば、nobodyユーザーとしてシェルを持っているとします。/etc/exportsファイルを確認し、no_all_squashオプションが存在することを確認し、/etc/passwdファイルを確認し、非rootユーザーをエミュレートし、そのユーザーとしてsuidファイルを作成します(nfsを使用してマウント)。 nobodyユーザーとしてsuidを実行し、異なるユーザーになります。
特権昇格
リモートエクスプロイト
この脆弱性を見つけた場合、次のように悪用できます:
クライアントマシンでそのディレクトリをマウントし、マウントされたフォルダ内に /bin/bash バイナリをrootとしてコピーし、それに SUID権限を与え、被害者のマシンからそのbashバイナリを実行します。
クライアントマシンでそのディレクトリをマウントし、ルートとしてマウントされたフォルダーに、SUID権限を悪用するコンパイル済みのペイロードをコピーし、それにSUID権限を与え、被害者のマシンからそのバイナリを実行します(ここにいくつかのC SUID payloadsがあります)。
ローカルエクスプロイト
自分のマシンから被害者のマシンへのトンネルを作成できる場合、引き続き必要なポートをトンネリングすることで、この特権昇格を悪用するリモートバージョンを使用できます。
次のトリックは、/etc/exports
ファイルがIPを示している場合です。この場合、リモートエクスプロイトを使用することはできず、このトリックを悪用する必要があります。
エクスプロイトが機能するための別の必須要件は、/etc/export
内のエクスポートが insecure
フラグを使用している必要があることです。
--もし /etc/export
がIPアドレスを示している場合、このトリックが機能するかどうかはわかりません--
基本情報
シナリオでは、ローカルマシン上のマウントされたNFS共有を悪用し、NFSv3仕様の欠陥を利用してクライアントがuid/gidを指定できるようにし、不正アクセスを可能にします。エクスプロイトには、NFS RPC呼び出しの偽造を可能にするライブラリであるlibnfsを使用します。
ライブラリのコンパイル
ライブラリのコンパイル手順は、カーネルバージョンに基づいて調整が必要な場合があります。この特定のケースでは、fallocateシステムコールがコメントアウトされていました。コンパイルプロセスには、次のコマンドが含まれます:
攻撃の実行
攻撃には、特権をrootに昇格させ、シェルを実行する単純なCプログラム(pwn.c
)を作成することが含まれます。プログラムをコンパイルし、生成されたバイナリ(a.out
)を、RPC呼び出しでuidを偽装するためにsuid rootで共有に配置します。
攻撃コードをコンパイルする:
攻撃を共有に配置し、uidを偽装してアクセス権を変更する:
root権限を取得するために攻撃を実行する:
ボーナス: ステルスファイルアクセスのためのNFShell
rootアクセスを取得した後、所有権を変更せずにNFS共有とやり取りするために(痕跡を残さないように)、Pythonスクリプト(nfsh.py)が使用されます。このスクリプトは、アクセスされるファイルのuidを調整し、許可の問題なく共有内のファイルとやり取りできるようにします。
実行方法:
参考文献
Last updated