跳到主要内容

servicescan

servicescan 是服务指纹识别(全连接扫描)模块:对目标主机的端口建立完整 TCP 连接,发送探测包并比对指纹规则,识别出端口上运行的服务名称、版本与 CPE 信息。相比 synscan 只判断"端口是否开放",servicescan 更精准,能回答"这个开放端口上跑的是什么服务"。

典型用法是先用 synscan 快速筛出开放端口,再用 servicescan.ScanFromSynResult 对开放端口做指纹识别,兼顾速度与精度;也可以直接用 servicescan.Scan 对少量目标做端到端扫描。结果以 channel 流式返回 *MatchResult,可一边扫描一边消费,对每个结果调用 IsOpen() 判断开放、String() 获取可读摘要、GetCPEs()/GetProto() 获取 CPE 与协议。

模块支持服务(nmap)指纹与 Web 指纹两套规则:用 service() 仅跑服务指纹、web() 仅跑 Web 指纹、all() 同时启用;并提供并发(concurrent)、探测超时(probeTimeout)、主动发包(active)、代理(proxy)、可取消上下文(context) 等大量可选项。可与 synscan、ping、spacengine(网络空间测绘) 等模块联动,是资产发现阶段的核心工具。

共 32 个函数

可变参数函数索引

函数参数返回值说明
servicescan.Scantarget string, port string, opts ...fp.ConfigOptionchan *fp.MatchResult, errorservicescan 库使用的端口扫描类型的方式为全连接扫描,用于对连接目标进行精准的扫描,相比 synscan 库的单纯扫描,servicescan 库会尝试获取精确指纹信息以及 CPE 信息
servicescan.ScanFromPingres chan *pingutil.PingResult, ports string, opts ...fp.ConfigOptionchan *fp.MatchResult, error从 ping.Scan 的结果中进行指纹识别
servicescan.ScanFromSpaceEngineres any, opts ...fp.ConfigOptionchan *fp.MatchResult, errorScanFromSynResult / ScanFromSpaceEngine 从 synscan.Scan 或者 spacengine.Query 的结果中进行指纹识别
servicescan.ScanFromSynResultres any, opts ...fp.ConfigOptionchan *fp.MatchResult, error/ ScanFromSpaceEngine 从 synscan.Scan 或者 spacengine.Query 的结果中进行指纹识别
servicescan.ScanOnetarget string, port int, opts ...fp.ConfigOption*fp.MatchResult, errorservicescan 单体扫描,同步扫描一个目标,主机+端口

可变参数函数详情

Scan

Scan(target string, port string, opts ...fp.ConfigOption) (chan *fp.MatchResult, error)

servicescan 库使用的端口扫描类型的方式为全连接扫描,用于对连接目标进行精准的扫描,相比 synscan 库的单纯扫描,servicescan 库会尝试获取精确指纹信息以及 CPE 信息

必填参数

参数名类型说明
targetstring目标地址,支持 CIDR 格式,支持 192.168.1.1-100 格式
portstring端口,支持 1-65535、1,2,3、1-100,200-300 格式

可选参数

可作为可变参数 opts ...fp.ConfigOption 传入选项;共 27 个可用选项,详见 ConfigOption 选项列表

返回值

序号类型说明
r1chan *fp.MatchResultchan *MatchResult: 指纹识别结果管道,逐个产出扫描结果
r2error启动失败时返回错误

示例:servicescan.Scan 的基础全连接扫描

// 全连接扫描本机常见端口,对开放端口打印指纹与 CPE 信息
ch, err = servicescan.Scan("127.0.0.1", "22,80,443,3306")
die(err) // 启动失败时停止脚本
for result := range ch {
if result.IsOpen() { // IsOpen 判断端口是否开放
println(result.String()) // 可读摘要,含服务名与版本
println(result.GetCPEs()) // CPE 列表
}
}

示例:控制并发与探测超时

// 目标端口较多时调大并发,并设置单个探测包超时
ch, err = servicescan.Scan("192.168.1.1/24", "1-1000",
servicescan.concurrent(50), // 50 个并发
servicescan.probeTimeout(5), // 单个探测包 5 秒超时
)
die(err)
for result := range ch {
if result.IsOpen() {
println(result.String())
}
}

示例:仅识别 Web 指纹

// 只跑 Web 指纹规则,扫描常见 Web 端口
ch, err = servicescan.Scan("127.0.0.1", "80,443,8080,8443", servicescan.web())
die(err)
for result := range ch {
if result.IsOpen() {
println(result.String())
}
}

