Python基於代理IP的挖掘與分析

天府雲創發表於2018-01-11

廢話不多說,直入主題。關於代理IP的挖掘與分析,個人的一些分析與總結。

1. 思路

1、獲取代理地址

2、對獲取的代理地址進行驗證,提取出真實可用的代理地址

3、代理指紋的提取與自動化挖掘代理

4、根據IP的相關資訊進行排序:存活時間。存活時間較長的IP一般為固定的IP

5、資料分析與利用

a. 代理IP的各種作用:爬蟲、隱藏真實IP、代理上外網、薅羊毛

b. 情報:IP威脅情報及IP信譽分析

c. 通過真實可用的IP提取分析代理IP的指紋資訊,可作為代理IP分析的指紋特徵。並且在具體工作中可以落地進行代理IP的查詢與分析。

d. 判斷改IP的所有者(政府企事業單位、個人使用者、IDC等)與存活時間;若為政府企事業單位使用者基本上說明該IP被黑客控制時間越長被控制的越久。獲取與整理這些IP,可以進行通報預警與應急響應。

e. 週期性探測,對短時間內出現大量的IP進行資產指紋分析,提取共性,可以用於預警通報

2. 資料爬取與指紋提取 2.1 獲取代理IP

代理IP的獲取可以先利用網上開放的代理IP平臺,這裡面個人推薦兩個:

http://www.xicidaili.com、http://cn-proxy.com(需要梯子)

下面以xicidaili.com為例進行分析。該代理網站的代理型別一共分為四類:國內高匿代理、國內普通代理、國內HTTPS代理、國內HTTP代理。

下面以國內HTTPS代理為例來爬取網站上的代理IP資訊,核心實現python程式碼如下(Python新手,大牛輕噴):

#coding:utf-8 from requests import * import re headers = { "accept":"text/html,application/xhtml+xml,application/xml;", "accept-encoding":"gzip", "accept-language":"zh-cn,zh;q=0.8", "referer":"Mozilla/5.0(compatible;Baiduspider/2.0;+http://www.baidu.com/search/spider.html)", "connection":"keep-alive", "user-agent":"mozilla/5.0(windows NT 6.1;wow64) applewebkit/537.36 (khtml,like gecko)chrome/42.0.2311.90 safari/537.36" } for i in range(1,835): url = 'http://www.xicidaili.com' url = url + '/wn/' url = url + str(i) html = get(url,timeout=3,headers=headers) html.encoding = html.apparent_encoding proxyip = r'(.*)' iplist = re.findall(proxyip,html.text) i = 1 for ip in iplist: ip = (ip.split('')[1]).split('')[0] f = open('./ip.txt','a') print(ip,file=f) if i%5==0: print('\n',file=f) i = i + 1

獲取到的代理IP格式經處理後如下所示:

可以看出爬取出來的代理IP的格式為:IP、埠、代表型別、存活天數、發現日期及時間。下面將這些資訊存入到資料庫中,以方便檢索與查詢。這裡面個人選擇mysql資料庫,將相關的資料匯入到mysql中,共29700條https代理,如下所示:

2.2 驗證可用的代理

驗證代理是否可用的方法比較多,在批量驗證時可以使用python來實現,這裡面驗證代理是否可用的方法為直接使用代理訪問ipip.net,若返回狀態為200,則說明代理可用。反之,則說明不可用。

驗證基於前面已經採集的HTTPS代理:

提取出HTTPS代理的IP、埠,儲存到本地的測試檔案中。測試檔案格式如下:

驗證代理是否可用的python程式碼如下:

#coding:utf-8 from requests import * import re for proxy in open("https.txt"): proxy = proxy.replace('\n','') proxies={"https":proxy} headers = { "Host": "www.ipip.net", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0", "Accept": "*/*", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", "Referer": "https://www.ipip.net/" } url = 'https://www.ipip.net' try: html = get(url,timeout=10,headers=headers,proxies=proxies) if html.status_code == 200: proxy = proxy.split('https://')[1] f = open('./proxyip.txt','a') print(proxy,file=f) except Exception as e: print(e) pass

