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

κΈ°λ³Έ 정보

IPC (Inter-Process Communication) λ„€μž„μŠ€νŽ˜μ΄μŠ€λŠ” λ©”μ‹œμ§€ 큐, 곡유 λ©”λͺ¨λ¦¬ μ„Έκ·Έλ¨ΌνŠΈ 및 μ„Έλ§ˆν¬μ–΄μ™€ 같은 System V IPC 객체의 격리λ₯Ό μ œκ³΅ν•˜λŠ” Linux 컀널 κΈ°λŠ₯μž…λ‹ˆλ‹€. 이 κ²©λ¦¬λŠ” λ‹€λ₯Έ IPC λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— μžˆλŠ” ν”„λ‘œμ„ΈμŠ€κ°€ μ„œλ‘œμ˜ IPC 객체에 직접 μ ‘κ·Όν•˜κ±°λ‚˜ μˆ˜μ •ν•  수 없도둝 ν•˜μ—¬ ν”„λ‘œμ„ΈμŠ€ κ·Έλ£Ή 간에 좔가적인 λ³΄μ•ˆ 및 ν”„λΌμ΄λ²„μ‹œ 계측을 μ œκ³΅ν•©λ‹ˆλ‹€.

μž‘λ™ 방식:

  1. μƒˆλ‘œμš΄ IPC λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ μƒμ„±λ˜λ©΄ μ™„μ „νžˆ 격리된 System V IPC 객체 μ„ΈνŠΈλ‘œ μ‹œμž‘ν•©λ‹ˆλ‹€. μ΄λŠ” μƒˆλ‘œμš΄ IPC λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ μ‹€ν–‰λ˜λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ 기본적으둜 λ‹€λ₯Έ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ‚˜ 호슀트 μ‹œμŠ€ν…œμ˜ IPC 객체에 μ ‘κ·Όν•˜κ±°λ‚˜ κ°„μ„­ν•  수 μ—†μŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.
  2. λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄μ—μ„œ μƒμ„±λœ IPC κ°μ²΄λŠ” ν•΄λ‹Ή λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄μ˜ ν”„λ‘œμ„ΈμŠ€λ§Œ λ³Ό 수 있고 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. 각 IPC κ°μ²΄λŠ” ν•΄λ‹Ή λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄μ—μ„œ κ³ μœ ν•œ ν‚€λ‘œ μ‹λ³„λ©λ‹ˆλ‹€. ν‚€λŠ” μ„œλ‘œ λ‹€λ₯Έ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ 동일할 수 μžˆμ§€λ§Œ, 객체 μžμ²΄λŠ” κ²©λ¦¬λ˜μ–΄ 있으며 λ„€μž„μŠ€νŽ˜μ΄μŠ€ 간에 μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  3. ν”„λ‘œμ„ΈμŠ€λŠ” setns() μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ‚¬μš©ν•˜μ—¬ λ„€μž„μŠ€νŽ˜μ΄μŠ€ 간에 μ΄λ™ν•˜κ±°λ‚˜ unshare() λ˜λŠ” clone() μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ‚¬μš©ν•˜μ—¬ CLONE_NEWIPC ν”Œλž˜κ·Έμ™€ ν•¨κ»˜ μƒˆλ‘œμš΄ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œμ„ΈμŠ€κ°€ μƒˆλ‘œμš΄ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ‘œ μ΄λ™ν•˜κ±°λ‚˜ 생성할 λ•Œ, ν•΄λ‹Ή λ„€μž„μŠ€νŽ˜μ΄μŠ€μ™€ μ—°κ²°λœ IPC 객체λ₯Ό μ‚¬μš©ν•˜κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€.

μ‹€μŠ΅:

λ‹€μ–‘ν•œ λ„€μž„μŠ€νŽ˜μ΄μŠ€ 생성

CLI

sudo unshare -i [--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/ipc
lrwxrwxrwx 1 root root 0 Apr  4 20:37 /proc/self/ns/ipc -> 'ipc:[4026531839]'

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

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

IPC λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— λ“€μ–΄κ°€κΈ°

nsenter -i TARGET_PID --pid /bin/bash

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

IPC 객체 생성

# Container
sudo unshare -i /bin/bash
ipcmk -M 100
Shared memory id: 0
ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x2fba9021 0          root       644        100        0

# From the host
ipcs -m # Nothing is seen

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