判断CDN的方法有很多,有根据socket探测返回ip数量进行判断、nslooup进行判断。
但是我比较喜欢用多地ping来判断。用国内、海外的服务器去ping域名,看返回的ip是否相同,如果不相同那么就是存在CDN了。
思路导图
例如:
www.kingsoft.com 有cdn
ffbebbs.kingsoft.com 无cdn
https://www.wepcc.com/ 这个网站速度应该会快很多,该网站的规律是如下图所示,先获取所有节点的hash
然后通过hash去对应服务器进行域名的ping获得ip值
代码实现
获取节点的所有hash
func get_hash(i string, wg *sync.WaitGroup) { //获取服务器的hash
defer wg.Done()
//i := "ffbebbs.kingsoft.com"
resp, err := http.PostForm("https://www.wepcc.com/", url.Values{"host": {i}, "node": {"2,3,6"}})
if err != nil {
fmt.Printf("get failed, err:%vn", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("read from resp.Body failed, err:%vn", err)
return
}
//fmt.Print(string(body))
reg := regexp.MustCompile(`<tr class="item" >`)
if reg == nil {
fmt.Println("MustCompile err")
return
}
//提取关键信息
result := reg.FindAllStringSubmatch(string(body), -1)
//fmt.Println(result)
//过滤<></>
var a []string
for _, text := range result {
a = append(a, text[1])
//fmt.Println(text[1])
}
//fmt.Println(a)
check_ping(i, a)
}
利用上一步中的hash进行cdn的探测,有时候服务器不一定能ping出来ip,还会无响应等状态,所以比较的时候要判断好
func check_ping(i string, a []string) { //利用各地的服务器ip节点去进行ping,进行比较
var ip []string
for _, b := range a {
resp, err := http.PostForm("https://www.wepcc.com/check-ping.html", url.Values{"host": {i}, "node": {b}})
if err != nil {
fmt.Printf("get failed, err:%vn", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("read from resp.Body failed, err:%vn", err)
return
}
//var data[] string
//fmt.Println(string(body))
//c, err := regexp.MatchString("((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}", string(body))
if strings.Index(string(body), "ipAddress") > 0 { //如果服务器报错,就不会存在ipAddress的字段
c := regexp.MustCompile("((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}").FindAllStringSubmatch(string(body), -1)
ip = append(ip, c[0][0])
}
}
b := 1
if len(ip) > 0 { //ip长度大于0再进行比较
//fmt.Print(len(ip), " ", i)
for a := 1; a < len(ip); a++ {
if ip[0] != ip[a] {
b = 0
break
}
}
}
if b == 1 {
fmt.Printf("[+]no cdn: %-30s %10sn", i, ip[0])
}
// } else {
// fmt.Printf("[-]have cdn: %-20sn", i)
// }
}
效果
准确率是百分百的,就是速度慢了一点,但是其实也还行。
参考链接
https://github.com/AuFeng111/go_cdn
https://www.yuque.com/aufeng/aufeng_good/gq2dd5
原文始发于微信公众号(巢安实验室):批量域名筛查CDN
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论