2049 - NFSサービスのペンテスト
Reading time: 16 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を提出してハッキングトリックを共有してください。
基本情報
NFSは、ユーザーがネットワーク上のファイルにローカルディレクトリ内にあるかのようにシームレスにアクセスできるように設計されたクライアント/サーバシステムです。
デフォルトポート: 2049/TCP/UDP(バージョン4を除く、TCPまたはUDPのみが必要です)。
2049/tcp open nfs 2-3 (RPC #100003
認証
このプロトコルの注目すべき点は、通常、組み込みの認証や認可メカニズムが欠如していることです。代わりに、認可はファイルシステム情報に依存し、サーバーはクライアント提供のユーザー情報をファイルシステムが要求する認可形式に正確に変換する役割を担っています。主にUNIX構文に従います。
認証は一般的にUNIX UID
/GID
識別子とグループメンバーシップに依存しています。しかし、クライアントとサーバー間の**UID
/GID
マッピングの不一致が生じるため、サーバーによる追加の検証の余地がありません。さらに、これらの詳細はクライアントによって送信され、サーバーによって信頼されるため、悪意のあるクライアントがより特権のあるuid
やgid
を送信して他のユーザーをなりすます**可能性があります。
ただし、デフォルトではNFSを使用してUID
0(root)をなりすますことはできません。これについてはスカッシングセクションで詳しく説明します。
ホスト
より良い(または一部の)認可のために、NFS共有にアクセスできるホストを指定できます。これはLinuxの/etc/exports
ファイルで行うことができます。例えば:
/PATH/TO/EXPORT CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ...
/media/disk/share 192.168.2.123(rw,sec=krb5p:krb5i)
As you can see, it allows to configure a specific IP or hostname to access the share. Only that address will be able to access the share.
Versions
-
NFSv2: このバージョンは、さまざまなシステムとの広範な互換性で認識されており、主にUDP上での初期操作によってその重要性を示しています。このシリーズで最も古いものであり、将来の開発の基礎を築きました。
-
NFSv3: 一連の改善と共に導入され、NFSv3は前のバージョンを拡張し、可変ファイルサイズをサポートし、エラーレポート機能を改善しました。進歩にもかかわらず、NFSv2クライアントとの完全な後方互換性には制限がありました。
-
NFSv4: NFSシリーズの画期的なバージョンであるNFSv4は、ネットワーク全体でのファイル共有を現代化するために設計された機能のスイートをもたらしました。注目すべき改善点には、高セキュリティのためのKerberosの統合、ファイアウォールを越えて動作し、ポートマッパーなしでインターネット上で動作する能力、アクセス制御リスト(ACL)のサポート、状態ベースの操作の導入が含まれます。そのパフォーマンスの向上と状態を持つプロトコルの採用により、NFSv4はネットワークファイル共有技術における重要な進展として際立っています。
-
LinuxホストでNFSがkerberos認証をサポートしているのを見つけるのは非常に奇妙です。
各NFSバージョンは、ネットワーク環境の進化するニーズに対応することを目的として開発されており、セキュリティ、互換性、パフォーマンスを徐々に向上させています。
Squashing
前述のように、NFSは通常、クライアントのuid
とgid
を信頼してファイルにアクセスします(kerberosが使用されていない場合)。ただし、サーバーでこの動作を変更するために設定できるいくつかの構成があります:
- all_squash: すべてのアクセスを圧縮し、すべてのユーザーとグループを**
nobody
**(65534 unsigned / -2 signed)にマッピングします。したがって、すべての人がnobody
であり、ユーザーは使用されません。 - root_squash/no_all_squash: これはLinuxのデフォルトであり、uid 0(root)でのアクセスのみを圧縮します。したがって、任意の
UID
とGID
は信頼されますが、0
はnobody
に圧縮されるため、rootの偽装は不可能です。 - no_root_squash: この構成が有効になっている場合、rootユーザーさえも圧縮されません。これは、この構成でディレクトリをマウントすると、rootとしてアクセスできることを意味します。
Subtree check
Linuxでのみ利用可能です。man(5) exportsは次のように述べています:「ファイルシステムのサブディレクトリがエクスポートされているが、全体のファイルシステムがエクスポートされていない場合、NFSリクエストが到着するたびに、サーバーはアクセスされたファイルが適切なファイルシステムにあること(これは簡単です)だけでなく、エクスポートされたツリーにあることも確認する必要があります(これは難しいです)。このチェックはサブツリーのチェックと呼ばれます。」
Linuxでは、subtree_check
機能はデフォルトで無効になっています。
Enumeration
Showmount
これは、NFSv3サーバーから情報を取得するために使用できます。たとえば、エクスポートのリスト、これらのエクスポートにアクセスを許可されているユーザー、接続されているクライアント(クライアントがサーバーに通知せずに切断した場合、正確でない可能性があります)などです。 NFSv4クライアントは直接/ exportにアクセスし、そこからエクスポートにアクセスしようとします。無効または認可されていない理由で失敗します。
showmount
やMetasploitモジュールのようなツールがNFSポートから情報を表示しない場合、それはバージョン3をサポートしていないNFSv4サーバーの可能性があります。
showmount -e <IP>
有用なnmapスクリプト
nfs-ls #List NFS exports and check permissions
nfs-showmount #Like showmount -e
nfs-statfs #Disk statistics and info from NFS share
有用なMetasploitモジュール
scanner/nfs/nfsmount #Scan NFS mounts and list permissions
nfs_analyze
このツールは https://github.com/hvs-consulting/nfs-security-tooling から取得でき、NFSサーバーからマウント、サポートされているNFSバージョン、接続されたIP、さらにはエクスポートから他のフォルダーにエスケープできるかや**no_root_squash
が有効か**を確認するための多くのデータを取得するために使用できます。
Mounting
サーバーがマウントするためにどのフォルダーが利用可能かを知るには、次のように尋ねることができます:
showmount -e <IP>
次に、次のようにマウントします:
mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -o nolock
バージョン2を使用することを指定する必要があります。なぜなら、それには認証や承認がないからです。
例:
mkdir /mnt/new_back
mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock
攻撃
UIDとGIDの信頼
もちろん、ここでの唯一の問題は、デフォルトではroot(UID
0)を偽装することができないことです。しかし、他のユーザーを偽装することは可能であり、no_root_squash
が有効になっている場合はrootを偽装することもできます。
- 特定のユーザー(UIDによって)にのみアクセス可能なファイルやフォルダーを含むフォルダーをマウントした場合、そのUIDを持つユーザーをローカルに作成し、そのユーザーを使用することでファイル/フォルダーにアクセスできるようになります。
- https://github.com/hvs-consulting/nfs-security-toolingのツール**
fuse_nfs
**は、ファイルにアクセスするために必要なUIDとGIDを常に送信します。
SUID特権昇格
ページを確認してください:
NFS no_root_squash/no_all_squash misconfiguration PE
エクスポートからの脱出
この素晴らしい記事では、エクスポートから脱出してファイルシステム内の他のフォルダーにアクセスすることが可能であることが示されています。
したがって、エクスポートが全体のファイルシステムのサブフォルダーをエクスポートしている場合、subtree_check
が無効になっていると、エクスポートの外部にあるファイルにアクセスすることが可能です。そして、これはLinuxではデフォルトで無効になっています。
例えば、NFSサーバーが/srv/
をエクスポートしていて、/var/
が同じファイルシステムにある場合、/var/log/
からログを読み取ったり、/var/www/
にウェブシェルを保存したりすることが可能です。
さらに、デフォルトではroot(0)ユーザーのみが偽装から保護されていることに注意してください(Squashセクションを確認)。ただし、ファイルがrootによって所有されているがグループが0でない場合、アクセスすることが可能です。例えば、ファイル/etc/shadow
はrootによって所有されていますが、グループはshadow
(Debianではgid 42)です。したがって、デフォルトで読み取ることが可能です!
https://github.com/hvs-consulting/nfs-security-toolingのツール**nfs_analyze
**は、ファイルシステムext4、xfs、btrfsに対するこの攻撃をサポートするために構築されています(v4でも可能であるべきです)。
NSFShell
ファイルにアクセスするためにUIDとGIDを簡単にリスト、マウント、変更するには、nfsshellを使用できます。
設定ファイル
/etc/exports
/etc/lib/nfs/etab
危険な設定
-
読み書き権限 (
rw
): この設定は、ファイルシステムからの読み取りと書き込みの両方を許可します。このような広範なアクセスを付与することの影響を考慮することが重要です。 -
安全でないポートの使用 (
insecure
): 有効にすると、システムは1024以上のポートを利用できるようになります。この範囲のポートのセキュリティは厳格でない場合があり、リスクが増加します。 -
ネストされたファイルシステムの可視性 (
nohide
): この設定により、別のファイルシステムがエクスポートされたディレクトリの下にマウントされていても、ディレクトリが可視化されます。各ディレクトリは適切な管理のために独自のエクスポートエントリを必要とします。 -
ルートファイルの所有権 (
no_root_squash
): この設定では、ルートユーザーによって作成されたファイルは元のUID/GID 0を維持し、最小権限の原則を無視し、過剰な権限を付与する可能性があります。 -
すべてのユーザーの非スクワッシュ (
no_all_squash
): このオプションは、ユーザーのアイデンティティがシステム全体で保持されることを保証しますが、正しく処理されない場合、権限やアクセス制御の問題を引き起こす可能性があります。
NFSの誤設定を利用した特権昇格
NFS no_root_squash と no_all_squash の特権昇格
HackTricks 自動コマンド
Protocol_Name: NFS #Protocol Abbreviation if there is one.
Port_Number: 2049 #Comma separated if there is more than one.
Protocol_Description: Network File System #Protocol Abbreviation Spelled out
Entry_1:
Name: Notes
Description: Notes for NFS
Note: |
NFS is a system designed for client/server that enables users to seamlessly access files over a network as though these files were located within a local directory.
#apt install nfs-common
showmount 10.10.10.180 ~or~showmount -e 10.10.10.180
should show you available shares (example /home)
mount -t nfs -o ver=2 10.10.10.180:/home /mnt/
cd /mnt
nano into /etc/passwd and change the uid (probably 1000 or 1001) to match the owner of the files if you are not able to get in
https://book.hacktricks.wiki/en/network-services-pentesting/nfs-service-pentesting.html
Entry_2:
Name: Nmap
Description: Nmap with NFS Scripts
Command: nmap --script=nfs-ls.nse,nfs-showmount.nse,nfs-statfs.nse -p 2049 {IP}
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を提出してハッキングトリックを共有してください。