滥用Docker API | Socket
关于滥用开放Docker socket的说明
本文不涉及从Docker容器中逃逸的内容。
端口:通常为2375和2376,但可以是任何端口。
参考链接:
- https://blog.sourcerer.io/a-crash-course-on-docker-learn-to-swim-with-the-big-fish-6ff25e8958b0
- https://www.slideshare.net/BorgHan/hacking-docker-the-easy-way
- https://blog.secureideas.com/2018/05/escaping-the-whale-things-you-probably-shouldnt-do-with-docker-part-1.html
- https://blog.secureideas.com/2018/08/escaping-the-whale-things-you-probably-shouldnt-do-with-docker-part-2.html
- https://infoslack.com/devops/exploring-docker-remote-api
- https://www.blackhat.com/docs/us-17/thursday/us-17-Cherny-Well-That-Escalated-Quickly-How-Abusing-The-Docker-API-Led-To-Remote-Code-Execution-Same-Origin-Bypass-And-Persistence_wp.pdf
- https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/
- https://cert.litnet.lt/2016/11/owning-system-through-an-exposed-docker-engine/
- https://medium.com/@riccardo.ancarani94/attacking-docker-exposed-api-3e01ffc3c124
- https://www.exploit-db.com/exploits/42356
- https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/linux/http/docker_daemon_tcp.rb
- http://blog.nibblesec.org/2014/09/abusing-dockers-remote-apis.html
- https://www.prodefence.org/knock-knock-docker-will-you-let-me-in-open-api-abuse-in-docker-containers/
- https://blog.ropnop.com/plundering-docker-images/
启用Docker socket(创建练习环境)
https://success.docker.com/article/how-do-i-enable-the-remote-api-for-dockerd
暴露Docker API | socket本质上相当于授予系统上任何容器的root权限。
守护进程默认监听unix:///var/run/docker.sock,但您可以将Docker绑定到其他主机/端口或Unix socket。
Docker socket是Docker守护进程默认监听的socket,可用于从容器内部与守护进程通信,或者如果配置了,也可以从容器外部与运行Docker的主机通信。
所有Docker socket的魔法都是通过Docker API实现的。例如,如果我们想启动一个nginx容器,我们会执行以下操作:
创建nginx容器
以下命令使用curl通过Unix socket将{“Image”:“nginx”}负载发送到Docker守护进程的/containers/create端点。这将创建一个基于Nginx的容器并返回其ID。
|
|
启动容器
|
|
如上所述,您也可以让Docker socket监听TCP端口。
您可以通过版本请求验证它是Docker:
|
|
或使用Docker客户端:
|
|
这基本上是一个进入容器的shell。
使用ps命令获取运行中的容器列表
|
|
进入其中一个容器执行命令
|
|
其他命令
是否有停止的容器?
|
|
主机上拉取了哪些镜像?
|
|
我经常无法让Docker客户端在执行命令时正常工作,但您仍然可以使用API在容器中执行代码。下面的示例使用curl通过https(如果启用)与API交互。创建和执行作业,设置变量以接收输出,然后启动执行以获取输出。
使用curl访问API
有时您会看到2376端口用于TLS端点。我无法使用Docker客户端连接到它,但您可以使用curl轻松访问Docker API。
Docker socket到元数据URL
https://docs.docker.com/engine/api/v1.37/#operation/ContainerExec
以下是访问内部AWS元数据URL并获取输出的示例:
列出容器:
|
|
列出容器中的进程:
|
|
设置并执行作业以访问元数据URL:
|
|
获取输出:
|
|
Docker secrets
相关阅读:https://docs.docker.com/engine/swarm/secrets/
列出secrets(没有secrets/swarm未设置)
|
|
列出secrets(存在secrets)
|
|
检查挂载的内容
|
|
通过启动exec获取输出
|
|
查看挂载的secret
|
|
|
|
如果您有secrets,还值得检查服务,以防它们通过环境变量添加secrets。
|
|