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 ...
随机推荐
- 使用VUE+SpringBoot+EasyExcel 整合导入导出数据
使用VUE+SpringBoot+EasyExcel 整合导入导出数据 创建一个普通的maven项目即可 项目目录结构 1 前端 存放在resources/static 下 index.html &l ...
- 最新版2022年任我行管家婆工贸版ERP M7 V22.0进销存财务生产管理软件网络版——云上的集团化制造管理系统
在互联网+制造业的时代背景下,制造业在利用互联网技术进行转型升级的同时,也面临着供应链体系和生产模式的重塑,主要呈现出以下特点: 多元化发展 对外,传统企业正在通过"互联网+"逐步 ...
- idea maven 依赖还原不上的问题 method <init>()V not found
问题 还原项目依赖的时候报错: java.lang.RuntimeException: org.codehaus.plexus.component.repository.exception.Compo ...
- # k8s-jenkins在kubernetes中持续部署
k8s-jenkins在kubernetes中持续部署 1. k8s-jenkins在kubernetes中持续部署 Kubernetes Continuous Deploy插件:用于将资源配置部署到 ...
- 理“ Druid 元数据”之乱
vivo 互联网大数据团队-Zheng Xiaofeng 一.背景 Druid 是一个专为大型数据集上的高性能切片和 OLAP 分析而设计的数据存储系统. 由于Druid 能够同时提供离线和实时数据的 ...
- SpringBoot整合RabbitMQ实战附加死信交换机
前言 使用springboot,实现以下功能,有两个队列1.2,往里面发送消息,如果处理失败发生异常,可以重试3次,重试3次均失败,那么就将消息发送到死信队列进行统一处理,例如记录数据库.报警等 环境 ...
- DS18B20数字温度计 (三) 1-WIRE总线 ROM搜索算法和实际测试
目录 DS18B20数字温度计 (一) 电气特性, 寄生供电模式和远距离接线 DS18B20数字温度计 (二) 测温, ROM和CRC算法 DS18B20数字温度计 (三) 1-WIRE总线 ROM搜 ...
- 聊聊 C# 方法重载的底层玩法
最近在看 C++ 的方法重载,我就在想 C# 中的重载底层是怎么玩的,很多朋友应该知道 C 是不支持重载的,比如下面的代码就会报错. #include <stdio.h> int say( ...
- flink-执行模式
flink的执行模式 flink既能处理离线数据,也能处理实时数据,在1.12.0版本以前,批数据返回的数据集合是dataSet,对应一套dataSet的api,从1.12.0版本以后,flink实现 ...
- JVM学习笔记-从底层了解程序运行(一)
1:JVM基础知识 什么是JVM 1. java虚拟机,跨语言的平台,实现java跨平台 2. 可以实现多种语言跨平台,只要该语言可以编译成.class文件 3. 解释执行.class文件 java是 ...