v-byte-cpu/sx

GitHub: v-byte-cpu/sx

一款遵循 UNIX 哲学、速度极快且支持多种协议的命令行网络扫描器,旨在高效完成网络发现与端口扫描任务。

Stars: 1542 | Forks: 108

sx

[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/v-byte-cpu/sx/blob/master/LICENSE) [![Build Status](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/a07f723d96182413.svg)](https://github.com/v-byte-cpu/sx/actions/workflows/ci.yml) [![GoReportCard Status](https://goreportcard.com/badge/github.com/v-byte-cpu/sx)](https://goreportcard.com/report/github.com/v-byte-cpu/sx) ![Platform](https://img.shields.io/badge/platform-linux%2FmacOS%2Fdocker-blue)
**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语言, 动态分析, 插件系统, 日志审计, 程序破解, 网络安全, 网络扫描器, 请求拦截, 隐私保护