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 ...
随机推荐
- Windows UIA自动化测试框架学习--获取qq好友列表
前段时间应公司要求开发一款针对现有WPF程序的自动化测试工具,在网上查资料找了一段时间,发现用来做自动化测试的框架还是比较多的,比如python的两个模块pywinauto和uiautomation, ...
- Blazor和Vue对比学习(基础1.8):Blazor中实现计算属性和数据监听
1.7章<传递UI片断>,需要做几个案例,这部分暂停消化几天.我们先把基础部分相对简单的最后两章学习了. 计算属性和数据监听是Vue当中的概念,本质上都是监听数据的变化,然后做出响应.两者 ...
- 解决 youtube 片尾内容被遮挡
参考: https://www.pcdvd.com.tw/showthread.php?t=1137333 在 ublock 的自定义静态规则中加上这句话 www.youtube.com##.ytp- ...
- 斯坦福NLP课程 | 第15讲 - NLP文本生成任务
作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www. ...
- 使用instanceof操作符判断对象类型及方法的重载
学习内容: 一.使用instanceof操作符判断对象类型 1.instanceof操作符可以判断一个实例对象是否属于一个类. 语法:对象名 instanceof 类名 2.使用instanceof表 ...
- linux运维基础1
内容概要 运维简介 运维岗位职责 服务器 服务器硬件介绍 磁盘阵列 虚拟化软件及环境 虚拟化软件 安装操作系统 Vmware虚拟机安装及相关配置流程 内容详情 运维简介 运维岗位职责 核心:运行维护应 ...
- DirectX11 With Windows SDK--19(Dev) 编译Assimp并加载模型、新的Effects框架
前言 注意:这一章进行了重写,对应教程Dev分支第19章的项目,在更新完后面的项目后会替换掉原来第19章的教程 在前面的章节中我们一直使用的是由代码生成的几何模型,但现在我们希望能够导入模型设计师生成 ...
- Camunda如何配置和使用mysql数据库
Camunda默认使用已预先配置好的H2数据库,数据库模式和所有必需的表将在引擎第一次启动时自动创建.如果你想使用自定义独立数据库,比如mysql,请遵循以下步骤: 一.新建mysql数据库 为Cam ...
- BUUCTF-镜子里的世界
镜子里面的世界 16进制看了下没有东西,binwalk分离了一下也没发现其他的,使用stegsolve查看即可发现.
- (win环境)使用Electron打造一个桌面应用翻译小工具
初始化项目 npm init 修改package.json {"name": "trans","version": "1.0.0& ...