fscan
fscan copied to clipboard
PortFinger.go的trimBanner函数对SMB的banner处理可能越界
fscan/Core/PortFinger.go的trimBanner函数中可能越界
func trimBanner(buf []byte) string {
Common.LogDebug("开始处理横幅数据")
bufStr := string(buf)
// 特殊处理SMB协议
if strings.Contains(bufStr, "SMB") {
banner := hex.EncodeToString(buf)
if len(banner) > 0xa+6 && banner[0xa:0xa+6] == "534d42" { // "SMB" in hex //<<===len(banner)>0不保证len(banner)大于0xa2
Common.LogDebug("检测到SMB协议数据")
plain := banner[0xa2:] //<<===这里可能越界
data, err := hex.DecodeString(plain)
if err != nil {
Common.LogDebug("SMB数据解码失败: " + err.Error())
return bufStr
}
//...
例如处理下面这个包就会越界,不过前提是修改对probes的处理,正确发送"Probe TCP SMBProgNeg"才能测出来
[]byte{0x0, 0x0, 0x0, 0x25, 0xff, 0x53, 0x4d, 0x42, 0x72, 0x0, 0x0, 0x0, 0x0, 0x88, 0x3, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x6, 0x0, 0x0, 0x1, 0x0, 0x1, 0xff, 0xff, 0x0, 0x0}
对应的match是
match netbios-ssn m|^\0\0\0.\xffSMBr\0\0\0\0\x88..\0\0\0\0\0\0\0\0\0\0\0\0\0\0@\x06\0\0\x01\0\x01\xff\xff\0\0$|s p/Samba smbd/ v/4/ cpe:/a:samba:samba:4/
===================================================================== 怎么代码里面的正则匹配都是先把response转字符串再用match匹配啊,response是二进制,又不是都能转化成字符串
例如
//PortFinger.go
// MatchPattern 使用正则表达式匹配响应内容
func (m *Match) MatchPattern(response []byte) bool {
// 将响应转换为字符串并进行匹配
responseStr := string([]rune(string(response))) //<<===应该删掉
foundItems := m.PatternCompiled.FindStringSubmatch(responseStr)
//应该删掉FindStringSubmatch应该换成FindSubmatch或其他正则库中类似的函数,foundItems可以转化成string,但匹配的时候不能把response转成string
if len(foundItems) > 0 {
m.FoundItems = foundItems
Common.LogDebug(fmt.Sprintf("匹配成功,找到 %d 个匹配项", len(foundItems)))
return true
}
return false
}
基本都是issues#478的问题
收到,将马上修复
这部分应该修复掉了,我后面做了几次破坏性的重写,但是也不能排除问题依然存在,🤔,#478的问题修复掉了,等发布后如果还有问题可以我们再讨论下