摘要
polarbearscan 旨在实现更快、更高效的横幅抓取和端口扫描。它结合了两个不同的理念,希望使其值得您关注和投入时间。
第一个理念是使用无状态 SYN 扫描,通过加密保护的 cookie 来解析传入的确认包。据作者所知,这项技术最早由 Dan Kaminsky 在 scanrand 中开创。Scanrand 本身是 Paketto Keiretsu(一组扫描工具)的一部分,于 2001-2002 年左右发布。该代码的镜像可在 Packet Storm [1] 找到。
第二个理念是使用修补过的用户态 TCP/IP 栈,以便扫描器在收到同时设置了 SYN 和 ACK 标志的加密验证数据包后,能立即恢复状态。polarbearscan 使用的用户态栈称为 libuinet [2]。与市面上其他一些用户态 TCP/IP 栈不同,这个栈非常成熟,因为它只是 FreeBSD 的 TCP/IP 栈的一个移植。
通过修补 libuinet 栈,可以构建一个套接字,并用正确的 ACK 回复,完成标准的三次握手。通过这种方式,可以立即建立完全可用的 TCP 连接。这与其他扫描器(如 nmap)不同,后者在检测到某个 TCP 端口开放后,必须通过内核执行一次完整的 TCP 连接才能进行横幅抓取或版本扫描。完整的 TCP 连接会导致执行一次全新的三次握手,完全丢弃了最初两个数据包在主机间交换时建立的隐式状态。通过避免这一点,可以减少带宽消耗,并立即从检测到端口开放转变为连接到该端口。然后,这个连接可以简单地静待并接收数据(横幅抓取模式),或者发送 HTTP 请求。
请注意,当前扫描器仅支持基于 IPv4 的扫描,且只能在以太网类型(有线或无线)接口上正常工作。短期内没有支持 IPv6 或不同接口的计划。
安装
编译代码非常简单。只需要一个可正常连接互联网的网络,并安装好 git,以便下载所需的依赖项。除此之外,还需要标准开发工具(gcc、make、patch)、库的开发版本(pthread、pcap、OpenSSL)。在基于 Debian 的发行版上,只需安装 DEPENDENCIES 文件中列出的所有软件包即可。之后,只需输入 'make',外部依赖项就会通过 git 检出,整个扫描器将被构建。生成的二进制文件可以复制到 /usr/bin 或 /usr/local/bin 等目录。
如果编译失败,请通过电子邮件联系作者(联系方式见下文),并附上错误输出、内核版本、libc 版本以及其他有助于重现和修复问题的任何信息。非常感谢您的帮助。
用法
运行该工具应该非常简单。您需要 root 权限。使用 -h 选项可以显示简要的使用信息和各选项说明。大多数情况下,您只需指定扫描类型、要扫描的端口列表以及目标 IP 或 IP 范围。IP 范围支持 CIDR 表示法。
共有四种扫描类型,通过 -s<参数> 指定:
-sB:执行标准横幅抓取。扫描器不会发送任何数据,只会等待并接收数据,显示直到第一个换行符或回车符为止的内容。
-sH:此模式会向每个成功建立的连接发送 "GET / HTTP/1.1" 请求。对于快速识别 HTTP 服务器非常有用。
-sT:TLS 扫描模式会发送一个 TLS1.0 空探针,不指定任何选项和算法。但如果接收端存在有效的 TLS 服务器,它会解析并尝试判断是否为有效的 TLS 错误响应,然后显示出来。
-sC:自定义扫描模式,从文件(通过 -d 指定)加载载荷,并将该载荷发送到每个成功建立的套接字。可用于快速探测非常特定的协议。
-p:要扫描的 TCP 端口列表,可以是端口范围或单个端口,范围与单个端口用逗号分隔。示例:-p22,80,8080-9000,143 将扫描端口 22、80、143 以及 8080 到 9000 的范围。
-b <限制>:出站探针的带宽限制。这不适用于套接字上发送和接收的数据,仅适用于实际发送的 SYN 探针。示例:-b300k、-b67m、-b500b 分别对应 300 kbps、76 Mbps 和 500 bps 的带宽限制。
-d <文件名>:包含自定义扫描所用载荷的文件名。整个文件将发送,最多 128 kB,对于大多数用途来说绰绰有余。
-t<超时>:指定扫描器在发送所有探针后,等待通过仍连接的套接字接收数据的秒数。假设还有连接存在,否则当没有更多工作可做时,扫描器会立即退出。
-x:强制工具始终以十六进制表示法显示接收到的输出。否则,仅当发现不可打印字符时才会以十六进制显示。
-v:指定一些详细输出。主要用于调试。
-i <接口>:用于选择源 IP 和设置 pcap 后端的接口。在只有一张正确配置的网卡的标准机器上通常不需要,但多网卡时可能需要。
-r <种子>:用于 RNG 的随机种子。主要用于调试,确保可以生成完全相同的数据包序列。参数为整数,可以用十六进制或十进制表示。
-T :覆盖 SYN 探针中使用的默认 IP TTL 值。并非必要,只是为了完整性而包含。
-W :覆盖 SYN 探针中使用的默认 TCP 窗口大小。并非必要,只是为了完整性而包含。
-I :覆盖 SYN 探针中使用的默认 IP ID 值。并非必要,只是为了完整性而包含。
-n:此选项仅应在您清楚自己在做什么时使用。它会确保工具不设置防火墙规则以丢弃所有出站 RST 数据包。如果使用此选项,扫描器将不会派生进程,您需要手动设置此规则,否则内核会为接收到的每个 SYN/ACK 数据包发送 RST 数据包,导致工具根本无法工作。在 Linux 上设置的规则如下:
$ /sbin/iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP
-o:此选项不进行 I/O 重定向,因此会看到更多 uinet 内部输出的内容。仅出于完整性或调试场景而添加,否则用处不大。
-h:显示用法信息。
一些使用示例。要对 /24 范围内的端口 22 进行横幅抓取,可以使用:
./pbscan -sB -p22 x.x.x.x/24
要对单个 IP 的多个常见 HTTP 端口进行 HTTP 扫描,并以十六进制模式输出,可以使用:
./pbscan -sH -x -p80,8080-9000 x.x.x.x
扫描过程中,如果按标准输入上的某个键,会打印一些统计信息,例如识别出的开放端口数量、收到的有效 TCP ACK 数量、当前活跃连接数以及已发送的 SYN 探针占总数的百分比。示例如下:
sent: 1.97% (of 254), open: 0, active: 2, acks: 2
作者
该工具由 Vincent Berg 编写。可通过电子邮件 [email protected] 联系我,或访问我的网站 http://santarago.org 获取此扫描器的更新版本/新闻。
致谢
非常感谢几位帮助测试、移植和报告错误的朋友。感谢 Ehab、Joseph、Alejandro、Julian 和 Diego。
参考文献
[1] http://packetstormsecurity.com/files/30489/paketto-1.10.tar.gz.html