Python實現(xiàn)Web指紋識別實例
web主流的識別方式
在當今的Web安全行業(yè)中,識別目標網(wǎng)站的指紋是滲透測試的常見第一步。指紋識別的目的是了解目標網(wǎng)站所使用的技術棧和框架,從而進一步根據(jù)目標框架進行針對性的安全測試,指紋識別的原理其實很簡單,目前主流的識別方式有下面這幾種。
- 識別特定網(wǎng)頁中的關鍵字,比對關鍵字識別框架:這種方式通過在目標網(wǎng)頁的HTML、CSS、JavaScript代碼中搜索特定的關鍵字或標識,比對這些關鍵字與已知框架的特征進行識別。例如,如果在網(wǎng)頁中發(fā)現(xiàn)了特定的JavaScript函數(shù)、CSS類名或HTML標簽,可以推斷目標網(wǎng)站所使用的框架或庫,如jQuery、AngularJS等。
- 通過計算特定的相對獨立頁面的哈希值,比對實現(xiàn)鑒別:這種方式將目標網(wǎng)頁的內(nèi)容進行哈希計算,生成一個唯一的哈希值,并與已知框架的頁面哈希值進行比對。如果目標網(wǎng)頁的哈希值與某個框架的哈希值匹配,則可以推斷目標網(wǎng)站所使用的框架。這種方法適用于那些在不同頁面間保持相對穩(wěn)定的框架,例如單頁應用(SPA)。
- 通過指定URL的TAG模式,鑒別目標容器類型:這種方式通過分析目標網(wǎng)站的URL結(jié)構或特定的URL參數(shù),來推斷目標網(wǎng)站所使用的容器類型或框架。例如,如果URL中包含特定的路徑或參數(shù),可以推斷目標網(wǎng)站可能是基于某個特定容器,如WordPress、Drupal等。這種方式常用于識別內(nèi)容管理系統(tǒng)(CMS)或其他特定的應用程序。
這些指紋識別方式都是通過分析目標網(wǎng)站的特定特征或行為,從中推斷所使用的框架或技術。它們可以幫助滲透測試人員了解目標網(wǎng)站的技術棧和框架,從而進行針對性的安全測試和漏洞掃描。本節(jié)內(nèi)容中我們將采用第二種方式通過哈希鑒定來確定目標指紋信息,此種方法需要有完善的特征庫,這些庫我們可以自行尋找制作,也可以使用已有的庫經(jīng)過轉(zhuǎn)換后獲取。
讀取到該目標網(wǎng)站的標題信息
在實現(xiàn)指紋識別之前,我們先要嘗試讀取到該目標網(wǎng)站的標題信息,該功能實現(xiàn)非常簡單,只需要讀入頁面,并依次取出所需要的"Date","Server","X-Powered-By","title"字段即可,由于代碼較為簡單此處就直接放出代碼部分。
import re,socket,threading,requests import argparse header = {'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) LySharkTools'} def GetIPAddress(domain): try: url = str(domain.split("http://")[1]) sock = socket.getaddrinfo(url,None) result = re.findall("(?:[0-9]{1,3}\.){3}[0-9]{1,3}", str(sock[0][4])) return str(result[0]) except Exception: pass def GetServerTitle(url): try: address = GetIPAddress(url) Respon = requests.get(url=url,headers=header,timeout=5) print("--" * 80) print(url + " ",end="") print(address + " ", end="") if Respon.status_code == 200: RequestBody = [item for item in Respon.headers] for item in ["Date","Server","X-Powered-By"]: if item in RequestBody: print(Respon.headers[item] + " ",end="") title = re.findall("<title>.*</title>", Respon.content.decode("utf-8")) print(title) except Exception: pass if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("-f","--file",dest="file",help="") args = parser.parse_args() # 使用方法: main.py -f url.log if args.file: fp = open(args.file,"r") for item in fp.readlines(): url = item.replace("\n","") thread = threading.Thread(target=GetServerTitle,args=(url,)) thread.start() else: parser.print_help()
這段代碼在運行時讀者需要準備好需要獲取的網(wǎng)站列表,并每行一列放入url.log文件中,通過運行如下圖所示的命令即可依次讀取到這些網(wǎng)站的服務器信息;
調(diào)用MD5算法計算出該頁面的HASH值并比對
我們繼續(xù)實現(xiàn)指紋識別功能,首先利用Requests庫將目標頁面讀入到字符串中,然后調(diào)用MD5算法計算出該頁面的HASH值并比對,由于特定框架中總是有些頁面不會變動,我們則去校驗這些頁面的HASH值,即可實現(xiàn)對框架的識別,代碼很簡單這里就直接放出源代碼。
import requests import os,sys,hashlib import argparse headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) LySharkTools'} def CheckFinger(url,flag,keyworld): if flag == 0: ret = requests.get(url=url,headers=headers,timeout=1) text = ret.text md5=hashlib.md5() md5.update(text.encode('utf-8')) print("目標網(wǎng)頁Hash值: {}".format(md5.hexdigest())) else: fp = open(keyworld,"r") for i in fp.readlines(): path = url + eval(i.replace("\n", ""))["Path"] hash = eval(i.replace("\n", ""))["Hash"] web = eval(i.replace("\n", ""))["WebServer"] ret = requests.get(url=path, headers=headers, timeout=1) if ret.status_code == 200: text = ret.text md5 = hashlib.md5() md5.update(text.encode('utf-8')) if md5.hexdigest() == hash: print("目標Hash:{} CMS頁面類型:{} ".format(hash,web)) else: continue if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--mode",dest="mode",help="設置檢查類型 [check/get]") parser.add_argument("-u","--url",dest="url",help="指定需要檢測的網(wǎng)站地址") parser.add_argument("-f","--file",dest="file",help="指定字典數(shù)據(jù)庫 data.json") args = parser.parse_args() if args.mode == "get" and args.url: CheckFinger(args.url,0,args.file) # 檢測目標容器類型: main.py --mode=check -u https://www.xxx.com -f data.json elif args.mode == "check" and args.url and args.file: CheckFinger(args.url,1,args.file) else: parser.print_help()
這段代碼通過使用get方法可獲取到特定頁面的hash值,例如獲取www.lyshark.com網(wǎng)站特定路徑的hash值,則可以執(zhí)行如下命令;
當獲取到這些特征后,我們就可以新建database.db文件,并將這些數(shù)據(jù)保存為特定的格式,如下所示;
{"Path":"/about/index.html","Hash": "9e69dd111c6cc873a1f915ca1a331b06","WebServer":"hexo"}
{"Path":"/index.php","Hash": "2457dd111c6cc32461f915ca17789b06","WebServer":"typecho"}
{"Path":"/index.html","Hash": "7530893af83150dc07461f4bc4cc0de6","WebServer":"oss"}
當特征庫完整時,即可使用-f指定特征文件,循環(huán)獲取是否匹配特征,從而判斷web容器使用了那種容器。
以上就是 Python 實現(xiàn)Web指紋識別的詳細內(nèi)容,更多關于 Python Web指紋識別的資料請關注腳本之家其它相關文章!