一. 什么是CDN, 为什么要绕过CDN
什么是CDN以及CDN加速?
CDN全称是(Content Delivery Network), 即内容分发网络. CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
CDN对网站有什么好处?
首先,开启CDN后的网站,会根据用户所在地的不同访问CDN的节点服务器,并不直接访问源服务器,这样可以减少网站服务器宽带资源,降低服务器压力。这也就是大家都在ping百度,但是不同地区得到的反馈ip不一样的原因。
其次,由于CDN节点的阻挡防护,可以更好的保护员服务器的安全。具体来说,CDN其实是充当了一个替身的角色,无论服务器是渗透还是DD0S攻击,攻击的目标都将是CDN节点,这样一来便间接的保护了网站本身。
为什么我们需要绕过CDN?
对于我们渗透测试者来说,我们在信息收集中重要的一步就是要得到目标服务器主机的真实IP地址,但如果目标服务器部署了CDN服务,那么往往我们直接访问得到的IP只是CDN节点服务器的IP,而不是真实的源服务器的IP地址,这是就需要我们想办法绕过CDN获取源服务器IP。
二. 验证是否存在CDN
1. 多地Ping查询
使用不同区域ping,查看ping的ip结果是否唯一。若不唯一,则目标网站可能存在CDN。
多地ping网站:
2. nslookup
原理同上, 如果返回域名解析对应多个IP地址多半是使用了CDN.
有CDN的示例
无CDN的示例:
3. 使用工具直接查询
参考如下网站
三. 绕过CDN查找真实IP
1. 查询子域名
由于CDN本身也不便宜, 再加上某些企业业务线众多, 所以很多站长可能只会对主站或者流量大的子站点做了 CDN, 而很多小站子站点又跟主站在同一台服务器或者同一个C段内, 此时就可以通过查询子域名对应的 IP 来辅助查找网站的真实IP.
查询子域名的方法就很多了:
- 各种子域名扫描器: subDomainsBrute、Sublist3r等
- Google hack
- 还有某些网站可以进行查询。例如:
https://dnsdb.io/zh-cn/
https://x.threatbook.cn/
2. 利用网站漏洞查询
- 敏感文件泄漏, 比如: phpinfo之类的探针, Github信息泄漏, Apache status和Jboss status敏感信息泄露, 网页源代码泄露, svn信息泄露信、github信息泄露等。
- 若存在web漏洞,服务器主动与我们发起请求连接,我们也能获取目标站点真实ip。例如: XSS盲打、SSRF、命令执行反弹shell等。
- 无论是用社工还是其他手段, 拿到了目标网站管理员在CDN的帐号, 从CDN的配置中找到网站的真实IP
3. 查询历史DNS记录
查询ip与域名绑定的历史记录,可能会发现使用CDN之前的记录。相关查询网站有:
- https://dnsdb.io/zh-cn/ DNS查询
- https://x.threatbook.cn/ 微步在线
- http://toolbar.netcraft.com/site_report?url= 在线域名信息查询
- http://viewdns.info/ DNS、IP等查询
- https://tools.ipip.net/cdn.php CDN查询IP
- http://www.17ce.com/
- https://community.riskiq.com/
- http://www.crimeflare.com/cfssl.html
4. 利用网站返回的内容寻找真实原始IP
如果原始服务器IP也返回了网站的内容,那么可以在网上搜索大量的相关数据。
浏览网站源代码,寻找独特的代码片段。在JavaScript中使用具有访问或标识符参数的第三方服务(例如Google Analytics,reCAPTCHA)是攻击者经常使用的方法。
以下是从HackTheBox网站获取的Google Analytics跟踪代码示例:
ga(’create’,’UA-93577176-1’,’auto’);
可以使用80.http.get.body:参数通过body/source过滤Censys数据,不幸的是,正常的搜索字段有局限性,但你可以在Censys请求研究访问权限,该权限允许你通过Google BigQuery进行更强大的查询。
Shodan是一种类似于Censys的服务,也提供了http.html搜索参数。
搜索示例:https://www.shodan.io/search?query=http.html%3AUA-32023260-1
5. Mx记录或邮件
很多站点都有发送邮件sendmail的功能, 如RSS邮件订阅等. 而且一般的邮件系统很多都是在内部, 没有经过CDN的解析. 查看邮件源码里面就会包含服务器的真实IP.
6. 使用国外主机解析域名
国内很多 CDN 厂商因为各种原因只做了国内的线路, 而针对国外的线路可能几乎没有, 通过国外的一些冷门的DNS或IP去请求目标, 通过国外代理访问就能查看真实IP了, 或者通过国外的DNS解析,可能就能得到真实的IP查询网站:
7. 利用Zgrab绕CDN找真实IP
通过信息收集,缩小扫描范围,确定一个相对小的IP和端口范围(中国?AS号?B段?等)
通过http指纹特征和keyword等做综合判断。可使用工具如下:
zgrab是基于zmap无状态扫描的应用层扫描器,可以自定义数据包,以及ip、domain之间的关联。可用于快速指纹识别爆破等场景。
可参考这篇文章:利用Zgrab绕CDN找真实IP - Levy Hsu
8. 用 Zmap 扫全网
直接Zmap硬扫
可参考这篇文章:简单获取CDN背后网站的真实IP - 安全客 - 有思想的安全新媒体
假如需要找 xiaix.me 网站的真实 IP, 我们首先从 apnic 获取 IP 段, 然后使用 Zmap 的 banner-grab 扫描出来 80 端口开放的主机进行 banner 抓取, 最后在 http-req 中的 Host 写 xiaix.me。
9. 网络空间引擎搜索法
比如 zoomeye、fofa、shodan
通过这些公开的安全搜索引擎爬取得历史快照,主要得一些特征总结如下:
- 特有的http头部(如server类型、版本、cookie等信息)、
- 特定keyword(如title、css、js、url等)、
- 特定的IP段搜索(如fofa支持C段搜索),
有些时候爬取的时候不一定含有上面那些特征,但是我们仍然需要仔细排查。
以fofa为例,只需输入:title:"网站的title关键字"
或者 body:"网站的body特征"
就可以找出fofa收录的有这些关键字的ip域名,很多时候能获取网站的真实ip
10. 利用SSL证书寻找真实原始IP
此方法来自于去年CplusHua表哥在Freebuf公开课《HTTP盲攻击的几种思路》中分享的:
查询网站:
- https://censys.io/
这个网址会将互联网所有的ip进行扫面和连接,以及证书探测。若目标站点有https证书,并且默认虚拟主机配了https证书,我们就可以找所有目标站点是该https证书的站点。443.https.tls.certificate.parsed.extensions.subject_alt_name.dns_names:www.xxx.com
11. F5 LTM 负载均衡解码获取真实内网ip
参考文章: 透过F5获取服务器真实内网IP - ThreatHunter
当服务器使用F5 LTM做负载均衡时, 通过对set-cookie关键字的解码真实ip也可被获取, 例如:Set-Cookie: BIGipServerpool_8.29_8030=487098378.24095.0000, 先把第一小节的十进制数即487098378取出来, 然后将其转为十六进制数1d08880a, 接着从后至前,以此取四位数出来, 也就是0a.88.08.1d, 最后依次把他们转为十进制数10.136.8.29, 也就是最后的真实ip。
12. 利用HTTP标头寻找真实原始IP
借助SecurityTrails这样的平台,任何人都可以在茫茫的大数据搜索到自己的目标,甚至可以通过比较HTTP标头来查找到原始服务器。
特别是当用户拥有一个非常特别的服务器名称与软件名称时,攻击者找到你就变得更容易。
如果要搜索的数据相当多,如上所述,攻击者可以在Censys上组合搜索参数。假设你正在与1500个Web服务器共享你的服务器HTTP标头,这些服务器都发送的是相同的标头参数和值的组合。而且你还使用新的PHP框架发送唯一的HTTP标头(例如:X-Generated-Via:XYZ框架),目前约有400名网站管理员使用了该框架。而最终由三个服务器组成的交集,只需手动操作就可以找到了IP,整个过程只需要几秒钟。
例如,Censys上用于匹配服务器标头的搜索参数是80.http.get.headers.server :,查找由CloudFlare提供服务的网站的参数如下:
80.http.get.headers.server:cloudflare