Mount Namespace

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 μ§€μ›ν•˜κΈ°

Basic Information

마운트 λ„€μž„μŠ€νŽ˜μ΄μŠ€λŠ” ν”„λ‘œμ„ΈμŠ€ 그룹이 λ³΄λŠ” 파일 μ‹œμŠ€ν…œ 마운트 μ§€μ μ˜ 격리λ₯Ό μ œκ³΅ν•˜λŠ” λ¦¬λˆ…μŠ€ 컀널 κΈ°λŠ₯μž…λ‹ˆλ‹€. 각 마운트 λ„€μž„μŠ€νŽ˜μ΄μŠ€λŠ” κ³ μœ ν•œ 파일 μ‹œμŠ€ν…œ 마운트 지점 집합을 κ°€μ§€λ©°, ν•˜λ‚˜μ˜ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ 마운트 지점에 λŒ€ν•œ λ³€κ²½ 사항은 λ‹€λ₯Έ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ„œλ‘œ λ‹€λ₯Έ 마운트 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ μ‹€ν–‰λ˜λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ 파일 μ‹œμŠ€ν…œ 계측에 λŒ€ν•œ μ„œλ‘œ λ‹€λ₯Έ λ·°λ₯Ό κ°€μ§ˆ 수 μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

마운트 λ„€μž„μŠ€νŽ˜μ΄μŠ€λŠ” 각 μ»¨ν…Œμ΄λ„ˆκ°€ λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆ 및 호슀트 μ‹œμŠ€ν…œκ³Ό 격리된 자체 파일 μ‹œμŠ€ν…œ 및 ꡬ성을 κ°€μ Έμ•Ό ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆν™”μ—μ„œ 특히 μœ μš©ν•©λ‹ˆλ‹€.

How it works:

  1. μƒˆλ‘œμš΄ 마운트 λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ μƒμ„±λ˜λ©΄, λΆ€λͺ¨ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ 마운트 지점 λ³΅μ‚¬λ³ΈμœΌλ‘œ μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€. μ΄λŠ” 생성 μ‹œ μƒˆλ‘œμš΄ λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ λΆ€λͺ¨μ™€ λ™μΌν•œ 파일 μ‹œμŠ€ν…œ λ·°λ₯Ό κ³΅μœ ν•¨μ„ μ˜λ―Έν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄μ˜ 마운트 지점에 λŒ€ν•œ μ΄ν›„μ˜ λ³€κ²½ 사항은 λΆ€λͺ¨ λ˜λŠ” λ‹€λ₯Έ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  2. ν”„λ‘œμ„ΈμŠ€κ°€ λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄μ—μ„œ 마운트 지점을 μˆ˜μ •ν•  λ•Œ, 예λ₯Ό λ“€μ–΄ 파일 μ‹œμŠ€ν…œμ„ λ§ˆμš΄νŠΈν•˜κ±°λ‚˜ μ–Έλ§ˆμš΄νŠΈν•  λ•Œ, λ³€κ²½ 사항은 ν•΄λ‹Ή λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— κ΅­ν•œλ˜λ©° λ‹€λ₯Έ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λŠ” 각 λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ 독립적인 파일 μ‹œμŠ€ν…œ 계측을 κ°€μ§ˆ 수 있게 ν•©λ‹ˆλ‹€.
  3. ν”„λ‘œμ„ΈμŠ€λŠ” setns() μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ‚¬μš©ν•˜μ—¬ λ„€μž„μŠ€νŽ˜μ΄μŠ€ 간에 μ΄λ™ν•˜κ±°λ‚˜, unshare() λ˜λŠ” clone() μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ‚¬μš©ν•˜μ—¬ CLONE_NEWNS ν”Œλž˜κ·Έμ™€ ν•¨κ»˜ μƒˆλ‘œμš΄ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œμ„ΈμŠ€κ°€ μƒˆλ‘œμš΄ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ‘œ μ΄λ™ν•˜κ±°λ‚˜ 생성할 λ•Œ, ν•΄λ‹Ή λ„€μž„μŠ€νŽ˜μ΄μŠ€μ™€ μ—°κ²°λœ 마운트 지점을 μ‚¬μš©ν•˜κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€.
  4. 파일 λ””μŠ€ν¬λ¦½ν„°μ™€ μ•„μ΄λ…Έλ“œλŠ” λ„€μž„μŠ€νŽ˜μ΄μŠ€ 간에 곡유되며, μ΄λŠ” ν•˜λ‚˜μ˜ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— μžˆλŠ” ν”„λ‘œμ„ΈμŠ€κ°€ νŒŒμΌμ„ κ°€λ¦¬ν‚€λŠ” μ—΄λ¦° 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό κ°€μ§€κ³  μžˆλ‹€λ©΄, ν•΄λ‹Ή 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό λ‹€λ₯Έ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ ν”„λ‘œμ„ΈμŠ€μ— 전달할 수 있으며, 두 ν”„λ‘œμ„ΈμŠ€ λͺ¨λ‘ λ™μΌν•œ νŒŒμΌμ— μ ‘κ·Όν•  수 μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 파일의 κ²½λ‘œλŠ” 마운트 μ§€μ μ˜ 차이둜 인해 두 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ λ™μΌν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

