PID ๋„ค์ž„์ŠคํŽ˜์ด์Šค

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 ์ง€์›ํ•˜๊ธฐ

๊ธฐ๋ณธ ์ •๋ณด

PID (ํ”„๋กœ์„ธ์Šค ์‹๋ณ„์ž) ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” Linux ์ปค๋„์˜ ๊ธฐ๋Šฅ์œผ๋กœ, ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน์ด ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ PID์™€ ๋ถ„๋ฆฌ๋œ ๊ณ ์œ ํ•œ PID ์ง‘ํ•ฉ์„ ๊ฐ€์ง€๋„๋ก ํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค ๊ฒฉ๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœ์„ธ์Šค ๊ฒฉ๋ฆฌ๊ฐ€ ๋ณด์•ˆ๊ณผ ์ž์› ๊ด€๋ฆฌ์— ํ•„์ˆ˜์ ์ธ ์ปจํ…Œ์ด๋„ˆํ™”์—์„œ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ PID ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด, ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ์„ธ์Šค์— PID 1์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค๋Š” ์ƒˆ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ โ€œinitโ€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋˜์–ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์˜ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋“ค์„ ๊ด€๋ฆฌํ•  ์ฑ…์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์—์„œ ์ƒ์„ฑ๋˜๋Š” ์ดํ›„์˜ ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์—์„œ ๊ณ ์œ ํ•œ PID๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ด PID๋“ค์€ ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ PID์™€ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค.

