Python 实现Web容器指纹识别

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 当今的Web安全行业在进行渗透测试时普遍第一步就是去识别目标网站的指纹,从而进一步根据目标框架进行针对性的安全测试,指纹识别的原理其实很简单,目前主流的识别方式有下面这几种。

当今的Web安全行业在进行渗透测试时普遍第一步就是去识别目标网站的指纹,从而进一步根据目标框架进行针对性的安全测试,指纹识别的原理其实很简单,目前主流的识别方式有下面这几种。

  • 1.识别特定网页中的关键字,比对关键字识别框架.
  • 2.通过计算特定的相对独立的页面的Hash值,比对实现鉴别.
  • 3.通过指定URL的TAG模式,鉴别目标容器类型.

以上的三种模式就是常见的指纹识别工具的工作原理,这里我就给大家演示第二种方式,HASH枚举。

首先在识别网站指纹之前,先要尝试读取到该目标网站的标题信息,该功能实现非常简单,只需要读入页面,并去除我们所需要的"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 Banner():
    print("  _          ____  _                _    ")
    print(" | |   _   _/ ___|| |__   __ _ _ __| | __")
    print(" | |  | | | \___ \| '_ \ / _` | '__| |/ /")
    print(" | |__| |_| |___) | | | | (_| | |  |   < ")
    print(" |_____\__, |____/|_| |_|\__,_|_|  |_|\_\\")
    print("       |___/                             \n")
    print("E-Mail: me@lyshark.com")

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="")
                else:
                    print("None" + "   ",end="")
            title = re.findall("<title>.*</title>", Respon.content.decode("utf-8"))
            print(title)
    except Exception:
        pass

if __name__ == "__main__":
    Banner()
    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()

程序运行时,需要指定一个文件列表,里面包括网址每行一个以换行隔开,并使用-f指定运行参数即可。

我们继续实现指纹识别功能,首先利用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 Banner():
    print("  _          ____  _                _    ")
    print(" | |   _   _/ ___|| |__   __ _ _ __| | __")
    print(" | |  | | | \___ \| '_ \ / _` | '__| |/ /")
    print(" | |__| |_| |___) | | | | (_| | |  |   < ")
    print(" |_____\__, |____/|_| |_|\__,_|_|  |_|\_\\")
    print("       |___/                             \n")
    print("E-Mail: me@lyshark.com")

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__":
    Banner()
    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方式提取指定页面的特征,例如:

image.png

我们新建一个文件,并依次写入指纹特征以及它的相对路径信息,并增加其所对应的Web容器版本。

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

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

image.png

目录
相关文章
|
11天前
|
前端开发 安全 数据库
Web架构&前后端分离站&Docker容器站&集成软件站&建站分配
Web架构&前后端分离站&Docker容器站&集成软件站&建站分配
|
12天前
|
存储 索引 Python
Python基础第五篇(Python数据容器)
Python基础第五篇(Python数据容器)
|
15天前
|
数据库 Python
Python实践:从零开始构建你的第一个Web应用
使用Python和轻量级Web框架Flask,你可以轻松创建Web应用。先确保安装了Python,然后通过`pip install Flask`安装Flask。在`app.py`中编写基本的&quot;Hello, World!&quot;应用,定义路由`@app.route(&#39;/&#39;)`并运行`python app.py`启动服务器。扩展应用,可添加新路由显示当前时间,展示Flask处理动态内容的能力。开始你的Web开发之旅吧!【6月更文挑战第13天】
41 2
|
18天前
|
开发框架 数据库 开发者
Web开发新境界:用Python玩转Django和Flask!
【6月更文挑战第12天】Python的Web开发框架Django和Flask各有千秋。Django是全能型框架,适合快速开发大型应用,提供ORM、模板引擎、URL路由和后台管理等全面功能。Flask则轻量级且灵活,适用于小型到中型应用,以其简单易用、高度可扩展和灵活路由著称。两者结合使用,能应对各种Web开发需求。
|
11天前
|
网络协议 小程序 生物认证
Web应用&企业产权&指纹识别&域名资产&网络空间&威胁情报
Web应用&企业产权&指纹识别&域名资产&网络空间&威胁情报
|
12天前
|
关系型数据库 MySQL 数据库
如何使用Python的Flask框架来构建一个简单的Web应用
如何使用Python的Flask框架来构建一个简单的Web应用
24 0
|
8天前
|
JSON API 数据库
Python使用Quart作为web服务器的代码实现
Quart 是一个异步的 Web 框架,它使用 ASGI 接口(Asynchronous Server Gateway Interface)而不是传统的 WSGI(Web Server Gateway Interface)。这使得 Quart 特别适合用于构建需要处理大量并发连接的高性能 Web 应用程序。与 Flask 类似,Quart 也非常灵活,可以轻松地构建 RESTful API、WebSockets、HTTP/2 服务器推送等。
|
13天前
|
XML 前端开发 数据挖掘
Web数据提取:Python中BeautifulSoup与htmltab的结合使用
Web数据提取:Python中BeautifulSoup与htmltab的结合使用
|
20小时前
|
分布式计算 并行计算 安全
在Python Web开发中,Python的全局解释器锁(Global Interpreter Lock,简称GIL)是一个核心概念,它直接影响了Python程序在多线程环境下的执行效率和性能表现
【6月更文挑战第30天】Python的GIL是CPython中的全局锁,限制了多线程并行执行,尤其是在多核CPU上。GIL确保同一时间仅有一个线程执行Python字节码,导致CPU密集型任务时多线程无法充分利用多核,反而可能因上下文切换降低性能。然而,I/O密集型任务仍能受益于线程交替执行。为利用多核,开发者常选择多进程、异步IO或使用不受GIL限制的Python实现。在Web开发中,理解GIL对于优化并发性能至关重要。
9 0
|
4天前
|
前端开发 JavaScript Python
Python之Tornado web 框架详解
Python之Tornado web 框架详解