HBS高效灵活的指纹匹配模块架构细节

admin 2022年7月8日05:02:50评论89 views字数 4711阅读15分42秒阅读模式

“端口扫描时一个连接能做什么?HBS告诉你。





HBS高效灵活的指纹匹配模块架构细节


HBS是一个简单而强大的端口扫描器,快速而高效,并有一个简单而强大的指纹识别模块。


扫描端口的时候只用一个文件,一个连接,能做到什么程度?


这是HBS思考的核心思想和功能实现的目标,同时争取更加的人性化,简单易用。


本来想直奔主题的,还是把HBS的功能更新点说一下,发出来后希望能让github上面一堆的扫描器的代码质量提高一点,就算满足了。


更多HBS的介绍请看。《兵器谱》之扫描的艺术——HBS


HBS更新说明


2022-5-1 v0.1.0


1. 内部使用版。


2022-5-4 v0.2.0 


1. 从HScan和SothisGo的代码中,移入了一些好用的功能和易用性的参数设定。


2. 开放了指纹策略的导出和指定功能,用 -f 参数,可指纹文件, 可修改后指定使用。其实本来是不打算开放的。


3. 从HScan和SothisGo中的扫描模块中移入了通过TLS/SSL连接中获取的证书,提取扫描IP所在域名的功能,同时压缩后保存证书。


4. 参数中直接带入域名扫描时,先解析IP,解析出多个IP时,同时对所有IP进行扫描


5. 在域名后也可以直接指定  /c 等的CIDR地址范围,将自动解析IP地址, 然后将每个IP的CIDR范围去重后列入扫描目标


   比如用 hbs cnhonker.com /c 同时对cnhonker.com的整个C段进行扫描。 这下再也不用先ping再扫C段了。


6. 增加了参数的懒人容错功能。把不常用的参数隐藏了,可用 -h 查看。


用一张图来说明更新内容。

HBS高效灵活的指纹匹配模块架构细节




指纹匹配架构


本指纹匹配模块是HBS/HScan 与 SothisGo 的一部分。本来不打算开放定制的,为了方便内部人员维护一个大的指纹库,现在开放提供定制功能。


由于hbs只是一个端口扫描器,默认只扫主页,不追踪跳转和扫特定目录,所以不要制定主页响应之外的数据,如果特征不明显,请使用words匹配方式。


核心思想:


1、 遍历规则库时使用编号和指针,直接操作,避免重复拷贝数据结构。

2、 传递数据尽量都用指针。

3、匹配逻辑要严谨、少做无用功。


下面分别详细说一下实现的细节。


一、指纹库结构

用一个map[string]来保存指纹分组([]Finger)的指针,以便策略分组

默认将全部进行匹配,可以通过名称来指定要匹配的指纹组。


程序中定义如下:

// 保存所有 http 指纹数据var Fingers = map[string]*[]Finger{}


二、指纹结构

用一个Finger来表示一个名称,以及属于他的匹配策略组。


同名称下面的匹配策略,匹配成功一次,即退出当前名称下的策略,以提高匹配效率


为什么采用这种结构呢?


是因为看到市面上大多数的策略,都是单条策略摆放,明明匹配成功了,后面是同个名称,他还要继续匹配,一点效率都没有。


程序中定义如下:

// 指纹结构type Finger struct {  Name  string        `json:"name,omitempty" yaml:"name,omitempty"`   // 名称  Match []FingerMatch `json:"match,omitempty" yaml:"match,omitempty"` // 匹配策略 同一个名称匹配成功,则忽略后面的}


三、匹配策略

用type, part, rules 3个string来保存匹配策略,其中:


1. type 为匹配类型


   分别有: “regexp, strings, words, md5” ,注意用小写。为了追求效率,默认为 regexp 正则表达式匹配。


   匹配器其他的方式暂未用于hbs中。如hash、encode、binary、dsl、expression等。


2. part 为要匹配的位置


   针对http分别有 "headers" 和 "body",注意用小写。为空时默认为 headers。指定了其他名字匹配位置为 body。暂不支持两个位置都匹配。为了策略判断位置更加精确,没有加入 "all" 位置全局匹配。

  headers匹配会比较高效,建议多用headers里面的特征。

   一条策略只能匹配一个位置和一种方式,如果要多个地方匹配或者多个方式,请建一条新的策略来指定


3. rules 为要匹配的规则


   多个策略用“ ”分割,所以要匹配的内容不能是 | 号。换行或其他特殊字符请用    进行转义。匹配时按 | 切分成数组后进行判断

   遵循的策略是,能少写一行,就少写一行。当库里超过几百条的策略时,对眼睛的挑战将是无法想象的。

    本来编译的时候就把切分数据保存到结构的减少重复劳动的,但想着要多一个数组,就放弃了。


   一般来说,里面的内容是或的关系,匹配一条即表示成功,除了words匹配方式。words是所有里面的内容都匹配才表示策略匹配成功。


程序中定义如下:

