文章目录

  • 一、Wappalyzer介绍
  • 二、设计原理
  • 三、python实现代码

一、Wappalyzer介绍

Wappalyzer 是一款浏览器插件,通过 Wappalyzer 可以识别出网站采用了那种 web 技术。它能够检测出 CMS 和电子商务系统、留言板、javascript 框架,主机面板,分析统计工具和其它的一些 web 系统。The company behind Wappalyzer 还能够收集 web 程序的一些信息用于统计分析,揭示出各种 web 系统的使用率即增长情况。实际 Wappalyzer 就是一个指纹识别工具。
例如:

二、设计原理

系统通过构造HTTP请求与目标Web服务器交互,从其响应数据包信息中提取提取指纹特征信息,然后通过与指纹数据库(Wappalyzer)进行比对,从而获取到Web服务器及应用的组件信息和版本信息。通过发现这些特征信息并对它进行识别可以帮助我们快速地制定渗透策略,是渗透环节中关键的一步。

三、python实现代码

# -*- coding:utf-8 -*-
"""
作者:wyt
日期:2022年04月17日
"""
# Reference:https://github.com/jwt1399/Sec-Toolsimport json
import os
import reimport requests
from bs4 import BeautifulSoupclass Wappalyzer(object):"""Python Wappalyzer driver."""def __init__(self, apps_file=None):"""Initialize a new Wappalyzer instance.初始化一个新的Wappalyzer实例。Parameters----------categories : dictMap of category ids to names, as in apps.json.apps : dictMap of app names to app dicts, as in apps.json.类别:dict类型分类id到名称的映射,如app.json。应用:dict类型应用名称到应用字典的映射,如在app.json中。"""with open(os.path.dirname(__file__) + '/apps.json', 'rb') as fd:obj = json.load(fd)self.categories = obj['categories']self.apps = obj['apps']for name, app in self.apps.items():self._prepare_app(app)def _prepare_app(self, app):"""Normalize app data, preparing it for the detection phase.标准化应用程序数据,为检测阶段做好准备。"""# Ensure these keys' values are lists# 确保这些键的值是列表for key in ['url', 'html', 'script', 'implies']:value = app.get(key)if value is None:app[key] = []else:if not isinstance(value, list):app[key] = [value]# Ensure these keys exist# 确保这些键存在for key in ['headers', 'meta']:value = app.get(key)if value is None:app[key] = {}# Ensure the 'meta' key is a dict# 确保“meta”键是一个字典obj = app['meta']if not isinstance(obj, dict):app['meta'] = {'generator': obj}# Ensure keys are lowercase# 确保键是小写的for key in ['headers', 'meta']:obj = app[key]app[key] = {k.lower(): v for k, v in obj.items()}# Prepare regular expression patterns# 准备正则表达式模式for key in ['url', 'html', 'script']:app[key] = [self._prepare_pattern(pattern) for pattern in app[key]]for key in ['headers', 'meta']:obj = app[key]for name, pattern in obj.items():obj[name] = self._prepare_pattern(obj[name])def _prepare_pattern(self, pattern):"""Strip out key:value pairs from the pattern and compile the regularexpression.从模式中删除键:值对,并编译正则表达式。"""regex, _, rest = pattern.partition('\\;')try:return re.compile(regex, re.I)except re.error as e:# regex that never matches:# 从不匹配的正则表达式:# http://stackoverflow.com/a/1845097/413622return re.compile(r'(?!x)x')def _has_app(self, app, webpage):"""Determine whether the web page matches the app signature.判断web页面是否与应用程序签名匹配。"""# Search the easiest things first and save the full-text search of the# HTML for lastfor regex in app['url']:if regex.search(webpage.url):return Truefor name, regex in app['headers'].items():if name in webpage.headers:content = webpage.headers[name]if regex.search(content):return Truefor regex in app['script']:for script in webpage.scripts:if regex.search(script):return Truefor name, regex in app['meta'].items():if name in webpage.meta:content = webpage.meta[name]if regex.search(content):return Truefor regex in app['html']:if regex.search(webpage.html):return Truedef _get_implied_apps(self, detected_apps):"""Get the set of apps implied by `detected_apps`.获取' detected_apps '隐含的一组应用程序。"""def __get_implied_apps(apps):  # app_implied_apps = set()try:for app in apps:if 'implies' in self.apps[app]:_implied_apps.update(set(self.apps[app]['implies']))return _implied_appsexcept:passimplied_apps = __get_implied_apps(detected_apps)all_implied_apps = set()# Descend recursively until we've found all implied apps# 递归查询,直到我们找到所有隐含的应用try:while not all_implied_apps.issuperset(implied_apps):all_implied_apps.update(implied_apps)implied_apps = __get_implied_apps(all_implied_apps)except:passreturn all_implied_appsdef get_categories(self, app_name):"""Returns a list of the categories for an app name.返回应用程序名称的类别列表。"""cat_nums = self.apps.get(app_name, {}).get("cats", [])cat_names = [self.categories.get("%s" % cat_num, "") for cat_num in cat_nums]return cat_namesdef analyze(self, webpage):"""Return a list of applications that can be detected on the web page.返回可以在网页上检测到的应用程序列表。"""detected_apps = set()for app_name, app in self.apps.items():if self._has_app(app, webpage):detected_apps.add(app_name)detected_apps |= self._get_implied_apps(detected_apps)return detected_apps  # {'mod_dav', 'PHP', 'Ubuntu', 'Apache'}def analyze_with_categories(self, webpage):detected_apps = self.analyze(webpage)categorised_apps = {}for app_name in detected_apps:cat_names = self.get_categories(app_name)categorised_apps[app_name] = {"categories": cat_names}return categorised_apps# 初始化一个cms类
class cms(object):def __init__(self, url, html, headers):self.url = urlself.html = htmlsoup = BeautifulSoup(self.html, "html.parser")  # 只有经bs4.BeautifulSoup方法解析成的soup才有“soup.title”方法self.title = soup.title.string if soup.title else 'None'  # titleself.headers = headersself.meta = {meta['name'].lower(): meta['content'] for meta insoup.findAll('meta', attrs=dict(name=True, content=True))}self.scripts = [script['src'] for script in soup.findAll('script', src=True)]wappalyzer = Wappalyzer()  # 实例化一个Wappalyzer类self.apps = wappalyzer.analyze(self)  # 利用定义好的Wappalyzer方法分析传入对象,返回Wappalyzer中analyze方法识别结果self.result = ';'.join(self.apps)# print(self.result)def info(self):result = self.result.split(';')return {"apps": list(set(result)),}if __name__ == '__main__':url = "http://192.168.137.129/"headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'}html = requests.get(url=url, headers=headers, timeout=4)cms = cms(html.url, html.text, html.headers).info()print(cms)

