当今的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方式提取指定页面的特征,例如:

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

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

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

Python 实现Web容器指纹识别的更多相关文章

  1. Web服务器指纹识别工具httprint

    Web服务器指纹识别工具httprint   在Web渗透测试中,准确判断服务器的类型直接影响后期渗透测试的成功率.Kali Linux提供了专门的Web服务器指纹识别工具Httprint.该工具根据 ...

  2. python安全编程之指纹识别

    什么是cms CMS是Content Management System的缩写,意为"内容管理系统",这是百度百科的解释,意思是相当于网站的建站模板,整个网站架构已经集成好了,只需 ...

  3. python之web自动化验证码识别解决方案

    验证码识别解决方案 对于web应用程序来讲,处于安全性考虑,在登录的时候,都会设置验证码,验证码的类型种类繁多,有图片中辨别数字字母的,有点击图片中指定的文字的,也有算术计算结果的,再复杂一点就是滑动 ...

  4. Web应用指纹识别

    http://danqingdani.blog.163.com/blog/static/186094195201493121834603/

  5. 使用C#winform编写渗透测试工具--Web指纹识别

    使用C#winform编写渗透测试工具--web指纹识别 本篇文章主要介绍使用C#winform编写渗透测试工具--Web指纹识别.在渗透测试中,web指纹识别是信息收集关键的一步,通常是使用各种工具 ...

  6. web容器获取SSL指纹实现和ByPass

    @font-face { font-family: octicons-link; src: url("data:font/woff;charset=utf-8;base64,d09GRgAB ...

  7. 原创工具14Finger-全能web指纹识别与分享平台

    14Finger 功能齐全的Web指纹扫描和分享平台,基于vue3+django前后端分离的web架构,并集成了长亭出品的rad爬虫的功能,内置了一万多条互联网开源的指纹信息. Github:http ...

  8. Web指纹识别目的Discuz识别+粗糙的版本演绎

    这个识别程序是本学期在我的职业培训项目.它是做一类似至Zoomeye怪东西,然后使用ES集成,为了让搜索引擎寻找.因此,我们必须首先去网上识别相应的能力Web包裹,如果用户输入的关键词:Discuz ...

  9. Web应用程序指纹识别工具BlindElephant

    Web应用程序指纹识别工具BlindElephant   BlindElephant是一款Web应用程序指纹识别工具.该工具可以读取目标网站的特定静态文件,计算其对应的哈希值,然后和预先计算出的哈希值 ...

  10. WAF指纹识别和XSS过滤器绕过技巧

    [译文] -- “Modern Web Application Firewalls Fingerprinting and Bypassing XSS Filters” 0x1 前言 之前在乌云drop ...

随机推荐

  1. 【docker】运维相关名词 Iaas-Paas和Saas docker镜像设置 启动与停止常用命令 镜像相关命令 容器相关命令

    目录 上节回顾 今日内容 1 什么是Iaas-Paas和Saas 2 docker 启动设置镜像 2.1 启动与停止常用命令 3 镜像相关命令 4 容器相关命令 练习 上节回顾 # 1 flask-s ...

  2. 【CJsonObject】C++ JSON 解析器使用教程

    能选封装的尽量不使用底层的 一.CJsonObject 简介 CJsonObject 是 Bwar 基于 cJSON 全新开发一个 C++ 版的 JSON 库. CJsonObject 的最大优势是轻 ...

  3. L2-030 冰岛人 (25 分) (阅读理解)

    补题链接:Here 2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普如下: 冰岛人沿用的是维京人古 ...

  4. 领域驱动设计(DDD)实践之路(三):如何设计聚合

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/oAD25H0UKH4zujxFDRXu9Q作者:wenbo zhang [领域驱动设计实践之路 ...

  5. 3、springboot连接数据库

    系列导航 springBoot项目打jar包 1.springboot工程新建(单模块) 2.springboot创建多模块工程 3.springboot连接数据库 4.SpringBoot连接数据库 ...

  6. vue.js从输入中的contenteditable元素获取innerhtml

    <div class="actual-score" :contenteditable="$route.params.mode === 'edit'" v- ...

  7. excel常用函数整理(可检索)

    目录: 一.数字函数 1.1 sum 1.2 sumif 1.3 sumifs 1.4 sumproduct 1.5 abs二.统计函数 2.1 count 2.2 counta 2.3 counti ...

  8. Kubernetes security context capability

    注:以下内容基于经验主义,不一定对. Linux capability Linux 中,root 作为特权用户,具有执行所有应用的能力.而普通用户只能执行普通应用.如果普通用户需要执行特权应用,需要进 ...

  9. 【JavaWeb】JSP基础和应用

    JSP基础 JSP简介 JSP全称是Java Server Page,它和Servlet一样,也是sun公司推出的一套开发动态web资源的技术,称为JSP/Servlet规范.JSP的本质其实就是一个 ...

  10. Oracle表结构&数据类型&约束

    1.Oracle 表结构 1.1.创建表名的规范 推荐以"t_xxx" 不能含有"+- "等非法字符,eg:sql create table "t-1 ...