// 匹配策略type FingerMatch struct {  Type  string `json:"type,omitempty" yaml:"type,omitempty"`   // 匹配方式 regexp, strings, words, md5  Part  string `json:"part,omitempty" yaml:"part,omitempty"`   // 匹配位置 headers, body  Rules string `json:"rules,omitempty" yaml:"rules,omitempty"` // 关键词/匹配表达式}

HBS高效灵活的指纹匹配模块架构细节


匹配方式说明


、regexp 正则匹配

1. regexp匹配方式的rules为正则表达式,表达式要用一对“()”把策略引起来,如果没写,程序将自动补上。


2. 正则表达式规则里的都是要匹配的内容,所以如果规则里有关于正则的特殊字符都需要转义,如 **| $ ()** 等


3.  加载时用 regexp.MustCompile()进行编译后保存至结构,匹配时通过指针传递数据、并调用regexp.MatchString()进行匹配。看到有的扫描器,每次都重新编译一次,每次看着都累。


4. 多个条件用 | 分割,一个成功即为匹配成功。

示例                  | 说明                                        |--------------------- | ------------------------------------------- |(SothisGo)            | 为对应位置有 sothisgo表示成功。区分大小写。 |(红盟|红客联盟|HUC)  | 三个中有一个即匹配成功 ()可省略                     |


二、strings匹配规则

1、strings 匹配方式的rules为一个或多个字符串,特殊字符得转义。


2、用strings.Contains()来判断是否匹配。


3. 多个条件用 | 分割,一个成功即为匹配成功。

示例                | 说明                                        |------------------- | ------------------------------------------- |SothisGo            | 为对应位置有 sothisgo表示成功。区分大小写。 |红盟|红客联盟|HUC    | 三个中有一个即匹配成功                      |


三、words匹配规则

1、strings 匹配方式的rules为一个或多个字符串,特殊字符得转义。


2、strings.Contains()来判断是否匹配。


3 、多个条件用 | 分割,全部匹配才返回成功。


4、此匹配方式可以用在没有很明显特征的页面,多个重复验证,减少误报率。

示例                | 说明                       ------------------- | --------------------------SothisGo            | 单条策略,效果跟strings一样红盟|红客联盟|HUC   | 三个都匹配才算成功         


四、md5匹配规则


1、由于hbs除了GET 获取网站根目录的响应,不做其他动作,所以一般为对 body 内容进行md5计算后进行匹配。


2、计算完一次后,将保存body的md5值,之后的策略如果再有md5匹配,将不再计算而直接判断。


3 、多个条件用 | 分割,全部匹配才返回成功。

示例                               | 说明       |---------------------------------- | ---------- |04d9541338e525258daf47cc844d59f3   | 匹配Big-IP |36c1002bb579edf52a472b9d2e39bb50|639b61409215d770a99667b446c80ea1  | 匹配Domino |


指纹匹配规则文件


一、规则文件

1、指纹匹配规则支持 yaml和json格式的配置文件。


2、默认为json,如果要使用yaml配置,必须得是yaml后缀名。


3、内容为一个以多个map分组保存多个Finger 的结构。


4、分组名不能重复,如果重复后者将会产生覆盖。


5、要覆盖程序内置的指纹库,请在策略文件里 建立三个分组 "net" "http" 和 "network", 大小写敏感。


6、大家可以多使用 -v 调试模式,共同维护一个庞大的指纹库。


二、json 格式示例
{   "default": [               {       "name": "ThinkPHP",                "match": [         {           "type": "regexp",           "part": "headers",           "rules": "ThinkPHP"         },         {           "type": "regexp",           "part": "body",           "rules": "www.thinkphp.cn"         }       ]     },     {       "name": "ThinkAdmin",       "match": [         {           "type": "regexp",           "part": "body",           "rules": "ThinkAdmin</title>"         }       ]     }   ]}

精简后:

{   "default": [               {       "name": "ThinkPHP",                "match": [         {           "rules": "ThinkPHP"         },         {           "part": "body",           "rules": "www.thinkphp.cn"         }       ]     },     {       "name": "ThinkAdmin",       "match": [         {           "part": "body",           "rules": "ThinkAdmin</title>"         }       ]     }   ]}



三、yaml格式示例

default: - name: ThinkPHP match: - type: regexp part: headers rules: (ThinkPHP) - type: regexp part: body rules: www.thinkphp.cn - name: ThinkAdmin match: - type: regexp part: body rules: ThinkAdmin</title>

精简后:


default:    - name: ThinkPHP      match:          rules: ThinkPHP        - part: body          rules: www.thinkphp.cn    - name: ThinkAdmin      match:        - part: body          rules: ThinkAdmin</title>






长按二维码关注公众号

HBS高效灵活的指纹匹配模块架构细节

长按二维码添加作者微信

HBS高效灵活的指纹匹配模块架构细节


你若欢喜,请点“在看” 


原文始发于微信公众号(开普勒安全团队):HBS高效灵活的指纹匹配模块架构细节

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年7月8日05:02:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   HBS高效灵活的指纹匹配模块架构细节http://cn-sec.com/archives/1162988.html

发表评论

匿名网友 填写信息