滥用Docker API | 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套接字。
Docker套接字是Docker守护进程默认监听的套接字,可用于从容器内部或外部(如果配置了)与运行Docker的主机通信。
所有Docker套接字的魔法都是通过Docker API实现的。例如,如果我们想启动一个nginx容器,可以执行以下操作:
创建nginx容器
以下命令使用curl通过Unix套接字向Docker守护进程的/containers/create端点发送{“Image”:“nginx”}负载。这将创建一个基于Nginx的容器并返回其ID。
|
|
启动容器
|
|
如上所述,你也可以让Docker套接字监听TCP端口。
你可以通过版本请求验证它是Docker:
|
|
或使用Docker客户端:
|
|
这基本上相当于进入容器的shell。
使用ps命令获取运行中的容器列表
|
|
进入其中一个容器
|
|
其他命令
是否有已停止的容器?
|
|
主机上拉取了哪些镜像?
|
|
我经常无法让Docker客户端在执行exec命令时正常工作,但你仍然可以使用API在容器中执行代码。下面的示例使用curl通过https(如果启用)与API交互,创建和执行作业,设置变量以接收输出,然后启动exec以获取输出。
使用curl访问API
有时你会看到2376作为TLS端点。我无法使用Docker客户端连接它,但你可以使用curl轻松访问Docker API。
Docker套接字到元数据URL
https://docs.docker.com/engine/api/v1.37/#operation/ContainerExec
以下是访问内部AWS元数据URL并获取输出的示例:
列出容器:
|
|
列出容器中的进程:
|
|
设置并执行作业以访问元数据URL:
|
|
获取输出:
|
|
Docker密钥
相关阅读:https://docs.docker.com/engine/swarm/secrets/
列出密钥(无密钥/未设置swarm)
|
|
列出密钥(存在密钥)
|
|
检查挂载内容
|
|
通过启动exec获取输出
|
|
查看挂载的密钥
|
|
|
|
如果你有密钥,也值得检查服务,以防它们通过环境变量添加密钥。
|
|