taigrr/gomap
GitHub: taigrr/gomap
纯 Go 实现的跨平台端口扫描器,提供 SYN 隐秘扫描、主机发现、OS 检测等丰富功能,支持作为库直接导入。
Stars: 1 | Forks: 0
# gomap
[](https://github.com/taigrr/gomap/actions/workflows/ci.yml)
[](https://pkg.go.dev/github.com/taigrr/gomap)
[](https://goreportcard.com/report/github.com/taigrr/gomap)
[](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构建, 插件系统, 数据统计, 日志审计, 漏洞评估, 程序破解, 端口扫描, 网络发现, 网络安全, 隐私保护