taigrr/gomap

GitHub: taigrr/gomap

纯 Go 实现的跨平台端口扫描器,提供 SYN 隐秘扫描、主机发现、OS 检测等丰富功能,支持作为库直接导入。

Stars: 1 | Forks: 0

# gomap [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/39/39faa54be350a1dab8afd3b2fb8c1c83e4d9cff84abfef2374d19a18053687c4.svg)](https://github.com/taigrr/gomap/actions/workflows/ci.yml) [![Go Reference](https://pkg.go.dev/badge/github.com/taigrr/gomap.svg)](https://pkg.go.dev/github.com/taigrr/gomap) [![Go Report Card](https://goreportcard.com/badge/github.com/taigrr/gomap)](https://goreportcard.com/report/github.com/taigrr/gomap) [![License: 0BSD](https://img.shields.io/badge/License-0BSD-blue.svg)](LICENSE) 一个纯 Go 实现、跨平台、可作为库导入的端口扫描器。 ## 功能 - **跨平台** — TCP connect 扫描可在 Linux、macOS 和 Windows 上运行 - **库优先** — 导入 `github.com/taigrr/gomap` 即可在你自己的代码中进行扫描 - **SYN 隐秘扫描** — 在具有 raw socket 权限的 Linux 上可用 - **ARP 表解析** — 仅限 Linux,通过 `/proc/net/arp` 实现 - **IANA 服务数据库** — 包含来自官方 IANA 注册表的 5,800 多个 TCP 和 5,400 多个 UDP 服务 - **常用端口扫描** — 快速扫描使用最常开放的前 200 个端口 - **全扫描模式** — 扫描所有在 IANA 注册的端口 - **支持 Context** — 所有扫描均遵循 `context.Context` 以便取消操作 - **JSON 输出** — 用于脚本的结构化结果 ## 安装 ``` go install github.com/taigrr/gomap/cmd/gomap@latest ``` ## CLI 用法 ``` # 扫描单个主机(常用端口) gomap -f example.com # 完整扫描(所有已知端口) gomap example.com # 扫描 CIDR 范围 gomap -c 192.168.1.0/24 -f # 仅前 100 个端口 gomap -t 100 example.com # 不同扫描类型(Linux,需要 root) sudo gomap -s syn example.com # SYN stealth scan sudo gomap -s fin example.com # FIN scan sudo gomap -s xmas example.com # Xmas tree scan sudo gomap -s null example.com # Null scan sudo gomap -s ack example.com # ACK scan (firewall mapping) sudo gomap -s window example.com # Window scan gomap -s udp example.com # UDP scan # 主机发现(ping sweep) gomap -P -c 192.168.1.0/24 # OS 检测 sudo gomap -O example.com # 输出格式 gomap -j example.com # JSON gomap -x example.com # nmap-compatible XML gomap -g example.com # Grepable # 服务版本检测(banner grabbing) gomap -V example.com # Timing templates gomap -T aggressive example.com # T4: fast gomap -T insane example.com # T5: maximum speed gomap -T paranoid example.com # T0: IDS evasion ``` ## 库用法 ``` package main import ( "context" "fmt" "log" "github.com/taigrr/gomap" ) func main() { ctx := context.Background() result, err := gomap.ScanHost(ctx, "example.com", gomap.ScanOptions{ FastScan: true, }) if err != nil { log.Fatal(err) } for _, p := range result.OpenPorts() { fmt.Printf("Port %d: %s\n", p.Port, p.Service) } } ``` ### 扫描选项 ``` opts := gomap.ScanOptions{ ScanType: gomap.ConnectScan, // SYNScan, FINScan, UDPScan, etc. FastScan: true, // Common ports only Timeout: 3 * time.Second, // Per-port timeout Workers: 500, // Concurrent goroutines Ports: []int{80, 443}, // Custom port list (nil = defaults) OpenOnly: true, // Filter to open ports only VersionIntensity: 7, // Service probe depth (0-9) ProgressFunc: func(scanned, total int) { /* ... */ }, } ``` 请参阅 [GoDoc](https://pkg.go.dev/github.com/taigrr/gomap) 中的 `ScanOptions` 结构体,获取包括时间控制、速率限制、代理、诱饵等在内的完整选项列表。 ### 扫描范围 ``` // Scan a specific CIDR results, err := gomap.ScanCIDR(ctx, "10.0.0.0/24", opts) // Scan local network results, err := gomap.ScanRange(ctx, opts) ``` ### 流式 API 适用于需要在结果到达时立即获取结果的 UI 和交互式应用程序: ``` events := gomap.ScanHostStream(ctx, "example.com", opts) for ev := range events { if ev.Port != nil && ev.Port.Open { fmt.Printf("Found open port: %d\n", ev.Port.Port) } if ev.Done { fmt.Println("Scan complete") } } ``` ### 主机发现 ``` hosts := gomap.CreateHostRange("192.168.1.0/24") results, err := gomap.DiscoverHosts(ctx, hosts, gomap.DiscoveryOptions{ Methods: []gomap.DiscoveryMethod{gomap.DiscoveryICMP, gomap.DiscoveryConnect}, Timeout: 2 * time.Second, }) for _, r := range results { if r.Alive { fmt.Printf("%s is up (%s)\n", r.IP, r.Latency) } } ``` ### 实用工具 ``` // Look up service name by port svc := gomap.LookupService(443) // "HTTP protocol over TLS/SSL" // Get local IP ip, err := gomap.GetLocalIP() // Get local /24 range cidr := gomap.GetLocalRange() // Parse CIDR to host list hosts := gomap.CreateHostRange("192.168.1.0/24") // MAC vendor lookup (37K OUI entries) vendor := gomap.LookupMACVendor("00:50:56:12:34:56") // "VMware" // Banner grabbing (nil uses embedded probe DB) sv, err := gomap.GrabBanner(ctx, "example.com", 22, 3*time.Second, nil) // sv.Service = "ssh", sv.Banner = "SSH-2.0-OpenSSH_9.0" // Timing templates gomap.ApplyTiming(&opts, gomap.TimingAggressive) ``` ## 平台支持 | 功能 | Linux | macOS | Windows | |---------|-------|-------|---------| | TCP connect 扫描 | 是 | 是 | 是 | | SYN 隐秘扫描 | 是 | 否* | 否* | | FIN/Xmas/Null 扫描 | 是 | 否* | 否* | | ACK/Window 扫描 | 是 | 否* | 否* | | UDP 扫描 | 是 | 是 | 是 | | 主机发现 (ICMP) | 是 | 是** | 是** | | 主机发现 (TCP) | 是 | 是 | 是 | | ARP 发现 | 是 | 否 | 否 | | OS 检测 | 是 | 否 | 否 | \* 在非 Linux 平台上回退到 connect 扫描 \** 可能需要提升权限 ## nmap 数据库兼容性 gomap 可以直接解析和使用 nmap 的数据库文件: ``` import "github.com/taigrr/gomap/probedb" // Load from files at runtime db, _ := probedb.LoadServiceProbesFile("/usr/share/nmap/nmap-service-probes") osdb, _ := probedb.LoadOSDBFile("/usr/share/nmap/nmap-os-db") // Or embed at compile time with go:embed //go:embed nmap-service-probes var serviceProbesData []byte db, _ := probedb.LoadServiceProbesData(serviceProbesData) // Or from fs.FS //go:embed data var dbFS embed.FS db, _ := probedb.LoadServiceProbesFS(dbFS, "data/nmap-service-probes") // Auto-find installed nmap databases spPath, osPath := probedb.FindDatabases() ``` 支持的数据库格式: - **nmap-service-probes** — 包含用于服务/版本检测的 187 个探测规则和 11,266 个匹配模式 - **nmap-os-db** — 包含 6,036 个带有评分/匹配机制的 OS 指纹 - **nmap-mac-prefixes** — MAC 厂商 OUI 查找(通过 generate-mac 工具) - **nmap-services** — 端口到服务的映射(通过 generate-services 工具) 设置 `GOMAP_DB_PATH` 以指定自定义的数据库目录。 ## 重新生成服务数据 端口到服务的映射是根据 IANA 注册表生成的: ``` go generate ./... ``` 这会获取最新的 IANA CSV 并重新生成 `services_generated.go`。 ## 路线图 - [x] 所有 TCP 扫描类型(SYN、FIN、Xmas、Null、ACK、Window) - [x] UDP 扫描 - [x] 主机发现(ICMP、TCP SYN/ACK、UDP、ARP) - [x] OS 指纹识别(TCP/IP 协议栈分析) - [x] 服务版本检测(Banner 抓取) - [x] 定时模板(T0-T5) - [x] XML 输出(兼容 nmap) - [x] Grepable 输出(-oG) - [x] MAC 地址厂商查找(37K 条 OUI 记录) - [x] OS 指纹数据库匹配(nmap-os-db) - [x] Traceroute(基于 UDP) - [x] NSE 风格的脚本引擎(http-title、ssh-hostkey、ssl-cert、smtp-commands、ftp-anon、mysql-info、redis-info) - [ ] IPv6 扫描支持 ## 许可证 0BSD
标签:AES-256, EVTX分析, Facebook API, Go语言, Maven构建, 插件系统, 数据统计, 日志审计, 漏洞评估, 程序破解, 端口扫描, 网络发现, 网络安全, 隐私保护