ryan-sharpnack/raw-tcp-port-scanner

GitHub: ryan-sharpnack/raw-tcp-port-scanner

一个基于 C 语言和 select() 多路复用的轻量级非阻塞 TCP 端口扫描器,用于快速发现和分类目标主机的端口状态。

Stars: 0 | Forks: 0

# 项目 5:使用非阻塞 Socket 的原始 TCP 端口扫描器 ## 技术目标 一个单线程、非阻塞的 TCP `connect()` 扫描器,它使用 `select()` 复用数百个并发握手尝试,将端口状态分类为 open(开放)、closed(关闭)或 filtered(被过滤)——无需线程,无需原始 socket,无需第三方库。 **业务影响摘要:** 一旦获得初始访问权限,网段上未受监控或不必要开放的端口就成为主要的横向移动向量。该工具为安全团队提供了一种快速、无依赖的方式,以便在审计或事件分类期间根据预期基准验证暴露的服务。 ## “原因”:工程价值与威胁影响 * **操作风险 / 威胁模型:** 端口扫描是攻击者登录主机后最先执行的操作之一,也是防御者应该能够复现的首要任务之一,从而了解他们自己的监控系统能捕获和无法捕获的内容。 * **工程掌握程度:** 展示了对 BSD socket 状态机、非阻塞 I/O 和基于 `select()` 的多路复用的直接控制,而无需引入线程库或扫描框架来完成这项工作。 * **防御实用性:** 为检测工程团队提供了一种已知且开源的扫描模式(批量的非阻塞握手完成),以验证 IDS/IPS 和基于网络流的扫描检测规则是否确实按预期触发。 ## 架构与系统边界 * **语言与工具链:** C (C11) / GCC 与 POSIX socket * **操作系统焦点:** Linux, x86_64(兼容 POSIX;可移植到其他 POSIX 系统) * **使用的核心 API/原语:** `connect()`、`select()`、`fcntl()` (`O_NONBLOCK`)、`getsockopt()` (`SO_ERROR`)、`getaddrinfo()` ## 技术执行(内容与方式) * **非阻塞 connect() 批处理:** 最多打开 500 个 socket,并在紧密循环中对每个 socket 调用 `connect()`;`EINPROGRESS` 是预期的返回值,因为握手是异步解析的。 * **基于 select() 的完成跟踪:** 每批使用一次 `select()` 调用一次性等待整个批次的 write-fd-set,而不是每个 socket 单独阻塞,因为一旦握手以某种方式完成解析,正在连接的 socket 就会变为可写状态。 * **三态分类:** `select()` 返回后的 `SO_ERROR` 可区分 OPEN (0) 和 CLOSED(例如 `ECONNREFUSED`);在超时时间内从未变为可写状态的任何 fd 都会被标记为 FILTERED,这与防火墙静默丢弃 SYN 的特征相匹配。 ## 如何在本地构建和运行 ``` gcc -Wall -Wextra -Wpedantic -std=c11 -O2 -o tcp_scanner src/tcp_scanner.c ./tcp_scanner [timeout_sec] # 使用 2s 超时扫描 localhost 的前 1024 个 ports ./tcp_scanner 127.0.0.1 1 1024 2 ```
标签:客户端加密, 插件系统, 数据泄露防护, 数据统计, 端口扫描, 网络安全, 网络探测, 隐私保护, 非阻塞I/O