PID ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์˜ ํ”„๋กœ์„ธ์Šค ๊ด€์ ์—์„œ๋Š” ๊ฐ™์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ํ”„๋กœ์„ธ์Šค๋Š” ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋ฉฐ, ์ „ํ†ต์ ์ธ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ ๋„๊ตฌ(์˜ˆ: kill, wait ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•ด ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœ์„ธ์Šค๋“ค์ด ์„œ๋กœ ๊ฐ„์„ญํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋•๋Š” ์ˆ˜์ค€์˜ ๊ฒฉ๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘ ๋ฐฉ์‹:

  1. ์ƒˆ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ(์˜ˆ: clone() ์‹œ์Šคํ…œ ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ), ๊ทธ ํ”„๋กœ์„ธ์Šค๋Š” ์ƒˆ ๋˜๋Š” ๊ธฐ์กด PID ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ํ• ๋‹น๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. If a new namespace is created, the process becomes the โ€œinitโ€ process of that namespace.
  2. ์ปค๋„์€ ์ƒˆ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ PID๋“ค๊ณผ ๋ถ€๋ชจ ๋„ค์ž„์ŠคํŽ˜์ด์Šค(์ฆ‰, ์ƒˆ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ƒ์„ฑ๋œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค)์˜ ํ•ด๋‹น PID๋“ค ์‚ฌ์ด์˜ ๋งคํ•‘์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋งคํ•‘์€ ํ•„์š”ํ•  ๋•Œ ์ปค๋„์ด PID๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค, ์˜ˆ๋ฅผ ๋“ค์–ด ์„œ๋กœ ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋“ค ๊ฐ„์— ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ผ ๋•Œ์ฒ˜๋Ÿผ.
  3. PID ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์˜ ํ”„๋กœ์„ธ์Šค๋“ค์€ ๋™์ผํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋“ค๋งŒ ๋ณด๊ณ  ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋ฉฐ, ๊ทธ๋“ค์˜ PID๋Š” ์ž์‹ ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์—์„œ ๊ณ ์œ ํ•ฉ๋‹ˆ๋‹ค.
  4. PID ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ํŒŒ๊ดด๋˜๋ฉด(์˜ˆ: ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ โ€œinitโ€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ), ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์˜ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋Š” ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ์—ฐ๊ด€๋œ ๋ชจ๋“  ์ž์›์ด ์ ์ ˆํžˆ ์ •๋ฆฌ๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์‹ค์Šต:

์„œ๋กœ ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ

CLI

sudo unshare -pf --mount-proc /bin/bash
Error: bash: fork: Cannot allocate memory

unshare๋ฅผ -f ์˜ต์…˜ ์—†์ด ์‹คํ–‰ํ•˜๋ฉด, Linux๊ฐ€ ์ƒˆ๋กœ์šด PID (Process ID) ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ๋‚ด์šฉ๊ณผ ํ•ด๊ฒฐ์ฑ…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. Problem Explanation:
  • Linux ์ปค๋„์€ unshare ์‹œ์Šคํ…œ ์ฝœ์„ ํ†ตํ•ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒˆ๋กœ์šด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒˆ๋กœ์šด PID ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ์„ ์‹œ์ž‘ํ•œ ํ”„๋กœ์„ธ์Šค(์ผ๋ช… โ€œunshareโ€ ํ”„๋กœ์„ธ์Šค)๋Š” ์ƒˆ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š์œผ๋ฉฐ, ์˜ค์ง ๊ทธ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋“ค๋งŒ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
  • %unshare -p /bin/bash%๋ฅผ ์‹คํ–‰ํ•˜๋ฉด /bin/bash๊ฐ€ unshare์™€ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ /bin/bash์™€ ๊ทธ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋“ค์€ ์›๋ž˜์˜ PID ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ /bin/bash์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ PID 1์ด ๋ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒํ•˜๋ฉด(๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†์„ ๊ฒฝ์šฐ) ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ •๋ฆฌ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. PID 1์€ ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž…์–‘(adopt)ํ•˜๋Š” ํŠน๋ณ„ํ•œ ์—ญํ• ์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Linux ์ปค๋„์€ ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ PID ํ• ๋‹น์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
  1. Consequence:
  • ์ƒˆ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ PID 1์ด ์ข…๋ฃŒ๋˜๋ฉด PIDNS_HASH_ADDING ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ •๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ์‹œ alloc_pid ํ•จ์ˆ˜๊ฐ€ ์ƒˆ๋กœ์šด PID๋ฅผ ํ• ๋‹นํ•˜์ง€ ๋ชปํ•˜์—ฌ โ€œCannot allocate memoryโ€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  1. Solution:
  • ์ด ๋ฌธ์ œ๋Š” unshare์— -f ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์€ ์ƒˆ๋กœ์šด PID ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ›„ unshare๊ฐ€ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ fork ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • %unshare -fp /bin/bash%๋ฅผ ์‹คํ–‰ํ•˜๋ฉด unshare ๋ช…๋ น ์ž์ฒด๊ฐ€ ์ƒˆ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ PID 1์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด /bin/bash์™€ ๊ทธ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋“ค์€ ์•ˆ์ „ํ•˜๊ฒŒ ์ด ์ƒˆ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์•ˆ์— ํฌํ•จ๋˜์–ด PID 1์˜ ์กฐ๊ธฐ ์ข…๋ฃŒ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ •์ƒ์ ์ธ PID ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

unshare๋ฅผ -f ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•˜๋ฉด ์ƒˆ PID ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์œ ์ง€๋˜์–ด /bin/bash์™€ ๊ทธ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋“ค์ด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์˜ค๋ฅ˜ ์—†์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

--mount-proc ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด /proc ํŒŒ์ผ์‹œ์Šคํ…œ์˜ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งˆ์šดํŠธํ•˜๋ฉด, ์ƒˆ๋กœ์šด ๋งˆ์šดํŠธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ๊ทธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ํŠน์ •ํ•œ ํ”„๋กœ์„ธ์Šค ์ •๋ณด๋ฅผ ์ •ํ™•ํ•˜๊ณ  ๊ฒฉ๋ฆฌ๋œ ๋ทฐ๋กœ ๋ณด๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

Docker

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

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ด๋–ค ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ

ls -l /proc/self/ns/pid
lrwxrwxrwx 1 root root 0 Apr  3 18:45 /proc/self/ns/pid -> 'pid:[4026532412]'

๋ชจ๋“  PID ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ฐพ๊ธฐ

sudo find /proc -maxdepth 3 -type l -name pid -exec readlink {} \; 2>/dev/null | sort -u

Note that the root use from the initial (default) PID namespace can see all the processes, even the ones in new PID names paces, thats why we can see all the PID namespaces.

Enter inside a PID namespace

nsenter -t TARGET_PID --pid /bin/bash

When you enter inside a PID namespace from the default namespace, you will still be able to see all the processes. And the process from that PID ns will be able to see the new bash on the PID ns.

Also, you can only enter in another process PID namespace if you are root. And you cannot enter in other namespace without a descriptor pointing to it (like /proc/self/ns/pid)

์ตœ๊ทผ ์•…์šฉ ๋…ธํŠธ

CVE-2025-31133: maskedPaths๋ฅผ ์•…์šฉํ•ด ํ˜ธ์ŠคํŠธ PIDs์— ์ ‘๊ทผํ•˜๊ธฐ

runc โ‰ค1.2.7์€ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋‚˜ runc exec ์›Œํฌ๋กœ๋“œ๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ๋Ÿฐํƒ€์ž„์ด ๋ฏผ๊ฐํ•œ procfs ํ•ญ๋ชฉ๋“ค์„ maskedํ•˜๊ธฐ ์ง์ „์— ์ปจํ…Œ์ด๋„ˆ ์ธก /dev/null์„ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ์Ÿ ์ƒํƒœ(race)๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด /dev/null์„ ์ž„์˜์˜ ํ˜ธ์ŠคํŠธ ๊ฒฝ๋กœ(์˜ˆ: /proc/sys/kernel/core_pattern)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ƒˆ ์ปจํ…Œ์ด๋„ˆ PID namespace๋Š” ์ž์‹ ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š์•˜์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ˜ธ์ŠคํŠธ ์ „์—ญ procfs ์ œ์–ด ์ง€์ ์— ๋Œ€ํ•œ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์ ‘๊ทผ์„ ๊ฐ‘์ž๊ธฐ ์ƒ์†๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. core_pattern ๋˜๋Š” /proc/sysrq-trigger๊ฐ€ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•ด์ง€๋ฉด, coredump๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ SysRq๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•จ์œผ๋กœ์จ ํ˜ธ์ŠคํŠธ PID namespace์—์„œ ์ฝ”๋“œ ์‹คํ–‰์ด๋‚˜ ์„œ๋น„์Šค ๊ฑฐ๋ถ€๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ „ ์ ˆ์ฐจ:

  1. rootfs๊ฐ€ /dev/null์„ ์›ํ•˜๋Š” ํ˜ธ์ŠคํŠธ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋งํฌ๋กœ ๊ต์ฒด๋œ OCI bundle์„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค (ln -sf /proc/sys/kernel/core_pattern rootfs/dev/null).
  2. ํŒจ์น˜ ์ ์šฉ ์ด์ „์— ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ runc๊ฐ€ ๋งํฌ ์œ„์— ํ˜ธ์ŠคํŠธ procfs ๋Œ€์ƒ ๊ฒฝ๋กœ๋ฅผ bind-mount ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ปจํ…Œ์ด๋„ˆ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด๋ถ€์—์„œ ์ด์ œ ๋…ธ์ถœ๋œ procfs ํŒŒ์ผ์— ์“ฐ๊ธฐ(์˜ˆ: core_pattern์„ ๋ฆฌ๋ฒ„์Šค ์…ธ ํ—ฌํผ๋กœ ์ง€์ •)ํ•˜๊ณ , ํ˜ธ์ŠคํŠธ ์ปค๋„์ด ํ•ด๋‹น ํ—ฌํผ๋ฅผ PID 1 ์ปจํ…์ŠคํŠธ๋กœ ์‹คํ–‰ํ•˜๋„๋ก ์ž„์˜์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ํฌ๋ž˜์‹œ์‹œํ‚ต๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋ฒˆ๋“ค์ด ์˜ฌ๋ฐ”๋ฅธ ํŒŒ์ผ๋“ค์„ ๋งˆ์Šคํ‚นํ•˜๋Š”์ง€ ๋น ๋ฅด๊ฒŒ ๊ฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

jq '.linux.maskedPaths' config.json | tr -d '"'

๋Ÿฐํƒ€์ž„์— ๊ธฐ๋Œ€ํ•œ ๋งˆ์Šคํ‚น ํ•ญ๋ชฉ์ด ์—†๊ฑฐ๋‚˜(/dev/null์ด ์‚ฌ๋ผ์ ธ์„œ ๊ฑด๋„ˆ๋›ธ ๊ฒฝ์šฐ), ์ปจํ…Œ์ด๋„ˆ๋ฅผ host PID visibility๋ฅผ ๊ฐ€์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๋ผ.

Namespace injection with insject

NCC Groupโ€™s insject๋Š” LD_PRELOAD payload๋กœ ๋กœ๋“œ๋˜์–ด ํƒ€๊นƒ ํ”„๋กœ๊ทธ๋žจ์˜ ํ›„๊ธฐ ๋‹จ๊ณ„(๊ธฐ๋ณธ๊ฐ’ main)์— ํ›…์„ ๊ฑธ๊ณ  execve() ์ดํ›„ ์ผ๋ จ์˜ setns() ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ˜ธ์ŠคํŠธ(๋˜๋Š” ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ)์—์„œ ํ”ผํ•ด์ž์˜ PID namespace์— ๋Ÿฐํƒ€์ž„์ด ์ดˆ๊ธฐํ™”๋œ ํ›„์— attachํ•  ์ˆ˜ ์žˆ์–ด, ์ปจํ…Œ์ด๋„ˆ ํŒŒ์ผ์‹œ์Šคํ…œ์— ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•  ํ•„์š” ์—†์ด /proc/<pid> ๋ทฐ๋ฅผ ๋ณด์กดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ insject๋Š” ํฌํฌํ•  ๋•Œ๊นŒ์ง€ PID namespace์— ํ•ฉ๋ฅ˜ํ•˜๋Š” ๊ฒƒ์„ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋ฅผ host namespace์— (CAP_SYS_PTRACE๋ฅผ ๊ฐ€์ง„ ์ƒํƒœ๋กœ) ์œ ์ง€ํ•˜๊ณ  ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ target PID namespace์—์„œ ์‹คํ–‰๋˜๊ฒŒ ํ•˜์—ฌ ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น… ๋˜๋Š” offensive primitives๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ:

sudo insject -S -p $(pidof containerd-shim) -- bash -lc 'readlink /proc/self/ns/pid && ps -ef'

namespace injection์„ ์•…์šฉํ•˜๊ฑฐ๋‚˜ ๋ฐฉ์–ดํ•  ๋•Œ์˜ ์ฃผ์š” ์š”์ :

  • Use -S/--strict to force insject to abort if threads already exist or namespace joins fail, otherwise you may leave partly-migrated threads straddling host and container PID spaces.
  • Never attach tools that still hold writable host file descriptors unless you also join the mount namespaceโ€”otherwise any process inside the PID namespace can ptrace your helper and reuse those descriptors to tamper with host resources.

์ฐธ์กฐ

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 ์ง€์›ํ•˜๊ธฐ