Docker Forensics

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

Container modification

์ผ๋ถ€ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์†์ƒ๋˜์—ˆ๋‹ค๋Š” ์˜ํ˜น์ด ์žˆ์Šต๋‹ˆ๋‹ค:

docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
cc03e43a052a        lamp-wordpress      "./run.sh"          2 minutes ago       Up 2 minutes        80/tcp              wordpress

์ด ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ์ด๋ฏธ์ง€์™€ ๊ด€๋ จ๋œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

docker diff wordpress
C /var
C /var/lib
C /var/lib/mysql
A /var/lib/mysql/ib_logfile0
A /var/lib/mysql/ib_logfile1
A /var/lib/mysql/ibdata1
A /var/lib/mysql/mysql
A /var/lib/mysql/mysql/time_zone_leap_second.MYI
A /var/lib/mysql/mysql/general_log.CSV
...

์ด์ „ ๋ช…๋ น์—์„œ C๋Š” Changed๋ฅผ ์˜๋ฏธํ•˜๊ณ  A๋Š” Added๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
/etc/shadow์™€ ๊ฐ™์€ ํฅ๋ฏธ๋กœ์šด ํŒŒ์ผ์ด ์ˆ˜์ •๋œ ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜๋ฉด, ์•…์˜์ ์ธ ํ™œ๋™์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…Œ์ด๋„ˆ์—์„œ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

docker cp wordpress:/etc/shadow.

์›๋ณธ๊ณผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์ƒˆ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ทธ ์•ˆ์—์„œ ํŒŒ์ผ์„ ์ถ”์ถœํ•˜์—ฌ:

docker run -d lamp-wordpress
docker cp b5d53e8b468e:/etc/shadow original_shadow #Get the file from the newly created container
diff original_shadow shadow

์˜์‹ฌ์Šค๋Ÿฌ์šด ํŒŒ์ผ์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•œ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ์— ์ ‘๊ทผํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

docker exec -it wordpress bash

์ด๋ฏธ์ง€ ์ˆ˜์ •

๋‚ด๋ณด๋‚ธ ๋„์ปค ์ด๋ฏธ์ง€(์•„๋งˆ๋„ .tar ํ˜•์‹)๋ฅผ ๋ฐ›์œผ๋ฉด container-diff๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ • ์‚ฌํ•ญ์˜ ์š”์•ฝ์„ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

docker save <image> > image.tar #Export the image to a .tar file
container-diff analyze -t sizelayer image.tar
container-diff analyze -t history image.tar
container-diff analyze -t metadata image.tar

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋ฏธ์ง€๋ฅผ ์••์ถ• ํ•ด์ œํ•˜๊ณ  ๋ธ”๋กญ์— ์ ‘๊ทผํ•˜์—ฌ ๋ณ€๊ฒฝ ์ด๋ ฅ์—์„œ ๋ฐœ๊ฒฌํ•œ ์˜์‹ฌ์Šค๋Ÿฌ์šด ํŒŒ์ผ์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

tar -xf image.tar

๊ธฐ๋ณธ ๋ถ„์„

์ด๋ฏธ์ง€์—์„œ ๊ธฐ๋ณธ ์ •๋ณด๋ฅผ ์–ป์œผ๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์„ธ์š”:

docker inspect <image>

๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ด๋ ฅ ์š”์•ฝ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

docker history --no-trunc <image>

์ด๋ฏธ์ง€์—์„œ dockerfile์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage"
dfimage -sV=1.36 madhuakula/k8s-goat-hidden-in-layers>

Dive

docker ์ด๋ฏธ์ง€์—์„œ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ˆ˜์ •๋œ ํŒŒ์ผ์„ ์ฐพ๊ธฐ ์œ„ํ•ด dive (๋‹ค์šด๋กœ๋“œ๋Š” releases์—์„œ) ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

#First you need to load the image in your docker repo
sudo docker load < image.tar                                                                                                                                                                                                         1 โจฏ
Loaded image: flask:latest

#And then open it with dive:
sudo dive flask:latest

์ด๊ฒƒ์€ docker ์ด๋ฏธ์ง€์˜ ๋‹ค์–‘ํ•œ ๋ธ”๋กญ์„ ํƒ์ƒ‰ํ•˜๊ณ  ์–ด๋–ค ํŒŒ์ผ์ด ์ˆ˜์ •๋˜์—ˆ๊ฑฐ๋‚˜ ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๋นจ๊ฐ„์ƒ‰์€ ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ณ  ๋…ธ๋ž€์ƒ‰์€ ์ˆ˜์ •๋œ ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํƒญ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋ณด๊ธฐ๋กœ ์ด๋™ํ•˜๊ณ  ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋”๋ฅผ ์ถ•์†Œ/์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

die๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฏธ์ง€์˜ ๋‹ค์–‘ํ•œ ๋‹จ๊ณ„์˜ ์ฝ˜ํ…์ธ ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๊ฐ ๋ ˆ์ด์–ด๋ฅผ ์••์ถ• ํ•ด์ œํ•˜๊ณ  ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฏธ์ง€๊ฐ€ ์••์ถ• ํ•ด์ œ๋œ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ์ด๋ฏธ์ง€์˜ ๋ชจ๋“  ๋ ˆ์ด์–ด๋ฅผ ์••์ถ• ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

tar -xf image.tar
for d in `find * -maxdepth 0 -type d`; do cd $d; tar -xf ./layer.tar; cd ..; done

๋ฉ”๋ชจ๋ฆฌ์—์„œ์˜ ์ž๊ฒฉ ์ฆ๋ช…

ํ˜ธ์ŠคํŠธ ๋‚ด์—์„œ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํ˜ธ์ŠคํŠธ์—์„œ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ps -ef๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ (๋ฃจํŠธ๋กœ) ํ˜ธ์ŠคํŠธ์—์„œ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋คํ”„ํ•˜๊ณ  ์ž๊ฒฉ ์ฆ๋ช…์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๋‹ค์Œ ์˜ˆ์ œ์™€ ๊ฐ™์ด.

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