apps.json部分截图:

python返回结果:

{'apps': ['mod_dav', 'Apache', 'Ubuntu', 'PHP']}

Wappalyzer网页插件分析结果:

【信息收集】利用Wappalyzer进行cms指纹识别(十)相关推荐

  1. Web安全信息收集之CMS指纹识别

    1.CMS指纹识别 CMS(内容管理系统),又称整站系统或文章系统网站内容管理.用户只需要下载对应的CMS软  件包,部署搭建,就可以直接利用CMS,简单方便.但是各种CMS都具有其独特的结构命名规则 ...

  2. 信息收集----CMS指纹识别

    一.什么是指纹识别 通过关键特征,识别出目标的CMS系统,服务器,开发语言,操作系统,CDN,WAF的类别版本等等 1.识别对象 1.CMS信息:比如Discuz,织梦,帝国CMS,PHPCMS,EC ...

  3. 信息收集之——CMS指纹识别

    CMS指纹识别 ​ 指纹由于其终身不变性.唯一性和方便性,几乎成为生物特征的代名词.这里所指的是网站CMS指纹识别.计算机操作系统及Web容器的指纹识别等. ​ 在渗透测试中,对目标服务器进行指纹识别 ...

  4. 信息收集之cms指纹识别

    注意:仅用于技术讨论,切勿用于其他用途,一切后果与本人无关. 一.指纹识别知识 指纹的特征:唯一性.终生不变性.方便性 在线识别收集指纹信息 一.云悉在线                        ...

  5. CMS指纹识别 绕过cdn查找网站真实ip借助网络空间搜索引擎

    CMS在线识别工具 http://finger.tidesec.com/ https://fp.shuziguanxing.com/#/ http://whatweb.bugscaner.com/lo ...

  6. CMS指纹识别的工具

    1.在线指纹识别工具 http://whatweb.bugscaner.com/look/ 2.kali自带的whatweb 命令:whatweb -v (url) 3.kali下载cmseek 执行 ...

  7. python指纹识别_python实现CMS指纹识别

    #coding=utf-8 import requests import json url=raw_input(unicode("请输入要识别的url地址:","utf- ...

  8. 渗透测试——信息收集(详细)

    信息收集: 前言: 信息收集是渗透测试除了授权之外的第一步,也是关键的一步,尽量多的收集目标的信息会给后续的渗透事半功倍.收集信息的思路有很多,例如:页面信息收集.域名信息收集.敏感信息收集.子域名收 ...

  9. 信息收集域名、IP、端口服务、指纹识别相关信息

    信息收集域名.IP.端口服务.指纹识别.Googlehacking.目录信息.Githack相关信息 域名相关的信息 域名是什么 域名的分类 国际域名 国别域名 新顶级域名 域名联系人信息 whois ...

