> For the complete documentation index, see [llms.txt](https://redryan.gitbook.io/studyjoon/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://redryan.gitbook.io/studyjoon/hacking/bhpt/undefined-4/http/nfs.md).

# NFS 취약점 진단

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FC9QdHgh7dkMwYTOkN46T%2Fimage.png?alt=media&amp;token=2860381f-db41-4583-b7df-ba147a084dba" alt=""><figcaption></figcaption></figure>

### 취약점 진단 <a href="#bkmrk-ec-b7-a8-ec-95-bd-ec-a0-90-ec-a7-84-eb-8b-a8" id="bkmrk-ec-b7-a8-ec-95-bd-ec-a0-90-ec-a7-84-eb-8b-a8"></a>

NFS는 기본적으로 파일과 디렉토리를 공유하는 프로토콜이기 때문에 권한 설정과 관련된 취약점 진단을 많이 하는 편입니다. 이외에도 NFS를 통해 공격자가 SUID 비트가 설정된 악성코드를 업로드해 사용하는 것처럼 권한 상승에 사용되는 경우도 있습니다. NFS 취약점 진단을 진행할 경우 다음과 같은 부분들을 살펴봅니다.

* NFS 접근 제어: 해당 호스트가 어떤 NFS 디렉토리를 노출하고 있는지, 그리고 해당 디렉토리에 접근 가능한 IP주소들은 무엇인지 진단합니다. 잘못 설정된 NFS 서버의 경우 특정 네트워크 전체에서 접근을 허락하거나 (`allow: 10.10.0.0/16`), 아예 모든 IP주소들의 접근을 허락하는 경우가 있습니다.
* 파일 권한: 특정 NFS 디렉토리에 접근 가능한 경우, 파일 및 디렉토리의 권한을 살펴봐야합니다.
* `no_root_squash` 설정 확인: NFS는 기본적으로 `no_root_squash` 비활성화 되어있습니다. 이 설정이 비활성화 되어 있는 경우, NFS 클라이언트가 서버에 접근해 특정 디렉토리를 사용할 때 root 권한이 아닌 낮은 권한의 `nfsnobody` 유저를 사용하게 됩니다. 낮은 권한의 유저이기 때문에 대부분 쓰기 권한이 금지되어 있고, 특정 파일을 덮어씌우거나 하는 등의 파괴적인 행동을 할 수 없습니다. 하지만 `no_root_squash` 설정이 활성화 되어있는 경우, NFS 클라이언트는 클라이언트 내의 유저 권한을 유지한 채 NFS 서버의 디렉토리 및 파일들을 사용할 수 있게 됩니다. 만약 클라이언트가 평상시 `root` 유저를 사용했다면, NFS 서버의 디렉토리내에서 `root` 권한을 가지게 됩니다.

## 실습 <a href="#bkmrk-ec-8b-a4-ec-8a-b5" id="bkmrk-ec-8b-a4-ec-8a-b5"></a>

### 1. 기본 Nmap 정보 수집 및 취약점 진단 <a href="#bkmrk-ea-b8-b0-eb-b3-b8-nmap-ec-a0-95-eb-b3-b4-ec-88-98-ec-a7-91-eb-b0-8f-ec-b7-a8-ec-95-bd-ec-a0-90" id="bkmrk-ea-b8-b0-eb-b3-b8-nmap-ec-a0-95-eb-b3-b4-ec-88-98-ec-a7-91-eb-b0-8f-ec-b7-a8-ec-95-bd-ec-a0-90"></a>

```sql
└─# nmap -p 111,2049 -Pn -n --open 172.31.245.200 --script="nfs-*" -sV

PORT     STATE SERVICE VERSION                                                 
111/tcp  open  rpcbind 2-4 (RPC #100000)                                                                                                                       
| rpcinfo:                             
|   program version    port/proto  service                                     
|   100000  2,3,4        111/tcp   rpcbind                                                                      
|   100003  3,4         2049/tcp   nfs          

| nfs-showmount:                       
|_  /public-nfs 172.31.0.0/16 10.0.0.0/8    

| nfs-statfs:                          
|   Filesystem   1K-blocks  Used       Available  Use%  Maxfilesize  Maxlink                                                                                   
|_  /public-nfs  7941576.0  7415960.0  509232.0   94%   16.0T   32000

| nfs-ls: Volume /public-nfs           
|   access: Read Lookup NoModify NoExtend NoDelete NoExecute                   
| PERMISSION  UID  GID  SIZE  TIME                 FILENAME                    
| rwxr-xr-x   0    0    4096  2023-10-12T04:08:44  .                           
| ??????????  ?    ?    ?     ?                    ..                          
| rwxr-xr-x   0    0    4096  2023-10-12T04:08:44  backup

2049/tcp open  nfs_acl 3 (RPC #100227)
```

앞서 서술한대로 NFS 클라이언트들은 NFS와 관련된 정보(엔드포인트, 포트 번호, 프로세스, 등)를 얻기 위해 포트 111의 RPCBind/Portmapper 네트워크 서비스를 이용합니다. 따라서 nmap으로 기본적인 NFS 정보수집을 진행할 때에도 포트 111과 2049 둘 다 확인해야합니다.

Nmap 결과를 확인하면 포트 111 RPCBind/Portmapper에서 NFS와 관련된 정보들을 수집한 것을 볼 수 있습니다. Nmap의 기본 NFS 스크립트들인 `nfs-showmount, nfs-statfs, nfs-ls` 등이 접근 제어 상태, 파일 시스템 크기, 그리고 노출중인 디렉토리 정보 및 파일 권한 등을 보여주고 있습니다.

### 2. Showmount - 접근 제어 확인 <a href="#bkmrk-showmount-ec-a0-91-ea-b7-bc-ec-a0-9c-ec-96-b4-ed-99-95-ec-9d-b8" id="bkmrk-showmount-ec-a0-91-ea-b7-bc-ec-a0-9c-ec-96-b4-ed-99-95-ec-9d-b8"></a>

Nmap 스크립트가 NFS 디렉토리(Export)들의 접근 제어와 관련된 정보를 수집했지만, `showmount` 명령어를 사용해 한 번 더 확인합니다.

```
└─# showmount -e 172.31.245.200 

Export list for 172.31.245.200:
/public-nfs 172.31.0.0/16,10.0.0.0/8
```

`/public-nfs` 라는 NFS 디렉토리(Export)를 노출시키고 있는 것을 볼 수 있으며, `172.31.0.0/16, 10.0.0.0/8` 등의 네트워크에서 접근을 허락하고 있습니다. 이는 RPC1918 기반의 사설 아이피중 대부분에 해당합니다. 따라서, "현재 172.31.245.200 호스트의 NFS 서버는 `/public-nfs` 라는 Export를 `172.31.0.0/16`, `10.0.0.0/8`으로부터 접근을 허락하고 있다" 라고 결론지을 수 있습니다.

### 3. 파일 권한 확인 <a href="#bkmrk-ed-8c-8c-ec-9d-bc-ea-b6-8c-ed-95-9c-ed-99-95-ec-9d-b8" id="bkmrk-ed-8c-8c-ec-9d-bc-ea-b6-8c-ed-95-9c-ed-99-95-ec-9d-b8"></a>

NFS의 디렉토리 및 파일들에 관련된 권한을 원격으로 확인할 수도 있지만, 가장 확실한 방법은 NFS 서버의 디렉토리들을 마운트 (`mount`) 한 뒤 파일 시스템의 권한을 확인 하는 것입니다. 마운트 하기 전 현재 파일시스템의 `/mnt` 디렉토리에 디렉토리를 하나 생성한 후, `mount` 명령어를 이용해 타겟 NFS 서버의 디렉토리(NFS Export)를 마운트합니다.

```sql
mkdir /mnt/testo
mount 172.31.245.200:/public-nfs /mnt/testo
-- 우리의 칼리 리눅스에 상대방의 nfs 폴더를 가져옴.
└─# cd /mnt/testo 

└─# ls -alh 
total 20K
drwxr-xr-x 5 root root 4.0K Oct 12 00:08 .
drwxr-xr-x 4 root root 4.0K Oct 27 23:28 ..
drwxr-xr-x 2 root root 4.0K Oct 12 00:08 backup
drwxr-xr-x 2 root root 4.0K Oct 12 00:08 secret
drwxr-xr-x 2 root root 4.0K Oct 12 00:08 vault
```

### 4. No\_Root\_Squash 활성화 확인 <a href="#bkmrk-no_root_squash-ed-99-9c-ec-84-b1-ed-99-94-ed-99-95" id="bkmrk-no_root_squash-ed-99-9c-ec-84-b1-ed-99-94-ed-99-95"></a>

* `no_root_squash`가 활성화 되어 있다면 타겟 호스트는 취약한 상태입니다.
* `no_root_squash`가 비활성화 되어 있다면 타겟 호스트는 안전한 상태입니다.

`no_root_squash` 옵션의 활성화 상태를 NFS 클라이언트가 원격에서 확인할 방법은 없습니다.

따라서 디렉토리를 마운트 한 뒤 직접 루트 계정을 이용해 파일을 생성해보고, 루트 권한으로 파일 생성이 가능하다면 `no_root_squash`가 활성화 되어 있고, 안된다면 `no_root_squash`가 비활성화 되어 있는 상태라고 결론 지을 수 있습니다.

{% code overflow="wrap" %}

```sql
┌──(root㉿kali)-[/mnt/test]
└─# echo 'hello, from choi!' > no-root-squash-enabled.txt
                                                                               
┌──(root㉿kali)-[/mnt/test]
└─# ls -alh 
total 24K
[ . . . ]
-rw-r--r-- 1 root root   18 Oct 27 23:57 no-root-squash-enabled.txt

```

{% endcode %}

위의 경우 no\_root\_squash가 비활성화 되어 있는 상태입니다. 여기서 공격자는 `no-root-squash-enabled.txt` 라는 파일을 NFS 서버의 파일시스템에 생성했습니다. 여기서 중요한 점은 파일의 owner와 group 모두 `root` 유저로 설정되었다는 것입니다. 이것을 활용해 SUID 비트가 설정되어 있는 페이로드나 쉘을 업로드 할 경우, 타겟 호스트에서 낮은 권한의 유저에서 루트 유저로 로컬 권한 상승을 진행할 수도 있습니다. 이와 관련된 공격 방식은 추후 3.3 공격 모듈들에서 다룹니다.

{% code overflow="wrap" %}

```sql
나의 칼리리눅스 root 권한(sudo -i)를 통해서 상대방의 nfs 공유 디렉토리에 root 권한을 가진 파일을 생성할 수 있다면 no_root_squash가 활성화되어 있고 취약한 상태를 의미한다.
```

{% endcode %}

### 5. 마운트 끝내기 <a href="#bkmrk-eb-a7-88-ec-9a-b4-ed-8a-b8-eb-81-9d-eb-82-b4-ea-b8-b0" id="bkmrk-eb-a7-88-ec-9a-b4-ed-8a-b8-eb-81-9d-eb-82-b4-ea-b8-b0"></a>

NFS를 다 사용하신 다음에는 꼭 마운트를 끝내야(Unmount)합니다. Unmount를 진행할 때 마운트 되어 있는 디렉토리에 쉘이 열려 있거나 파일을 접근하고 있는 상태면 안됩니다. 모든 연결을 끊은 뒤 마운트를 끝냅니다.

```
# 마운트 디렉토리에서 빠져나오기 
┌──(root㉿kali)-[/mnt/test]
└─# cd ..

# 마운트 끝내기 
└─# umount /mnt/<디렉토리-이름>
```

### 연습 문제 <a href="#bkmrk-ec-97-b0-ec-8a-b5-eb-ac-b8-ec-a0-9c" id="bkmrk-ec-97-b0-ec-8a-b5-eb-ac-b8-ec-a0-9c"></a>
