Python 实现Web指纹识别

在当今的Web安全行业中,识别目标网站的指纹是渗透测试的常见第一步。指纹识别的目的是了解目标网站所使用的技术栈和框架,从而进一步根据目标框架进行针对性的安全测试,指纹识别的原理其实很简单,目前主流的识别方式有下面这几种。

  • 识别特定网页中的关键字,比对关键字识别框架:这种方式通过在目标网页的HTMLCSSJavaScript代码中搜索特定的关键字或标识,比对这些关键字与已知框架的特征进行识别。例如,如果在网页中发现了特定的JavaScript函数、CSS类名或HTML标签,可以推断目标网站所使用的框架或库,如jQueryAngularJS等。
  • 通过计算特定的相对独立页面的哈希值,比对实现鉴别:这种方式将目标网页的内容进行哈希计算,生成一个唯一的哈希值,并与已知框架的页面哈希值进行比对。如果目标网页的哈希值与某个框架的哈希值匹配,则可以推断目标网站所使用的框架。这种方法适用于那些在不同页面间保持相对稳定的框架,例如单页应用(SPA)。
  • 通过指定URL的TAG模式,鉴别目标容器类型:这种方式通过分析目标网站的URL结构或特定的URL参数,来推断目标网站所使用的容器类型或框架。例如,如果URL中包含特定的路径或参数,可以推断目标网站可能是基于某个特定容器,如WordPressDrupal等。这种方式常用于识别内容管理系统(CMS)或其他特定的应用程序。

这些指纹识别方式都是通过分析目标网站的特定特征或行为,从中推断所使用的框架或技术。它们可以帮助渗透测试人员了解目标网站的技术栈和框架,从而进行针对性的安全测试和漏洞扫描。本节内容中我们将采用第二种方式通过哈希鉴定来确定目标指纹信息,此种方法需要有完善的特征库,这些库我们可以自行寻找制作,也可以使用已有的库经过转换后获取。

在实现指纹识别之前,我们先要尝试读取到该目标网站的标题信息,该功能实现非常简单,只需要读入页面,并依次取出所需要的"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("//")[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()

这段代码在运行时读者需要准备好需要获取的网站列表,并每行一列放入url.log文件中,通过运行如下图所示的命令即可依次读取到这些网站的服务器信息;

我们继续实现指纹识别功能,首先利用Requests库将目标页面读入到字符串中,然后调用MD5算法计算出该页面的HASH值并比对,由于特定框架中总是有些页面不会变动,我们则去校验这些页面的HASH值,即可实现对框架的识别,代码很简单这里就直接放出源代码。

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("目标网页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="指定需要检测的网站地址")
    parser.add_argument("-f","--file",dest="file",help="指定字典数据库 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网站特定路径的hash值,则可以执行如下命令;

当获取到这些特征后,我们就可以新建database.db文件,并将这些数据保存为特定的格式,如下所示;

{"Path":"/about/index.html","Hash": "9e69dd111c6cc873a1f915ca1a331b06","WebServer":"hexo"}
{"Path":"/index.php","Hash": "2457dd111c6cc32461f915ca17789b06","WebServer":"typecho"}
{"Path":"/index.html","Hash": "7530893af83150dc07461f4bc4cc0de6","WebServer":"oss"}

当特征库完整时,即可使用-f指定特征文件,循环获取是否匹配特征,从而判断web容器使用了那种容器。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于Python指纹识别算法实现需要使用一些图像处理和机器学习的库,例如OpenCV和scikit-learn。以下是一个简单的指纹识别算法实现的步骤: 1. 预处理指纹图像,包括去噪、增强和细化等操作。 ```python import cv2 # 读取指纹图像 img = cv2.imread('fingerprint.png', 0) # 去噪 img = cv2.medianBlur(img, 5) # 增强 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) img = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) # 细化 img = cv2.ximgproc.thinning(img) ``` 2. 提取指纹特征,例如使用方向梯度直方图(HOG)算法。 ```python from skimage.feature import hog # 提取HOG特征 fd, hog_image = hog(img, orientations=8, pixels_per_cell=(16, 16), cells_per_block=(1, 1), visualize=True, multichannel=False) # 显示HOG特征图像 cv2.imshow('HOG Image', hog_image) cv2.waitKey(0) ``` 3. 训练分类器,例如使用支持向量机(SVM)算法。 ```python from sklearn import svm from sklearn.model_selection import train_test_split # 读取训练数据和标签 X = np.loadtxt('features.txt') y = np.loadtxt('labels.txt') # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) # 训练SVM分类器 clf = svm.SVC(kernel='linear', C=1.0) clf.fit(X_train, y_train) # 在测试集上测试分类器性能 accuracy = clf.score(X_test, y_test) print('Accuracy:', accuracy) ``` 4. 对新的指纹图像进行识别。 ```python # 对新的指纹图像提取HOG特征 fd = hog(new_img, orientations=8, pixels_per_cell=(16, 16), cells_per_block=(1, 1), visualize=False, multichannel=False) # 使用训练好的SVM分类器进行识别 label = clf.predict(fd.reshape(1, -1)) print('Label:', label) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码云笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值