“端口扫描时一个连接能做什么?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/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"` // 关键词/匹配表达式
}
匹配方式说明
一、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高效灵活的指纹匹配模块架构细节
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论