v-byte-cpu/sx
GitHub: v-byte-cpu/sx
一款遵循 UNIX 哲学、速度极快且支持多种协议的命令行网络扫描器,旨在高效完成网络发现与端口扫描任务。
Stars: 1542 | Forks: 108
[](https://github.com/v-byte-cpu/sx/blob/master/LICENSE)
[](https://github.com/v-byte-cpu/sx/actions/workflows/ci.yml)
[](https://goreportcard.com/report/github.com/v-byte-cpu/sx)

**sx** 是一款旨在遵循 UNIX 哲学的命令行网络扫描器。
本项目的目标是创建一款代码整洁、简单且速度最快的网络扫描器。
## 📖 目录
* [功能](https://github.com/v-byte-cpu/sx#-features)
* [安装](https://github.com/v-byte-cpu/sx#-install)
* [从源码编译](https://github.com/v-byte-cpu/sx#-build-from-source)
* [快速入门](https://github.com/v-byte-cpu/sx#-quick-start)
* [参考资料](https://github.com/v-byte-cpu/sx#-references)
* [贡献](https://github.com/v-byte-cpu/sx#-contributing)
* [鸣谢](https://github.com/v-byte-cpu/sx#-credits)
* [License](https://github.com/v-byte-cpu/sx#license)
## ✨ 功能
* **⚡ 比 nmap 快 30 倍**
* **ARP 扫描**:扫描本地网络以检测活跃设备
* **ICMP 扫描**:使用高级 ICMP 扫描技术检测存活主机和防火墙规则
* **TCP SYN 扫描**:传统的半开扫描,用于发现开放的 TCP 端口
* **TCP FIN / NULL / Xmas 扫描**:用于绕过某些防火墙规则的扫描技术
* **使用任意 TCP 标志的自定义 TCP 扫描**:发送你想要的任何特殊数据包,并获取包含回复数据包中设置的所有 TCP 标志的结果
* **UDP 扫描**:扫描 UDP 端口并获取完整的 ICMP 回复,以检测开放端口或防火墙规则
* **应用层扫描**:
* **SOCKS5 扫描**:通过扫描 IP 范围或从文件中读取 IP/端口对列表来检测存活的 SOCKS5 代理
* 使用有限循环乘法群对 IP 地址进行**随机化遍历**
* **支持 JSON 输出**:sx 专门为方便自动化处理结果而设计
## 📦 安装
最简单的方法是从 [GitHub Releases](https://github.com/v-byte-cpu/sx/releases) 下载,并将可执行文件放置在你的 PATH 中。
## 🛠 从源码编译
环境要求:
* [Go 1.25 或更高版本](https://golang.org/dl/)
* [libpcap](https://www.tcpdump.org/)(如果你使用 **wireshark**,则已经安装)
在 macOS 上,请先安装 Xcode Command Line Tools,以便 CGO 可以链接到系统自带的 libpcap:
```
xcode-select --install
```
在源码根目录下,运行:
```
go build
```
## 🚀 快速入门
以下是一些展示如何使用 `sx` 扫描网络的快速示例。
### ARP 扫描
扫描你的本地网络,并显示已连接设备的 IP 地址、MAC 地址以及相关的硬件供应商:
```
sx arp 192.168.0.1/24
```
示例输出:
```
192.168.0.1 b0:be:76:40:05:8d TP-LINK TECHNOLOGIES CO.,LTD.
192.168.0.111 80:c5:f2:0b:02:e3 AzureWave Technology Inc.
192.168.0.171 88:53:95:2d:3c:af Apple, Inc.
```
JSON 输出:
```
sx arp --json 192.168.0.1/24
```
示例输出:
```
{"ip":"192.168.0.1","mac":"b0:be:76:40:05:8d","vendor":"TP-LINK TECHNOLOGIES CO.,LTD."}
{"ip":"192.168.0.111","mac":"80:c5:f2:0b:02:e3","vendor":"AzureWave Technology Inc."}
{"ip":"192.168.0.171","mac":"88:53:95:2d:3c:af","vendor":"Apple, Inc."}
```
在退出前等待 5 秒以接收延迟的回复数据包,默认情况下 `sx` 会等待 300 毫秒:
```
sx arp --exit-delay 5s 192.168.0.1/24
```
实时扫描模式,每 10 秒重新扫描一次网络:
```
sx arp 192.168.0.1/24 --live 10s
```
### TCP 扫描
与 nmap 和其他扫描器在实际扫描前隐式执行 ARP 请求以将 IP 地址解析为 MAC 地址不同,`sx` 明确使用了 **ARP 缓存** 的概念。ARP 缓存文件是一个简单的文本文件,每行包含一个 JSON 字符串([JSONL](https://jsonlines.org/) 文件),其具有与上述 ARP 扫描 JSON 输出相同的 JSON 字段。高层协议(如 TCP 和 UDP)的扫描会从 stdin 读取 ARP 缓存文件,然后开始实际扫描。
这不仅简化了程序的设计,还加快了扫描过程,因为不必每次都执行 ARP 扫描。
假设实际的 ARP 缓存位于 `arp.cache` 文件中。我们可以手动创建它
或使用如下所示的 ARP 扫描:
```
sx arp 192.168.0.1/24 --json | tee arp.cache
```
一旦我们有了 ARP 缓存文件,就可以运行高层协议的扫描,例如 TCP SYN 扫描:
```
cat arp.cache | sx tcp -p 1-65535 192.168.0.171
```
示例输出:
```
192.168.0.171 22
192.168.0.171 443
```
在这种情况下,我们发现端口 22 和 443 是开放的。
如果在大型扫描期间看到 `send: No buffer space available`,通常意味着发送端的速度超过了内核/raw-socket 缓冲区的处理速度。
首先的修复方法是添加 `--rate` 并降低发送速率,例如 `-r 100000/s`,或者在需要时设置得更低。
在某些系统上,调整操作系统的 socket/缓冲区限制也会有所帮助,但速率限制是主要的修复方法。
使用 JSON 输出进行扫描:
```
cat arp.cache | sx tcp --json -p 1-65535 192.168.0.171
```
示例输出:
```
{"scan":"tcpsyn","ip":"192.168.0.171","port":22}
{"scan":"tcpsyn","ip":"192.168.0.171","port":443}
```
扫描多个端口范围:
```
cat arp.cache | sx tcp -p 1-23,25-443 192.168.0.171
```
或单独的端口:
```
cat arp.cache | sx tcp -p 22,443 192.168.0.171
```
或者使用 `--ports-file` 选项指定一个包含要扫描的端口或端口范围的文件,每行一个。
从文件中扫描 IP/端口对并以 JSON 格式输出:
```
cat arp.cache | sx tcp --json -f ip_ports_file.jsonl
```
输入文件的每一行都是一个 JSON 字符串,必须包含 **ip** 和 **port** 字段。
示例输入文件:
```
{"ip":"10.0.1.1","port":1080}
{"ip":"10.0.2.2","port":1081}
```
可以使用 `-a` 或 `--arp-cache` 选项指定 ARP 缓存文件:
```
sx tcp -a arp.cache -p 22,443 192.168.0.171
```
或使用 stdin 重定向:
```
sx tcp -p 22,443 192.168.0.171 < arp.cache
```
你也可以使用 `tcp syn` 子命令来代替 `tcp`:
```
cat arp.cache | sx tcp syn -p 22 192.168.0.171
```
除非传递了 `--flags` 选项(见下文),否则 `tcp` 子命令只是 `tcp syn` 子命令的简写。
### VPN 接口
`sx` 支持使用虚拟网络接口(wireguard、openvpn 等)进行扫描,在这种情况下**不需要**使用 ARP 缓存,因为这些接口需要原始 IP 数据包而不是以太网帧作为输入。例如,扫描 VPN 网络上的 IP 地址:
```
sx tcp 10.1.27.1 -p 80 --json
```
### TCP FIN 扫描
大多数网络扫描器会尝试解释扫描结果。例如,它们会说“这个端口是关闭的”,而不是说“我收到了一个 RST”。有时它们是对的,有时则不然。这对初学者来说更容易,但当你知道自己在做什么时,对于更高级的扫描技术,你会不断尝试从程序的解读中推断出到底发生了什么。
`sx` 试图克服这些问题。它会返回 TCP FIN、NULL、Xmas 和自定义 TCP 扫描的所有回复数据包的信息。该信息包含 IP 地址、TCP 端口以及回复数据包中设置的所有 TCP 标志。
TCP FIN 扫描及其其他变体(NULL 和 Xmas)利用了 RFC793 第 3.9 节:
因此,关闭的端口应该返回带有 RST 标志的数据包。
该节还指出:
这里的关键短语是:**丢弃该数据段**,并返回。因此,大多数操作系统上的开放端口会丢弃包含除 SYN、ACK 和 RST 之外任何标志的 TCP 数据包。
让我们用 TCP FIN 扫描来扫描某个关闭的端口:
```
cat arp.cache | sx tcp fin --json -p 23 192.168.0.171
```
示例输出:
```
{"scan":"tcpfin","ip":"192.168.0.171","port":23,"flags":"ar"}
```
`flags` 字段包含回复数据包中的所有 TCP 标志,其中每个字母代表一个 TCP 标志:
* `s` - SYN 标志
* `a` - ACK 标志
* `f` - FIN 标志
* `r` - RST 标志
* `p` - PSH 标志
* `u` - URG 标志
* `e` - ECE 标志
* `c` - CWR 标志
* `n` - NS 标志
在这种情况下,我们发现端口 23 发送了设置有 ACK 和 RST 标志的回复数据包(根据 rfc793,这是关闭端口的典型响应)。
如果我们扫描一个开放的端口,我们将得不到响应(除非防火墙正在伪造响应)。
其他类型的 TCP 扫描可以依此类推进行。
TCP NULL 扫描:
```
cat arp.cache | sx tcp null --json -p 23 192.168.0.171
```
TCP Xmas 扫描:
```
cat arp.cache | sx tcp xmas --json -p 23 192.168.0.171
```
### 自定义 TCP 扫描
可以使用 `--flags` 选项发送具有自定义 TCP 标志的 TCP 数据包。
让我们发送设置了 SYN、FIN 和 ACK 标志的 TCP 数据包来进行远程 OS 指纹识别:
```
cat arp.cache | sx tcp --flags syn,fin,ack --json -p 23 192.168.0.171
```
Windows 和 MacOS 不会响应此数据包,但 Linux 会发送带有 RST 标志的回复数据包。
`--flags` 选项可能的参数:
* `syn` - SYN 标志
* `ack` - ACK 标志
* `fin` - FIN 标志
* `rst` - RST 标志
* `psh` - PSH 标志
* `urg` - URG 标志
* `ece` - ECE 标志
* `cwr` - CWR 标志
* `ns` - NS 标志
### UDP 扫描
`sx` 可以帮助调查开放的 UDP 端口。UDP 扫描利用了 RFC1122 第 4.1.3.1 节:
与 TCP 扫描类似,`sx` 返回 UDP 扫描的所有回复 ICMP 数据包的信息。该信息包含 IP 地址、回复数据包中设置的 ICMP 数据包类型和代码。
例如,要检测主机上的 DNS 服务器,请运行:
```
cat arp.cache | sx udp --json -p 53 192.168.0.171
```
示例输出:
```
{"scan":"udp","ip":"192.168.0.171","icmp":{"type":3,"code":3}}
```
在这种情况下,我们发现主机发送了 **Destination Unreachable**(目标不可达)类型和 **Port Unreachable**(端口不可达)代码的 ICMP 回复数据包(根据 rfc1122,这是关闭端口的典型响应)。
防火墙通常会将 ICMP 代码设置为与 **Port Unreachable** 不同的值,因此很容易被检测出来。
### 速率限制
有时你需要限制生成数据包的发送速度。这可以通过
`--rate` 选项来完成。
例如,要将速度限制为每 5 秒 1 个数据包:
```
cat arp.cache | sx tcp --rate 1/5s --json -p 22,80,443 192.168.0.171
```
### 排除子网
有时你需要从扫描中排除某些 IP 地址和子网。这可以通过
`--exclude` 选项来完成。它指定了一个文件,其中包含要排除的 IP 或 CIDR 表示法的子网,每行一个。
例如,要排除 RFC 1918 地址,请创建一个名为 `ips.txt` 的文件,内容如下:
```
10.0.0.0/8
172.16.0.0/16
192.168.0.0/16
```
你也可以插入注释和空行:
```
# 排除 RFC 1918 地址
10.0.0.0/8 # comment 1
172.16.0.0/12 # comment 2
192.168.0.0/16 # comment 3
0.0.0.0/8 # used in initialization procedures (RFC 6890)
# 排除 RFC 5735 地址
127.0.0.0/8 # loopback address
192.0.0.0/24 # reserved block for IETF protocol assignments
224.0.0.0/4 # allocated for use in IPv4 multicast address assignments
240.0.0.0/4 # reserved for future use
# 排除 Amazon 网络
3.0.0.0/8
# ip 地址同样有效
1.1.1.1
```
然后带上 `--exclude ips.txt` 选项运行扫描。
### 实时局域网 TCP SYN 扫描器
作为扫描组合的示例,你可以结合 ARP 和 TCP SYN 扫描来创建一个定期扫描整个局域网的实时 TCP 端口扫描器。
启动实时 ARP 扫描并将结果保存到 `arp.cache` 文件中:
```
sx arp 192.168.0.1/24 --live 10s --json | tee arp.cache
```
在另一个终端中启动 TCP SYN 扫描:
```
while true; do sx tcp -p 1-65535 -a arp.cache -f arp.cache; sleep 30; done
```
### SOCKS5 扫描
`sx` 可以检测存活的 SOCKS5 代理。要进行扫描,你必须指定 IP 范围或包含 IP/端口对的 JSONL 文件。
例如,IP 范围扫描:
```
sx socks -p 1080 10.0.0.1/16
```
从文件中扫描 IP/端口对并以 JSON 格式输出:
```
sx socks --json -f ip_ports_file.jsonl
```
输入文件的每一行都是一个 JSON 字符串,必须包含 **ip** 和 **port** 字段。
示例输入文件:
```
{"ip":"10.0.1.1","port":1080}
{"ip":"10.0.2.2","port":1081}
```
你也可以指定要扫描的端口范围:
```
sx socks -p 1080-4567 -f ips_file.jsonl
```
在这种情况下,只会从文件中提取 IP 地址,**port** 字段不再是必需的。
## 使用帮助
```
sx help
```
## 📜 参考资料
* **Network Security Assessment: Know Your Network 1st Edition**,作者:Chris McNab
* **ICMP Usage in Scanning - The Complete Know-How**,作者:Ofir Arkin
* [Transmission Control Protocol ( rfc793 )](https://tools.ietf.org/rfc/rfc793.txt)
* [User Datagram Protocol ( rfc768 )](https://tools.ietf.org/rfc/rfc768.txt)
* [Requirements for Internet Hosts -- Communication Layers ( rfc1122 )](https://tools.ietf.org/rfc/rfc1122.txt)
* [SOCKS Protocol Version 5 ( rfc1928 )](https://tools.ietf.org/rfc/rfc1928.txt)
* [Internet Control Message Protocol ( rfc792 )](https://tools.ietf.org/rfc/rfc792.txt)
## 🤝 贡献
欢迎贡献代码、提出问题和功能请求。
## 💎 鸣谢
Logo 由 [mikhailtsoy.com](https://mikhailtsoy.com/) 设计
## License
本项目基于 MIT License 授权。请查看 [LICENSE](https://github.com/v-byte-cpu/sx/blob/master/LICENSE) 文件获取完整的许可文本。标签:EVTX分析, Go语言, 动态分析, 插件系统, 日志审计, 程序破解, 网络安全, 网络扫描器, 请求拦截, 隐私保护