提取出驗證成功的代理IP地址和埠號,如下所示:

選擇驗證成功的進行測試,成功正常使用。

2.3 代理指紋提取

既然網上這麼多多的代理IP,這些代理IP和埠絕大多數是批量掃描得到的,因此,如果掌握了這些代理的指紋資訊,就可以批量掃描代理的IP和埠了。選擇其中部分代理的IP進行分析,通過nmap與抓包形式分析其指紋資料。這裡隨意選擇一個代理IP地址:58.252.6.165,其代理埠為9000。對其進行資料分析,通過nmap探測到其9000埠對應的服務為MikroTik http proxy,這些資料應該可以作為代理的指紋。

基於Nmap掃描而來的代理指紋

基於HTTP響應提取的代理指紋

指紋提取思路:

本人的思路是直接提取HTTP響應頭部資訊,得到的是這樣的:

看了一下,資料量有點大,一般情況下web服務型別是通過HTTP響應頭部的server欄位來返回的,因此程式碼優化了一下,直接提取出server欄位,程式碼如下:

#coding:utf-8 from requests import * headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0", "Accept": "*/*", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", } for url in open("proxytest.txt"): url = url.split('\n')[0] try: html = get(url,timeout=3,headers=headers) html = html.headers['server'] except Exception as e: pass f = open('./proxyanalysis.txt','a') print(url,html,file=f)

爬取了一段時間,共採集到14000個左右的有效響應,得到如下資料:

對資料進行提取、分析整理出如下代理的指紋資訊(HTTP響應頭部的server欄位):

上述代理指紋資料個人感覺有些不太適合,如Microsoft-IIS、PCSERVER、Apache。這些代理指紋可能需要結合其他指紋資訊。

另外,在網上也找了一些代理伺服器,有興趣的同學可以收集一下以下代理伺服器的指紋資訊:

MicrosoftProxy,Microsoft ISA,WinProxy、WinGate、winRoute、SyGate、CCProxy、SuperProxy

2.4 指紋實戰

既然基於Nmap和基於HTTP響應報文頭部的MikrotikHttpProxy可以作為代理IP的指紋,那麼我們來進行代理指紋的搜尋實戰。網際網路上有很多比較不錯的黑客搜尋引擎,如shodan、fofa、zoomeye等。本文以Fofa使用為例子介紹如果通過搜尋引擎找到代理的IP。

Fofa是白帽匯公司推出的一款基於網路爬蟲而生成的黑客搜尋引擎,上文已經收集整理了很多代理的指紋資訊,通過fofa搜尋代理IP,其搜尋可以使用以下方法:

server:”MikrotikHttpProxy”,探測到44439條結果。

基於fofa搜尋的代理IP

搜尋44439條結果,本來想全部爬取下來,奈何fofa的API需要會員,並且非會員只能看到前5頁。所以只爬取第一頁相關代理IP,爬取後資料如下:

上面是使用Fofa搜尋到的代理IP資訊,有興趣的同學可以自己使用程式碼來實現,下面使用部分代理指紋來搜尋代理裝置:

#coding:utf-8 from requests import * import re for url in open("urllist.txt"): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0", "Accept": "*/*", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", } html = get(url,headers=headers) if 'Mikrotik HttpProxy' or 'squid' or 'App-webs' or 'Tengine' or 'Proxy' in html.headers['Server']: url = url.split('/')[-1] print(url) 3. 資料分析與利用 3.1 埠號分佈

通過對爬取的代理IP和埠來看,其代理埠出現頻率較高的基本上相對比較固定,因此可以對這些代理埠進行分析。這樣的話,後期基於Nmap或開發相應的自動探測產品可以有針對性的探測,不需要所有的埠都探測。當然也可以所有埠都探測,但是這樣效率相對較低,好處就是漏報相對較少。大家在實戰的時候根據自己的情況來選擇。對29700個HTTPS的代理埠進行進行,除去頻率低於100次的,其埠分佈情況如下所示:

代理埠分佈情況

在搜尋代理IP時可以重點搜尋以上出現頻率比較高的埠。

