声明:该系列文章首发于公众号:Y1X1n安全,转载请注明出处!本公众号所分享内容仅用于每一个爱好者之间的技术讨论及教育目的,所有渗透及工具的使用都需获取授权,禁止用于违法途径,否则需自行承担,本公众号及作者不承担相应的后果。
MASSCAN:海量 IP 端口扫描器
Masscan是一款高速、高效的端口扫描工具,用于快速扫描大规模网络。它能够同时扫描大量IP地址和端口,帮助发现开放的服务,采用异步扫描技术,发送和接收数据包的速度非常快,并且提供了灵活的扫描选项和多种输出格式支持。 Masscan 主要用于对大量机器进行大范围扫描,而 nmap 则设计用于单机或小范围的密集扫描。
Masscan官方提供了Visual Studio V2010版本的构建信息,所以有Visual Studio的小伙伴可以直接进行编译使用。
项目下载地址:https://github.com/robertdavidgraham/masscan
下载后需要关注如下3个文件夹:
首先,看下自己的Visual Studio版本,我的是Microsoft Visual Studio Community 2022 (64 位) - Current
版本 17.7.0,然后去微软官方:预定义宏,找自己版本所对应的_MSC_VER的值。我在编译的时候官方还未给出 17.7.0对应_MSC_VER的值,但是可以看出规律:自 Visual Studio 2017 版本 15.3 之后都是依次递增1的,那么我的版本对应的应该是1937,如下:
这个地方再写一个对应的2022应该也可以,但是我就直接在2010上修改了。
这么操作的原因如下:
Microsoft C/C++ 编译器 (MSVC) 根据语言(C 或 C++)、编译目标和所选编译器选项预定义某些预处理器宏。
_MSC_VER 是一个定义在 Microsoft Visual C++ 编译器中的预定义宏(predefined macro)。它用于表示当前使用的编译器的版本号。_MSC_VER 的值是一个整数,代表 Visual C++ 编译器的主要版本号。不同的 Visual C++ 版本对应着不同的_MSC_VER 值。通过检查 _MSC_VER 的值,可以在代码中做特定于编译器版本的条件编译。以根据不同的编译器版本执行特定的代码路径或使用特定的编译器功能。这对于处理特定于编译器的问题或利用最新的编译器功能非常有用。
然后,用Visual Studio打开下载下来的Masscan,找到vs10目录下的masscan.sln文件,masscan.sln 文件是 Masscan 项目的 Visual Studio 解决方案文件,它提供了一种集中管理项目、构建和调试代码的方式。
在 Visual Studio 中打开 masscan.sln 文件后,可以进行以下操作:
我们点击上方工具栏中的生成—生成解决方案(快捷键:ctrl+shift+b),即可在bin目录下生成可执行程序。
masscan.exe -p 1-65535 10.249.0.0/24 --rate=10000
masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112
# 支持IPV6
masscan.exe -p 1-65535 -iL ips.txt --rate=10000 -oL scan_results.txt
masscan 10.0.0.0/8 -p80 --banners --source-ip 192.168.1.200
-p <ports,--ports <ports>>: 指定要扫描的端口范围。可以是单个端口、端口范围或逗号分隔的端口列表。
--banners: 获取服务的banner信息,支持一些协议。
--rate <packets-per-second>: 设置发送数据包的速率,单位是每秒的数据包数。
-c <filename>, --conf <filename>: 读取配置文件进行扫描。
--echo: 将当前的配置信息保存到配置文件中。
-e <ifname>, --adapter <ifname>: 指定用于发送数据包的网络接口名称。
--adapter-ip <ip-address>: 设置发送数据包的源IP地址。
--adapter-port <port>: 设置发送数据包的源端口。
--adapter-mac <mac-address>: 设置发送数据包的源MAC地址。
--router-mac <mac address>: 设置网关的MAC地址。
--exclude <ip/range>: 指定要排除的IP地址范围,防止masscan扫描这些地址。
--excludefile <filename>: 指定包含要排除的IP地址范围的文件。
--includefile, -iL <filename>: 从指定的文件中读取要扫描的IP地址范围列表。
--ping: 扫描时包括对ICMP请求的响应。
--append-output: 将结果以附加的方式输出到文件。
--iflist: 列出可用的网络接口,然后退出。
--retries: 设置发送数据包的重试次数,每次重试间隔1秒。
--nmap: 输出与nmap兼容的信息。
--http-user-agent <user-agent>: 设置HTTP请求的用户代理字段值。
--show [open,close]: 指定要显示的端口状态,可选值为开放或关闭,默认为开放端口。
--noshow [open,close]: 禁止显示端口状态。
--pcap <filename>: 将接收到的数据包以libpcap格式保存到指定的文件中。
--regress: 运行回归测试,以验证扫描器的正确运行。
--ttl <num>: 设置发送数据包的TTL(生存时间)值,默认为255。
--wait <seconds>: 设置发送数据包后的等待时间,默认为10秒。
--offline: 不实际发送数据包,主要用于测试开销。
-sL: 不进行扫描,只生成随机地址列表。
--readscan <binary-files>: 读取-oB生成的二进制文件,并转换为XML或JSON格式。
--connection-timeout <secs>: 指定获取banner时的最大TCP连接维持时间,默认为30秒。
输出格式:
-oX <filespec> (XML)
-oB <filespec> (Binary)
-oG <filespec> (Grep)
-oJ <filespec> (Json)
-oL <filespec> (List)
-oU <filespec> (Unicornscan format)
对Linux和macOS来说,由于Masscan具有与本地系统分离的独立TCP/IP堆栈,当本地系统接收到来自被探测目标的SYN-ACK时,会发送RST数据包,导致Masscan无法捕获banner信息。Windows系统不会响应RST数据包,不存在上述问题。
避免这个问题的最简单方法是为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 使用的 IP 地址在本地子网中必须是唯一的,并且尚未被其他系统使用。
在WiFi场景下,可通过防火墙阻止Masscan使用的端口, 这样本地TCP/IP堆栈就无法获取到该数据包,但Masscan仍然可以。
-sS:默认情况下,masscan使用SYN扫描(只发送SYN数据包),但将来可能会更改为其他扫描类型。
-Pn:默认情况下,masscan会在扫描之前不对主机进行ping操作。这是为了实现异步操作,以便更快地进行扫描。
-n:默认情况下,masscan不进行DNS解析,以避免在扫描过程中产生额外的网络流量。
--randomize-hosts:默认情况下,masscan会完全随机地扫描目标主机。这意味着扫描顺序不受用户控制,以增加扫描的随机性。
--send-eth:默认情况下,masscan使用原始的libpcap库发送数据。这可以提供更高的性能和灵活性。
在Windows系统或从虚拟机中,它可以每秒发送300,000个数据包。在Linux系统(无虚拟化)下,它可以每秒发送1.6百万个数据包。这足够快以至于能够使大多数网络崩溃。
采用异步设计,具有独立的传输和接收线程。它通过随机化目标IP地址的方式来扫描网络,并使用二进制搜索来提高性能。该程序的目标是以极高的速度发送数据包进行扫描,因此在处理大量数据包和转换索引为IP地址时需要考虑性能优化。
Masscan通过采用内核绕过技术解决了"C10M问题",以实现更高级别的可扩展性。它使用自定义网络驱动程序、用户态TCP堆栈和用户态同步来绕过内核的限制。这使得Masscan能够以最大硬件速率传输数据包,并支持大量并发的TCP连接。此外,Masscan避免使用互斥锁,而是使用"rings"进行同步操作,以提高性能和可扩展性。
如果你对网络安全或编程感兴趣,可以搜索公众号“Y1X1n安全”,每天都会分享相关知识点,让我们一同加油!路漫漫其修远兮,吾将上下而求索。