2049 - Pentesting NFS Service

Reading time: 9 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 지원하기

기본 정보

NFS는 사용자가 네트워크를 통해 파일에 원활하게 접근할 수 있도록 설계된 클라이언트/서버 시스템으로, 이러한 파일이 로컬 디렉토리에 있는 것처럼 보이게 합니다.

기본 포트: 2049/TCP/UDP (버전 4를 제외하고, TCP 또는 UDP만 필요함).

2049/tcp open  nfs     2-3 (RPC #100003

인증

이 프로토콜의 주목할 만한 측면은 일반적으로 내장된 인증 또는 권한 부여 메커니즘이 부족하다는 것입니다. 대신, 권한 부여는 파일 시스템 정보에 의존하며, 서버는 클라이언트가 제공한 사용자 정보를 파일 시스템에서 요구하는 권한 부여 형식으로 정확하게 변환하는 역할을 합니다. 주로 UNIX 구문을 따릅니다.

인증은 일반적으로 UNIX UID/GID 식별자 및 그룹 멤버십에 의존합니다. 그러나 클라이언트와 서버 간의 UID/GID 매핑의 불일치로 인해 문제가 발생하며, 서버에 의한 추가 검증의 여지가 없습니다. 게다가 이러한 세부 정보는 클라이언트에 의해 전송되고 서버에 의해 신뢰되므로, 악의적인 클라이언트가 더 높은 권한의 uidgid를 보내 다른 사용자를 가장할 수 있습니다.

그러나 기본적으로 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는 일반적으로 클라이언트의 uidgid를 신뢰하여 파일에 접근합니다(kerberos가 사용되지 않는 경우). 그러나 서버에서 이 동작을 변경하는 몇 가지 구성을 설정할 수 있습니다:

  • all_squash: 모든 접근을 압축하여 모든 사용자와 그룹을 nobody (65534 unsigned / -2 signed)로 매핑합니다. 따라서 모든 사용자는 nobody가 되며 사용자가 없습니다.
  • root_squash/no_all_squash: 이는 Linux의 기본값이며 uid 0 (root)로 접근을 압축합니다. 따라서 모든 UIDGID는 신뢰되지만 0nobody로 압축됩니다(따라서 root 가장이 불가능합니다).
  • no_root_squash: 이 구성이 활성화되면 root 사용자조차 압축하지 않습니다. 즉, 이 구성을 사용하여 디렉토리를 마운트하면 root로 접근할 수 있습니다.

Subtree check

Linux에서만 사용 가능합니다. man(5) exports는 다음과 같이 말합니다: "파일 시스템의 하위 디렉토리가 내보내지지만 전체 파일 시스템이 내보내지 않는 경우, NFS 요청이 도착할 때마다 서버는 접근된 파일이 적절한 파일 시스템에 있는지(이는 쉽습니다)뿐만 아니라 내보내진 트리에 있는지(이는 더 어렵습니다) 확인해야 합니다. 이 검사를 subtree check라고 합니다."

Linux에서는 subtree_check 기능이 기본적으로 비활성화되어 있습니다.

Enumeration

Showmount

이것은 NFSv3 서버에서 정보를 얻는 데 사용될 수 있습니다, 예를 들어 exports 목록, 이 exports에 접근할 수 있는 사람, 그리고 연결된 클라이언트(클라이언트가 서버에 알리지 않고 연결을 끊으면 부정확할 수 있음)입니다. NFSv4 클라이언트는 직접 /export에 접근하고 거기서 exports에 접근하려고 시도하며, 유효하지 않거나 어떤 이유로든 권한이 없으면 실패합니다.

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

유용한 메타스플로잇 모듈

bash
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

서버가 마운트할 수 있는 폴더를 알기 위해 다음과 같이 요청할 수 있습니다:

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 신뢰

물론, 여기서 유일한 문제는 기본적으로 루트(UID 0)를 가장하는 것이 불가능하다는 것입니다. 그러나 다른 사용자를 가장하는 것은 가능하며, no_root_squash가 활성화된 경우 루트도 가장할 수 있습니다.

  • 특정 사용자만 접근할 수 있는 파일 또는 폴더가 포함된 폴더를 마운트하는 경우( 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**가 비활성화되어 있으면 내보내기 외부의 파일에 접근할 수 있습니다. 그리고 이는 리눅스에서 기본적으로 비활성화되어 있습니다.

예를 들어, NFS 서버가 /srv/를 내보내고 /var/가 동일한 파일 시스템에 있는 경우, /var/log/에서 로그를 읽거나 /var/www/에 웹쉘을 저장할 수 있습니다.

또한, 기본적으로 루트(0) 사용자만 가장하는 것으로부터 보호된다는 점에 유의하세요(스쿼시 섹션 확인). 그러나 파일이 루트에 의해 소유되지만 그룹이 0이 아닌 경우, 접근할 수 있습니다. 예를 들어, 파일 /etc/shadow는 루트에 의해 소유되지만 그룹은 shadow(Debian에서 gid 42)입니다. 따라서 기본적으로 읽을 수 있습니다!

https://github.com/hvs-consulting/nfs-security-tooling에서 제공하는 도구 **nfs_analyze**는 ext4, xfs, btrfs 파일 시스템에 대한 이 공격을 지원하도록 구축되었습니다(버전 3에서 가능해야 하며, v4에서도 가능할 것입니다).

NSFShell

파일에 접근하기 위해 UID 및 GID를 쉽게 나열하고 마운트하며 변경하려면 nfsshell을 사용할 수 있습니다.

멋진 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 지원하기