CGroup 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

cgroup λ„€μž„μŠ€νŽ˜μ΄μŠ€λŠ” λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄μ—μ„œ μ‹€ν–‰λ˜λŠ” ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•œ cgroup κ³„μΈ΅μ˜ 격리λ₯Ό μ œκ³΅ν•˜λŠ” λ¦¬λˆ…μŠ€ 컀널 κΈ°λŠ₯μž…λ‹ˆλ‹€. cgroupsλŠ” μ œμ–΄ 그룹의 μ•½μžλ‘œ, CPU, λ©”λͺ¨λ¦¬ 및 I/O와 같은 **μ‹œμŠ€ν…œ λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ μ œν•œμ„ κ΄€λ¦¬ν•˜κ³  μ‹œν–‰ν•˜κΈ° μœ„ν•΄ ν”„λ‘œμ„ΈμŠ€λ₯Ό 계측적 그룹으둜 쑰직할 수 있게 ν•΄μ£ΌλŠ” 컀널 κΈ°λŠ₯μž…λ‹ˆλ‹€.

cgroup λ„€μž„μŠ€νŽ˜μ΄μŠ€λŠ” μš°λ¦¬κ°€ μ•žμ„œ λ…Όμ˜ν•œ λ‹€λ₯Έ λ„€μž„μŠ€νŽ˜μ΄μŠ€ μœ ν˜•(PID, mount, network λ“±)κ³ΌλŠ” λ³„κ°œμ˜ λ„€μž„μŠ€νŽ˜μ΄μŠ€ μœ ν˜•μ΄ μ•„λ‹ˆμ§€λ§Œ, λ„€μž„μŠ€νŽ˜μ΄μŠ€ 격리 κ°œλ…κ³Ό 관련이 μžˆμŠ΅λ‹ˆλ‹€. Cgroup λ„€μž„μŠ€νŽ˜μ΄μŠ€λŠ” cgroup κ³„μΈ΅μ˜ λ·°λ₯Ό κ°€μƒν™”ν•˜μ—¬, cgroup λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄μ—μ„œ μ‹€ν–‰λ˜λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ 호슀트 λ˜λŠ” λ‹€λ₯Έ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ μ‹€ν–‰λ˜λŠ” ν”„λ‘œμ„ΈμŠ€μ™€ λΉ„κ΅ν•˜μ—¬ κ³„μΈ΅μ˜ λ‹€λ₯Έ λ·°λ₯Ό 갖도둝 ν•©λ‹ˆλ‹€.

How it works:

  1. μƒˆλ‘œμš΄ cgroup λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ μƒμ„±λ˜λ©΄, 생성 ν”„λ‘œμ„ΈμŠ€μ˜ cgroup을 기반으둜 ν•œ cgroup κ³„μΈ΅μ˜ 뷰둜 μ‹œμž‘ν•©λ‹ˆλ‹€. μ΄λŠ” μƒˆλ‘œμš΄ cgroup λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄μ—μ„œ μ‹€ν–‰λ˜λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ 전체 cgroup κ³„μΈ΅μ˜ ν•˜μœ„ μ§‘ν•©λ§Œμ„ 보게 됨을 μ˜λ―Έν•˜λ©°, μ΄λŠ” 생성 ν”„λ‘œμ„ΈμŠ€μ˜ cgroup에 뿌리λ₯Ό λ‘” cgroup μ„œλΈŒνŠΈλ¦¬λ‘œ μ œν•œλ©λ‹ˆλ‹€.
  2. cgroup λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄μ˜ ν”„λ‘œμ„ΈμŠ€λŠ” μžμ‹ μ˜ cgroup을 κ³„μΈ΅μ˜ 루트둜 λ΄…λ‹ˆλ‹€. μ΄λŠ” λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄λΆ€μ˜ ν”„λ‘œμ„ΈμŠ€ κ΄€μ μ—μ„œ μžμ‹ μ˜ cgroup이 루트처럼 보이며, μžμ‹ μ˜ μ„œλΈŒνŠΈλ¦¬ μ™ΈλΆ€μ˜ cgroup을 λ³Ό 수 μ—†κ³  μ ‘κ·Όν•  수 μ—†μŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.
  3. cgroup λ„€μž„μŠ€νŽ˜μ΄μŠ€λŠ” λ¦¬μ†ŒμŠ€μ˜ 격리λ₯Ό 직접 μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€; 그듀은 단지 cgroup 계측 뷰의 격리만 μ œκ³΅ν•©λ‹ˆλ‹€. λ¦¬μ†ŒμŠ€ μ œμ–΄ 및 κ²©λ¦¬λŠ” μ—¬μ „νžˆ cgroup μ„œλΈŒμ‹œμŠ€ν…œ(예: cpu, memory λ“±) μžμ²΄μ— μ˜ν•΄ μ‹œν–‰λ©λ‹ˆλ‹€.

CGroups에 λŒ€ν•œ 더 λ§Žμ€ μ •λ³΄λŠ” λ‹€μŒμ„ ν™•μΈν•˜μ„Έμš”:

CGroups

Lab:

Create different Namespaces

CLI

sudo unshare -C [--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/cgroup
lrwxrwxrwx 1 root root 0 Apr  4 21:19 /proc/self/ns/cgroup -> 'cgroup:[4026531835]'

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

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

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

nsenter -C TARGET_PID --pid /bin/bash

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

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