ScanFromPing

ScanFromPing(res chan *pingutil.PingResult, ports string, opts ...fp.ConfigOption) (chan *fp.MatchResult, error)

从 ping.Scan 的结果中进行指纹识别

必填参数

参数名类型说明
reschan *pingutil.PingResultping.Scan 的结果管道
portsstring端口,支持 1-65535、1,2,3、1-100,200-300 格式

可选参数

可作为可变参数 opts ...fp.ConfigOption 传入选项;共 27 个可用选项,详见 ConfigOption 选项列表

返回值

序号类型说明
r1chan *fp.MatchResultchan *MatchResult: 指纹识别结果管道,逐个产出扫描结果
r2error启动失败时返回错误

示例:先 ping 探活再做指纹识别

// 先用 ping 探活,再只对存活主机做服务指纹识别,省去对死主机的探测
pingResult, err = ping.Scan("192.168.1.1/24")
die(err)
fpResults, err = servicescan.ScanFromPing(pingResult, "22,80,443,3389")
die(err)
for result := range fpResults {
if result.IsOpen() {
println(result.String())
}
}

ScanFromSpaceEngine

ScanFromSpaceEngine(res any, opts ...fp.ConfigOption) (chan *fp.MatchResult, error)

ScanFromSynResult / ScanFromSpaceEngine 从 synscan.Scan 或者 spacengine.Query 的结果中进行指纹识别

必填参数

参数名类型说明
resanysynscan.Scan 或者 spacengine.Query 的结果

可选参数

可作为可变参数 opts ...fp.ConfigOption 传入选项;共 27 个可用选项,详见 ConfigOption 选项列表

返回值

序号类型说明
r1chan *fp.MatchResultchan *MatchResult: 指纹识别结果管道,逐个产出扫描结果
r2error启动失败时返回错误

示例:与 synscan 联动(先快速探活, 再精准识别指纹)

// 先用 synscan 快速探活开放端口,再交给 servicescan 做精准指纹识别,兼顾速度与精度
synResult, err = synscan.Scan("127.0.0.1", "1-65535")
die(err)
fpResults, err = servicescan.ScanFromSynResult(synResult)
die(err)
for result := range fpResults {
println(result.String())
}

示例:与网络空间测绘(spacengine)联动复核指纹

// 把网络空间测绘(如 shodan)查询到的资产交给 servicescan 复核服务指纹
res, err = spacengine.ShodanQuery("YOUR_API_KEY", "apache")
die(err)
fpResults, err = servicescan.ScanFromSpaceEngine(res)
die(err)
for result := range fpResults {
println(result.String())
}

ScanFromSynResult

ScanFromSynResult(res any, opts ...fp.ConfigOption) (chan *fp.MatchResult, error)

/ ScanFromSpaceEngine 从 synscan.Scan 或者 spacengine.Query 的结果中进行指纹识别

必填参数

参数名类型说明
resanysynscan.Scan 或者 spacengine.Query 的结果

可选参数

可作为可变参数 opts ...fp.ConfigOption 传入选项;共 27 个可用选项,详见 ConfigOption 选项列表

返回值

序号类型说明
r1chan *fp.MatchResultchan *MatchResult: 指纹识别结果管道,逐个产出扫描结果
r2error启动失败时返回错误

示例:与 synscan 联动(先快速探活, 再精准识别指纹)

// 先用 synscan 快速探活开放端口,再交给 servicescan 做精准指纹识别,兼顾速度与精度
synResult, err = synscan.Scan("127.0.0.1", "1-65535")
die(err)
fpResults, err = servicescan.ScanFromSynResult(synResult)
die(err)
for result := range fpResults {
println(result.String())
}

示例:与网络空间测绘(spacengine)联动复核指纹

// 把网络空间测绘(如 shodan)查询到的资产交给 servicescan 复核服务指纹
res, err = spacengine.ShodanQuery("YOUR_API_KEY", "apache")
die(err)
fpResults, err = servicescan.ScanFromSpaceEngine(res)
die(err)
for result := range fpResults {
println(result.String())
}

ScanOne

ScanOne(target string, port int, opts ...fp.ConfigOption) (*fp.MatchResult, error)

servicescan 单体扫描,同步扫描一个目标,主机+端口

必填参数

参数名类型说明
targetstring目标地址
portint端口

可选参数

可作为可变参数 opts ...fp.ConfigOption 传入选项;共 27 个可用选项,详见 ConfigOption 选项列表

