在做内部扫描的过程中,有些POC带有无回显识别功能时,漏洞扫描发payload的时候会把这个callback地址插入到HTTP报文的任意地方进行发送探测漏洞,时间久了,就发现回显后台中有很多 不知所云 的DNS或者HTTP的log,遇到这种情况并不好排查,往往不了了之。但现在这种情况深入分析是有存在漏洞的风险的,我姑且称其为Pingback漏洞。以下是BH2017相关议题的一些总结。
0x01 明确攻击目标该攻击主要针对前端有负载均衡,并且后端存在一些分析设备的服务,比如一些DNS监控设备、安全网页识别设备、用户行为分析设备等等。
Pingback攻击就是通过发送一些自行构造的payload,payload上携带了我们自己的回显网址,一旦后端设备主动访问了我们的回显地址,那么我们就知道该目标后方有这种疑似的设备,所以就可以深入进行测试,当然,最容易想到的就是SSRF漏洞了,其实还有别的。
大致的原理如下:
0x02 触发手段
触发手段就是将回显地址想尽办法插入到可能被pingback的位置,比如Host,XFF,X-Client-IP以及其他的HTTP扩展头部。大致有以下姿势:
(1)使用无效的Host字段
GET / HTTP/1.1 Host: payload-site.net Connection: close发包时,往正常地址端口发送,但是HTTP协议中的HOST字段插入我们的payload。
在nginx配置中,如果server name不匹配是会报错的,这里运用错误的Host引发报错,猜测可能后端一些error log分析系统会自动对payload进行探测,从而发现漏洞。
(2)Fuzz HOST头
GET http://internalwebsite.mil/ HTTP/1.1 Host: xxxxxxx.mil Connection: close在发包时,Host字段填写正常的值,但是GET后面的PATH填写完整的URL,这样就覆盖了Host头,会引发后端设备的一些异常,从而请求错误的地址。
或者使用@来进一步混淆:
GET / HTTP/1.1 Host: incapsulaclient.net:80@burpcollaborator.net Connection: close这里用@符号进行跳转,很熟悉的trick。
(3)Fuzz Path部分
发包的时候将@符号应用在path部分,包类似于这样:
GET @burpcollaborator.net/ HTTP/1.1 Host: newrelic.com Connection: close或者直接在path中添加我们的payload地址:
GET xyz.burpcollaborator.net:80/bar HTTP/1.1 Host: demo.globaleaks.org Connection: close(4)Fuzz一些Http的头部
这些头部有的是原生协议里规定的,更多的是X开头的扩展头部,感觉这个议题作者就是挖facebook或者yahoo的漏洞时发现的,因为我之前也见过这些扩展头:
比如:X-Forwarded-For, True-Client-IP, Referer, X-WAP-Profile。此外我还从shodan上找到一些,这些头部的特点就是value部分直接填写的是URL,如果后端设备只是用来记录log还好说,但是要求客户端传一个URL,本身就遐想无限了。这里还有如Via, Forwarded, Contact, From等等。
0x03 漏洞利用这种pingback漏洞,本质和无回显SSRF区别并不大,所以利用起来比较困难。相对于直接挖掘出的SSRF,好歹也能根据延时或者报错信息来判断端口是否开放,从而打开攻击面,但是pingback很多情况下并不能做到这一点。因此这里议题作者提出,可以“远程攻击客户端”。啥意思呢?就是说有些后端pingback功能的程序很可能用的一些诸如PhantomJS的一些渲染程序,我们就可以构造恶意页面触发RCE漏洞。
如果有回显,那就能更好的判断后端的反代或者程序的行为,修正攻击思路即可。
参考Blackhat 2017中议题《Exploiting-HTTPs-Hidden-Attack-Surface》:
https://www.blackhat.com/us-17/briefings/schedule/#cracking-the-lens-targeting-https-hidden-attack-surface-6387