shadow1ng
2c921c375b
Merge pull request #608 from NOPTrace/fix/smtp-deadline
...
发布 / auto-tag (push) Canceled after 0s
测试构建 / 代码检查 (push) Canceled after 0s
发布 / release (push) Canceled after 0s
测试构建 / 单元测试和构建 (push) Canceled after 0s
测试构建 / 构建验证 (push) Canceled after 0s
fix: set conn deadline in smtp testAnonymousAccess/testOpenRelay to avoid hang on silent servers
2026-09-17 12:19:08 +08:00
NOPTrace
6bb8ccd490
fix: set conn deadline in smtp testAnonymousAccess/testOpenRelay to avoid hang on silent servers
...
testAnonymousAccess and testOpenRelay dial the target and immediately
hand the connection to smtp.NewClient without setting any deadline.
smtp.NewClient reads the 220 greeting as its first operation, so a
server that accepts TCP but never sends data (honeypot/tarpit) blocks
the goroutine forever. The outer select waits on resultChan or
ctx.Done(); with the default -gt 0 the context has no deadline, so
Scan never returns and RunScan's wg.Wait() freezes the whole process.
Set the same ModuleTimeout deadline used by the other functions in
this file (doSMTPAuth, testVRFYCommand, testEXPNCommand, getServerInfo).
Verified against a live accept-but-silent SMTP endpoint:
- unpatched: process hangs (31 goroutines, stack at smtp.go:276)
- patched: full plugin chain completes in ~92s, no regression on
normally-responding servers (detection output identical)
2026-09-17 09:24:05 +08:00
ZacharyZcR
95cc12e753
Merge pull request #604 from shadow1ng/dev
...
发布 / auto-tag (push) Canceled after 0s
测试构建 / 代码检查 (push) Canceled after 0s
发布 / release (push) Canceled after 0s
测试构建 / 单元测试和构建 (push) Canceled after 0s
测试构建 / 构建验证 (push) Canceled after 0s
release: v2.2.1
v2.2.1
2026-08-26 04:43:42 +08:00
ZacharyZcR
75f4265098
Merge remote-tracking branch 'origin/main' into dev
测试构建 / 代码检查 (push) Canceled after 0s
测试构建 / 单元测试和构建 (push) Canceled after 0s
测试构建 / 构建验证 (push) Canceled after 0s
2026-08-26 04:34:51 +08:00
ZacharyZcR
5bda99528b
docs: add v2.2.1 release notes
2026-08-26 04:31:59 +08:00
ZacharyZcR
a1ff55ef55
fix: resolve recent service scan regressions
2026-08-26 04:19:58 +08:00
ZacharyZcR
1418f6d8ce
Disable default global scan timeout
2026-08-25 23:50:30 +08:00
ZacharyZcR
3ef7a1beee
feat: expand internal network poc coverage
测试构建 / 代码检查 (push) Has been cancelled
测试构建 / 单元测试和构建 (push) Has been cancelled
测试构建 / 构建验证 (push) Has been cancelled
2026-07-16 02:04:36 +08:00
ZacharyZcR
621b2c2f24
feat: add curated internal network pocs
2026-07-16 01:45:09 +08:00
ZacharyZcR
61ae87d171
chore: bump dev version to 2.2.1
2026-07-16 01:08:05 +08:00
逸航
9d0010927e
fix: 修复高并发下自适应超时过低导致开放端口漏扫 ( #598 )
...
* fix: 修复高并发下自适应超时过低导致开放端口漏扫 (#503 )
扫描本机/低 RTT 目标时,AdaptiveTimeout 在 10 次采样后迅速收敛到 100ms 下限。高并发(600+ 线程)下 TCP 握手尾延迟可能超过 100ms,加上超时错误不会重试,导致开放端口被误判为关闭。
- AdaptiveTimeout 下限从 100ms 提升至 max(500ms, maxTimeout/5)
- connectWithRetry 对超时错误用完整超时重试一次
- slidingWindowSchedule 任务丢弃时记录日志,便于排查漏扫
* refactor: 按 review 意见移除无条件超时重试,补充 minTO 下限测试
根据 #598 review 反馈:
1. 移除 connectWithRetry 中 timeout->full maxTO 无条件重试
- filtered/无响应端口占超时大头,盲目重试只烧时间
- #503 主场景靠 minTO 抬升已足够覆盖
2. 移除不再使用的 MaxTimeout() 方法和 port_scan_timeout_retry i18n 条目
3. AdaptiveTimeout 收敛测试补充 minTO 下限断言(3s->600ms)
2026-07-16 01:07:27 +08:00
ZacharyZcR
bf036fd9b2
Merge pull request #594 from shadow1ng/dev
...
发布 / auto-tag (push) Has been cancelled
测试构建 / 代码检查 (push) Has been cancelled
发布 / release (push) Has been cancelled
测试构建 / 单元测试和构建 (push) Has been cancelled
测试构建 / 构建验证 (push) Has been cancelled
Release v2.2.0
v2.2.0
2026-07-10 13:57:26 +08:00
ZacharyZcR
fdf836f003
chore: prepare v2.2.0 release
测试构建 / 代码检查 (push) Has been cancelled
测试构建 / 单元测试和构建 (push) Has been cancelled
测试构建 / 构建验证 (push) Has been cancelled
2026-07-09 20:41:10 +08:00
ZacharyZcR
075bf646dc
fix: 全局超时改为动态估算,替代硬编码阈值表
...
测试构建 / 代码检查 (push) Has been cancelled
测试构建 / 单元测试和构建 (push) Has been cancelled
测试构建 / 构建验证 (push) Has been cancelled
根据 hostCount × portCount / threads 计算端口扫描耗时,
结合开放率估算插件扫描耗时,加 20% 余量,上限 2h。
新增 EstimateHostCount 快速统计 CIDR/range/文件中的主机数。
2026-06-27 16:50:53 +08:00
ZacharyZcR
1980504007
fix: 大规模扫描全局超时过短导致提前终止 ( #588 )
...
4 万 IP 全端口扫描默认 -gt 180s 完全不够用,3 分钟后报
"解析目标失败: context deadline exceeded" 误导用户。
1. 自适应全局超时:用户未显式指定 -gt 时,根据端口数和是否有
hosts 文件自动调大超时(最高 24h),并输出调整日志
2. 修正超时错误信息:context deadline exceeded 不再包装为
"解析目标失败",改为提示用户调大 -gt 或设为 0 禁用
2026-06-27 16:42:32 +08:00
ZacharyZcR
a3ccc2827b
fix: Telnet 弱口令误报,Cisco MOTD 横幅触发 shell prompt 误判 ( Closes #590 )
...
isShellPrompt 使用 Contains 匹配 # $ > 单字符,Cisco IOS MOTD 横幅中
的装饰线(###)和文本内容会误触发,导致未发送凭据就判定认证成功。
重写 isShellPrompt 改为行尾匹配,排除全同字符装饰线;
performTelnetAuth 等待 login prompt 阶段移除 isShellPrompt 检查,
未授权检测由 testUnauthAccess 专门负责。
2026-06-27 16:35:18 +08:00
ZacharyZcR
ed45d0ead5
fix: 结果文件中 POC 漏洞只显示 vulnerable 不显示漏洞名称 ( Closes #591 )
...
POC 扫描结果存入 details["vulnerability_name"],
但 TXT/CSV/NDJSON 三种输出格式只读 details["vulnerability"],
key 不匹配导致漏洞名丢失,退化为显示 status 字段 "vulnerable"。
三种 writer 统一兼容两种 key。
2026-06-27 16:23:52 +08:00
ZacharyZcR
4922122530
fix: 修复 #591 POC 对 HTTPS 端口误用 HTTP + #592 空指针 panic
...
1. buildTargetURL 对 443/8443 等已知 TLS 端口默认使用 https scheme,
webtitle 触发 POC 扫描前将检测到的协议写回 info.URL,
避免对 HTTPS 服务发送 HTTP 请求导致 EOF
2. GetInfo 添加 probe nil 检查,防止探针初始化失败时空指针 panic
3. 删除 test-nuclei-example.yaml 测试模板,避免 robots.txt 误报
2026-06-27 16:23:52 +08:00
ZacharyZcR
4976cb1f6b
feat: 添加 -nsp 参数禁用网段预筛
...
大规模扫描时 probeSubnets 会自动跳过空 /24 网段,
部分场景下用户需要关闭此优化以扫描全部目标。
新增 -nsp (no subnet probe) 参数控制。
2026-06-27 16:23:51 +08:00
ZacharyZcR
ed2f947722
fix: POC 扫描遇到非 HTTP 服务时不再输出错误日志
...
扫描非 HTTP 端口时 Go net/http 返回 malformed HTTP status code 等
transport 级错误,属于正常现象,不应作为 error 输出。
在 executeRule 和 clustersend 两个调用点统一过滤 transport 错误,
返回 false, nil 表示"目标不可达 = 无漏洞"。
2026-06-27 15:36:42 +08:00
ZacharyZcR
34638954b8
fix: 消除 state_test.go SA2001 lint 警告
测试构建 / 代码检查 (push) Has been cancelled
测试构建 / 单元测试和构建 (push) Has been cancelled
测试构建 / 构建验证 (push) Has been cancelled
2026-06-17 12:51:43 +08:00
ZacharyZcR
65e64e8967
fix: Oracle TNS Resend 重试 + ANO 格式修正,扩展集成测试至 22 协议
...
Oracle raw TNS 修复:
- connect 阶段支持 Resend 包重试(Oracle 18c+ 需要)
- ANO 请求补齐加密/完整性算法列表和 auth UB2 字段
- ANO length 字段修正为包含 magic 的完整长度
- Oracle 18c ANO 仍不兼容(字节级匹配 go-ora 但被拒绝),爆破标记 SKIP
新增集成测试协议:
ActiveMQ, Zookeeper, Rsync, VNC, SNMP, Oracle(服务检测), Cassandra, Neo4j, Kafka, SMTP, LDAP
VNC 修复:换用支持 RFB 3.8 的 debian-xfce-vnc 镜像
2026-06-17 12:51:43 +08:00
ZacharyZcR
1c6f3b80d0
fix: Cassandra CQL 协议头缺少 flags 字节 + version 方向位错误
...
cqlSend 写 8 字节头(缺 flags),实际 CQL v4 需要 9 字节。
version byte 0x84 是 response 方向,request 应为 0x04。
同时扩展集成测试至 17 个协议:新增 Memcached、Elasticsearch、
MSSQL、RabbitMQ、MQTT、LDAP、Cassandra、Neo4j、Kafka、SMTP。
2026-06-17 12:51:42 +08:00
ZacharyZcR
9b8e4f3f3b
fix: MongoDB SCRAM 认证因 BSON 键序随机而失败
...
Go map 遍历顺序不确定,导致 buildBSON 输出的命令文档中
saslStart/saslContinue 不一定是第一个键,MongoDB 拒绝执行。
引入有序 []mongoKV 类型,SASL 命令改用 orderedDoc() 构造。
同时新增 6 协议集成测试框架(Docker Compose + go test -tags integration)。
2026-06-17 12:51:42 +08:00
ZacharyZcR
0612255893
test: 补充单元测试覆盖率 29.9% → 36.6%
...
新建 18 个测试文件,追加 30 个已有测试文件,覆盖协议解析、
错误分类、CEL 表达式求值、YAML 反序列化、字节编码等纯函数。
2026-06-17 12:51:41 +08:00
ZacharyZcR
d7dbccab76
merge dev into main for v2.2.0-rc.1 re-release
发布 / release (push) Has been cancelled
测试构建 / 代码检查 (push) Has been cancelled
测试构建 / 单元测试和构建 (push) Has been cancelled
测试构建 / 构建验证 (push) Has been cancelled
v2.2.0-rc.1
2026-06-15 12:46:01 +08:00
ZacharyZcR
6eff1d5ccf
fix: 外部审查 8 项修复 + 国密 TLS 按需回退
...
测试构建 / 代码检查 (push) Has been cancelled
测试构建 / 单元测试和构建 (push) Has been cancelled
测试构建 / 构建验证 (push) Has been cancelled
- UserAgent 默认值回退 + 注册 -ua flag (#2 )
- README 编译命令 main.go → . (#3 )
- README 版本号同步 rc.1 (#4 )
- Client.go gmtls stdout 劫持删除 (#5 )
- ms17010 smb1GetResponse size<32 越界 panic (#6 )
- SSH 拨号超时统一 ModuleTimeout (#8 )
- AddPorts 死字段删除 (#9 )
- 国密 TLS 按需回退:标准 TLS 握手失败时仅在错误为
cipher/protocol 不兼容时尝试国密,跳过超时/拒绝等连接级错误
2026-06-15 04:46:25 +08:00
ZacharyZcR
2f7d2d49c6
fix: redis exploit 超时改用配置值 & 清理死代码
...
- redis exploit 硬编码 30s deadline 改为 config.ModuleTimeout(),与同文件其他超时一致
- 删除 BaseScanStrategy.LogPluginInfo 残留死代码(全是空操作)
- .gitignore 补充 fscan_cli/fscan_web/embed-agent 构建产物
2026-06-14 23:58:56 +08:00
ZacharyZcR
35f3cf1960
docs: release notes 移除实测验证章节
测试构建 / 代码检查 (push) Has been cancelled
测试构建 / 单元测试和构建 (push) Has been cancelled
测试构建 / 构建验证 (push) Has been cancelled
2026-06-14 23:01:39 +08:00
ZacharyZcR
065ba6fae7
docs: 更新 v2.2.0-rc.1 release notes,覆盖全部 29 个 commit 的变更
2026-06-14 23:00:26 +08:00
ZacharyZcR
6d61b661f4
fix: 修复实机测试发现的可靠性问题 (v2.2.0-rc.1)
...
测试构建 / 代码检查 (push) Has been cancelled
测试构建 / 单元测试和构建 (push) Has been cancelled
测试构建 / 构建验证 (push) Has been cancelled
- UDP 插件在 -p 指定端口时被跳过
- Redis exploit 无超时保护 / readReply 吞没非超时错误
- service_probe 连接丢失后静默成功
- SNMP 探测成功但终端无输出
- SSH 爆破不稳定 (并发过高 + 自适应超时过短 + 限流误判)
- 进度条 isActive 竞态
新增 Config.ModuleTimeout() 协议级超时下限 (≥3s)
新增 ErrorTypeThrottle 限流错误分类
2026-06-14 22:23:52 +08:00
ZacharyZcR
3babff6863
fix: -hash 支持 LM:NT 格式 & -debug 日志文件修复
...
1. -hash 支持标准的 LM:NT 格式 (如 aad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0)
之前只接受纯 32 字符 NTLM hash,LM:NT 格式报 invalid hash length
2. -debug 日志文件写入修复(已在上一个 commit 中)
2026-06-14 22:23:51 +08:00
ZacharyZcR
d7071b7b8e
fix: -debug 日志文件写入失败,applyLogLevel 重建 Logger 时丢失 DebugLogFile 配置
2026-06-14 22:23:51 +08:00
ZacharyZcR
6ae37b8892
fix: -nopoc 禁用POC时不再输出错误日志
2026-06-14 22:23:51 +08:00
ZacharyZcR
2b202aa298
fix: 让 -gt 全局超时参数真正生效
...
-gt 参数之前是死代码:flag 定义了 GlobalTimeout 但从未被使用。
现在在 RunScan 中用它创建带 deadline 的 context,
超时后所有扫描任务(端口扫描、插件执行)被取消。
2026-06-14 22:23:51 +08:00
ZacharyZcR
6d7e6cd394
fix: 修复3个实测输出问题
...
1. 静默模式NDJSON banner截断至200字符
Redis INFO响应~5KB导致JSONL单行过长,截断后加...后缀
2. CSV漏洞Type列补全
ResultTypeVuln的fillDetail未设type字段,CSV Vulns列为空
统一设为"vulnerability"
3. ICMP权限不足告警精简
4行告警(listen失败/连接失败/权限不足/切换ping)合并为1行
2026-06-14 22:23:51 +08:00
ZacharyZcR
626d8f79bb
fix: 修复3个实测发现的问题
...
1. -pwd 支持逗号分隔多个密码
之前 -pwd "123,456,root" 被当作单个密码,SSH root:123 无法匹配
现在逗号分隔为独立密码,空格保留(可能是密码的一部分)
2. -nobr 禁用爆破时仍检测 Redis 未授权访问
未授权访问是服务探测不是爆破,不应被 -nobr 跳过
将未授权检测移到 DisableBrute 判断之前
3. 指定端口时跳过 UDP 插件调度
-p 80 只扫 HTTP 时不需要 SNMP/BACnet/DNS 等 UDP 探测
仅在默认端口扫描时才分发 UDP 插件
效果: -p 80 从 9 秒降到 3 秒
2026-06-14 22:23:51 +08:00
ZacharyZcR
a52e93e84c
fix: 非终端输出时禁用进度条,防止ANSI控制码覆盖扫描结果
2026-06-14 22:23:50 +08:00
ZacharyZcR
04cae2e42d
fix: 彻底解决UDP插件阻塞导致扫描无法结束的问题
...
根因分析(通过 goroutine dump 定位):
1. UDP conn.Write 在 WSL2 上可能永久阻塞(SetDeadline 对 Write 不生效)
2. SNMP community 爆破混入通用密码字典(57个),串行 × 10s超时 = 10分钟
修复:
- 提取 udpProbe() 公共函数,用 context timeout + conn.Close 双保险
超时后强制关闭连接,中断阻塞的 Write/Read
- BACnet/DNS/IPMI/TFTP 统一使用 udpProbe()
- SNMP probe 使用 goroutine + context select 保护
- SNMP community 列表不再混入通用密码字典(8个专用 community 足够)
- SNMP 后续 community 爆破用 3s 短超时 + 连续失败 3 次快速退出
效果: 同样的扫描从无限卡死 → 9秒完成
2026-06-14 22:23:50 +08:00
ZacharyZcR
4169eb6ee0
fix: UDP插件改用 conn.SetDeadline 替代类型断言
2026-06-14 22:23:50 +08:00
ZacharyZcR
63631d6cdf
fix: 所有UDP插件添加ReadDeadline防止无限阻塞
...
SNMP/BACnet/DNS/IPMI/TFTP 的 conn.Read() 在目标不响应时
无限阻塞(goroutine 泄漏),导致整个扫描无法结束。
在 Write 前设置 ReadDeadline 确保超时后返回。
2026-06-14 22:23:50 +08:00
ZacharyZcR
4f6bb28138
fix: 修复6个运行时问题
...
1. 抑制 gmtls 库的 handshake error stdout 噪声
gmtls/conn.go:1304 硬编码了 fmt.Println,在调用时临时重定向 os.Stdout
2. MySQL 3306 服务名误识别为 genetec-5400
nmap 指纹库将 MySQL 握手包的随机 salt 误匹配,通过 banner 特征校正
3. 管道输出时自动禁用 ANSI 控制码
检测 stdout 是否为终端,非终端时自动启用 NoColor
4. 进度条完成消息措辞精确化
去掉冗余冒号,保持信息简洁一致
5. URL 模式跳过不必要的 TLS 探测
用户已通过 -u 显式指定 http:// 协议时直接使用,不再做 TLS 握手
6. 无网络探测数据时降低默认重试次数
-np 跳过存活探测后,将默认重试从 3 降到 2,加速不可达主机的超时
2026-06-14 22:23:49 +08:00
ZacharyZcR
46a6d812a4
fix: DetectPocFormat 误判含 transport 的 fscan POC 为 xray 格式
...
有 transport 字段但 rules 是数组的 POC(如 apache-httpd-cve-2021-40438)
属于 fscan 格式,不应被 xray 分支兜底。移除错误的 fallback return,
让这类 POC 正确落入 fscan 格式检测分支。
修复前: 388个POC成功380个,失败8个
修复后: 388个POC成功388个,失败0个
2026-06-14 22:23:49 +08:00
ZacharyZcR
d4f4e65dec
refactor: 4项架构优化 — CEL缓存/POC隔离/服务缓存/结果统一
...
1. CEL 表达式编译缓存
- 新增 CelProgCache,同一 POC 的所有规则/参数组合共享编译后的 Program
- clusterpoc 热路径上消除重复的 Compile+Program 调用
2. POC 全局状态消除
- allPocs/pocLoaded 全局变量改为 pocStore 按 PocPath 缓存
- 不同 PocPath 的扫描独立加载,Web API 并发场景不再互相覆盖
3. serviceCache 下沉到 per-session State
- 服务识别缓存从包级全局 map 迁移到 State.serviceCache (sync.Map)
- BaseScanStrategy 通过 SetState 注入 session state
- 消除多个并发扫描之间的服务识别缓存串台
4. POC 结果输出路径统一
- 提取 buildVulnDetails/buildVulnLogMsg/saveVulnResult 三个公共函数
- CheckMultiPoc 和 recordVulnerabilityResult 共用统一的结果构造逻辑
- 消除 details 字段名不一致和日志格式差异
2026-06-14 22:23:49 +08:00
ZacharyZcR
a115499793
fix+perf: 修复10个bug & 10项性能优化
...
Bug修复:
- clustersend CEL结果判断从字符串比较改为类型断言
- Nuclei DSL matcher安全降级为false避免误报
- clusterpoc发现漏洞后返回true修正语义
- reverseCheck加10s超时防止ceye API阻塞
- doSearch/bmatches正则编译结果缓存到sync.Map
- evalset CEL求值失败时存空字符串而非原始表达式
- CEL wait()函数加nil Reverse指针检查防panic
- MongoDB readMongoMsg应用timeout参数设置读超时
- TXTWriter.Close确保Sync失败后仍调用file.Close
性能优化:
- 指纹regex缓存从RWMutex+map改为sync.Map消除锁竞争
- CaseInsensitive指纹词加载时预小写化避免匹配时分配
- 版本提取FindAllStringSubmatch限制返回数量
- i18n.Tr用strconv.Itoa替代Sprintf减少分配
- POC加载用atomic.Bool+DCLP消除热路径锁
- 结果缓冲map预分配容量减少rehash
- HTTP连接池参数随并发数动态调整
- getRuleHash去除反射+Headers排序保证确定性dedup
- POC并发加载用channel替代Mutex收集结果
2026-06-14 22:23:49 +08:00
ZacharyZcR
8402be98e3
优化自适应扫描系统 & 修复 POC 调度问题
...
自适应扫描优化:
- target/ceiling 分离,自适应池可向上探索而非锁死在 target
- assessHealth 阈值按网络环境区分(LAN 收紧 / Internet 放宽)
- RTT 漂移时动态压低 target,配合 AIMD 双重降速
- 去掉 semaphore 双层流控,由 ants pool 统一反压
- 探测端口从 3 个扩充到 8 个,减少 RTT 采样偏差
- computeRetries 按环境调整目标概率和上限
Bug 修复:
- AdaptivePool.Wait() 加 10 分钟超时,防止 goroutine 卡死时永久挂起
- CEL 环境初始化失败后允许重试(sync.Once → sync.Mutex + 标志位)
- CAS 自旋加 runtime.Gosched() 退避,减少高并发下 CPU 空转
- -full 模式下 web 插件跳过 IsMarkedWebService 检查 #588
- 不确定服务补做 HTTP 回退探测,覆盖自定义框架漏网场景
- POC sets 纯字面量值跳过 CEL 编译,消除大量误报错误日志
2026-06-14 22:23:48 +08:00
ZacharyZcR
c49c23c7f0
Harden scan robustness and tests
2026-06-14 22:23:48 +08:00
ZacharyZcR
5ad914a1bb
feat: 统一服务缓存 + 指纹驱动插件匹配
...
将 webServiceCache 扩展为通用 serviceCache,所有指纹识别结果
统一缓存,插件匹配时端口不命中则回退到服务名称匹配。
删除多余的 service_cache.go,复用已有的 ServiceInfo 体系。
补充 nil 防御、Explicit 标记、大量单元/集成/回归测试。
2026-06-14 22:23:47 +08:00
ZacharyZcR
2ab7c4d9b2
fix: 非标准端口的服务无法匹配对应插件 #588
...
端口扫描识别到 8881 上运行 SSH,但 SSH 插件只注册了 [22,2222,2200,22222],
端口不匹配导致插件不执行。
新增服务名称缓存:端口扫描阶段记录 host:port → serviceName,
插件匹配时端口不命中则回退到服务名称匹配。
2026-06-14 22:23:46 +08:00
ZacharyZcR
5c251b123d
fix: 移除误导性的"无可用插件"日志 #588
...
扫描开始前的插件预检基于端口列表静态匹配,不代表实际扫描中插件
不会执行。移除"无可用插件"提示,避免用户误以为插件未工作。
2026-06-14 22:23:46 +08:00