这几天在做一些指纹识别的工作,因为有实时性要求,考虑层面主要是源码识别,另一个方面则是流量识别。这里以Resin为例记录一下实验过程。

0x01 指纹识别

常见方式

  1. 特定文件
    一些网站的特定图片/JS/CSS等静态文件,如favicon.ico、css、logo.ico、js等一般不会修改,通过爬虫对这些文件进行抓取,可比对md5值,如果和规则库中的md5一致,则说明是同一CMS。这种方式速度比较快,误报率相对低一些,但也不排除有些二次开发的CMS会修改这些文件。

  2. 正常页面或错误网页中包含的关键字
    先访问首页或特定页面如robots.txt等,通过正则匹配某些关键字,如Discuz、dedecms等。此外,可以构造错误页面,根据报错信息来判断使用的CMS或者中间件信息,如tomcat的报错页面等。
    Discuz

  3. 请求头信息的关键字匹配
    根据网站response返回头信息进行关键字匹配,如Wappalyzerwhatweb就是通过banner信息来快速识别指纹,之前fofa的web指纹库很多都是使用的这种方法,效率非常高,基本请求一次就可以,但搜集这些规则可能会耗时很长,而且这些banner信息有些容易被改掉。
    根据response header一般有以下几种识别方式:

    (1)查看http响应报头的X-Powered-By字段来识别;
    (2)根据Cookies来进行判断,如一些waf会在返回头中包含一些信息,如Safedog等;
    (3)根据header中的Server信息来判断,如Mod_Security、nginx-wallarm等;
    (4)根据www-authenticate进行判断,一些路由交换设备可能存在这个字段,如huawei、h3c等设备。
    resin

  4. URL包含的路径特征等
    通过规则库去探测是否有相应目录,或者根据爬虫结果对链接url进行分析,文件中目录进行检测等等方式,通过url地址或者对robots.txt来判别是否使用了某CMS,比如wordpress默认存在wp-includes和wp-admin目录,织梦默认管理后台为dede目录,weblogic可能包含wlsconsole等URL关键特征。
    Weblogic

常见的指纹识别工具

WhatWeb
Whatweb是一个基于Ruby的开源指纹识别工具,它能够识别的网站信息包括:CMS类型、博客平台、中间件、web框架、服务器、脚本类型、JavaScript库、IP、cookies等。
WhatWeb

Wappalyzer
Wappalyzer是一个跨平台网站分析工具,可以帮助开发者、安全研究者检测网页使用了什么技术。Wappalyzer的功能可检测JavaScript框架/CMS内容管理系统/Web服务器和已安装的分析工具等。
Wappalyzer

Whatruns
Whatruns和Wappalyzer类似,可直接在chrome应用商城安装。在与Wappalyzer的对比上,它可以显示托管CDN、wordpress插件等,拥有丰富的插件支持。
Whatruns

0x02 Resin

在做最近的工作过程中,需要搭建环境对传输数据进行指纹提取,接下来记录了构建应用Docker及脱敏后指纹提取的简单思路。

  1. 要创建一个基于java:latest的resin镜像,首先要按照jdk的环境,之后便可创建resin镜像了。
    下载一个基础镜像:docker pull java:latest,下载成功后docker info查看镜像信息。
    将在官网下载的resin-4.0.64放在Users/repo/cms/resin目录下
    官网下载地址

  2. 编辑Dockerfile
    在resin目录下创建、编辑Dockerfile内容,内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    cd Users/repo/cms/resin
    vim Dockerfile

    # Dockerfile
    FROM java:latest
    ADD resin-4.0.64 /Users/repo/cms/resin/resin4
    EXPOSE 8080
    CMD ["/Users/repo/cms/resin/resin4/bin/resin.sh","console"]
  3. 创建build.sh启动脚本
    给构造的镜像起名为 resin4,内容如下。运行build.sh脚本,可通过docker images查看已创建的resin4镜像。

    1
    2
    3
    # -t:镜像名称
    # .是指定Dockerfile的位置在当前目录
    docker build -t resin4:latest .
  4. 基于镜像启动容器
    通过docker ps查看容器运行状况,启动后可正常访问

    1
    docker run --name test -d -p 18081:8080 resin4:latest

homepage

  1. 在resin中部署web项目
    将web项目pro打包到/Users/repo/cms/resin目录,并将项目挂载到resin的虚拟目录中。
    1
    docker run --name proCMS -d -p 18082:8080 -v /Users/repo/cms/resin/pro:/Users/repo/cms/resin/resin4/webapps/ROOT resin4:latest

CMS

  1. Resin指纹识别
    对于resin,分别抓包和审计源码,采集如报文cgi/resin-admin等敏感目录访问报文,提取特征从而进行指纹识别。
    举例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # Resin特定文件
    resin.ico
    # Resin请求头
    re.search('\/resin-admin', request.header)
    # Resin关键字
    re.search("Resin® Default Home Page", response.content)
    re.search("Server:\sResin\/\d", response.header)
    # URL
    re.search("\/resin-admin", request.cgi)

0x03 参考链接