绕过CDN找到源站的思路

Saturday, October 28, 2017

绕过CDN的思路

网上有很多绕过CDN的思路,但是存在很多问题,以下是收集并总结的思路。 站在站长的角度,不可能每个站都会用上CDN。 站在DNS服务商的角度,历史解析记录可能不受CDN服务商控制。 站在CDN服务商的角度,提供CDN服务的区域有限制,CDN流量有限制。

DNS历史解析

https://dnshistory.org/ http://whoisrequest.com/history/ https://completedns.com/dns-history/ http://dnstrails.com/ https://who.is/domain-history/ http://research.domaintools.com/research/hosting-history/ http://site.ip138.com/ http://viewdns.info/iphistory/

通过大量DNS查漏

查询冷门的DNS的解析。或者多地Ping

从目标服务器入手

被动获取

让目标服务器主动链接我们的服务器,获取来源IP

  • SSRF
  • 服务器主动发送Mail,获得请求IP
  • RSS内带有的IP

服务器信息

  • 探针文件
  • 服务器日志文件
  • 错误信息

旁站

  • 查找子域名或者父域名对应IP
  • 查非子域名旁站
  • 通过搜索引擎查找公网上的相同站点(开发环境,备份站点等)
  • MX、TXT记录

对比全网banner

获取目标站点的banner,在全网搜索引擎搜索,也可以使用AQUATONE,在Shodan上搜索相同指纹站点。 可以通过互联网络信息中心的IP数据,筛选目标地区IP,遍历Web服务的banner用来对比CDN站的banner,可以确定源IP。

该方法也能用于寻找内网服务器IP与域名的对应关系

import requests
import bs4
import lxml
from multiprocessing.dummy import Pool
requests.packages.urllib3.disable_warnings()
global c
def demo(ip_host):
    # 计数器
    global c
    headers = {'Host': ip_host[1],
               'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}
    try:
        r=requests.get(ip_host[0],headers=headersverify=Fasle)
        if len(r.text) > 0:
            try:
                t = bs4.BeautifulSoup(r.text,'lxml').find("title").string
            except:
                t = "notitle"
            print(ip_host[0]," mkdd1211 ",ip_host[1]," mkdd1211 ",len(r.text)," mkdd1211 ",t)  # 打印出来放在exel,mkdd1211用来替换成分列符号
    except:
        pass
    c=c-1
    if c%1000==0:  # 这个1000表示每1000次打印一下当前剩余的请求,便于你知道还有多久跑完,可以根据总请求调整
        print(c)

def make_payload(ips,hosts):
    payload=[]
    for ip in ips:
        for host in hosts:
            payload.append(("https://"+ip,host))
            payload.append(("http://"+ip,host))
    return payload

def make_payload_c(ips_c,hosts):
    payload=[]
    u = []
    for i in range(256):
        for ip in ips_c:
            u.append(ip+"."+str(i))
    for ip in u:
        for host in hosts:
            payload.append(("https://"+ip,host))
            payload.append(("http://"+ip,host))
    return payload

# ips=["1.1.1.1","2.2.2.2"] 
# d=make_payload(ips,hosts) #可以先用ip跑一下,没有收获选择跑C段

ipc = ["1.1.1","2.2.2"]
hosts=["a.huoxian.cn","b.huoxian.cn","c.huoxian.cn"]
d=make_payload_c(ipc,hosts)

c=len(d)
print(len(d))
with Pool(200) as p:
    p.map(demo,d)

CDN服务商

  • 入侵CDN服务商
  • 根据CDN解析特性获取源IP(如www.crimeflare.com)
  • 耗尽CDN服务流量,暴露真实IP

F5 LTM

F5 LTM解码法 当服务器使用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。

网络安全CDN

硬件维修笔记

Verizon FIOS-G1100 获取ROOT权限