前段时间在某次护网中发现了某个私有docker仓库存在未授权访问,这引起了我的好奇。带着疑问进行了简单的研究。
仓库列表
遇到的仓库是开放了http的5000端口,访问http://xxx/v2/_catalog
镜像标签
默认的镜像标签都是latest,不排除开发者故意设置其他的标签。如使用版本号作为标签。
这里可以使用他的api接口进行查询某一个镜像的所有标签,比如我这里查询sopplus镜像,可以看到存在两个标签。
镜像拉取
这里交给docker进行pull。因为目标仓库使用了http协议,会被docker认为是不安全的。
这里可以修改 /etc/docker/daemon.json 文件(没有可以创建)内容如下:
对docker服务进行重启
sudo systemctl restart docker ,到这里就可以进行拉取镜像了。
镜像上传
可以本地制作恶意的镜像或添加后门代码到镜像中,使用tag给本地的镜像打个标签。
命令为:docker tag <local_images> <remote_images>:<tag>
打完标签就可对该镜像进行push操作了,命令如下:
对上传进行进行验证
使用api接口进行验证,是否真正的push上去了。使用如下接口进行访问
http://xxx/v2/<images>/tags/list
可以看到已经成功上传了我修改后镜像tag
利用扩展
缺点:
由于对指定镜像投毒具有缓慢性,不清楚什么时候进行pull操作也有可能会push新的版本。
即使投毒成功也无法及时有效的知道镜像被部署到什么服务器中。
思路:
如下显示的镜像中存在基础镜像和编译镜像
可以考虑如底层镜像centos中添加二进制后门,定期向指定服务器回传等操作。
还可以考虑如maven 编译镜像中添加后门程序,在正常编译程序的同时向正常代码中增加backdoor代码等。
······