User Namespace

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법:

기본 정보

사용자 네임스페이스는 Linux 커널 기능으로, 각 사용자 네임스페이스가 사용자 및 그룹 ID 매핑의 격리를 제공하여 각 사용자 네임스페이스가 고유한 사용자 및 그룹 ID 세트를 가질 수 있게 합니다. 이 격리는 동일한 사용자 및 그룹 ID를 공유하더라도 서로 다른 사용자 네임스페이스에서 실행되는 프로세스가 다른 권한과 소유권을 가질 수 있게 합니다.

사용자 네임스페이스는 특히 컨테이너화에서 유용하며, 각 컨테이너가 고유한 사용자 및 그룹 ID 세트를 가질 수 있도록 하여 컨테이너와 호스트 시스템 간의 보안 및 격리를 개선할 수 있습니다.

작동 방식:

  1. 새로운 사용자 네임스페이스가 생성되면, 사용자 및 그룹 ID 매핑이 비어있는 상태로 시작됩니다. 이는 새로운 사용자 네임스페이스에서 실행되는 모든 프로세스가 네임스페이스 외부에서 초기에는 권한이 없음을 의미합니다.

  2. ID 매핑은 새로운 네임스페이스와 부모(또는 호스트) 네임스페이스 간의 사용자 및 그룹 ID 사이에서 설정될 수 있습니다. 이를 통해 새로운 네임스페이스의 프로세스가 부모 네임스페이스의 사용자 및 그룹 ID에 해당하는 권한과 소유권을 가질 수 있습니다. 그러나 ID 매핑은 특정 범위와 ID 하위 집합으로 제한될 수 있으므로 새로운 네임스페이스의 프로세스에 부여되는 권한을 세밀하게 제어할 수 있습니다.

  3. 사용자 네임스페이스 내에서 프로세스는 네임스페이스 내부 작업에 대해 완전한 루트 권한 (UID 0)을 가질 수 있으며, 동시에 네임스페이스 외부에서는 제한된 권한을 가질 수 있습니다. 이를 통해 컨테이너는 호스트 시스템에서 완전한 루트 권한을 가지지 않고도 자체 네임스페이스 내에서 루트와 유사한 기능으로 실행될 수 있습니다.

  4. 프로세스는 setns() 시스템 호출을 사용하여 네임스페이스 간 이동하거나 unshare() 또는 clone() 시스템 호출을 사용하여 CLONE_NEWUSER 플래그와 함께 새로운 네임스페이스를 생성할 수 있습니다. 프로세스가 새로운 네임스페이스로 이동하거나 생성할 때 해당 네임스페이스와 관련된 사용자 및 그룹 ID 매핑을 사용하기 시작합니다.

랩:

다른 네임스페이스 생성

CLI

sudo unshare -U [--mount-proc] /bin/bash

--mount-proc 파라미터를 사용하여 /proc 파일 시스템의 새로운 인스턴스를 마운트함으로써, 새로운 마운트 네임스페이스가 해당 네임스페이스에 특정한 프로세스 정보의 정확하고 격리된 뷰를 가지도록 보장합니다.

오류: bash: fork: 메모리를 할당할 수 없음

unshare-f 옵션 없이 실행하면, Linux가 새로운 PID (프로세스 ID) 네임스페이스를 처리하는 방식 때문에 오류가 발생합니다. 주요 내용과 해결 방법은 아래에 설명되어 있습니다:

  1. 문제 설명:

  • Linux 커널은 unshare 시스템 호출을 사용하여 프로세스가 새로운 네임스페이스를 생성할 수 있게 합니다. 그러나 새로운 PID 네임스페이스를 생성하는 프로세스( "unshare" 프로세스라고 함)는 새로운 네임스페이스로 진입하지 않습니다. 오직 그 자식 프로세스들만이 진입합니다.

  • %unshare -p /bin/bash%를 실행하면 /bin/bashunshare와 동일한 프로세스에서 시작됩니다. 결과적으로 /bin/bash와 그 자식 프로세스들은 원래의 PID 네임스페이스에 속합니다.

  • 새로운 네임스페이스에서 /bin/bash의 첫 번째 자식 프로세스는 PID 1이 됩니다. 이 프로세스가 종료되면, 다른 프로세스가 없다면 해당 네임스페이스를 정리하게 되는데, PID 1은 고아 프로세스를 책임지는 특별한 역할을 가지고 있습니다. 그러면 Linux 커널은 해당 네임스페이스에서 PID 할당을 비활성화합니다.

  1. 결과:

  • 새로운 네임스페이스에서 PID 1이 종료되면 PIDNS_HASH_ADDING 플래그가 정리되어버립니다. 이로 인해 alloc_pid 함수가 새로운 프로세스를 생성할 때 새로운 PID를 할당하지 못하고 "메모리를 할당할 수 없음" 오류가 발생합니다.

  1. 해결 방법:

  • -f 옵션을 unshare와 함께 사용하여 이 문제를 해결할 수 있습니다. 이 옵션은 unshare가 새로운 PID 네임스페이스를 생성한 후에 새로운 프로세스를 포크합니다.

  • %unshare -fp /bin/bash%를 실행하면 unshare 명령어 자체가 새로운 네임스페이스에서 PID 1이 됩니다. 그러면 /bin/bash와 그 자식 프로세스들은 이 새로운 네임스페이스 안에 안전하게 포함되어 PID 1의 조기 종료를 방지하고 정상적인 PID 할당이 가능해집니다.

