WEB指纹识别技术与工具
一、常见WEB指纹检测对象
1、CMS信息:比如大汉CMS、织梦、帝国CMS、phpcms、ecshop等;
2、前端技术:比如HTML5、jquery、bootstrap、pure、ace等;
3、Web服务器:比如Apache、lighttpd, Nginx, IIS等;
4、应用服务器:比如Tomcat、Jboss、weblogic、websphere等;
5、开发语言:比如PHP、Java、Ruby、Python、C#等;
6、操作系统信息:比如linux、win2k8、win7、kali、centos等;
7、CDN信息:是否使用CDN,如cloudflare、360cdn、365cyd、yunjiasu等;
8、WAF信息:是否使用waf,如Topsec、Jiasule、Yundun等;
9、IP及域名信息:IP和域名注册信息、服务商信息等;
10、端口信息:有些软件或平台还会探测服务器开放的常见端口。
二、常见的识别指纹的方式
1. 对比特定文件的md5值
一些网站的特定图片文件、js文件、CSS等静态文件, 如favicon.ico、css、logo.ico、js等文件一般不会修 改,通过爬虫对这些文件进行抓取并比对md5值;
如果和规则库中的Md5一致则说明是同一CMS。这种方式速度比较快,误报率相对低一些,但也不排. 除有些二次开发的CMS会修改这些文件。
2. 正常页面或者错误页面中包含的关键字
1. 先访问首页或特定页面如robots.txt等,通过正则的方式去匹配某些关键字,如Powered by Discuz,dedecms等。
2. 可以构造错误页面,根据报错信息来判断使用的CMS或者中间件信息,比较常见的如tomcat的报错页面
3. 对比请求头中的关键字
-
根据网站response返回头信息进行关键字匹配,whatweb和Wappalyzer就是通过banner信息来快速识别指纹,之前fofa的web指纹库很多都是使用的这种方法,效率非常高,基本请求一次就可以,但搜集这些规则可能会耗时很长。而且这些banner信息有些很容易被改掉。
-
根据response header一般有以下几种识别方式:
- 查看http响应报头的X-Powered-By字段来识别;
- 根据Cookies来进行判断,比如一些waf会在返回头中包含一些信息,如360wzws、Safedog、yunsuo等;
- 根据header中的Server信息来判断,如DVRDVS-Webs、yunjiasu-nginx、Mod_Security、nginx-wallarm等;
- 根据WWW-Authenticate进行判断,一些路由交换设备可能存在这个字段,如NETCORE、huawei、h3c等设备。
4. 部分URL中包含的关键字,比如wp-includes、dede等URL关键特征
- 通过规则库去探测是否有相应目录
- 根据爬虫结果对链接url进行分析
- 对robots.txt文件中目录进行检测等等方式,通过url地址来判别是否使用了某CMS,比如wordpress默认存在wp-includes和wp-admin目录,织梦默认管理后台为dede目录,solr平台可能使用/solr目录,weblogic可能使用wls-wsat目录等。
5. 开发语言的识别
web开发语言一般常见的有PHP、jsp、aspx、asp等,常见的识别方式有
-
通过爬虫获取动态链接进行直接判断是比较简便的方法。
示例: asp判别规则如下
<a[^>]*?href=('|")[^http][^>]*?\.asp(\?|\#|\1)
,其他语言可替换相应asp即可。 -
通过
X-Powered-By
进行识别示例 :比较常见的有
X-Powered-By: ASP.NET
或者X-Powered-By: PHP/7.1.8
-
通过
Set-Cookie
进行识别示例 :比如
Set-Cookie
中包含PHPSSIONID
说明是php、包含JSESSIONID
说明是java、包含ASP.NET_SessionId
说明是aspx等。
三、工具介绍
1. WHATWEB
whatweb是目前网络上比较强大的一款应用识别程序。它支持正则表达式、md5 hash匹配、url识别、HTML标记模式、蜘蛛爬行等等
1.1 官方简介:
WhatWeb网站识别。WhatWeb识别包括内容管理系统(CMS),博客平台,统计/分析包,JavaScript库,Web服务器和嵌入式设备在内的Web技术。WhatWeb有1800多个插件,每个插件都可以识别不同的东西。WhatWeb还可以识别版本号,电子邮件地址,帐户ID,Web框架模块,SQL错误等。
WhatWeb可以隐秘而快速或者彻底但缓慢。WhatWeb支持攻击性级别,以控制速度和可靠性之间的平衡。当您在浏览器中访问网站时,交易中会包含许多提示,这些信息是由哪些网络技术为该网站提供动力的。有时,单个网页访问包含足以识别网站的信息,但如果没有,则WhatWeb可以进一步查询该网站。默认的攻击级别称为“隐身”,它是最快的,只需要网站的一个HTTP请求即可。这适用于扫描公共网站。开发了更具侵略性的模式用于渗透测试。
大多数WhatWeb插件都很详尽,可以识别从细微到明显的各种提示。例如,大多数WordPress网站可以通过meta HTML标签(例如“”)进行标识,但是少数WordPress网站会删除该标识标签,但这并不能阻止WhatWeb。WordPress WhatWeb插件已进行了15项测试,其中包括检查favicon,默认安装文件,登录页面以及检查相对链接中的“ / wp-content /”。
1.2 特点:
- 超过1800个插件
- 能够控制速度,隐身性和可靠性之间的平衡
- 性能调优。控制要同时扫描的网站数量。
- 多种日志格式:简要,详细,XML,JSON,MagicTree,RubyObject,MongoDB,ElasticSearch,SQL。
- 代理支持,包括TOR
- 自定义HTTP标头
- 基本的HTTP身份验证
- 控制网页重定向
- IP地址范围
- 模糊匹配
- 结果确定性意识
- 在命令行上定义的自定义插件
- IDN(国际域名)支持
1.3 安装
1.3.1 安装ruby环境
1. 下载并解压
# yum源中的版本较旧的2.0.0版本,所以使用源码安装
# 可从此地址选择最新稳定版本下载使用 :https://www.ruby-lang.org/en/downloads/
wget https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.1.tar.gz
tar -zxvf ruby-3.0.1.tar.gz
# 2. 编译安装
cd ruby-3.0.1
./configure # 默认安装路径:/usr/local
make -j4 && make install
# 3. 查看版本信息
ruby -v
1.3.2 安装whatweb
# 1. 下载ruby并解压
# 可从此地址选择最新版本下载使用 : https://github.com/urbanadventurer/WhatWeb/wiki
wget https://github.com/urbanadventurer/WhatWeb/archive/refs/tags/v0.5.2.tar.gz`
tar -zxvf v0.5.2.tar.gz
cd WhatWeb-0.5.2
# 2. 安装Ruby依赖关系管理器
gem install bundler
# 更新程序
bundle update
# 从WhatWeb源文件夹执行捆绑程序,以安装Gemfile中定义的依赖项
bundle install
# 查看版本信息
./whatweb --verison
1.4 工具使用
1.4.1 简单示例
# Usage: whatweb [options] <URLs>
# 简单探测指纹信息
whatweb baidu.com
# 输出更详细的指纹探测信息
whatweb -v baidu.com
1.4.2 参数配合使用
-
批量扫描url
--input-file=FILE, -i whatweb -i url.txt
url.txt文件可以批量填写url,每行一个url, 并且支持使用注释本次无需扫描的网站
-
修改目标
whatweb 192.168.1.100/24 -url-suffix=":8080" -url-prefix //添加前缀 -url-suffix // 添加后缀 -url-pattern //在中间插入内容
-
代理相关
# 指定代理主机与端口,默认8080 --proxy <hostname[:port]> # 指定代理用户名密码 --proxy-user <username:password>
-
授权相关
# http基本认证 --user, -u=<user:password> # 指定cookie信息 --cookie, -c=COOKIES e.g. 'name=value; name2=value2' # 从文件中读取cookies信息 --cookie-jar=FILE
-
指定扫描级别
--aggression,-a = LEVEL `whatweb -a 1 url` # 级别对应描述 1 stealthy 发送单个http请求,并且会跟随重定向 2 unused 不可用(从2011年开始,此参数就是在开发状态) 3 aggressive 如果匹配了1中的插件,就会触发额外的请求 4 heavy 每个目标会发送大量的http请求,会去尝试每一个插件
-
http相关选项
# 自定义ua --user-agent, -U=AGENT #自定义添加请求头,如果添加的是已经存在的请求头,则替换默认掉默认的值,空值则会移除该请求头 --header, -H # 控制何时跟随重定向,有下列可选项,默认为always #`never',`http-only',`meta-only',`same-site',`same-domain',`always' --follow-redirect=WHEN # 连续重定向次数最大值,默认值为10 --max-redirects=NUM
-
结果输出到文件
--log-brief=FILE # 简要的记录,每个网站只记录一条返回信息 --log-verbose=FILE # 详细输出 --log-xml=FILE # 返回 XML 格式的日志 --log-json=FILE # 以 JSON 格式记录日志 --log-json-verbose=FILE # 记录详细的 JSON 日志 --log-magictree=FILE # XML 的树形结构 # !! JSON 格式需要安装 JSON 依赖, sudo gem install JSON
-
插件相关
# 使用参数-l可以列出插件的列表,包括插件以及插件的描述 whatweb -l # 通过以上参数具体查看插件的内容 whatweb -info-plugins=“YouTube”
-
性能与稳定性
# 并发线程数,默认值:25。 --max-threads,-t # 打开超时时间,以秒为单位,默认值:15 --open-timeout # 读取超时时间,以秒为单位。默认值:30 --read-timeout # 在连接之间等待SECONDS --wait = SECONDS
-
更多参数使用
-h/--help
查看
1.5 工作原理
# 支持的匹配模式如下
:regexp 标准的 ruby 正则表达式
:text 字符
:ghdb google hack 数据库,包含以下几个模式:
inurl:包含的字符串在 url
intitle:包含的字符串在 title
filetype:包含的文件名,如 PDF, JPG, RB 等
:md5 请求页面的 md5 hash 值
:tagpattern html 标签
:version 可以设置正则表达式或直接字符串匹配
:string 可以设置正则表达式或直接字符串匹配
:filepath 可以设置正则表达式或直接字符串匹配,通常显示系统错误或配置文件等
:account 经常用在登陆页面或用户列表等
:module 可以设置正则表达式或直接字符串匹配,如网络设备可能使用了一个ruby 模块等
:model 可以设置正则表达式或直接字符串匹配
:firmware 可以设置正则表达式或直接字符串匹配,设备的固件版本
识别Web应用程序的主要方法有4种:
- 简单网页请求的HTTP标头和HTML中的匹配模式
- 测试URL并识别HTML中的模式
- 测试URL并识别MD5哈希
- 测试URL,并简单地指出它们的存在或返回HTTP status 200代码。
1.6 插件示例
Plugin.define "Plone" do
author "Andrew Horton"
version "0.2"
description "An open-source content management system (CMS) written in Python."
website "http://plone.org/"
dorks [
'"powered by plone"'
]
#####################################重点关注部分################################
matches [
{:name=>"meta generator tag",
:regexp=>/<meta name="generator" content="[^>]*http:\/\/plone.org" \/>/},
{:name=>"plone css",
:regexp=>/(@import url|text\/css)[^>]*portal_css\/.*plone.*css(\)|")/}, #"
{:name=>"plone javascript",
:regexp=>/src="[^"]*ploneScripts[0-9]+.js"/}, #"
{:text=>'<div class="visualIcon contenttype-plone-site">'},
{:name=>"div tag, visual-portal-wrapper",
:certainty=>75,
:text=>'<div id="visual-portal-wrapper">'},
]
######################################重点关注部分###################################
def passive
m=[]
#X-Caching-Rule-Id: plone-content-types
#X-Cache-Rule: plone-content-types
m << {:name=>"X-Caching-Rule-Id: plone-content-types" } if @meta["x-caching-rule-id"] =~ /plone-content-types/i
m << {:name=>"X-Cache-Rule: plone-content-types" } if @meta["x-cache-rule"] =~ /plone-content-types/i
m
end
end
BTW:
:name (包含匹配的文件名称,这个文件必须是网站中唯一存在的文件)
:certainty (可信值)
每个插件可以访问
@body
,@meta
,@status
,@base_uri
,@md5
,@ip
和@tagpattern
变量。
2. wappalyzer
2.1 简介
Wappalyzer是基于正则表达式来识别web应用,它的功能是识别单个url的指纹,其原理就是给指定URI发送HTTP请求,获取响应头与响应体并按指纹规则进行匹配。它也是一款浏览器插件,能识别出网站采用了那种web技术,能够检测出CMS和电子商务系统、留言板、javascript框架,主机面板,分析统计工具和其它的一些web系统。
2.2 安装使用
-
浏览器安装(chrome为例)
访问谷歌商店
搜索wappalyzer,点击添加至chrome,即可安装成功
-
使用
访问你需要获取指纹的网站
访问成功后,点击浏览器右上角的扩展程序图标,再点击wappalyzer图标,即可查看当前网站指纹信息
2.3 工作原理
发送请求之后,通过正则匹配HTML代码以及JavaScript变量,响应标头等
匹配字段有以下:
更多可以查看官方文档
字段 | 描述 | 例子 |
---|---|---|
cookies |
cookies 信息 |
{ "cookie_name": "Cookie value" } |
dom |
使用查询选择器检查元素属性,属性和文本内容 | { "#example-id": { "property": { "example-prop": "" } } } |
dns |
DNS记录:支持MX,TXT,SOA和NS(仅NPM驱动程序) | { "MX": "example\\.com" } |
js |
JavaScript属性(区分大小写);避免使用简短的属性名称,以防止匹配小块的代码。 | { "jQuery.fn.jquery": "" } |
headers |
HTTP响应头 | { "X-Powered-By": "^WordPress$" } |
html |
HTML页面,必须包含HTML开头标签,以避免匹配纯文本,出于性能原因,尽可能避免使用html ,而应使用dom ,dom解析了html,能更快定位 |
"<a [^>]*href=\"index.html" |
css |
CSS规则,网站强制实施同源策略时不可用。出于性能原因,仅一部分可用CSS规则用于查找匹配项。 | "\\.example-class" |
robots |
Robots.txt文件内容 | "Disallow: /unique-path/" |
url |
完整的请求URL | "^https?//.+\\.wordpress\\.com" |
meta |
HTML元标记,记录了网页的关键信息,例如生成器 | { "generator": "^WordPress$" } |
scripts |
页面上包含的JavaScript文件的URL | "jquery\\.js" |
BTW
- generator是生成器的意思,在meta标签内使用,则表示用来表示制作或生成该网页文档的是什么软件程序。
- robots.txt是一个纯文本文件,在这个文件中网站管理者可以声明该网站中不想被robots访问的部分,或者指定搜索引擎只收录指定的内容。
- 同源策略:同源是指域名、协议、端口相同。不同源的客户端脚本在没有明确授权的情况下是不允许读写其他网站的资源。
2.4 规则示例
"Ant Design": {
"cats": [
12
],
"html": [
"<[^>]*class=\"ant-(?:btn|col|row|layout|breadcrumb|menu|pagination|steps|select|cascader|checkbox|calendar|form|input-number|input|mention|rate|radio|slider|switch|tree-select|time-picker|transfer|upload|avatar|badge|card|carousel|collapse|list|popover|tooltip|table|tabs|tag|timeline|tree|alert|modal|message|notification|progress|popconfirm|spin|anchor|back-top|divider|drawer)",
"<i class=\"anticon anticon-"
],
"icon": "Ant Design.svg",
"js": {
"antd": ""
},
"website": "https://ant.design"
}