gotoscan

前言

项目地址

https://github.com/newbe3three/gotoscan

结合自己学习到的Go相关知识,通过实现这个简易的CMS指纹识别工具来锻炼一下自己写代码的能力。

常见的指纹识别的方式:

  1. 特定文件的MD5值:一些CMS的特定的静态资源:图片、js文件、css文件一般是不会修改的。所以可以根据这些文件的md5值来进行匹配。
  2. 正常页面或错误页面中包含的关键字:比如说在robots.txt等,可能包含了标识CMS的关键字。或者是一些报错页面的报错信息也包含了CMS关键字,比如thinkphp3的错误页面。
  3. 请求头关键字信息的匹配
  4. 部分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指纹识别工具的更多相关文章

  1. 网站指纹识别工具——WhatWeb v0.4.7发布

      WhatWeb是一款网站指纹识别工具,主要针对的问题是:“这个网站使用的什么技术?”WhatWeb可以告诉你网站搭建使用的程序,包括何种CMS系统.什么博客系统.Javascript库.web服务 ...

  2. Web服务器指纹识别工具httprint

    Web服务器指纹识别工具httprint   在Web渗透测试中,准确判断服务器的类型直接影响后期渗透测试的成功率.Kali Linux提供了专门的Web服务器指纹识别工具Httprint.该工具根据 ...

  3. Web应用程序指纹识别工具BlindElephant

    Web应用程序指纹识别工具BlindElephant   BlindElephant是一款Web应用程序指纹识别工具.该工具可以读取目标网站的特定静态文件,计算其对应的哈希值,然后和预先计算出的哈希值 ...

  4. 网站指纹识别工具Whatweb的使用

    目录 whatweb 一些常见的Whatweb的扫描 常规扫描 批量扫描 详细回显扫描 扫描强度等级控制 快速本地扫描(扫描内网的主机) 将扫描结果导出至文件内 whatweb whatweb 是ka ...

  5. python安全编程之指纹识别

    什么是cms CMS是Content Management System的缩写,意为"内容管理系统",这是百度百科的解释,意思是相当于网站的建站模板,整个网站架构已经集成好了,只需 ...

  6. Kali Linux渗透测试实战 2.2 操作系统指纹识别

    目录 2.2 操作系统指纹识别 2.2.1 Banner抓取 2.2.2 TCP 和 ICMP 常规指纹识别技术 TCP数据报格式 ICMP首部格式 TTL与TCP窗口大小 FIN探测 BOGUS f ...

  7. Kali-linux系统指纹识别

    现在一些便携式计算机操作系统使用指纹识别来验证密码进行登录.指纹识别是识别系统的一个典型模式,包括指纹图像获取.处理.特征提取和对等模块.如果要做渗透测试,需要了解要渗透测试的操作系统的类型才可以.本 ...

  8. 使用C#winform编写渗透测试工具--Web指纹识别

    使用C#winform编写渗透测试工具--web指纹识别 本篇文章主要介绍使用C#winform编写渗透测试工具--Web指纹识别.在渗透测试中,web指纹识别是信息收集关键的一步,通常是使用各种工具 ...

  9. 原创工具14Finger-全能web指纹识别与分享平台

    14Finger 功能齐全的Web指纹扫描和分享平台,基于vue3+django前后端分离的web架构,并集成了长亭出品的rad爬虫的功能,内置了一万多条互联网开源的指纹信息. Github:http ...

随机推荐

  1. leetcode 142. Linked List Cycle II 环形链表 II

    一.题目大意 https://leetcode.cn/problems/linked-list-cycle-ii/ 给定一个链表的头节点  head ,返回链表开始入环的第一个节点. 如果链表无环,则 ...

  2. 709. To Lower Case - LeetCode

    Question 709. To Lower Case Sollution 题目大意:字符串大写转小写 思路: 直接调用Java API函数 字符串转char数组,遍历数组,判断如果大写就转小写 Ja ...

  3. 03-数据结构(C语言版)

    Day01 笔记 1 数据结构基本理论 1.1 算法五个特性: 1.1.1 输入.输出.有穷.确定.可行 1.2 数据结构分类 1.2.1 逻辑结构:集合.线性.树形.图形 1.2.2 物理结构:顺序 ...

  4. SmartIDE v0.1.18 已经发布 - 助力阿里国产IDE OpenSumi 插件安装提速10倍、Dapr和Jupyter支持、CLI k8s支持

    SmartIDE v0.1.18 (cli build 3538) 已经发布,在过去的Sprint 18中,我们集中精力推进对 k8s 远程工作区 的支持,同时继续扩展SmartIDE对不同技术栈的支 ...

  5. 【摸鱼神器】UI库秒变LowCode工具——列表篇(一)设计与实现

    内容摘要: 需求分析 定义 interface 定义 json 文件 定义列表控件的 props 基于 el-table 封装,实现依赖 json 渲染 实现内置功能:选择行(单选.多选),格式化.锁 ...

  6. django框架4

    内容概要 编辑删除功能编写 虚拟环境 django路由层版本区别 视图函数的返回值 JsonResponse对象 form表单上传文件 request其他方法 FBV与CBV(基于函数的视图.基于类的 ...

  7. 如何在 Mac 和虚拟机上安装 macOS Big Sur、Monterey 和 Ventura

    请访问原文链接:https://sysin.org/blog/how-to-install-macos/,查看最新版.原创作品,转载请保留出处. 作者主页:www.sysin.org 名词解释: 硬件 ...

  8. ShardingSphere 异构迁移最佳实践:将3.5亿量级的顾客系统 RTO 减少60倍

    Apache ShardingSphere 助力当当 3.5 亿用户量级顾客系统重构,由 PHP+SQL Server 技术栈无缝转型为 Java+ShardingSphere+MySQL,性能.可用 ...

  9. Java学习-第一阶段-第一节:Java概述

    JAVA概述 Java版本 原网址(https://www.oracle.com/java/technologies/java-se-support-roadmap.html) Oracle 将仅将某 ...

  10. Aeraki Mesh正式成为CNCF沙箱项目,腾讯云携伙伴加速服务网格成熟商用

    6月,由腾讯云主导,联合百度.灵雀云.腾讯音乐.滴滴.政采云等多家合作伙伴发起的服务网格开源项目 Aeraki Mesh 通过了全球顶级开源基金会云原生计算基金会(CNCF)技术监督委员会评定,正式成 ...