gotoscan:CMS指纹识别工具
gotoscan
前言
项目地址
https://github.com/newbe3three/gotoscan
结合自己学习到的Go相关知识,通过实现这个简易的CMS指纹识别工具来锻炼一下自己写代码的能力。
常见的指纹识别的方式:
- 特定文件的MD5值:一些CMS的特定的静态资源:图片、js文件、css文件一般是不会修改的。所以可以根据这些文件的md5值来进行匹配。
 - 正常页面或错误页面中包含的关键字:比如说在
robots.txt等,可能包含了标识CMS的关键字。或者是一些报错页面的报错信息也包含了CMS关键字,比如thinkphp3的错误页面。 - 请求头关键字信息的匹配
 - 部分URL中包含的关键字
 
整体介绍
在这块,我们解析的特征文件也只包含了上述常见方式的前两种,即对比文件md5值和页面中的关键字。
代码整体逻辑还是比较好理解的,解析包含CMS特征的json文件,并根据解析的内容发起请求,并验证其是否包含了CMS的特征。
所以代码也主要由三个块内容:负责解析json文件的parsecms.go、负责发起请求的request.go、和最后实现测试的scancms.go。
parsecms.go
首先先看一下json文件中的数据:
"gowinsoft_jw": [{
		"path": "/web/web/web/images/4bt1.jpg",
		"option": "md5",
		"content": "ef1ee9c8708cde1bd25a90054de85690"
	}, {
	...
	}],
	"maticsoftsns": [{
		"path": "/msgbox/images/gb_tip_layer.png",
		"option": "md5",
		"content": "c8cb16e8b61bc549ebd339858e66fa5c"
	}, {
	...
	}],
	.....
json文件主要还是由每一个小的json数据块组成,是CMS名字和对应的特征。首先需要定义一个将json数据解析为Go结构体的类型。通常我们将json数据解析成Go中的map[][],那么我们对上面的json就可以由如下Go结构体来对应。
//对应CMS特征的内容
type CmsFeature struct {
	Path    string `json:"path"`
	Option  string `json:"option"`
	Content string `json:"content"`
}
//通过map来对应json形式的数据,k就是cms名,v就是对应的特征切片。
map[string][]CmsFeature
通过借助"encoding/json"包的方法来实现对json文件的解析。将解析后的内容存放在map[string][]CmsFeature中返回。具体有关"encoding/json"包内的其他方法可以去看看api文档。
json.Unmarshal(data, &cmslist);
request.go
发起请求这一块主要是先对服务器发起head请求,head请求状态码为200再发起get请求。先发起head请求主要是由于其响应头和get是完全一样的,但是服务器不会返回请求的实体数据,避免了传输请求、响应体的数据浪费。head请求时非常快的。
scancms.go
扫描这一部分最重要的部分就是并发。一方面是同时扫描多台主机,另一方面时同时扫描多个CMS。
Go语言的并发是易得的,只需要再你想要的并发的函数前面加上关键字go就实现了简单的并发操作。
控制同时扫描多台主机
func HostWorker(hosts []string, cmslist map[string][]CmsFeature, sortList CmsSortList) []string {
	hostsChan := make(chan string)
	resultChan := make(chan string)
	var resultList []string
    //根据我们获取到的目标数量来开启并发。
	for i := 0; i < len(hosts); i++ {
		go cmsWorker(hostsChan, cmslist, sortList, resultChan)
	}
	for _, host := range hosts {
		hostsChan <- host
	}
    //使用通道来控制线程,因为发送的工作单元数量和接收到结果的数量是相同的,所以程序直到何时关闭通道并随后关闭cmsWorker线程。
	for i := 0; i < len(hosts); i++ {
        //程序会在这里阻塞直到有数据传入通道。
		result := <-resultChan
		resultList = append(resultList, result)
	}
	close(hostsChan)
	close(resultChan)
	return resultList
}
控制同时扫描多个CMS特征。与上述不同这里我们需要用到sync.WaitGroup来控制线程。因为这里发送和接收是不同的。
//对多个cms的并发操作
func cmsWorker(hosts chan string, cmslist map[string][]CmsFeature, sortList CmsSortList, resultChan chan string) {
	for host := range hosts {
		var scanStatus bool = false
		cmsListChan := make(chan map[string][]CmsFeature, 10)
		var wg sync.WaitGroup
		for i := 0; i < cap(cmsListChan); i++ {
			go featureWorker(host, cmsListChan, &wg, &scanStatus, resultChan)
		}
        //这里需要先判断是否已经匹配到了,没匹配到计数器才能+1。匹配到了就直接return
		for _, data := range sortList {
			if !scanStatus {
				wg.Add(1)
				cmsListChan <- map[string][]CmsFeature{data.Name: cmslist[data.Name]}
			} else {
				//wg1.Done()
				return
			}
		}
		wg.Wait()
        //扫描完所有特征都没匹配到,向结果通道添加一条数据,也就是所谓发起和接收要一样。每个host都应该有一个扫描结果
		resultChan <- fmt.Sprintf("The host: %s has no matching results", host)
		close(cmsListChan)
	}
}
总结
至此一个简单的CMS工具就实现了,其他部分的代码可以直接点击左下角去我的GitHub上看源码就好了。当然啦CMS识别不仅仅是需要你多种可以匹配的方式,最重要的还是需要足够完备的特征库。
这次通过这个工具,还是学到了很多Go一些包的用法以及一些接口。代码还是还是要多敲。
Todo
- 请求头关键字信息的匹配
 - 同时扫描多个特征
 - 根据cmd参数来控制线程
 