Lab:

Create different Namespaces

CLI

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

μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€μ˜ /proc 파일 μ‹œμŠ€ν…œμ„ λ§ˆμš΄νŠΈν•˜λ©΄ --mount-proc λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ 마운트 λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ ν•΄λ‹Ή λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— νŠΉμ •ν•œ ν”„λ‘œμ„ΈμŠ€ 정보에 λŒ€ν•œ μ •ν™•ν•˜κ³  격리된 λ·°λ₯Ό 갖도둝 보μž₯ν•©λ‹ˆλ‹€.

였λ₯˜: bash: fork: λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•  수 μ—†μŠ΅λ‹ˆλ‹€

unshareκ°€ -f μ˜΅μ…˜ 없이 싀행될 λ•Œ, Linuxκ°€ μƒˆλ‘œμš΄ PID(ν”„λ‘œμ„ΈμŠ€ ID) λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방식 λ•Œλ¬Έμ— 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. μ£Όμš” 세뢀사항과 해결책은 μ•„λž˜μ— μ„€λͺ…λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€:

  1. 문제 μ„€λͺ…:
  • Linux 컀널은 ν”„λ‘œμ„ΈμŠ€κ°€ unshare μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 생성할 수 μžˆλ„λ‘ ν—ˆμš©ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μƒˆλ‘œμš΄ PID λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€(이λ₯Ό β€œunshare” ν”„λ‘œμ„ΈμŠ€λΌκ³  함)λŠ” μƒˆλ‘œμš΄ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— λ“€μ–΄κ°€μ§€ μ•ŠμœΌλ©°, 였직 κ·Έ μžμ‹ ν”„λ‘œμ„ΈμŠ€λ§Œ λ“€μ–΄κ°‘λ‹ˆλ‹€.
  • %unshare -p /bin/bash%λ₯Ό μ‹€ν–‰ν•˜λ©΄ /bin/bashκ°€ unshare와 λ™μΌν•œ ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ‹œμž‘λ©λ‹ˆλ‹€. 결과적으둜 /bin/bash와 κ·Έ μžμ‹ ν”„λ‘œμ„ΈμŠ€λŠ” μ›λž˜ PID λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— μžˆμŠ΅λ‹ˆλ‹€.
  • μƒˆλ‘œμš΄ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ /bin/bash의 첫 번째 μžμ‹ ν”„λ‘œμ„ΈμŠ€λŠ” PID 1이 λ©λ‹ˆλ‹€. 이 ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ˜λ©΄, λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ 없을 경우 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ 정리가 νŠΈλ¦¬κ±°λ©λ‹ˆλ‹€. PID 1은 κ³ μ•„ ν”„λ‘œμ„ΈμŠ€λ₯Ό μž…μ–‘ν•˜λŠ” νŠΉλ³„ν•œ 역할을 κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. 그러면 Linux 컀널은 ν•΄λ‹Ή λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ PID 할당을 λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€.
  1. κ²°κ³Ό:
  • μƒˆλ‘œμš΄ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ PID 1의 μ’…λ£ŒλŠ” PIDNS_HASH_ADDING ν”Œλž˜κ·Έμ˜ 정리λ₯Ό μ΄ˆλž˜ν•©λ‹ˆλ‹€. 이둜 인해 μƒˆλ‘œμš΄ ν”„λ‘œμ„ΈμŠ€λ₯Ό 생성할 λ•Œ alloc_pid ν•¨μˆ˜κ°€ μƒˆλ‘œμš΄ PIDλ₯Ό ν• λ‹Ήν•˜μ§€ λͺ»ν•˜κ²Œ λ˜μ–΄ β€œλ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•  수 μ—†μŠ΅λ‹ˆλ‹€β€ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.
  1. ν•΄κ²°μ±…:
  • 이 λ¬Έμ œλŠ” unshare와 ν•¨κ»˜ -f μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 μ˜΅μ…˜μ€ 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

