绕过CDN查找真实IP方法总结
本文作者:3had0w(贝塔安全实验室-核心成员)
CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。 百度百科
0x01:域名解析过程
- 传统访问:用户访问域名-->解析IP-->访问目标主机
- 简单模式:用户访问域名-->CDN节点-->真实IP-->目标主机
- 360网站卫士:用户访问域名-->CDN节点(云WAF)-->真实IP-->目标主机
注:目前场面上大多数CDN服务商都提供了云WAF的配置选项,内置了多种安全防护策略,可对SQL注入、XSS跨站、Webshell上传、后门隔离保护、命令注入、恶意扫描等攻击行为进行有效拦截。
0x02:CDN配置方法
- 1、将域名的NS记录指向CDN厂商提供的DNS服务器。
- 2、给域名设置一个cname记录,将它指向CDN厂商提供的另一个域名。
0x03:CDN检测方法
利用“全球Ping”快速检测目标网址是否存在CDN,如果得到的IP归属地是某CDN服务商,或者每个地区得到的IP地址都不一样则说明可能存在CDN,可用以下几个网站检测!
https://wepcc.com
http://ping.chinaz.com
https://asm.ca.com/en/ping.php
注:全球Ping有一定机率可以得到目标服务器真实IP地址,因为CDN服务商没有某些地区CDN节点。
0x04:查找真实IP方法
(1) phpinfo等探针找到真实IP
通过l.php、phpinfo.php等探针类文件即可得到真实IP地址,phpinfo.php搜索SERVER_NAME。
(2) 网站根域或子域找到真实IP
大部分CDN服务都是按流量进行收费的,所以一些网站管理员只给重要业务部署CDN,也有很多人忘了给“根域”部署CDN,所以我们可以尽可能的多搜集一些子域名来尝试得到真实IP地址。
注:有时多个子域名可能不会解析到同一台服务器,而是根据公司业务的重要与非重要性将子域名解析在内网或外网的不同服务器中,需要一定的分析能力。
(3) 利用邮件服务器找到真实IP
Web跟Email服务属同服务器的情况下可以通过Email来查询目标真实IP地址,但如果Web跟Email属不同服务器,那么我们通过Email得到的可能只是邮件服务器的IP地址,所以在hosts文件中即使绑定IP后无法访问目标网站也属正常现象。常见发送邮件的功能有:注册用户、找回密码等等。
(4) 域名历史解析记录找到真实IP
查询目标域名历史解析记录可能会找到部署CDN前的解析记录(真实IP地址),可用以下几个网站查询。
https://domain.8aq.net //基于Rapid7 Open Data
https://x.threatbook.cn
https://webiplookup.com
https://viewdns.info/iphistory
https://securitytrails.com/#search
https://toolbar.netcraft.com/site_report
(5) FOFA查询网站标题找到真实IP
利用“FOFA网络空间安全搜索引擎”搜索网站源代码中的title标签内容即可得到真实IP地址。
title="*** ***** – Multi Asset Fund"
(6) Censys查询SSL证书找到真实IP
利用“Censys网络空间搜索引擎”搜索网站的SSL证书及HASH,在https://crt.sh上查找目标网站SSL证书的HASH,然后再用Censys搜索该HASH即可得到真实IP地址。
443.https.tls.certificate.parsed.extensions.subject_alt_name.dns_names:***trade.com
(7) 自建CDN节点服务器找到真实IP
这篇笔记当时没有记录下来,其实就是MS17-010刚出来时很多机器都还没打补丁,批量过程中打了一台别人自建的CDN节点服务器,然后在里边发现很多解析到这边的IP地址,其实这些IP地址就是某些网站的真实IP,所以说这种方法也算是一种思路吧,但是得先拿到这台CDN节点服务器的权限。
注:一些免费或自建CDN流量都不会很多,可以用DDOS攻击将其流量耗尽后即可显示出真实IP地址。
(8) 分析目标C段来简单判断真实IP
这种方法得看目标有多少子域名吧,如果子域够多,且又有多台服务器(同段),找一个没有部署CDN的子域名,然后扫描整个C段查找与目标站Title一致的即可得到它的真实IP地址!
网站域名 |
真实IP地址 |
CDN节点IP地址 |
---|---|---|
111.test.com(目标) |
192.168.1.10 |
8.8.8.8 |
222.test.com |
192.168.1.11 |
9.9.9.9 |
333.test.com |
192.168.1.12 |
没有CDN |
假如目标站111.test.com解析在192.168.1.10,title:90sec社区,通过查询333.test.com这个子域名得到333的真实IP地址192.168.1.12,然后扫描192.168.1.x 整个C段,扫到192.168.1.10这个IP后发现一个title为“90sec社区”的网站,域名也是111.test.com后就能确定192.168.1.10是它的真实IP地址了,虽然这种方法没有实践过,但肯定是有这种情况的,在遇到时可以尝试一下?
(9) 利用目标网站的漏洞找到真实IP
Web漏洞:
XSS、SSRF、命令执行、文件上传等,需要先绕过云WAF的安全防护。
敏感信息泄露:
phpinfo、Apache status和Jboss status敏感信息泄露,网页源代码泄露,SVN、Github信息泄露等。
(10) 通过社工CDN控制台找到真实IP
(11) Zmap全网扫描及F5 LTM解码法
这两种方法都是前辈们写的,个人感觉较为复杂,并没有实践测试过,不知道是否真可行?
注:部署了CDN的网站有必要设置严格访问控制策略,仅允许CDN节点访问网站真实服务器(80端口),这样设置的好处就是即使别人在hosts文件中绑定了真实IP以后仍然无法访问。笔者曾经在一次渗透测试过程中也遇到过类似情况,就是成功绑定了真实IP后,虽然能够正常访问到目标网站,但是仍然没有绕过云WAF,具体情况有点记不太清了,当时没有去细研究这个问题!
- 直播回看:高可用架构入门 —— 腾讯云架构演变及经验
- 【腾讯云的1001种玩法】十分钟轻松搞定云架构之一 :从上云开始
- 【腾讯云的1001种玩法】十分钟轻松搞定云架构之二:更好的网络
- 【腾讯云的1001种玩法】十分钟轻松搞定云架构之三:更大的存储
- Socket学习总结系列(一) -- IM & Socket
- 【腾讯云的1001种玩法】十分钟轻松搞定云架构 之四:替你分心的负载均衡
- 【腾讯云的1001种玩法】十分钟搞定云架构 · 什么是Bucket、什么是Object
- 【腾讯云的1001种玩法】十分钟轻松搞定云架构 · 负载均衡的最佳实践
- 【黑客浅析】像黑客一样思考
- 【腾讯云的1001种玩法】 十分钟轻松搞定云架构 · 负载均衡的几种均衡模式
- ASP.NET Web API的Controller是如何被创建的?
- 【腾讯云的1001种玩法】十分钟轻松搞定云架构:COS的两种上传模式
- 物流行业迎变革,云计算是基础,大数据是关键
- Socket学习总结系列(二) -- CocoaAsyncSocket
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言在不同样本量下的Littles MCAR检验
- PHP10段常用功能代码
- MySQL中group_concat()函数用法总结
- [::-1] 数组中元素反向
- MySQL面试题
- numpy~运算符和Boolean类型变量
- PHP安全基础第一章
- 21 个非常有用的 .htaccess 提示和技巧
- PHP实现图片马赛克效果
- PHP中的类
- PHP获取表单textarea数据中的换行问题
- Numpy根据Bool值挑选数组中元素
- MySQL获取每个分类下面的前三条数据
- windows宿主机如何SSH连接VMware的Linux虚拟机
- np.random.rand均匀分布随机数和np.random.randn正态分布随机数函数使用方法