跳到主要内容

finscan

finscan 库实现 FIN 扫描——一种隐蔽的端口扫描技术:向目标端口发送仅置 FIN 标志的 TCP 包,依据是否回 RST 判断端口状态。相比 SYN 扫描更隐蔽,可绕过部分简单防火墙/日志,但对现代系统准确性有限。

典型使用场景:

  • 扫描:finscan.Scan(target, port, opts...) 对目标端口做 FIN 扫描,返回结果 channel。
  • 控制:finscan.concurrent / finscan.rateLimit 控速,finscan.excludeHosts / finscan.excludePorts 排除,finscan.wait 控制收包等待,finscan.outputFile / finscan.outputPrefix 落盘。

与相邻库的关系:finscansynscan(SYN 半开放扫描)同属底层端口探测,需要原始套接字权限;发现开放端口后可交给 servicescan 做指纹识别。

共 10 个函数

函数索引

函数参数返回值说明
finscan.concurrentcount intfinScanOpt设置 FIN 扫描的并发,可以有效控制精准度
finscan.excludeHostshosts stringfinScanOpt设置 FIN 扫描时需要排除的主机
finscan.excludePortsports stringfinScanOpt设置 FIN 扫描时需要排除的端口
finscan.initHostFilterf stringfinScanOpt设置 FIN 扫描的初始主机过滤器,仅扫描命中过滤器的主机
finscan.initPortFilterf stringfinScanOpt设置 FIN 扫描的初始端口过滤器,仅扫描命中过滤器的端口
finscan.outputFilefile stringfinScanOpt设置 FIN 扫描的端口开放结果保存到指定文件
finscan.outputPrefixprefix stringfinScanOpt设置 FIN 扫描结果保存到文件时添加自定义前缀,比如 tcp:// https:// http:// 等,需要配合 outputFile 使用
finscan.rateLimitms int, count intfinScanOpt设置 FIN 扫描的发包速率限制(每 count 个数据包延迟 ms 毫秒)
finscan.waitsec float64finScanOpt设置 FIN 扫描发出 FIN 包后等待回包的最大时间

可变参数函数索引

函数参数返回值说明
finscan.Scantarget string, port string, opts ...finScanOptchan *finscan.FinScanResult, error对目标执行 FIN 端口扫描,以 channel 形式流式返回开放端口结果

函数详情

concurrent

concurrent(count int) finScanOpt

设置 FIN 扫描的并发,可以有效控制精准度

在 yak 中通过 finscan.concurrent 调用

参数

参数名类型说明
countint并发数

返回值

序号类型说明
r1finScanOpt一个 finscan.Scan 可接收的配置选项

示例

// 该示例为示意性用法:设置 FIN 扫描并发
res = finscan.Scan("192.168.1.1", "1-1000", finscan.concurrent(1000))~

excludeHosts

excludeHosts(hosts string) finScanOpt

设置 FIN 扫描时需要排除的主机

在 yak 中通过 finscan.excludeHosts 调用

参数

参数名类型说明
hostsstring需要排除的主机表达式,支持 IP、CIDR、范围等

返回值

序号类型说明
r1finScanOpt一个 finscan.Scan 可接收的配置选项

示例

// 该示例为示意性用法:排除网关地址
res = finscan.Scan("192.168.1.1/24", "80", finscan.excludeHosts("192.168.1.1"))~

excludePorts

excludePorts(ports string) finScanOpt

设置 FIN 扫描时需要排除的端口

在 yak 中通过 finscan.excludePorts 调用

参数

参数名类型说明
portsstring需要排除的端口表达式,如 "9100,9200"

返回值

序号类型说明
r1finScanOpt一个 finscan.Scan 可接收的配置选项

示例

// 该示例为示意性用法:排除指定端口
res = finscan.Scan("192.168.1.1", "1-65535", finscan.excludePorts("9100,9200"))~

initHostFilter

initHostFilter(f string) finScanOpt

设置 FIN 扫描的初始主机过滤器,仅扫描命中过滤器的主机

在 yak 中通过 finscan.initHostFilter 调用

参数

参数名类型说明
fstring初始主机过滤表达式

