# 2049 - Pentesting NFS Service {{#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(루트)을 가장하는 것은 불가능하다는 점에 유의하십시오. 이에 대한 자세한 내용은 스쿼싱 섹션에서 다룹니다.** #### 호스트 더 나은(또는 일부) 권한 부여를 위해 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를 네트워크 파일 공유 기술의 중요한 발전으로 구분 짓습니다. - Kerberos 인증을 지원하는 Linux 호스트 NFS를 찾는 것은 매우 이상하다는 점에 유의하십시오. 각 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 요청이 도착할 때마다 서버는 접근된 파일이 적절한 파일 시스템에 있는지(이는 쉽습니다)뿐만 아니라 내보내진 트리에 있는지도 확인해야 합니다(이는 더 어렵습니다). 이 검사를 subtree check라고 합니다." Linux에서는 **`subtree_check` 기능이 기본적으로 비활성화되어 있습니다.** ## Enumeration ### Showmount 이것은 **NFSv3 서버에서 정보를 얻는 데** 사용될 수 있으며, **내보내기** 목록, 이 내보내기에 **접근할 수 있는** 사람, 그리고 연결된 클라이언트(클라이언트가 서버에 알리지 않고 연결을 끊으면 부정확할 수 있음)를 보여줍니다. **NFSv4 클라이언트는 직접 /export에 접근**하고 거기서 내보내기에 접근하려고 시도하며, 유효하지 않거나 어떤 이유로든 권한이 없으면 실패합니다. `showmount` 또는 Metasploit 모듈과 같은 도구가 NFS 포트에서 정보를 표시하지 않으면, 이는 버전 3을 지원하지 않는 NFSv4 서버일 가능성이 있습니다. ```bash showmount -e ``` ### 유용한 nmap 스크립트 ```bash nfs-ls #List NFS exports and check permissions nfs-showmount #Like showmount -e nfs-statfs #Disk statistics and info from NFS share ``` ### 유용한 메타스플로잇 모듈 ```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 ``` 그런 다음 다음을 사용하여 마운트합니다: ```bash mount -t nfs [-o vers=2] : -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 신뢰 물론, 여기서 유일한 문제는 기본적으로 루트(`UID` 0)를 가장할 수 없다는 것입니다. 그러나 다른 사용자를 가장할 수 있으며, `no_root_squash`가 활성화된 경우 루트도 가장할 수 있습니다. - 특정 사용자만 접근할 수 있는 **파일 또는 폴더**가 포함된 폴더를 마운트하는 경우( **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`**가 비활성화되어 있으면 내보내기 외부의 파일에 접근할 수 있습니다. 그리고 이는 **리눅스에서 기본적으로 비활성화되어 있습니다**. 예를 들어, NFS 서버가 `/srv/`를 내보내고 `/var/`가 동일한 파일 시스템에 있는 경우, `/var/log/`에서 로그를 읽거나 `/var/www/`에 웹쉘을 저장할 수 있습니다. 또한, 기본적으로 루트(0) 사용자만 가장하는 것으로부터 보호된다는 점에 유의하세요(스쿼시 섹션 확인). 그러나 파일이 **루트 소유이지만 그룹이 0이 아닌 경우 접근할 수 있습니다**. 예를 들어, 파일 `/etc/shadow`는 루트 소유이지만 그룹은 `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 파일 시스템에 대한 이 공격을 지원하도록 구축되었습니다(버전 3에서 작동하며 v4에서도 가능해야 합니다). ### NSFShell 파일에 접근하기 위해 UID 및 GID를 쉽게 나열하고 마운트하며 변경하려면 [nfsshell](https://github.com/NetDirect/nfsshell)을 사용할 수 있습니다. [멋진 NFSShell 튜토리얼.](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}}