十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

masscan 互联网级端口扫描器:从构建安装到 10M pps 全网扫描的完整实战指南

masscan 互联网级端口扫描器:从构建安装到 10M pps 全网扫描的完整实战指南 网络安全渗透测试CLI【免费下载链接】masscanTCP port scanner, spews SYN packets asynchronously, scanning entire Internet in under 5 minutes.项目地址https://gitcode.com/gh_mirrors/ma/masscan点击查看免费下载masscan 是面向“互联网规模”的 TCP 端口扫描器官方宣称可以在 5 分钟内扫完整个 IPv4 互联网、单机发送 1000 万包/秒。它采用与 nmap 类似的命令行参数与输出风格但内部是完全不同的异步架构。本篇指南以仓库根目录 README.md 为骨架结合 src/ 下的真实源码实现系统讲解 masscan 的构建安装、基础扫描、Banner 抓取、全网扫描、五种输出格式、速率控制以及“索引加密随机化”“C10M 绕过内核”“PF_RING”等核心设计原理帮助你从“会用”进阶到“懂它的设计”。一、masscan 是什么定位与核心设计思想masscan 是一个互联网规模的端口扫描器。根据官方 README 的说明它可以在 5 分钟内扫描整个互联网以单机 1000 万包/秒10 million packets per second的速率发送数据包。它的用法参数、输出与 nmap 高度相似凡是支持“对大量机器进行广泛扫描”的功能都被保留而“对单台机器进行深入扫描”的功能则不支持。在内部实现上masscan 采用异步传输asynchronous transmission架构与scanrand、unicornscan、ZMap属于同一设计流派但比它们更灵活——支持任意的端口范围和地址范围组合。使用 masscan 前必须理解一个关键前提masscan 自带一套独立的 ad hoc TCP/IP 协议栈详见 src/stack-tcp-core.c、src/stack-tcp-api.h。这意味着除简单的端口扫描外任何操作都可能与本机操作系统的 TCP/IP 协议栈产生冲突。因此需要使用--src-ip选项指定一个不同的源 IP 地址或者使用--src-port指定 masscan 使用的源端口并在内部防火墙如pf或iptables中把这些端口与本机其余流量隔离。二、构建与安装2.1 Debian/Ubuntu 快速构建masscan 几乎没有外部依赖只需要一个 C 编译器如gcc或clangsudo apt-get --assume-yes install git make gcc git clone https://gitcode.com/gh_mirrors/ma/masscan cd masscan make编译产物位于masscan/bin子目录Makefile 中的all: bin/masscan目标。安装到系统Linux则执行make install源码由大量小文件组成因此推荐用多线程构建加速make -j注意在树莓派等内存只有 2GB 的设备上make -j使用全部线程会导致内存不足而构建失败此时建议降低并行度例如make -j4。2.2 其他平台构建方式官方 README 给出的平台支持矩阵如下平台构建方式Windows Visual Studio使用 vs10/masscan.sln 工程Windows MinGW直接makeWindows Cygwin不支持macOS Xcode使用 xcode4/masscan.xcodeproj 工程macOS 命令行直接makeFreeBSD使用gmake其他平台直接编译全部源文件cc src/*.c -o bin/masscan从 Makefile 的源码可以看到编译器选择逻辑是优先clang其次gcc最后回退到cc链接库LIBS则根据平台自动切换Linux 用-lm -lrt -ldl -lpthreadmacOS 用-lmMinGW 用-lIPHLPAPI -lWs2_32等。另外 README 提到在 macOS 上x86 二进制在 ARM 模拟下运行速度与原生几乎相同。2.3 构建后自检构建完成后建议立即运行内置的回归测试见 README 的 Regression testing 一节make test bin/masscan --selftest selftest: success!make test与make regress等价Makefile底层都是执行bin/masscan --selftest用于验证程序中大量容易出错的细节逻辑。三、基本用法一次扫描长什么样masscan 的用法与 nmap 类似。扫描一个网段的若干端口masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112这条命令会扫描10.x.x.x子网和2603:3001:2d00:da00::x两个子网扫描端口 80 以及 8000 到 8100 的区间即两个子网上合计 102 个端口把结果打印到标准输出stdout可以直接重定向到文件。3.1 用--echo导出完整配置要查看完整可用的参数列表不需要背文档直接使用--echo特性它会把当前完整配置打印出来并退出。而且这份输出可以直接作为输入再喂回程序masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112 --echo xxx.conf masscan -c xxx.conf --rate 1000这一机制在源码 src/main-conf.c 中可以看到masscan_echo()系列函数把每个配置项如banners、capture等以key value的形式回写出来。也就是说--echo输出的配置文件就是该程序“当前状态”的权威描述非常适合作为扫描基线存档。3.2 默认配置文件默认情况下masscan 会先加载/etc/masscan/masscan.conf之后任何命令行参数都会覆盖这个默认文件中的对应设置。官方建议把excludefile之类的参数放进这个文件这样每次扫描都会自动带上不会忘记。四、Banner 抓取与自建 TCP/IP 栈的冲突解决masscan 不仅能判断端口是否开放还能完成 TCP 连接并和应用交互抓取简单的 Banner 信息。官方 README 列出的支持协议包括FTP、HTTP、IMAP4、memcached、POP3、SMTP、SSH、SSL、SMBv1、SMBv2、Telnet、RDP、VNC对应的协议解析实现可在 src/proto-ftp.c、src/proto-http.c、src/proto-ssh.c、src/proto-ssl.c、src/proto-smb.c、src/proto-tcp-rdp.c、src/proto-vnc.c 等文件中找到。问题所在masscan 自带 TCP/IP 栈与操作系统相互独立。当目标返回 SYN-ACK 时本机操作系统收到后会自动回一个 RST 包把连接掐断——masscan 还没来得及抓 Banner。4.1 方案一给 masscan 分配独立 IP推荐最容易的方式是给 masscan 一个独立的 IP 地址例如masscan 10.0.0.0/8 -p80 --banners --source-ip 192.168.1.200 masscan 2a00:1450:4007:810::/112 -p80 --banners --source-ip 2603:3001:2d00:da00:91d7:b54:b498:859d注意事项该地址必须在本机子网内且不能被其他系统使用masscan 会尝试警告你配置有误但如果你用错了地址可能干扰到别的机器的通信达数分钟之久务必小心。4.2 方案二防火墙屏蔽 masscan 使用的源端口在 WiFi 等无法分配独立 IP 的场景下可以把 masscan 使用的源端口从操作系统的 TCP/IP 栈中“隔离”出来用防火墙丢弃这些端口的数据包本机协议栈就看不到 SYN-ACK而 masscan 因为绕过了本机协议栈依然能收到。Linux 上的做法iptables -A INPUT -p tcp --dport 61000 -j DROP masscan 10.0.0.0/8 -p80 --banners --source-port 61000端口选择要避开 Linux 可能用于临时源端口的范围可查看并调整/proc/sys/net/ipv4/ip_local_port_range以 2018 年 8 月版本的 Kali Linux 为例该范围是 32768 到 60999因此应选择32768 以下或 61000 以上的端口。注意iptables规则重启后失效需要根据发行版保存配置如iptables-save或iptables-persistent。macOS 和 BSD 有类似步骤。查看需要避开的端口范围sysctl net.inet.ip.portrange.first net.inet.ip.portrange.lastFreeBSD 和旧版 macOS 使用ipfwsudo ipfw add 1 deny tcp from any to any 40000 in masscan 10.0.0.0/8 -p80 --banners --source-port 40000新版 macOS 和 OpenBSD 使用pf包过滤工具。编辑/etc/pf.conf加入一行block in proto tcp from any to any port 40000:40015然后启用防火墙pfctl -E若防火墙已在运行则重启或重新加载规则pfctl -f /etc/pf.confWindows 不会主动回 RST 包所以这两种方案都不需要但 masscan 依然被设计为“使用独立 IP 效果最佳”即使不必要也建议尽量那样运行。同样的处理也适用于其他检查类功能例如--heartbleed——它本质上就是一种 Banner 检查。五、扫描整个互联网排除、速率与配置文件masscan 是为整个互联网设计的。完整扫描的命令是masscan 0.0.0.0/0 -p0-65535但扫描整个互联网是不明智的一方面互联网的某些部分对扫描反应激烈另一方面有些站点会记录扫描行为并把你的地址加入封禁名单导致你被有用的网络区域防火墙隔离。因此必须排除大量地址段。黑名单语法masscan 0.0.0.0/0 -p0-65535 --excludefile exclude.txt仓库自带的 data/exclude.conf 就是一个真实的排除文件范例前半部分按 IANA 特殊地址注册表RFC 5735、RFC 6598 等列出0.0.0.0/8、10.0.0.0/8、127.0.0.0/8、192.168.0.0/16等保留地址段后半部分则收录了历次真实扫描收到的滥用投诉邮件对应的地址段如153.11.0.0/16、165.160.0.0/16、129.123.0.0/16以及美军地址段等每段都附有投诉原文作为注释——这本身就是“全网扫描前必须做排除”的生动教材。默认输出到命令行通常需要保存到文件masscan 0.0.0.0/0 -p0-65535 -oX scan.xml这会把结果保存为 XML 文件方便导入数据库或其他工具。但默认速率只有100 包/秒照此速度扫描互联网要到地老天荒。需要提速masscan 0.0.0.0/0 -p0-65535 --max-rate 100000以 10 万包/秒的速率扫描整个互联网剔除排除段后大约需要每个端口 10 小时如果扫描全部 65535 个端口则约 65.5 万小时。注意这条命令里的选项全部是 nmap 兼容的此外 masscan 还隐式设置了 nmap 风格的“隐形”选项-sS -Pn -n --randomize-hosts --send-eth。XML 文件的格式也受到 nmap 的启发。当然因为异步架构本质上和 nmap 不同两者仍有大量差异。5.1 用配置文件固化扫描任务长命令行写起来繁琐可以存成配置文件。上面的设置对应# My Scan rate 100000.00 output-format xml output-status all output-filename scan.xml ports 0-65535 range 0.0.0.0-255.255.255.255 excludefile exclude.txt使用方式masscan -c myscan.conf这也会让重复执行同一扫描变得非常简单。配置文件中的rate项在 src/main-conf.c 中有对应的解析实现支持小数并换算为masscan-max_rate包/秒。六、五种输出格式默认情况下 masscan 会生成较大的文本文件但很容易转换成其他格式。官方支持五种输出格式xml参数-oX filename或--output-format xml--output-filename filename。适合导入数据库。binarymasscan 内置格式文件小得多——官方扫描互联网时用它能防止磁盘被撑爆。缺点是需要解析。命令行选项--readscan可以读取二进制扫描文件配合-oX即可把二进制结果转为 XML 版本masscan --open --banners --readscan filename -oX savefile该功能在源码 src/in-binary.c 的readscan_binary_scanfile()中实现支持一次读取多个文件过滤逻辑在 src/in-filter.c 的readscan_filter_pass()中可按 IP、端口、状态过滤统计/汇总逻辑在 src/in-report.c 的readscan_report()中。grepablenmap-oG风格便于命令行工具解析。参数-oG filename或--output-format grepable--output-filename。jsonJSON 格式。参数-oJ filename或--output-format json--output-filename。list每行一个“主机 端口”的简单列表。参数-oL filename或--output-format list--output-filename。行格式为port state protocol port number IP address POSIX timestamp open tcp 80 XXX.XXX.XXX.XXX 1390380064七、与 nmap 的兼容性设计在合理范围内masscan 刻意让 nmap 用户感到熟悉尽管两者本质不同masscan 面向大量机器的广域扫描nmap 面向单机或小范围的深度扫描。两个重要差异没有默认端口必须用-p ports显式指定端口目标是 IP 地址或简单范围不支持 DNS 名称也不支持 nmap 那种花哨的子网写法如10.0.0-255.0-255。可以把 masscan 视为永久开启了以下 nmap 设置选项含义-sS仅 SYN 扫描当前版本如此未来可能会变-Pn不先 ping 主机这是异步操作的根本-n不做 DNS 解析--randomize-hosts始终完全随机化扫描顺序不可关闭--send-eth用原始libpcap发送数据包查看完整的 nmap 兼容选项列表masscan --nmap八、传输速率默认 100 pps注意“熔断”自己的网络masscan 发包速度极快这部分数字均来自官方 README 的说明Windows 或虚拟机约30 万包/秒Linux非虚拟化约160 万包/秒默认速率仅为100 包/秒提高到百万级用--rate 1000000README 原文如此源码中--rate与--max-rate等价见 src/main-conf.c。这个速度足以“熔化”大多数网络。但注意它只会熔化你自己的网络——因为目标 IP 是随机化的流量均匀分摊不会压垮任何一个远端网络。IPv4 与 IPv6 的流量分布有本质区别扫描 IPv4 互联网时会覆盖大量子网即使总体发包速率很高每个目标子网收到的速率都很小而 IPv6 扫描往往聚焦在单个拥有几十亿地址的子网上默认行为会压垮目标网络——很多网络在 masscan 产生的负载下会崩溃。因此 IPv6 扫描务必降低速率。九、设计原理源码级深入9.1 代码布局main.c 是“设计说明书”src/main.c 包含main()函数以及transmit_thread()发送探测包线程和receive_thread()接收响应包线程。正如文件头部注释src/main.c所言这两个线程被刻意“拍平”flattened并加上大量注释只需逐行阅读这两个函数就能读懂整个程序的设计。每个网卡对应一对收发线程线程参数封装在struct ThreadPair中src/main.c。9.2 异步架构masscan 之于 nmap如同 nginx 之于 Apachemasscan 是异步设计发送线程与接收线程相互独立与scanrand、unicornscan、ZMap同类。因为异步它跑多快取决于底层发包能力而不是等待应答。9.3 随机化加密索引而不是洗牌masscan 与其它扫描器最大的区别在于目标随机化方式。其基本原理是维护一个从零开始、每次探测加一的单一索引变量for (i 0; i range; i) { scan(i); }需要把索引翻译成 IP 地址。假设要扫描所有“私网”地址即下面三张范围表192.168.0.0/16 10.0.0.0/8 172.16.0.0/12那么前 65536 个索引映射到 192.168.x.x接下来 1600 万个索引映射到 10.x.x.x其余映射到 172.16.x.x。扫描整个互联网时由于大量黑名单把目标空间切碎实际会有超过 100 个范围段。这引出了代码中较慢的部分之一每秒 1000 万次把索引翻译成 IP解决方案是在小内存中做二分查找binary search。在这种发包速率下缓存效率开始压倒算法效率——理论上更高效的算法都需要太多内存实际反而更慢。这个索引→IP 的翻译函数叫pick()for (i 0; i range; i) { ip pick(addresses, i); scan(ip); }masscan 同时支持 IP 范围与端口范围因此要从索引里同时挑出 IP 和端口range ip_count * port_count; for (i 0; i range; i) { ip pick(addresses, i / port_count); port pick(ports, i % port_count); scan(ip, port); }除法/取模在 x86 上约 90 个时钟周期约 30 纳秒以 1000 万包/秒发包时每包只有 100 纳秒预算。好在两个这样的操作可以并行执行所以一次除法开销并不比做两次大。上述优化依赖i顺序递增但 masscan 必须随机化扫描顺序否则会“轰击”那些扛不住高速扫描的目标网络。随机化的方式是对索引变量做加密加密天然是随机的且产生索引与输出的 1:1 映射。于是线性遍历索引时输出的 IP 地址完全随机range ip_count * port_count; for (i 0; i range; i) { x encrypt(i); ip pick(addresses, x / port_count); port pick(ports, x % port_count); scan(ip, port); }代价也不小由于范围大小不可预测不是整齐的 2 的幂无法用 AND/XOR 这类廉价位运算只能用 MODULUS 这类昂贵操作。官方基准显示加密一次约需 40 纳秒。这一加密随机化的具体实现就是 src/crypto-blackrock.cBlackRock 洗牌算法与 src/crypto-lcg.cLCG 线性同余等模块。这个架构派生出一系列实用特性分片shards5 台机器各自扫描range / shard_count的五分之一。分片可以是多台机器、同一台机器的多张网卡甚至同一张网卡上的多个源 IP种子seed/key给加密函数一个种子每次扫描得到不同的顺序即x encrypt(seed, i)断点续扫退出程序时记住当前i值修完 bug 后用-c配置和--resume继续README 作者开发时经常这样暂停/恢复全网扫描重传/重试互联网会丢包可以背靠背发两个包但丢一个包的系统往往也丢紧随其后的包所以副本应间隔约 1 秒发送。既然已有速率变量rate每秒包数重传索引就是i rate。官方还计划未来用同样的方式区分“背靠背”“1 秒”“10 秒”“1 分钟”重传的丢包差异。9.4 C10M 可扩展性绕过内核的三条途径异步技术是“c10k 问题”万并发的已知解法masscan 的目标是下一等级——“C10M 问题”千万并发。C10M 的解法是绕过内核masscan 的三条内核绕过途径自定义网卡驱动可以使用 PF_RING DNA 驱动。该驱动把包从用户态内存直接 DMA 到网卡驱动零内核参与。这样即使 CPU 较慢软件也能以硬件允许的最大速率发包——如果一台机器插 8 张 10Gbps 网卡理论发包速率可达 1 亿包/秒用户态 TCP 栈masscan 内置 TCP 栈src/stack-tcp-core.c用于抓取 Banner只要内存足够可轻松支撑 1000 万并发 TCP 连接用户态同步masscan没有互斥锁mutex。现代 futex 虽多在用户态但有两个问题一是会导致缓存行在 CPU 间快速抖动二是发生竞争时会陷入内核系统调用直接扼杀性能。因此 masscan 用“环形缓冲ring”同步例如接收线程中的用户态 TCP 栈需要发包时通过 ring 与发送线程协作而不互相干扰——实现见 src/rte-ring.c生产者/消费者环形缓冲与 src/xring.c。9.5 可移植性代码在 Linux、Windows、macOS 上运行良好重要部分均为标准 CC90因此能用 Visual Studio 编译器Windows、Clang/LLVMmacOS、GCCLinux编译。Windows 和 Mac 未针对发包调优约 30 万包/秒而 Linux 可达 150 万包/秒——官方认为这通常已经超出你的实际需求。9.6 安全编码项目提供漏洞赏金详见仓库根目录的 VULNINFO.md使用安全函数如safe_strcpy()替代不安全的strcpy()实现在 src/util-safefunc.c具备自动化单元回归测试make regress。9.7 IPv4 与 IPv6 共存masscan 支持 IPv6但没有独立的 IPv6 模式——两种地址始终同时受支持没有-6选项因为它永远可用。任何示例中把 IPv4 地址换成 IPv6 地址即可同一扫描中可同时包含 IPv4 与 IPv6 目标输出中地址出现在相同位置无需特殊标记。需要记住 IPv6 地址空间极大不要扫描大范围最多扫一个子网中通过 DHCPv6 分配的前 65536 个地址。更实用的做法是用--include-file filename.txt扫描从其他来源获得的大列表文件该文件同样可混合 IPv4/IPv6。官方使用的测试文件含800 万个地址——这么大的文件启动时要多花几秒读取masscan 会先排序并去重。另因 masscan 自带网络栈运行它的本机不需要启用 IPv6但所在网络需要能路由 IPv6 包。9.8 PF_RING突破 200 万包/秒要超过 200 万包/秒需要 Intel 10Gbps 以太网卡和 ntop 的“PF_RING ZC”特殊驱动。masscan无需重新编译即可使用 PF_RING但需要构建以下组件libpfring.so安装到 /usr/lib/libpfring.sopf_ring.ko内核驱动ixgbe.kontop 版 Intel 10Gbps 网卡驱动不需要构建他们的libpcap.so。当 masscan 检测到网卡名形如zc:enp1s0而非enp1s0时会自动切换到 PF_RING ZC 模式。9.9 性能测试用下面的命令做性能测试目标地址用一次性地址避免压垮本地路由器bin/masscan 0.0.0.0/4 -p80 --rate 100000000 --router-mac 66-55-44-33-22-11伪造的--router-mac让数据包留在本地网段不会发往互联网。也可以测试“离线模式”即不计发包开销时程序的运行速度bin/masscan 0.0.0.0/4 -p80 --rate 100000000 --offline这个基准大致对应使用 PF_RING近零开销时程序的运行速度。另外随机化算法重度依赖“整数算术”——这是 CPU 上的慢性慢操作现代 CPU 把整数运算速度翻倍masscan 也因此快了很多。十、文档、测试数据与授权完整的手册页位于 doc/masscan.8另有 Markdown 版 doc/masscan.8.markdown更多 FAQ 见 doc/faq/README.md涵盖慢速扫描、丢包、排除列表、服务器日志等话题仓库 data/ 目录还附带测试用的 pcap 文件如 data/flush_all.pcap、data/afl-http.pcap工具由 Robert Graham 创建项目采用GNU Affero General Public License v3授权见 LICENSE版权归 Robert David Graham 所有。结语从构建安装、基础扫描、Banner 抓取到全网扫描的排除策略、五种输出格式再到“加密索引随机化”“C10M 内核绕过”“PF_RING”等设计原理masscan 的每一层都有 README 与 src/ 源码相互印证。上手使用只需记住几条命令但要安全、高效地用好它务必理解它“自带 TCP/IP 栈”“默认 100 包/秒”“目标永远随机化”这三个核心事实。在开始任何大规模扫描前请先准备好独立的源 IP或隔离的源端口和一份完善的排除文件。赞分享网络安全渗透测试CLI【免费下载链接】masscanTCP port scanner, spews SYN packets asynchronously, scanning entire Internet in under 5 minutes.项目地址https://gitcode.com/gh_mirrors/ma/masscan点击查看免费下载相关推荐Masscan5分钟扫描整个互联网的终极端口扫描器Masscan5分钟扫描整个互联网的终极端口扫描器 Masscan 是一款高性能的互联网级 TCP 端口扫描器能够在短短5分钟内完成对整个互联网的扫描。作为网络安全渗透测试CLIMasscan项目推荐互联网级端口扫描的终极利器Masscan项目推荐互联网级端口扫描的终极利器 Masscan 是一款互联网级别的端口扫描工具能够异步发送SYN数据包在短短5分钟内完成对整个互联网的扫网络安全渗透测试CLI如何使用Masscan5分钟扫描整个互联网的终极端口扫描工具教程如何使用Masscan5分钟扫描整个互联网的终极端口扫描工具教程 Masscan是一款高性能的TCP端口扫描工具能够异步发送SYN数据包在短短5分钟内完成网络安全渗透测试CLI上一篇3 个闲置侧键的用法Mac Mouse Fix 安装与按键配置完整指南下一篇WebPShop插件终极指南让Photoshop轻松支持WebP图像格式创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表