返回值

序号类型说明
r1finScanOpt一个 finscan.Scan 可接收的配置选项

示例

// 该示例为示意性用法:设置初始主机过滤器
res = finscan.Scan("192.168.1.1/24", "80", finscan.initHostFilter("192.168.1.0/24"))~

initPortFilter

initPortFilter(f string) finScanOpt

设置 FIN 扫描的初始端口过滤器,仅扫描命中过滤器的端口

在 yak 中通过 finscan.initPortFilter 调用

参数

参数名类型说明
fstring初始端口过滤表达式

返回值

序号类型说明
r1finScanOpt一个 finscan.Scan 可接收的配置选项

示例

// 该示例为示意性用法:设置初始端口过滤器
res = finscan.Scan("192.168.1.1", "1-65535", finscan.initPortFilter("80,443"))~

outputFile

outputFile(file string) finScanOpt

设置 FIN 扫描的端口开放结果保存到指定文件

在 yak 中通过 finscan.outputFile 调用

参数

参数名类型说明
filestring结果保存的文件路径

返回值

序号类型说明
r1finScanOpt一个 finscan.Scan 可接收的配置选项

示例

// 该示例为示意性用法:将结果保存到文件
res = finscan.Scan("192.168.1.1", "1-65535", finscan.outputFile("/tmp/open_ports.txt"))~

outputPrefix

outputPrefix(prefix string) finScanOpt

设置 FIN 扫描结果保存到文件时添加自定义前缀,比如 tcp:// https:// http:// 等,需要配合 outputFile 使用

在 yak 中通过 finscan.outputPrefix 调用

参数

参数名类型说明
prefixstring保存到文件时添加的前缀,例如 tcp://

返回值

序号类型说明
r1finScanOpt一个 finscan.Scan 可接收的配置选项

示例

// 该示例为示意性用法:为结果添加前缀
res = finscan.Scan("192.168.1.1", "1-65535", finscan.outputFile("./open_ports.txt"), finscan.outputPrefix("tcp://"))~

rateLimit

rateLimit(ms int, count int) finScanOpt

设置 FIN 扫描的发包速率限制(每 count 个数据包延迟 ms 毫秒)

在 yak 中通过 finscan.rateLimit 调用

参数

参数名类型说明
msint延迟毫秒数
countint每多少个数据包延迟一次

返回值

序号类型说明
r1finScanOpt一个 finscan.Scan 可接收的配置选项

示例

// 该示例为示意性用法:限制发包速率
res = finscan.Scan("192.168.1.1", "1-1000", finscan.rateLimit(10, 5))~

wait

wait(sec float64) finScanOpt

设置 FIN 扫描发出 FIN 包后等待回包的最大时间

在 yak 中通过 finscan.wait 调用

参数

参数名类型说明
secfloat64等待时间,单位为秒

返回值

序号类型说明
r1finScanOpt一个 finscan.Scan 可接收的配置选项

示例

// 该示例为示意性用法:设置等待时间
res = finscan.Scan("192.168.1.1", "80,443", finscan.wait(5))~

可变参数函数详情

Scan

Scan(target string, port string, opts ...finScanOpt) (chan *finscan.FinScanResult, error)

对目标执行 FIN 端口扫描,以 channel 形式流式返回开放端口结果

在 yak 中通过 finscan.Scan 调用,FIN 扫描具有较好的隐蔽性,依赖网络环境且通常需要相应权限

必填参数

参数名类型说明
targetstring扫描目标,支持 IP、域名、CIDR、逗号分隔等多种写法
portstring端口表达式,如 "80,443"、"1-65535"

可选参数

参数名类型说明
opts...finScanOpt可选配置项,如 finscan.concurrent、finscan.wait、finscan.excludePorts 等

返回值

序号类型说明
r1chan *finscan.FinScanResult一个只读 channel,逐条产出 FIN 扫描结果
r2error错误信息,启动失败时非 nil

示例

// 该示例为示意性用法:对目标执行 FIN 端口扫描
res = finscan.Scan("192.168.1.1", "22,80,443", finscan.wait(5))~

for result = range res {
println(result.Host, result.Port)
}