利用Python對網(wǎng)站是否使用CDN進(jìn)行“粗暴”的判斷

什么是CDN?

CDN全稱Content Delivery Network即內(nèi)容分發(fā)網(wǎng)絡(luò)野瘦。
其簡單說來就是為服務(wù)器建立一個緩存機(jī)制,它分布在各地不同的服務(wù)器中,當(dāng)我們?nèi)ピL問使用了CDN的服務(wù)器域名的時候忘嫉,它會根據(jù)我們的IP地址,選擇離我們最近的CDN服務(wù)器案腺,為我們提供更為快速的訪問體驗庆冕。
同時他也能隱藏服務(wù)器的真實IP,提升攻擊門檻劈榨。

如何判斷CDN访递?

網(wǎng)上其實也有很多關(guān)于如何判斷對方網(wǎng)站是否使用了CDN的方法,比如nslookup,或者dig,或者ping,再或者收集一份CDN字典(注:很多CDN再HTTP的返回頭中都有標(biāo)識同辣,只要你夠肝拷姿,你就可以收集整理很大一部分的CDN標(biāo)識字典)。
當(dāng)然我覺得判斷CDN最有效的方式其實還是使用全球PING旱函,根據(jù)響應(yīng)IP來進(jìn)行判斷响巢。但是我沒有這么多服務(wù)器,同時也不想去抓網(wǎng)站API接口來進(jìn)行判斷 :)

那么我是如何對CDN進(jìn)行粗暴的判斷的呢棒妨?

一個例子
我們會經(jīng)常使用socket.getaddrinfo[host,port]這種方式去獲取網(wǎng)站的IP

import socket
addr = socket.getaddrinfo('www.baidu.com','http')[0][4][0]
print(addr)

我只是個栗子

另一個例子
那么問題來了踪古,如果我不指定port,我將其設(shè)置為None券腔,這個時候伏穆,神奇的就來了,如果目標(biāo)站點使用了CDN的話纷纫,那么getaddrinfo就會返回多個IP枕扫。

import socket

ip_list = []
addrs = socket.getaddrinfo('www.baidu.com', None)
for item in addrs:
    if item[4][0] not in ip_list:
        ip_list.append(item[4][0])
print(ip_list)

另一個栗子

最后
所以我的“粗暴”判斷方式就是利用返回的IP數(shù)量來進(jìn)行判斷。(注:誤報肯定是有的)

import socket
from threading import Thread, Semaphore

sm = Semaphore(20)
timeout = 5.0
# 超時判斷
socket.setdefaulttimeout(timeout)


class ThreadWithReturnValue(Thread):
    def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None):
        Thread.__init__(self, group, target, name, args, kwargs, daemon=daemon)
        self._return = None

    def run(self):
        if self._target is not None:
                self._return = self._target(*self._args,**self._kwargs)

    def join(self):
        Thread.join(self)
        return self._return


def get_ip_list(domain):  # 獲取域名解析出的IP列表
    dict = {}
    with sm:
        try:
            addrs = socket.getaddrinfo(domain, None)
            for item in addrs:
                if item[4][0] in dict:
                    dict.get(domain).append(str(item[4][0]))
                else:
                    dict.setdefault(domain, []).append(str(item[4][0]))
            # print('[*] Url: {} IP: {}'.format(domain, dict[domain][0]))
        except Exception as e:
            print('[-] Error: {} info: {}'.format(domain, e))
            pass
        except socket.timeout as e:
            print('[-] {} time out'.format(domain))
            pass
    return dict


def open_url_txt(filename):
    url_list = []
    with open(filename, 'r') as f:
        for l in f:
            url_list.append(l.strip())
    return url_list


def save_info(url, ip, key):
    if key == 1:
        with open('url_ip.csv', 'a+') as f:
            url_info = url + ',' + ip + '\n'
            f.write(url_info)

    else:
        with open('error_info.txt', 'a+') as f:
            f.write(url + ' ' + ','.join(ip) + '\n')



if __name__ == '__main__':
    url_list = open_url_txt('url_list.txt')
    thread_list = []
    for url in url_list:
        t = ThreadWithReturnValue(target=get_ip_list, args=(url,))
        thread_list.append(t)
        t.start()
    for t in thread_list:
        ip = t.join()
        if ip:
            for key in ip:
                if len(ip[key]) > 1:
                    print('[-] The Url: {} Maybe Exist CDN'.format(key))
                    save_info(key, ip[key], 0)
                else:
                    print('[*] Url:{} IP:{}'.format(key, ip[key][0]))
                    save_info(key, ip[key][0], 1)
    print('[*] End Scanner')
運行中
完成掃描的結(jié)果
疑似CDN的保存結(jié)果

最后的最后
我為什么要寫這樣一個腳本辱魁?其實不論是護(hù)網(wǎng)還是挖掘SRC铡原,我們都會面臨大量的域名偷厦,其中很大一部分都是部署了CDN的,如果我們盲目的使用端口掃描等工具的時候燕刻,會浪費我們大量的時間只泼。并且我最近在寫一個自己的信息收集框架,所以也算是為自己后面的框架寫測試demo吧卵洗!:)
gayhub傳送點:
https://github.com/HoldOnToYourHeart/qf_scan/blob/master/cdn_judge.py

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末请唱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子过蹂,更是在濱河造成了極大的恐慌十绑,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酷勺,死亡現(xiàn)場離奇詭異本橙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)脆诉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門甚亭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人击胜,你說我怎么就攤上這事亏狰。” “怎么了偶摔?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵暇唾,是天一觀的道長。 經(jīng)常有香客問我辰斋,道長策州,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任宫仗,我火速辦了婚禮够挂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锰什。我一直安慰自己,他們只是感情好丁逝,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布汁胆。 她就那樣靜靜地躺著,像睡著了一般霜幼。 火紅的嫁衣襯著肌膚如雪嫩码。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天罪既,我揣著相機(jī)與錄音铸题,去河邊找鬼铡恕。 笑死,一個胖子當(dāng)著我的面吹牛丢间,可吹牛的內(nèi)容都是我干的探熔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼烘挫,長吁一口氣:“原來是場噩夢啊……” “哼诀艰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饮六,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤其垄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后卤橄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绿满,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年窟扑,在試婚紗的時候發(fā)現(xiàn)自己被綠了喇颁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡辜膝,死狀恐怖无牵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厂抖,我是刑警寧澤茎毁,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站忱辅,受9級特大地震影響七蜘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜墙懂,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一橡卤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧损搬,春花似錦碧库、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至颅悉,卻和暖如春沽瞭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剩瓶。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工驹溃, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留城丧,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓豌鹤,卻偏偏與公主長得像亡哄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子傍药,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355