ν”„λ‘œμ„ΈμŠ€κ°€ μžˆλŠ” λ„€μž„μŠ€νŽ˜μ΄μŠ€ ν™•μΈν•˜κΈ°

ls -l /proc/self/ns/mnt
lrwxrwxrwx 1 root root 0 Apr  4 20:30 /proc/self/ns/mnt -> 'mnt:[4026531841]'

λͺ¨λ“  마운트 λ„€μž„μŠ€νŽ˜μ΄μŠ€ μ°ΎκΈ°

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

Mount λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄λΆ€λ‘œ λ“€μ–΄κ°€κΈ°

nsenter -m TARGET_PID --pid /bin/bash

λ˜ν•œ, 루트 μ‚¬μš©μžλ§Œ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— λ“€μ–΄κ°ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. 그리고 λ””μŠ€ν¬λ¦½ν„°κ°€ μ—†μœΌλ©΄ λ‹€λ₯Έ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— λ“€μ–΄κ°ˆ 수 μ—†μŠ΅λ‹ˆλ‹€ (예: /proc/self/ns/mnt).

μƒˆλ‘œμš΄ λ§ˆμš΄νŠΈλŠ” λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄μ—μ„œλ§Œ μ ‘κ·Όν•  수 있기 λ•Œλ¬Έμ—, λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ κ·Έ μ•ˆμ—μ„œλ§Œ μ ‘κ·Όν•  수 μžˆλŠ” λ―Όκ°ν•œ 정보λ₯Ό 포함할 κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€.

무언가 λ§ˆμš΄νŠΈν•˜κΈ°

# Generate new mount ns
unshare -m /bin/bash
mkdir /tmp/mount_ns_example
mount -t tmpfs tmpfs /tmp/mount_ns_example
mount | grep tmpfs # "tmpfs on /tmp/mount_ns_example"
echo test > /tmp/mount_ns_example/test
ls /tmp/mount_ns_example/test # Exists

# From the host
mount | grep tmpfs # Cannot see "tmpfs on /tmp/mount_ns_example"
ls /tmp/mount_ns_example/test # Doesn't exist
# findmnt # List existing mounts
TARGET                                SOURCE                                                                                                           FSTYPE     OPTIONS
/                                     /dev/mapper/web05--vg-root

# unshare --mount  # run a shell in a new mount namespace
# mount --bind /usr/bin/ /mnt/
# ls /mnt/cp
/mnt/cp
# exit  # exit the shell, and hence the mount namespace
# ls /mnt/cp
ls: cannot access '/mnt/cp': No such file or directory

## Notice there's different files in /tmp
# ls /tmp
revshell.elf

# ls /mnt/tmp
krb5cc_75401103_X5yEyy
systemd-private-3d87c249e8a84451994ad692609cd4b6-apache2.service-77w9dT
systemd-private-3d87c249e8a84451994ad692609cd4b6-systemd-resolved.service-RnMUhT
systemd-private-3d87c249e8a84451994ad692609cd4b6-systemd-timesyncd.service-FAnDql
vmware-root_662-2689143848

References

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 μ§€μ›ν•˜κΈ°