mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
181 lines
14 KiB
Markdown
181 lines
14 KiB
Markdown
# 2049 - NFSサービスのペンテスト
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|
||
|
||
## **基本情報**
|
||
|
||
**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サーバーの可能性があります。
|
||
```bash
|
||
showmount -e <IP>
|
||
```
|
||
### 有用なnmapスクリプト
|
||
```bash
|
||
nfs-ls #List NFS exports and check permissions
|
||
nfs-showmount #Like showmount -e
|
||
nfs-statfs #Disk statistics and info from NFS share
|
||
```
|
||
### 有用なMetasploitモジュール
|
||
```bash
|
||
scanner/nfs/nfsmount #Scan NFS mounts and list permissions
|
||
```
|
||
### nfs_analyze
|
||
|
||
このツールは [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) から取得でき、NFSサーバーから**マウント**、サポートされているNFSバージョン、接続されたIP、さらには**エクスポートから他のフォルダーにエスケープできるか**や**`no_root_squash`が有効か**を確認するための多くのデータを取得するために使用できます。
|
||
|
||
## Mounting
|
||
|
||
サーバーが**マウント**するために**どのフォルダー**が**利用可能**かを知るには、次のように尋ねることができます:
|
||
```bash
|
||
showmount -e <IP>
|
||
```
|
||
次に、次のようにマウントします:
|
||
```bash
|
||
mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -o nolock
|
||
```
|
||
**バージョン2を使用する**ことを指定する必要があります。なぜなら、それには**認証**や**承認**が**ない**からです。
|
||
|
||
**例:**
|
||
```bash
|
||
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](https://github.com/hvs-consulting/nfs-security-tooling)のツール**`fuse_nfs`**は、ファイルにアクセスするために必要なUIDとGIDを常に送信します。
|
||
|
||
### SUID特権昇格
|
||
|
||
ページを確認してください:
|
||
|
||
{{#ref}}
|
||
../linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md
|
||
{{#endref}}
|
||
|
||
### エクスポートからの脱出
|
||
|
||
この[素晴らしい記事](https://www.hvs-consulting.de/en/nfs-security-identifying-and-exploiting-misconfigurations/)では、**エクスポートから脱出してファイルシステム内の他のフォルダーにアクセスする**ことが可能であることが示されています。
|
||
|
||
したがって、エクスポートが**全体のファイルシステム**の**サブフォルダー**をエクスポートしている場合、**`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](https://github.com/hvs-consulting/nfs-security-tooling)のツール**`nfs_analyze`**は、ファイルシステムext4、xfs、btrfsに対するこの攻撃をサポートするために構築されています(v4でも可能であるべきです)。
|
||
|
||
### NSFShell
|
||
|
||
ファイルにアクセスするためにUIDとGIDを簡単にリスト、マウント、変更するには、[nfsshell](https://github.com/NetDirect/nfsshell)を使用できます。
|
||
|
||
[Nice NFSShell tutorial.](https://www.pentestpartners.com/security-blog/using-nfsshell-to-compromise-older-environments/)
|
||
|
||
## 設定ファイル
|
||
```
|
||
/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 の特権昇格](../linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md)
|
||
|
||
## 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}
|
||
```
|
||
{{#include ../banners/hacktricks-training.md}}
|