gotoscan:CMS指纹识别工具的更多相关文章
- 网站指纹识别工具——WhatWeb v0.4.7发布
		
WhatWeb是一款网站指纹识别工具,主要针对的问题是:“这个网站使用的什么技术?”WhatWeb可以告诉你网站搭建使用的程序,包括何种CMS系统.什么博客系统.Javascript库.web服务 ...
 - Web服务器指纹识别工具httprint
		
Web服务器指纹识别工具httprint 在Web渗透测试中,准确判断服务器的类型直接影响后期渗透测试的成功率.Kali Linux提供了专门的Web服务器指纹识别工具Httprint.该工具根据 ...
 - Web应用程序指纹识别工具BlindElephant
		
Web应用程序指纹识别工具BlindElephant BlindElephant是一款Web应用程序指纹识别工具.该工具可以读取目标网站的特定静态文件,计算其对应的哈希值,然后和预先计算出的哈希值 ...
 - 网站指纹识别工具Whatweb的使用
		
目录 whatweb 一些常见的Whatweb的扫描 常规扫描 批量扫描 详细回显扫描 扫描强度等级控制 快速本地扫描(扫描内网的主机) 将扫描结果导出至文件内 whatweb whatweb 是ka ...
 - python安全编程之指纹识别
		
什么是cms CMS是Content Management System的缩写,意为"内容管理系统",这是百度百科的解释,意思是相当于网站的建站模板,整个网站架构已经集成好了,只需 ...
 - Kali Linux渗透测试实战 2.2 操作系统指纹识别
		
目录 2.2 操作系统指纹识别 2.2.1 Banner抓取 2.2.2 TCP 和 ICMP 常规指纹识别技术 TCP数据报格式 ICMP首部格式 TTL与TCP窗口大小 FIN探测 BOGUS f ...
 - Kali-linux系统指纹识别
		
现在一些便携式计算机操作系统使用指纹识别来验证密码进行登录.指纹识别是识别系统的一个典型模式,包括指纹图像获取.处理.特征提取和对等模块.如果要做渗透测试,需要了解要渗透测试的操作系统的类型才可以.本 ...
 - 使用C#winform编写渗透测试工具--Web指纹识别
		
使用C#winform编写渗透测试工具--web指纹识别 本篇文章主要介绍使用C#winform编写渗透测试工具--Web指纹识别.在渗透测试中,web指纹识别是信息收集关键的一步,通常是使用各种工具 ...
 - 原创工具14Finger-全能web指纹识别与分享平台
		
14Finger 功能齐全的Web指纹扫描和分享平台,基于vue3+django前后端分离的web架构,并集成了长亭出品的rad爬虫的功能,内置了一万多条互联网开源的指纹信息. Github:http ...
 
随机推荐
- Idea之常用插件
			
效率提升 Jrebel 热部署插件,修改代码编译就生效,节省大量重启服务时间.热部署支持修改方法代码,方法定义,类定义,接口定义(包括swagger文档),修改资源文件,修改mapper.xml(需配 ...
 - 『忘了再学』Shell基础 — 19、使用declare命令声明变量类型
			
目录 1.declare命令介绍 2.声明数组变量类型 3.声明变量为环境变量 4.声明只读属性 5.补充: 1.declare命令介绍 Shell中所有变量的默认类型是字符串类型,如果你需要进行特殊 ...
 - SQLServer2008中的Merge
			
SqlServer2008 + 中的 Merge Merge: 合并 融合 SqlServer2008 中的Merge 用于匹配两种表中的数据,根据源表和目标表中的数据的比较结果对目标表进行对 ...
 - 记一次生产事故的排查与优化——Java服务假死
			
一.现象 在服务器上通过curl命令调用一个Java服务的查询接口,半天没有任何响应.关于该服务的基本功能如下: 1.该服务是一个后台刷新指示器的服务,即该服务会将用户需要的指示器数据提前计算好,放入 ...
 - Tmux终端复用神器使用心得
			
tmux在连接远程服务器做实验时很有帮助,可以为每一个项目设置一个Session,在Session中设置不同的Window同时跑多个实验,Window本身还可以分割为多个Pane,在一个视野内利用多个 ...
 - Spring Boot整合Swagger报错:"this.condition" is null
			
前段时间看到群里有吐槽swagger整合问题,当时没仔细看,总以为是姿势不对. 这两天正好自己升级Spring Boot版本,然后突然出现了这样的一个错误: Caused by: java.lang. ...
 - 关于『HTML5』:第二弹
			
关于『HTML5』:第二弹 建议缩放90%食用 咕咕咕咕咕咕咕!!1 (蒟蒻大鸽子终于更新啦) 自开学以来,经过了「一脸蒙圈的 半期考试」.「二脸蒙圈的 体测」的双重洗礼,我终于有空肝 HTML5 辣 ...
 - Java命令行传递参数
			
目录 命令行传参 代码运行 视频 命令行传参 有时候你希望运行一个程序的时候再传递给它消息. 这要靠传递命令行参数给main()函数实现 package com.broky.base; public ...
 - Python数据分析--Numpy常用函数介绍(6)--Numpy中矩阵和通用函数
			
在NumPy中,矩阵是 ndarray 的子类,与数学概念中的矩阵一样,NumPy中的矩阵也是二维的,可以使用 mat . matrix 以及 bmat 函数来创建矩阵. 一.创建矩阵 mat 函数创 ...
 - 如何在 Mac 和虚拟机上安装 macOS Big Sur、Monterey 和 Ventura
			
请访问原文链接:https://sysin.org/blog/how-to-install-macos/,查看最新版.原创作品,转载请保留出处. 作者主页:www.sysin.org 名词解释: 硬件 ...