Releases: shadow1ng/fscan
Release list
v2.2.0
fscan v2.2.0
v2.2.0 是 v2.2 系列首个正式版,基于 v2.1.3 之后的 RC 测试和 Issue 反馈整理发布。
本版本重点提升大规模扫描稳定性、POC 扫描可靠性、非标准端口服务识别、插件隔离和嵌入式 SDK 能力。
重点变化
嵌入式 Scanner SDK
新增 pkg/fscan,fscan 从纯 CLI 工具扩展为可嵌入的 Go 扫描引擎:
- 支持在 Go 程序内直接调用扫描能力
- Scanner 实例拥有独立
config/state/session - 全局状态迁移到 session,改善多实例并发隔离
- 补充 SDK 结果转换、配置校验和并发扫描测试
大规模扫描稳定性
- 新增流式 Host Iterator,大 CIDR 不再一次性展开到内存
- 移除 MaxHosts 硬限制,大网段不再被静默截断
- 新增自适应并发调度,基于 RTT、丢包率、fd limit 自动推导扫描参数
- 线程池升级为 AIMD + 慢启动,遇到资源耗尽时自动降速
-gt全局超时正式生效,超时后会取消扫描任务- 新增
-nsp,可禁用网段预筛
服务识别与插件调度
- 修复非标准端口服务无法匹配插件的问题
- 新增服务缓存和指纹驱动插件匹配
-full模式下 Web 插件可覆盖所有开放端口- 不确定服务增加 HTTP 回退探测
- 移除误导性的“无可用插件”日志
- 用户指定
-p时 UDP 插件按端口交集正确调度
Web / POC 扫描
- 修复默认扫描 POC 结果缺失
- 修复
-hf批量扫描时 POC 缺失 - 修复 HTTPS 端口误用 HTTP 扫描 POC
- 修复 POC 结果文件只显示
vulnerable不显示漏洞名称 - POC 加载按
pocpath隔离缓存,多 session 不再互相覆盖 - 修复 CEL、reverseCheck、正则缓存等稳定性问题
-nopoc禁用 POC 时不再输出误导性错误日志
新增协议插件
新增多种原生协议插件,覆盖邮件、Java 调试、文件共享、带外管理、UDP 和工控场景:
| 插件 | 用途 |
|---|---|
| IMAP / POP3 | 邮件服务器检测 |
| JDWP | Java Debug 端口检测 |
| NFS / RMI | 文件共享 / Java 远程调用 |
| IPMI | 服务器带外管理 |
| SNMP / DNS / BACnet / Modbus | 网络设备、DNS、工控协议检测 |
Web 版
- 拆分 CLI / Web 入口
- Web 版结果存储改为 SQLite 持久化
- Web API 版本号改为动态读取
Bug 修复摘要
- 修复 #586 默认扫描 POC 结果缺失
- 修复 #587
-hf批量扫描 POC 缺失 - 修复 #588 非标准端口服务插件匹配问题
- 修复 #590 Telnet Cisco MOTD 横幅误判 shell prompt
- 修复 #591 HTTPS POC 协议错误与结果名称缺失
- 修复 #592 service probe 空指针 panic
- 修复 #593
-ehf排除主机未生效,支持 IP / CIDR / range - 修复 UDP 插件阻塞导致扫描无法结束
- 修复 SSH goroutine 泄漏和握手 deadline 问题
- 修复 Redis exploit 超时和非超时错误处理
- 修复 MongoDB SCRAM、Cassandra、Oracle 等协议问题
- 修复 SOCKS5 代理认证、LM:NT hash、逗号分隔密码等参数问题
- 修复非终端输出 ANSI 控制码覆盖结果
- 修复 CSV / NDJSON / TXT 输出若干字段问题
- 修复 ARM 32 位原子计数器对齐问题
升级注意
- WebUI 仍建议视为实验性能力
- 本地后渗透插件仅用于授权环境
- v2.2.0 改动较大,建议从 v2.1.3 升级的用户先在测试环境验证扫描参数
- 如依赖旧版本输出格式,请重点检查 POC、SERVICE、VULN 结果字段
版本说明
| 版本 | 说明 |
|---|---|
| fscan | 标准版,包含全部插件(推荐) |
| fscan-nolocal | 精简版,不含本地模块(体积更小) |
| fscan-web | WebUI 版,带 Web 管理界面(主流平台) |
平台支持
| 平台 | 架构 |
|---|---|
| Linux | x64, x32, arm64, armv5/6/7, mips, mips64, mipsle |
| Windows | x64, x32 |
| macOS | x64, arm64 |
| FreeBSD | x64, x32, arm64, armv5/6/7 |
| Solaris | x64 |
校验
本版本已通过:
go test ./...- 近期 Issue 回归验证
- 本地 HTTP / HTTPS POC 扫描验证
-hf批量 POC 扫描验证-ehfIP / CIDR 排除验证
完整变更记录见:
v2.2.0-rc.1
fscan v2.2.0-rc.1
⚠️ 这是预发布版本 (Release Candidate),可能存在未发现的问题。
如果你在使用中遇到任何异常,请积极通过 Issue 反馈,帮助我们尽快稳定正式版。
生产环境建议继续使用 v2.1.3。
与 v2.2.0-rc 的变更
本版本基于大量实机测试反馈,修复 30+ 个问题,新增自适应扫描系统。183 个文件变更。
🚀 新功能
自适应并发调度
扫描前自动探测网络环境(RTT、丢包率、fd limit),基于探测数据推导关键参数,替代硬编码默认值:
- Timeout:
median_RTT + 4σ(覆盖 99.9% 正常连接),下限 1s,上限 10s - ModuleThreadNum:
ThreadNum / 30,下限 5,上限 50 - MaxRetries: 基于丢包率推导,保证全失败概率 <1%
- ICMPRate / PocNum: 跟随环境和并发自动调整
线程池升级为 AIMD + 慢启动:慢启动阶段 500ms 翻倍,稳态 AIMD(健康 +5%,拥塞 ×0.5),双信号(资源耗尽率 + RTT 趋势)驱动。
协议级超时下限(ModuleTimeout)
新增 Config.ModuleTimeout() 方法,保证插件级交互超时不低于 3s。自适应系统将端口扫描超时压到 1s 时,SSH 握手、SNMP 探测、数据库认证等多轮交互协议不再受影响。全部 44 个服务插件已迁移。
限流错误分类(ErrorTypeThrottle)
新增 ErrorTypeThrottle 错误类型,区分服务端限流(SSH MaxStartups 等)和真正的网络不可达。限流错误不计入连续失败计数,触发 500ms 退避后继续,避免误判目标不可达而提前放弃。
Web 版独立入口
- 拆分
main.go为main_cli.go和main_web.go - Web 版结果存储从内存替换为 SQLite 持久化(纯 Go 零 CGO)
🐛 Bug 修复
插件调度(#586 #587 #588)
- 非标准端口服务无法匹配插件 — SSH 在 8881 端口,端口匹配失败导致插件不执行。新增服务名称缓存 + 指纹驱动回退匹配 (#588)
- 移除误导性的"无可用插件"日志 — 预检基于静态端口匹配,不代表实际不执行 (#588)
- 默认扫描 POC 结果缺失 —
executeRules返回空vulName导致检测结果被丢弃 (#586) - 批量扫描(-hf)POC 缺失 — 并发压力下 HTTP 请求瞬时失败未重试,跳过指纹识别和 POC 触发。加入指数退避重试 (#587)
- UDP 插件在
-p指定端口时被跳过 — 现在按用户指定端口过滤并正确调度 -full模式下 Web 插件跳过IsMarkedWebService检查- 不确定服务补做 HTTP 回退探测,覆盖自定义 HTTP 框架漏网场景
UDP 插件
- UDP 插件阻塞导致扫描无法结束 —
conn.Read()在目标不响应时无限阻塞。所有 UDP 插件(SNMP/BACnet/DNS/IPMI/TFTP)统一使用 context timeout + conn.Close 双保险 - SNMP community 爆破混入通用密码字典 — 57 个通用密码串行探测导致 10 分钟阻塞,精简为 8 个专用 community
SSH
- SSH goroutine 泄漏 —
ssh.NewClientConn不接受 context,context 取消后底层 TCP 连接未关闭,大规模扫描时泄漏数万 goroutine - SSH 握手无 TCP deadline 兜底 — 在
NewClientConn前设置 deadline,握手成功后清除 - SSH 爆破并发过高 — 从 30 降至 3,避免触发 OpenSSH MaxStartups 限流
Redis
- Redis exploit 无超时保护 — exploit 阶段移除了全部 deadline,改为 30s 超时
- Redis readReply 吞没非超时错误 — 现在仅对 timeout 类型错误做容忍
POC 引擎
- DetectPocFormat 误判含 transport 的 fscan POC 为 xray 格式 — 修复后 388 个 POC 全部正确加载(之前 8 个失败)
- CEL clustersend 结果判断错误 — 从字符串比较改为类型断言
- CEL wait() 函数 nil Reverse 指针 panic
- reverseCheck 无超时 — 加 10s 超时防止 ceye API 阻塞
- 正则编译结果未缓存 —
doSearch/bmatches缓存到sync.Map
参数与输出
-gt全局超时参数是死代码 — 现在真正生效,超时后取消所有扫描任务-nopoc禁用 POC 时仍输出错误日志 — 已修复-debug日志文件写入失败 —applyLogLevel重建 Logger 时丢失DebugLogFile配置-hash不支持 LM:NT 格式 — 现在支持aad3b435b51404ee:31d6cfe0d16ae931...标准格式-pwd不支持逗号分隔多个密码 — 现在-pwd "123,456,root"正确拆分-nobr跳过了 Redis 未授权检测 — 未授权是服务探测不是爆破,不受-nobr影响- 非终端输出时 ANSI 控制码覆盖扫描结果 — 管道/重定向时自动禁用进度条和颜色
- 静默模式 NDJSON banner 过长 — Redis INFO ~5KB 截断至 200 字符
- CSV 漏洞 Type 列为空 — 补全
type字段 - SNMP 探测成功但终端无输出 — 补充
session.LogVuln调用
其他
- service_probe 连接丢失后静默成功 —
Write/Read在Conn=nil时返回明确错误 - MongoDB readMongoMsg 未设置读超时
- TXTWriter.Close Sync 失败后未关闭文件
- MySQL 3306 服务名误识别为 genetec-5400 — nmap 指纹库误匹配,通过 banner 特征校正
- gmtls stdout 竞态 — 移除
os.Stdout非同步重定向
🏗️ 架构优化
- 统一服务缓存 —
webServiceCache扩展为通用serviceCache,下沉到 per-session State,消除多实例缓存串台 - CEL 表达式编译缓存 — 同一 POC 的所有规则共享编译后的 Program
- POC 全局状态消除 —
allPocs全局变量改为pocStore按 PocPath 缓存,并发场景不再互相覆盖 - 进度条竞态修复 —
isActive改为atomic.Bool - Lint 全量修复 — cassandra/ipmi/mongodb/webscan 的 ineffassign、unused、errcheck
反馈与贡献
- 🐛 发现 Bug → 提交 Bug 报告
- 🎯 结果不准 → 提交误报/漏报
- ✨ 功能建议 → 提交功能请求
- 💬 使用疑问 → Discussions
v2.2.0-rc
fscan v2.2.0-rc
⚠️ 这是预发布版本 (Release Candidate),可能存在未发现的问题。
如果你在使用中遇到任何异常,请积极通过 Issue 反馈,帮助我们尽快稳定正式版。
生产环境建议继续使用 v2.1.3。
与 v2.1.3 的主要变更
🏗️ 架构升级:嵌入式 Scanner SDK
新增 pkg/fscan 包,fscan 从纯 CLI 工具进化为可嵌入的扫描引擎。
- 支持从其他 Go 程序直接调用 fscan 扫描能力
- 每个 Scanner 实例拥有独立的 config/state/session
- 支持多实例并发扫描,日志和结果完全隔离
- 全局状态已完整迁移到 session 实例
🚀 大规模扫描支持
- 流式 Host Iterator — /8 级别 CIDR 不再一次性展开到内存
- 移除 MaxHosts 硬限制 — 大网段不再被静默截断
- ARM 原子计数器对齐 — 修复 32 位 ARM 平台 panic
🔌 新增协议插件(+9)
| 插件 | 用途 |
|---|---|
| IMAP / POP3 | 邮件服务器检测 |
| JDWP | Java Debug 端口检测 |
| NFS / RMI | 文件共享 / Java 远程调用 |
| IPMI | 服务器带外管理 |
| SNMP (UDP) | 网络设备管理 |
| DNS / BACnet / Modbus | DNS 服务 / 工控协议 |
全部为原生协议实现,零外部依赖。
⚡ 性能与体积优化
- Kafka/MongoDB/Cassandra 从重型客户端库改为 raw TCP 实现,二进制体积减小
- 热路径零分配、自适应连接池 CAS 无锁化
- Scanner 客户端指纹收敛(降低被检测概率)
🌐 网络能力增强
- SOCKS5 代理认证支持(用户名/密码)
- 国密 TLS(SM2/SM3/SM4)网站扫描
- 支持
-add-password追加多个自定义密码
🔧 本地后渗透插件
- 新增 sshkey、4 种持久化插件(crontask/systemd/winregistry/winschtask)
- minidump 降级链凭据提取 + 杀软前置检测
- cleaner 清理所有持久化痕迹
- systeminfo 整合合并(fileinfo/dcinfo/avdetect/envinfo)
📦 工程改进
- 目录重命名:
WebScan/→webscan/、mylib/→libs/ - i18n 覆盖扩展(中/英双语)
- 全量 lint/errcheck 修复
- 补充大量单元测试
⚠️ 已知问题 / 注意事项
| 问题 | 说明 |
|---|---|
| SDK 并发限速共享 | CanSendPacket() 全局限速器在多 Scanner 实例间共享(按进程限速,非按实例) |
| CEL 回连验证走全局 | DNSLog 反连检测的 HTTP 请求计数走全局 state(影响可忽略) |
| 本地插件仅限授权场景 | 持久化/minidump/shell 类插件仅用于授权渗透测试 |
| WebUI 为实验性功能 | fscan-web 版本的 Web 界面尚未完善 |
common 包未完全拆分 |
内部架构的 common 包职责仍较重,后续版本持续优化 |
反馈与贡献
这是一个 RC 版本,我们非常需要你的反馈:
- 🐛 发现 Bug → 提交 Bug 报告
- 🎯 结果不准 → 提交误报/漏报
- ✨ 功能建议 → 提交功能请求
- 💬 使用疑问 → Discussions
版本说明
| 版本 | 说明 |
|---|---|
| fscan | 标准版,包含全部插件(推荐) |
| fscan-nolocal | 精简版,不含本地后渗透模块(体积更小) |
| fscan-web | WebUI版,带 Web 管理界面(主流平台) |
平台支持
| 平台 | 架构 |
|---|---|
| Linux | x64, x32, arm64, armv5/6/7, mips, mips64, mipsle |
| Windows | x64, x32 |
| macOS | x64 (Intel), arm64 (Apple Silicon) |
| FreeBSD | x64, x32, arm64, armv5/6/7 |
| Solaris | X64n |
v2.1.3
fscan v2.1.3
感谢使用 fscan!
版本说明
| 版本 | 说明 |
|---|---|
| fscan | 标准版,包含全部插件(推荐) |
| fscan-nolocal | 精简版,不含本地模块(体积更小) |
| fscan-web | WebUI版,带Web管理界面(主流平台) |
平台支持
| 平台 | 架构 |
|---|---|
| Linux | x64, x32, arm64, armv5, armv6, armv7, mips, mips64, mipsle |
| Windows | x64, x32 |
| macOS | x64, arm64 |
| FreeBSD | x64, x32, arm64, armv5, armv6, armv7 |
| Solaris | x64 |
Changelog
🐛 问题修复
- 2e277a5: fix: 修复 plugins/local 未使用变量导致编译失败 (@ZacharyZcR)
- 7459da2: fix: 恢复 plugins/local 中实际使用的 config 变量 (@ZacharyZcR)
- 9d19188: fix: 移除 composite action 中不支持的 timeout-minutes (@ZacharyZcR)
🔧 其他改进
- 2c2ca6a: v2.1.3 Release (#572) (@ZacharyZcR)
完整更新日志: v2.1.2...v2.1.3
v2.1.2
fscan v2.1.2
感谢使用 fscan!
版本说明
| 版本 | 说明 |
|---|---|
| fscan | 标准版,包含全部插件(推荐) |
| fscan-nolocal | 精简版,不含本地模块(体积更小) |
| fscan-web | WebUI版,带Web管理界面(主流平台) |
平台支持
| 平台 | 架构 |
|---|---|
| Linux | x64, x32, arm64, armv6, armv7, mips, mips64, mipsle |
| Windows | x64, x32 |
| macOS | x64, arm64 |
| FreeBSD | x64, x32, arm64, armv6, armv7 |
| Solaris | x64 |
Changelog
🚀 新功能
- 6b13b2e: feat: 添加 GitHub Issue 模板 (@ZacharyZcR)
🐛 问题修复
- db0b53b: fix(ci): 扩展 UPX 压缩范围覆盖 ARM/MIPS/FreeBSD 架构 (@ZacharyZcR)
🔧 其他改进
- 594f567: Update README.md (@ZacharyZcR)
- 760c8ea: v2.1.2 核心优化与多架构发布 (#561) (@ZacharyZcR)
完整更新日志: v2.0.1...v2.1.2
1.8.4
1.8.3
fscan 1.8.2
fscan 1.8.1
加入手工gc回收,尝试节省无用内存。
-url 支持逗号隔开。
修复一个poc模块bug。
fscan 1.8.0
一、加强poc fuzz模块,支持跑备份文件、目录、shiro-key(默认跑10key,可用-full参数跑100key)等。
二、新增ms17017利用(使用参数: -sc add),可在ms17010-exp.go自定义shellcode,内置添加用户等功能。
三、新增poc、指纹。
四、支持socks5代理。
五、因body指纹更全,默认不再跑ico图标。