3.2 資料分析

3.2.1 存活較長的IP

通過代理資料庫可以發現裡面有很多代理IP存活天數較長,比較長的有一年左右的,這種存活天數較長的IP一般都為固定的IP,因此需要過濾出這些IP和埠資訊。

這裡面我們把代理庫中存活天數大於100天的過濾出來,過濾後存在881條。

select * from httpsproxy where LiveDayslike '%天' and LiveDays > 100 order by LiveDays desc;

3.2.2 安全分析

這些代理都是存活100天以上的,這些IP基本上都是固定的IP,要麼是公司、企業的,因此對這些IP分析,探測可能是政企單位使用者。這裡分析的思路是探測該IP上面是否有跑相應的網站,若存在網站的話再進行分析網站屬性,若為政府企事業單位。若發現政府企事業單位有IP對外開放代理,一般情況政府企事業單位不會開放代理,這種情況基本上配置問題或者被惡意開放。因些需要提取出這些IP和所屬使用者情況。這些可以作為代理資料分析後的輸出的安全情報。

雲悉作為面向網際網路開放的指紋與資產平臺,其有相應的IP下開放的域名查詢的功能。使用方法為http://yunsee_info.vuln.cn/?type=webip&url=ip,如查詢1.2.3.4下有哪些域名,查詢方法為:

http://yunsee_info.vuln.cn/?type=webip&url=1.2.3.4

返回的是json格式的資料,返回資料格式如下:

這裡面把開放代理超過100天的IP直接匯入,使用python進行批量查詢。

#coding:utf-8 from requests import * import re for ip in open('livedays.txt'): url = 'http://yunsee_info.vuln.cn/?type=webip&url=' url = url + ip html = get(url) html = html.text if '404' not in html: f = open('./ipipip.txt','a') print(ip,html,file=f)

查詢後對其資料進行分析,得到以下資料:

以上這些IP都是在IP代理網站中爬取下來,並且經驗證其上面都有網站跑在上面,並且有的還是政府的站點。並且其存活時間都是100天以上,有的還有3年之久的。選擇其中一個比較有意思的代理站點分享一下:

代理以後,開啟任何網站都會跳轉到其網站上,這個應該是配置不合理導致的。

以上對代理IP的分析只是拋磚引玉,其實還有很多好的挖掘點,如這些代理IP的區域分佈、IP上是否有業務以及業務元件的指紋資訊、IP是否為路由器等。

3.3 IP情報

既然這些IP都是代理的IP,那麼黑客或羊毛黨也可以利用這些代理IP來進行攻擊或薅羊毛,因此這些IP可以作為IP情報/信譽度之一。安全廠商或者情報廠商可以定期將爬取網際網路上的代理IP,將其加入IP情報庫,並定期的更新與維護。做安全對抗在單純網路層防護肯定比應用層防護容易的多,因此代理IP/惡意IP在安全方面個人感覺意義重大。

4. 總結 4.1 我的安全觀

IP是安全裡面很小的分支、而代理IP又是IP裡的分支。單純惡意IP/代理IP可以作為安全裡面的情報之一。未來安全的領域肯定分出現更多細分的領域,在某一個細分的領域精工細作也可以有很好的機遇與發展。

另外,安全是一個多維度、動態的。有的時候不一定非要使用太高大上的東西,真正接地氣、可落地的方法與理念可能比高大上的東西更具有實戰意義。能在網路層防護就不需要到傳輸層,能在傳輸層防護就不需要到應用層防護,能使用簡單指令碼實現的東西就不一定需要機器學習這些高大上的東西。

4.2 致敬freebuf及原創作者

Freebuf是一個比較開放的網際網路安全平臺,上面有很多比較好的原創作者。很多作者以前分享很多較好的議題,因為噴子無情,很多都沒有更新了。在寫原創文章的同時,我的綜合能力也在不斷的提升,回頭看看那些噴子還在到處噴。所以,提升的是自己。希望大家也抱著開放、共享的精神,多多貢獻優質的文章。

在這裡,也祝大家2018新年快樂!

相關文章