返回值

序号类型说明
r1*fp.MatchResult*MatchResult: 单个目标的指纹识别结果
r2error扫描失败时返回错误

示例:servicescan.ScanOne 同步扫描单个目标

// 同步扫描单个 host:port,直接拿到一个结果(端口关闭也会返回结果、不报错)
result, err = servicescan.ScanOne("127.0.0.1", 80, servicescan.probeTimeout(5))
die(err)
if result.IsOpen() {
println(result.String()) // 可读摘要
println(result.GetCPEs()) // CPE 列表
}

可变参数选项列表

以下按选项类型汇总全部可变参数选项(原先重复在各主函数下的选项表已收拢到此处):

1. 类型:ConfigOption

涉及到的函数有:servicescan.Scanservicescan.ScanFromPingservicescan.ScanFromSpaceEngineservicescan.ScanFromSynResultservicescan.ScanOne

选项函数参数返回值说明
servicescan.activeraw boolConfigOption设置是否启用主动发包模式,主动向目标发送探测包以提升指纹识别准确率
servicescan.all-fp.ConfigOptionservicescan 的配置选项,强制同时启用 Web 与服务(nmap)全部指纹识别
servicescan.cacheb boolConfigOptionservicescan 的配置选项,设置本次扫描是否使用缓存
servicescan.concurrentsize intConfigOptionservicescan 的配置选项,用于设置整体扫描并发
servicescan.contextctx context.ContextConfigOption设置服务扫描使用的 context,用于取消或超时控制
servicescan.databaseCacheb boolConfigOptionservicescan 的配置选项,设置本次扫描是否使用数据库缓存
servicescan.debugLogb ...boolConfigOption的配置选项,设置本次扫描是否使用 debugLog
servicescan.disableDefaultRuleb ...boolfp.ConfigOptionservicescan 的配置选项,禁用内置默认指纹规则(通常配合自定义规则使用)
servicescan.disableOpenPortGuardb ...boolConfigOptionservicescan 的配置选项, 禁用单主机开放端口数保护.
servicescan.disableWebScanConnPoolb boolfp.ConfigOptionservicescan 的配置选项,用于禁用 web 扫描的连接池
servicescan.excludeHostshosts stringConfigOptionservicescan 的配置选项,设置本次扫描排除的主机
servicescan.excludePortsports stringConfigOptionservicescan 的配置选项,设置本次扫描排除的端口
servicescan.maxProbesm intConfigOptionservicescan 的配置选项,在主动模式发包的基础上设置本次扫描使用的最大探测包数量,默认值为 5
servicescan.maxProbesConcurrentm intConfigOptionservicescan 的配置选项,设置本次扫描发送 Probe 的并发量,默认值为 5
servicescan.nmapRarityMaxrarity intConfigOptionservicescan 的配置选项,设置本次扫描使用的 Nmap 指纹稀有度,在主动模式发包的基础上进行探测控制
servicescan.nmapRulei anyConfigOptionservicescan 的配置选项,设置本次扫描使用的 Nmap 指纹规则
servicescan.onFinishcb func(*MatchResult)ConfigOptionservicescan 的配置选项,设置本次扫描完成单个目标时的回调函数
servicescan.onOpencb func(*MatchResult)ConfigOptionservicescan 的配置选项,设置本次扫描端口开放时的回调函数
servicescan.openPortGuardLimitlimit intConfigOptionservicescan 的配置选项, 设置单主机开放端口数熔断阈值.
servicescan.probeTimeoutf float64ConfigOptionservicescan 的配置选项,设置每一个探测包的超时时间
servicescan.protoproto ...anyfp.ConfigOptionservicescan 的配置选项,用于指定扫描协议
servicescan.proxyproxies ...stringConfigOptionservicescan 的配置选项,设置本次扫描使用的代理
servicescan.service-fp.ConfigOptionservicescan 的配置选项,仅启用服务(nmap)指纹识别,禁用 Web 指纹
servicescan.web-fp.ConfigOptionservicescan 的配置选项,仅启用 Web 指纹识别(只扫描 Web 服务指纹)
servicescan.webRulers ...anyConfigOptionservicescan 的配置选项,设置本次扫描使用的 Web 指纹规则
servicescan.withRuleGroupgroups ...stringConfigOptionservicescan 的配置选项,用于指定指纹库中的指纹组。
servicescan.withRuleGroupAll-ConfigOptionservicescan 的配置选项,用于指定使用指纹组的全部指纹。