mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/linux-hardening/privilege-escalation/nfs-no_root_squash
This commit is contained in:
parent
5f36bd40ad
commit
9612722432
@ -2,26 +2,26 @@
|
||||
|
||||
# Squashing Basic Info
|
||||
|
||||
NFS는 일반적으로 (특히 리눅스에서) 파일에 접근하기 위해 클라이언트가 연결할 때 지정된 `uid`와 `gid`를 신뢰합니다 (kerberos가 사용되지 않는 경우). 그러나 서버에서 **이 동작을 변경하는** 몇 가지 설정이 있습니다:
|
||||
NFS는 일반적으로 (특히 리눅스에서) 파일에 접근하기 위해 클라이언트가 연결할 때 지정한 `uid`와 `gid`를 신뢰합니다 (kerberos가 사용되지 않는 경우). 그러나 서버에서 **이 동작을 변경하는** 몇 가지 설정이 있습니다:
|
||||
|
||||
- **`all_squash`**: 모든 접근을 압축하여 모든 사용자와 그룹을 **`nobody`** (65534 unsigned / -2 signed)로 매핑합니다. 따라서 모든 사용자는 `nobody`가 되며, 사용자가 없습니다.
|
||||
- **`root_squash`/`no_all_squash`**: 이는 리눅스의 기본값이며 **uid 0 (root)**에 대한 접근만 압축합니다. 따라서 모든 `UID`와 `GID`는 신뢰되지만 `0`은 `nobody`로 압축됩니다 (따라서 root 가장이 불가능합니다).
|
||||
- **`all_squash`**: 모든 접근을 압축하여 모든 사용자와 그룹을 **`nobody`** (65534 unsigned / -2 signed)로 매핑합니다. 따라서 모든 사용자는 `nobody`가 되며 사용자가 없습니다.
|
||||
- **`root_squash`/`no_all_squash`**: 이는 리눅스의 기본값이며 **uid 0 (root)로의 접근만 압축합니다**. 따라서 모든 `UID`와 `GID`는 신뢰되지만 `0`은 `nobody`로 압축됩니다 (따라서 root 가장이 불가능합니다).
|
||||
- **``no_root_squash`**: 이 설정이 활성화되면 root 사용자조차 압축하지 않습니다. 즉, 이 설정으로 디렉토리를 마운트하면 root로 접근할 수 있습니다.
|
||||
|
||||
**/etc/exports** 파일에서 **no_root_squash**로 설정된 디렉토리를 찾으면, **클라이언트로서** 해당 디렉토리에 **접근**하고 **그 안에 쓰기**를 할 수 있습니다 **로컬 머신의 root**인 것처럼.
|
||||
**/etc/exports** 파일에서 **no_root_squash**로 설정된 디렉토리를 찾으면, **클라이언트로서** 해당 디렉토리에 **접근**하고 **로컬 머신의 root**인 것처럼 그 안에 **쓰기** 할 수 있습니다.
|
||||
|
||||
**NFS**에 대한 더 많은 정보는 다음을 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
/network-services-pentesting/nfs-service-pentesting.md
|
||||
../../network-services-pentesting/nfs-service-pentesting.md
|
||||
{{#endref}}
|
||||
|
||||
# Privilege Escalation
|
||||
|
||||
## Remote Exploit
|
||||
|
||||
옵션 1: bash 사용:
|
||||
- **클라이언트 머신에서 해당 디렉토리를 마운트하고, root로서** 마운트된 폴더 안에 **/bin/bash** 바이너리를 복사한 후 **SUID** 권한을 부여하고, **피해자** 머신에서 해당 bash 바이너리를 실행합니다.
|
||||
옵션 1: bash 사용
|
||||
- **클라이언트 머신에서 해당 디렉토리를 마운트하고, root로서** 마운트된 폴더 안에 **/bin/bash** 바이너리를 복사한 후 **SUID** 권한을 부여하고, **희생자** 머신에서 그 bash 바이너리를 실행합니다.
|
||||
- NFS 공유 내에서 root가 되려면, **`no_root_squash`**가 서버에 설정되어 있어야 합니다.
|
||||
- 그러나 활성화되지 않은 경우, 바이너리를 NFS 공유에 복사하고 상승하고자 하는 사용자로서 SUID 권한을 부여하여 다른 사용자로 상승할 수 있습니다.
|
||||
```bash
|
||||
@ -37,7 +37,7 @@ cd <SHAREDD_FOLDER>
|
||||
./bash -p #ROOT shell
|
||||
```
|
||||
옵션 2: C 컴파일 코드 사용:
|
||||
- 클라이언트 머신에서 해당 디렉토리를 **마운트**하고, **루트로 복사**하여 마운트된 폴더 안에 SUID 권한을 악용할 컴파일된 페이로드를 넣고, 피해자 머신에서 해당 바이너리를 **실행**합니다 (여기에서 일부 [C SUID 페이로드](payloads-to-execute.md#c)를 찾을 수 있습니다).
|
||||
- 클라이언트 머신에서 해당 디렉토리를 **마운트**하고, **루트로 복사**하여 마운트된 폴더 안에 SUID 권한을 악용할 컴파일된 페이로드를 넣고, **희생자** 머신에서 해당 바이너리를 **실행**합니다 (여기에서 일부 [C SUID 페이로드](payloads-to-execute.md#c)를 찾을 수 있습니다).
|
||||
- 이전과 동일한 제한 사항
|
||||
```bash
|
||||
#Attacker, as root user
|
||||
@ -97,7 +97,7 @@ LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs:/
|
||||
```
|
||||
## Bonus: NFShell for Stealthy File Access
|
||||
|
||||
루트 접근 권한을 얻은 후, 소유권을 변경하지 않고(NFS 공유와의 상호작용에서 흔적을 남기지 않기 위해) Python 스크립트(nfsh.py)를 사용합니다. 이 스크립트는 접근하는 파일의 uid를 일치시켜, 권한 문제 없이 공유의 파일과 상호작용할 수 있도록 합니다:
|
||||
루트 접근 권한을 얻은 후, 소유권을 변경하지 않고 NFS 공유와 상호작용하기 위해 (흔적을 남기지 않기 위해) Python 스크립트(nfsh.py)가 사용됩니다. 이 스크립트는 접근하는 파일의 uid를 일치시켜, 권한 문제 없이 공유의 파일과 상호작용할 수 있도록 합니다:
|
||||
```python
|
||||
#!/usr/bin/env python
|
||||
# script from https://www.errno.fr/nfs_privesc.html
|
||||
@ -116,7 +116,7 @@ uid = get_file_uid(filepath)
|
||||
os.setreuid(uid, uid)
|
||||
os.system(' '.join(sys.argv[1:]))
|
||||
```
|
||||
실행 방법:
|
||||
실행 예:
|
||||
```bash
|
||||
# ll ./mount/
|
||||
drwxr-x--- 6 1008 1009 1024 Apr 5 2017 9.3_old
|
||||
|
||||
@ -29,12 +29,12 @@ As you can see, it allows to configure a specific **IP** or **hostname** to acce
|
||||
|
||||
### Versions
|
||||
|
||||
- **NFSv2**: 이 버전은 다양한 시스템과의 폭넓은 호환성으로 인정받으며, 초기 작업이 주로 UDP를 통해 이루어졌습니다. 시리즈 중 **가장 오래된** 버전으로, 향후 개발의 기초를 마련했습니다.
|
||||
- **NFSv2**: 이 버전은 다양한 시스템과의 광범위한 호환성으로 인식되며, 주로 UDP를 통해 초기 작업을 수행하는 것으로 그 중요성을 나타냅니다. 시리즈 중 **가장 오래된** 버전으로, 향후 개발을 위한 기초를 마련했습니다.
|
||||
|
||||
- **NFSv3**: 다양한 개선 사항과 함께 도입된 NFSv3는 이전 버전을 기반으로 하여 가변 파일 크기를 지원하고 개선된 오류 보고 메커니즘을 제공합니다. 발전에도 불구하고 NFSv2 클라이언트와의 완전한 하위 호환성에는 한계가 있었습니다.
|
||||
- **NFSv3**: 다양한 개선 사항과 함께 도입된 NFSv3는 이전 버전을 기반으로 하여 가변 파일 크기를 지원하고 개선된 오류 보고 메커니즘을 제공합니다. 그 발전에도 불구하고 NFSv2 클라이언트와의 완전한 하위 호환성에는 한계가 있었습니다.
|
||||
|
||||
- **NFSv4**: NFS 시리즈의 획기적인 버전인 NFSv4는 네트워크 간 파일 공유를 현대화하기 위해 설계된 기능 모음을 가져왔습니다. 주목할 만한 개선 사항으로는 **높은 보안**을 위한 Kerberos 통합, 방화벽을 통과하고 포트 매퍼 없이 인터넷에서 작동할 수 있는 기능, 접근 제어 목록(ACL) 지원, 상태 기반 작업의 도입이 있습니다. 성능 향상과 상태 기반 프로토콜의 채택은 NFSv4를 네트워크 파일 공유 기술의 중요한 발전으로 구별합니다.
|
||||
- Kerberos 인증을 지원하는 Linux 호스트 NFS를 찾는 것은 매우 이상적입니다.
|
||||
- **NFSv4**: NFS 시리즈의 이정표 버전인 NFSv4는 네트워크 간 파일 공유를 현대화하기 위해 설계된 기능 모음을 가져왔습니다. 주목할 만한 개선 사항으로는 **높은 보안**을 위한 Kerberos 통합, 방화벽을 통과하고 포트 매퍼 없이 인터넷에서 작동할 수 있는 기능, 접근 제어 목록(ACL) 지원, 상태 기반 작업의 도입이 있습니다. 성능 향상과 상태 기반 프로토콜의 채택은 NFSv4를 네트워크 파일 공유 기술의 중요한 발전으로 구별합니다.
|
||||
- Kerberos 인증을 지원하는 Linux 호스트 NFS를 찾는 것은 매우 이상하다는 점에 유의하십시오.
|
||||
|
||||
각 NFS 버전은 네트워크 환경의 진화하는 요구를 해결하기 위해 개발되었으며, 보안, 호환성 및 성능을 점진적으로 향상시켰습니다.
|
||||
|
||||
@ -48,7 +48,7 @@ As you can see, it allows to configure a specific **IP** or **hostname** to acce
|
||||
|
||||
### Subtree check
|
||||
|
||||
Linux에서만 사용 가능합니다. man(5) exports는 다음과 같이 말합니다: "파일 시스템의 하위 디렉토리가 내보내지지만 전체 파일 시스템이 내보내지 않는 경우, NFS 요청이 도착할 때마다 서버는 접근된 파일이 적절한 파일 시스템에 있는지(이는 쉽습니다)뿐만 아니라 내보낸 트리에 있는지(이는 더 어렵습니다) 확인해야 합니다. 이 검사를 subtree check라고 합니다."
|
||||
Linux에서만 사용 가능합니다. man(5) exports는 다음과 같이 말합니다: "파일 시스템의 하위 디렉토리가 내보내지지만 전체 파일 시스템이 내보내지 않는 경우, NFS 요청이 도착할 때마다 서버는 접근된 파일이 적절한 파일 시스템에 있는지(이는 쉽습니다)뿐만 아니라 내보내진 트리에 있는지(이는 더 어렵습니다) 확인해야 합니다. 이 검사를 subtree check라고 합니다."
|
||||
|
||||
Linux에서는 **`subtree_check` 기능이 기본적으로 비활성화되어 있습니다.**
|
||||
|
||||
@ -56,8 +56,8 @@ Linux에서는 **`subtree_check` 기능이 기본적으로 비활성화되어
|
||||
|
||||
### Showmount
|
||||
|
||||
이것은 **NFSv3 서버에서 정보를 얻는 데** 사용될 수 있으며, **내보내기** 목록, 이 내보내기에 **접근할 수 있는** 사람, 연결된 클라이언트 등을 포함합니다(클라이언트가 서버에 알리지 않고 연결을 끊으면 부정확할 수 있습니다).
|
||||
**NFSv4 클라이언트는 직접 /export에 접근**하고 거기서 내보내기에 접근하려고 시도하며, 유효하지 않거나 어떤 이유로든 권한이 없으면 실패합니다.
|
||||
이것은 **NFSv3 서버에서 정보를 얻는 데 사용될 수 있습니다**, 예를 들어 **exports** 목록, 이 exports에 **접근할 수 있는** 사람, 그리고 연결된 클라이언트(클라이언트가 서버에 알리지 않고 연결을 끊으면 부정확할 수 있음)입니다.
|
||||
**NFSv4 클라이언트는 직접 /export에 접근**하고 거기서 exports에 접근하려고 시도하며, 유효하지 않거나 어떤 이유로든 권한이 없으면 실패합니다.
|
||||
|
||||
`showmount`와 같은 도구나 Metasploit 모듈이 NFS 포트에서 정보를 표시하지 않으면, 이는 버전 3을 지원하지 않는 NFSv4 서버일 가능성이 있습니다.
|
||||
```bash
|
||||
@ -75,7 +75,7 @@ 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`가 활성화되어 있는지**와 같은 많은 데이터를 얻는 데 사용할 수 있습니다.
|
||||
이 도구는 [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling)에서 제공되며, NFS 서버에서 **마운트**, 지원되는 NFS 버전, 연결된 IP 및 **내보내기에서 다른 폴더로의 탈출이 가능한지** 또는 **`no_root_squash`가 활성화되어 있는지**와 같은 많은 데이터를 얻는 데 사용할 수 있습니다.
|
||||
|
||||
|
||||
## Mounting
|
||||
@ -99,30 +99,30 @@ mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock
|
||||
|
||||
### UID 및 GID 신뢰
|
||||
|
||||
물론, 여기서 유일한 문제는 기본적으로 루트(`UID` 0)를 가장할 수 없다는 것입니다. 그러나 다른 사용자를 가장할 수 있으며, `no_root_squash`가 활성화된 경우 루트도 가장할 수 있습니다.
|
||||
물론, 여기서 유일한 문제는 기본적으로 루트(`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를 항상 전송합니다.
|
||||
- [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
|
||||
../linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md
|
||||
{{#endref}}
|
||||
|
||||
### 내보내기에서 탈출
|
||||
|
||||
이 [훌륭한 기사](https://www.hvs-consulting.de/en/nfs-security-identifying-and-exploiting-misconfigurations/)에서는 **내보내기에서 탈출하여 파일 시스템의 다른 폴더에 접근할 수 있는** 가능성을 확인할 수 있습니다.
|
||||
이 [훌륭한 기사](https://www.hvs-consulting.de/en/nfs-security-identifying-and-exploiting-misconfigurations/)에서는 **내보내기에서 탈출하여 파일 시스템의 다른 폴더에 접근하는 것이 가능**하다는 것을 볼 수 있습니다.
|
||||
|
||||
따라서, 내보내기가 **전체 파일 시스템**의 **하위 폴더**인 폴더를 내보내는 경우, **`subtree_check`**가 비활성화되어 있으면 내보내기 외부의 파일에 접근할 수 있습니다. 그리고 이는 **리눅스에서 기본적으로 비활성화되어 있습니다**.
|
||||
따라서, 내보내기가 **전체 파일 시스템**의 **하위 폴더**를 내보내는 경우, **`subtree_check`**가 비활성화되어 있으면 내보내기 외부의 파일에 접근할 수 있습니다. 그리고 이는 **리눅스에서 기본적으로 비활성화되어 있습니다**.
|
||||
|
||||
예를 들어, NFS 서버가 `/srv/`를 내보내고 `/var/`가 동일한 파일 시스템에 있는 경우, `/var/log/`에서 로그를 읽거나 `/var/www/`에 웹쉘을 저장할 수 있습니다.
|
||||
|
||||
또한, 기본적으로 루트(0) 사용자만 가장되는 것을 방지한다는 점에 유의하세요(스쿼시 섹션 확인). 그러나 파일이 **루트에 의해 소유되지만 그룹이 0이 아닌 경우 접근할 수 있습니다**. 예를 들어, 파일 `/etc/shadow`는 루트에 의해 소유되지만 그룹은 `shadow`(Debian에서 gid 42)입니다. 따라서 기본적으로 읽을 수 있습니다!
|
||||
또한, 기본적으로 루트(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에서도 가능할 것입니다).
|
||||
[https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling)에서 제공하는 도구 **`nfs_analyze`**는 ext4, xfs, btrfs 파일 시스템에 대한 이 공격을 지원하도록 구축되었습니다(버전 3에서 가능해야 하며, v4에서도 가능할 것입니다).
|
||||
|
||||
### NSFShell
|
||||
|
||||
@ -143,9 +143,9 @@ mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock
|
||||
|
||||
- **중첩 파일 시스템의 가시성 (`nohide`):** 이 구성은 다른 파일 시스템이 내보낸 디렉토리 아래에 마운트되어 있어도 디렉토리를 볼 수 있게 합니다. 각 디렉토리는 적절한 관리를 위해 자체 내보내기 항목이 필요합니다.
|
||||
|
||||
- **루트 파일 소유권 (`no_root_squash`):** 이 설정을 사용하면 루트 사용자가 생성한 파일이 원래 UID/GID인 0을 유지하여 최소 권한 원칙을 무시하고 과도한 권한을 부여할 수 있습니다.
|
||||
- **루트 파일 소유권 (`no_root_squash`):** 이 설정을 사용하면 루트 사용자가 생성한 파일이 원래 UID/GID인 0을 유지하며, 최소 권한 원칙을 무시하고 과도한 권한을 부여할 수 있습니다.
|
||||
|
||||
- **모든 사용자 비스쿼시 (`no_all_squash`):** 이 옵션은 사용자 신원이 시스템 전반에 걸쳐 유지되도록 보장하지만, 올바르게 처리되지 않으면 권한 및 접근 제어 문제를 초래할 수 있습니다.
|
||||
- **모든 사용자의 비스쿼시 (`no_all_squash`):** 이 옵션은 사용자 신원이 시스템 전반에 걸쳐 유지되도록 보장하며, 올바르게 처리되지 않으면 권한 및 접근 제어 문제를 일으킬 수 있습니다.
|
||||
|
||||
## NFS 잘못된 구성으로 인한 권한 상승
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user