最新文章

  1. java 判断一个字符串是否由数字组成的_Java中怎样判断一个字符串是否是数字
  2. 关于Redis配置主从复制踩到的坑,主机不显示从机的连接信息
  3. devops 开源_没有开源就无法拥有DevOps
  4. java安装证书文件_Java安装证书文件
  5. STM32学习笔记(正点原子STM32Mini版)
  6. 小程序UI与传统HTML5区别
  7. 【算法导论-34】红黑树、顺序统计树的Java实现
  8. NIKE ZOOM ASTORIA SKY HI ACG (MUSTARD/TAN)
  9. unity 3d原创制作射击游戏(全完整版+安卓apk编译)
  10. 图解通信原理与案例分析-29:埃隆.马斯克的“星链”Starlink计划是卫星语音通信向卫星互联网的演进
  11. Linux spi驱动框架之执行流程-nuc970-att7022
  12. 淘宝玉伯引发Web前后端研发模式讨论
  13. 区块链技术:未来将颠覆的9大行业
  14. 计算机专业要学视频剪辑吗,想要成为入门剪辑师?必须做到这五点,才能坚持下去...
  15. 谈谈Eureka的自我保护模式
  16. [从零开始学习FPGA编程-41]:视野篇 - 摩尔时代与摩尔定律以及后摩尔时代的到来
  17. BZOJ.4695.最假女选手(线段树 Segment tree Beats!)
  18. STM32+MS5611气压计测量海拔,IIC方式
  19. 给安卓手机安装linux系统分区,把Linux装在你的FAT32分区
  20. recurdyn同步带装配问题

热门文章

  1. omap5 eMMC 启动流程
  2. 公司局域网无线AP测试方法
  3. 使用pyppeteer淘宝登录
  4. [笨叔点滴2] 为啥子ARM32体系结构中每个处理模式都有一个单独的栈?
  5. html前台多文本框布局,网页前端(5)表单及表格
  6. Android——fragment调用相册
  7. Android Wear 开发 (一),如何化身BAT面试收割机
  8. WPS-Word:尾注中的参考文献四个字没显示在导航窗格或目录中,是因为算作尾注内容了
  9. cannot be resolved or is not a field
  10. 机顶盒(线刷/固件升级)通用教程