unshare-f 플래그와 함께 실행되도록 보장함으로써, 새로운 PID 네임스페이스가 올바르게 유지되어 /bin/bash와 그 하위 프로세스들이 메모리 할당 오류를 겪지 않고 작동할 수 있습니다.

Docker

docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash

사용자 네임스페이스를 사용하려면 Docker 데몬을 --userns-remap=default 옵션으로 시작해야 합니다(우분투 14.04에서는 /etc/default/docker 파일을 수정한 다음 sudo service docker restart 명령을 실행하여 설정할 수 있습니다).

프로세스가 속한 네임스페이스 확인하기

ls -l /proc/self/ns/user
lrwxrwxrwx 1 root root 0 Apr  4 20:57 /proc/self/ns/user -> 'user:[4026531837]'

다음 명령을 사용하여 도커 컨테이너에서 사용자 매핑을 확인할 수 있습니다:

cat /proc/self/uid_map
0          0 4294967295  --> Root is root in host
0     231072      65536  --> Root is 231072 userid in host

호스트에서 다음과 같이 실행합니다:

cat /proc/<pid>/uid_map

모든 사용자 네임스페이스 찾기

sudo find /proc -maxdepth 3 -type l -name user -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name user -exec ls -l  {} \; 2>/dev/null | grep <ns-number>
nsenter -U TARGET_PID --pid /bin/bash

또한, 루트 권한이 없으면 다른 프로세스 네임스페이스로 들어갈 수 없습니다. 그리고 /proc/self/ns/user와 같은 디스크립터가 없으면 다른 네임스페이스로 들어갈 수 없습니다.

새로운 사용자 네임스페이스 생성 (매핑 포함)

unshare -U [--map-user=<uid>|<name>] [--map-group=<gid>|<name>] [--map-root-user] [--map-current-user]
# Container
sudo unshare -U /bin/bash
nobody@ip-172-31-28-169:/home/ubuntu$ #Check how the user is nobody

# From the host
ps -ef | grep bash # The user inside the host is still root, not nobody
root       27756   27755  0 21:11 pts/10   00:00:00 /bin/bash

기능 복구

사용자 네임스페이스의 경우, 새로운 사용자 네임스페이스가 생성되면 해당 네임스페이스에 진입하는 프로세스는 해당 네임스페이스 내에서 전체 기능 세트를 부여받습니다. 이러한 기능은 프로세스가 특권 작업을 수행할 수 있도록 해줍니다. 예를 들어, 파일 시스템을 마운트하거나 장치를 생성하거나 파일 소유권을 변경하는 작업을 수행할 수 있지만, 사용자 네임스페이스의 문맥 내에서만 가능합니다.

예를 들어, 사용자 네임스페이스 내에서 CAP_SYS_ADMIN 기능을 가지고 있다면, 일반적으로 이 기능이 필요한 작업을 수행할 수 있지만, 사용자 네임스페이스의 문맥 내에서만 가능합니다. 이 기능을 사용하여 수행하는 작업은 호스트 시스템이나 다른 네임스페이스에 영향을 주지 않습니다.

따라서, 새로운 사용자 네임스페이스 내에서 새로운 프로세스를 얻는다고 해도, 모든 기능을 다시 얻을 수는 없습니다 (CapEff: 000001ffffffffff). 실제로는 네임스페이스와 관련된 기능만 사용할 수 있습니다 (예: 마운트). 따라서, 이것만으로는 Docker 컨테이너에서 탈출할 수 없습니다.

```bash # There are the syscalls that are filtered after changing User namespace with: unshare -UmCpf bash

Probando: 0x067 . . . Error Probando: 0x070 . . . Error Probando: 0x074 . . . Error Probando: 0x09b . . . Error Probando: 0x0a3 . . . Error Probando: 0x0a4 . . . Error Probando: 0x0a7 . . . Error Probando: 0x0a8 . . . Error Probando: 0x0aa . . . Error Probando: 0x0ab . . . Error Probando: 0x0af . . . Error Probando: 0x0b0 . . . Error Probando: 0x0f6 . . . Error Probando: 0x12c . . . Error Probando: 0x130 . . . Error Probando: 0x139 . . . Error Probando: 0x140 . . . Error Probando: 0x141 . . . Error Probando: 0x143 . . . Error

## 참고 자료
* [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)

<details>

<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로에서 영웅까지 AWS 해킹을 배워보세요<strong>!</strong></summary>

HackTricks를 지원하는 다른 방법:

* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왑**](https://peass.creator-spring.com)을 얻으세요.
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks)와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.

</details>

Last updated