观星Finger-P指纹平台指纹编写
0x00 前言
最近,数字观星和谷安联合主办了一个活动,奖品比较丰厚,还有甜品能帮上应届求职,不免有些心动,但原来从没有接触过指纹编写,就在文档和大佬指点下开始尝试了,如今也刚好达到了40条,顺便记录下心路历程。
0x01 啥是指纹?
数字观星Finger-P指纹平台是基于Wappalyzer针对于web指纹识别的平台,在此文中指纹特指web指纹。Web指纹是web服务组件在开发时留下的对其类型及版本进行标识的特殊信息,包括web服务器指纹、web运用指纹以及前端框架指纹等。在web安全测试过程中,收集web指纹信息也是一个比较重要的步骤;在安全运营过程中,通过指纹识别识别资产的web信息,这样能更加了解整个资产存在哪些方面的威胁,然后对症检测修补,提升安全工作的效率。网络上开源的web指纹识别程序很多,如Wappalyzer,whatweb, wpscan, joomscan等等,也有云悉等在线指纹平台。
这里简单展示火狐插件Wappalyzer对本网站的指纹信息检测。
观星Finger-P指纹平台接收指纹(网站默认首页能识别)的范围包括CMS应用指纹、WEB中间件指纹、首页能识别的应用指纹、国内外的其它web应用指纹等。
指纹应用层级
**应用层:**主要是各种web应用系统以及前端js框架等,比如dedecms、xxx应用系统、邮件系统等;
**支撑层:**主要是语言、后端框架等,比如java、php、struts、spring等;
**服务层:**主要是服务和应用,以及协议,包含openssh、apahce、tomcat、ssl、ntp、icmp等;
**系统层:**主要指操作系统,包含Linux、unix、centos、Ubuntu、Windows等;
**硬件层:**主要是硬件设备为主,包含路由器、交换机、防火墙、VPN、waf(现在不区分软waf)、以及物联网等设备;
基于Wappalyzer的指纹识别分类
指纹识别的几种方式
A、网页中发现关键字(比如CopyRight、电话号、应用名称等。)
B、特定文件的MD5(主要是静态文件、不一定要是MD5)
C、指定URL的关键字
D、指定URL的TAG模式
0x02 Wappalyzer的安装与使用
Wappalyzer是基于正则表达式来识别web应用,它的功能是识别单个url的指纹,其原理就是给指定URI发送HTTP请求,获取响应头与响应体并按指纹规则进行匹配。它也是一款浏览器插件,能识别出网站采用了那种web技术,能够检测出CMS和电子商务系统、留言板、javascript框架,主机面板,分析统计工具和其它的一些web系统。
(1)Wappalyzer的安装与使用需要基于Node.js,需要注意的是官方的帮助文档中提及Nodejs V10/12 已经不支持采用TLS 1.0以前协议的HTTPS站点,建议使用V8版本来进行测试。
(2)通过Node.js安装wappalyzer
<code>npm i wappalyzer
</code>
(3)使用wappalyzer指纹识别
cmd打开命令行,使用wappalyzer 目的网站
命令来进行指纹识别。
或者通过调用wappalyzer模块识别指纹信息node ./node_modules/wappalyzer/cli.js 目的网站
Wappalyze执行文件在C:\Users\xx\AppData\Roaming\npm\
,Wappalyzer的包目录在C:\Users\xx\AppData\Roaming\npm\node_modules\wappalyzer
,重点是apps.json(即为technologies.json),这个文件记录的是整个的指纹规则,json文件里面有两部分apps(technologies)与categories,写的指纹就是放在这里面进行识别网站的,categories是指纹的类型,这项可以不用管,只看apps(technologies)。
0x03 指纹规则
基于Wappalyzer的指纹规则说明
指纹编写样例
"Struts": {
"cats": [ "18"],
"html":"(href|action|src).*?=.*?(action|do)\\;confidence:50",
"url": "/.*\\.do$|/.*\\.action$\\;confidence:40",
"html": "Struts Problem Report",
"website": "http://struts.apache.org/",
"_fingerprint_note":"Apache Struts是一个用于开发Java EE网络应用程序的开放源代码网页应用程序架构。",
"_fingerprint_test_url":"https://www.shuziguanxing.com/"
}
- 应用名称struts组件
- 分类18(web框架)
- 匹配html中是否存在action,do后缀,定义可信值50
- layer是指这个应用属于5层中的那一层,该应用属于数据支撑层
- 匹配URL中是否有do和action后缀,定义可信值40
- 匹配html中是否存在“Struts Problem Report”字符串
- website为应用官网地址
- _fingerprint_note是简单描述这个应用
- _fingerprint_test_url为指纹识别测试的URL
默认不定义可信值则为100。总体可信值如果超过100,也只会返回100。
Wappalyzer测试的编写样例
{ "$schema":
"../schema.json",
"apps":{
"1C-Bitrix":{
"cats":[ 1 ],
"headers":{
"Set-Cookie":"BITRIX_",
"X-Powered-CMS":"Bitrix Site Manager"
},
"html":"(?:<link[^>]+components/bitrix(?:src|href)=\"/bitrix/(?:js|templates))",
"icon":"1C-Bitrix.png",
"implies":"PHP",
"script":"1c-bitrix",
"website":"http://www.1c-bitrix.ru" }, },
"categories":{ "1":
{ "name":"CMS", "priority":1 }, ......
}}
apps
- 应用名1C-Bitrix
- 匹配Headers特征
- 匹配html
- 匹配icon
- 包含PHP的所有指纹信息
- 匹配Script
- website为应用官网地址
categories
- 编号
- 名称
- 优先级
上述样例中用到了一些正则表达式,这在指纹编写过程中可以提升指纹的质量,比如将年份2021换成\d{4}
。
0x04 实战编写
(1)寻找要写web指纹的产品
这里需要用到一些工具,Sodan、Fofa、ZoomEye,可以通过类似https://www.oschina.net/project或者https://www.cnvd.org.cn/flaw/typelist?typeId=29去批量获取产品名录;或者是批量获取web软件厂商名录再去空间测绘的站点批量收集厂商的产品名录;又或者直接范围较广的关键词在空间测绘引擎中搜索批量获取名单,诸如地名,应用类别名称等关键词。俗话说,万事开头难,这一步是整个指纹编写最难搞的一步。
(2)寻找线上样例与排重
可以直接到指纹库中查询进行大概率排重。也可以考虑在批量寻找产品的时候,在大方向上避开Finger-P指纹平台上已有的大块,这个需要对Finger-P指纹平台已有指纹的大块有所了解和自行分析。通过避开Finger-P指纹平台上已有的大块来简化排重这一个步骤。出现“此域名指纹不存在!”或者现有的指纹信息中没有对应产品。
(3)观察该web应用
按照我微不足道的经验来说,Web应用系列的产品中html是最容易看出来的,一般藏在<title>
、<p>
、<div>
、<meta>
等标签中。
其次是cookie
和script
。
其他的按照指纹规则搜集。
(4)依据以上特征提交指纹到平台****
平台提供两种方式:表单提交和批量提交,初学者建议采用表单提交,熟练后批量提交很爽快。
首先看一下表单的页面。
应用层级对应0x01的内容。
识别方式默认是首页特征(即为HTML中的内容),对应指纹的识别方式。
指纹种类默认是Web Server(Web 服务),可根据需要多选或修改,一般默认就足够的。
批量提交的指纹撰写方式可具体参考下列文档。