nmap与masscan

Lekou 2021年04月06日 146次浏览

  无论是在渗透测试信息收集过程中还是企业自查时,端口扫描几乎都是必须要做的事情。今天摸鱼时间简单说一下这两款端口扫描神器的优缺点及其特性。

nmap

  nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具。Nmap可以检测目标机是否在线、端口开放情况、侦测运行的服务类型及版本信息、侦测操作系统与设备类型等信息。
  Nmap有强大的脚本引擎框架,用户可以使用Lua语言编写扩展。目前官方提供了400多个扩展脚本,用于增强基础功能和扩展更多功能,如漏洞检测、口令爆破等。在扫描命令中使用—script=scriptname调用即可。

Nmap的功能非常强大,而且作为一个广泛使用的开源工具,全球的开发者都为其功能的丰富贡献了力量。因此,本文仅对其功能进行简单的描述。

  • 基本功能:主机发现,开放端口扫描,支持多端口、多网段,可对目标域名进行扫描;
  • 识别功能:识别端口服务类型及版本、操作系统、设备类型等;
  • 扫描模式:TCP SYN scan、TCP connectscan、UDP scan、No Ping scan等;
  • 规避检测:分片、IP伪装、MAC伪装。

四项基本功能:

  • 主机发现(Host Discovery)
  • 端口扫描(Port Scanning)
  • 版本侦测(Version Detection)
  • 操作系统侦测(Operating System Detection)

主机发现原理

  主机发现的原理与Ping命令类似,发送探测包到目标主机,如果收到回复,那么说明目标主机是开启的。Nmap支持十多种不同的主机探测方式,比如发送ICMP ECHO/TIMESTAMP/NETMASK报文、发送TCPSYN/ACK包、发送SCTP INIT/COOKIE-ECHO包,用户可以在不同的条件下灵活选用不同的方式来探测目标机。

  Nmap的用户位于源端,IP地址192.168.0.5,向目标主机192.168.0.3发送ICMP Echo Request。如果该请求报文没有被防火墙拦截掉,那么目标机会回复ICMP Echo Reply包回来。以此来确定目标主机是否在线。

  默认情况下,Nmap会发送四种不同类型的数据包来探测目标主机是否在线。

  • ICMP echo request
  • a TCP SYN packet to port 443
  • a TCP ACK packet to port 80
  • an ICMP timestamp request

依次发送四个报文探测目标机是否开启。只要收到其中一个包的回复,那就证明目标机开启。使用四种不同类型的数据包可以避免因防火墙或丢包造成的判断错误。

端口扫描

  端口扫描是Nmap最基本最核心的功能,用于确定目标主机的TCP/UDP端口的开放情况。默认情况下,Nmap会扫描1000个最有可能开放的TCP端口。

  Nmap通过探测将端口划分为6个状态:

  • open:端口是开放的。
  • closed:端口是关闭的。
  • filtered:端口被防火墙IDS/IPS屏蔽,无法确定其状态。
  • unfiltered:端口没有被屏蔽,但是否开放需要进一步确定。
  • open|filtered:端口是开放的或被屏蔽。
  • closed|filtered :端口是关闭的或被屏蔽。

版本侦测

  用于确定目标主机开放端口上运行的具体的应用程序及版本信息。

原理:

简要的介绍版本的侦测原理。版本侦测主要分为以下几个步骤:
  首先检查open与open|filtered状态的端口是否在排除端口列表内。如果在排除列表,将该端口剔除。
如果是TCP端口,尝试建立TCP连接。尝试等待片刻(通常6秒或更多,具体时间可以查询文件nmap-services-probes中Probe TCP NULL q||对应的totalwaitms)。通常在等待时间内,会接收到目标机发送的“WelcomeBanner”信息。nmap将接收到的Banner与nmap-services-probes中NULL probe中的签名进行对比。查找对应应用程序的名字与版本信息。
如果通过“Welcome Banner”无法确定应用程序版本,那么nmap再尝试发送其他的探测包(即从nmap-services-probes中挑选合适的probe),将probe得到回复包与数据库中的签名进行对比。如果反复探测都无法得出具体应用,那么打印出应用返回报文,让用户自行进一步判定。
如果是UDP端口,那么直接使用nmap-services-probes中探测包进行探测匹配。根据结果对比分析出UDP应用服务类型。
如果探测到应用程序是SSL,那么调用openSSL进一步的侦查运行在SSL之上的具体的应用类型。
如果探测到应用程序是SunRPC,那么调用brute-force RPC grinder进一步探测具体服务。

Nmap提供的版本侦测具有如下的优点:

  • 高速。并行地进行套接字操作,实现一组高效的探测匹配定义语法。
  • 尽可能地确定应用名字与版本名字。
  • 支持TCP/UDP协议,支持文本格式与二进制格式。
  • 支持多种平台服务的侦测,包括Linux/Windows/Mac OS/FreeBSD等系统。
  • 如果检测到SSL,会调用openSSL继续侦测运行在SSL上的具体协议(如HTTPS/POP3S/IMAPS)。
  • 如果检测到SunRPC服务,那么会调用brute-force RPC grinder进一步确定RPC程序编号、名字、版本号。
  • 支持完整的IPv6功能,包括TCP/UDP,基于TCP的SSL。
  • 通用平台枚举功能(CPE)
  • 广泛的应用程序数据库(nmap-services-probes)。目前Nmap可以识别几千种服务的签名,包含了180多种不同的协议。

OS侦测

  操作系统侦测用于检测目标主机运行的操作系统类型及设备类型等信息。Nmap拥有丰富的系统数据库nmap-os-db,目前可以识别2600多种操作系统与设备类型。

OS侦测原理:

  Nmap使用TCP/IP协议栈指纹来识别不同的操作系统和设备。在RFC规范中,有些地方对TCP/IP的实现并没有强制规定,由此不同的TCP/IP方案中可能都有自己的特定方式。Nmap主要是根据这些细节上的差异来判断操作系统的类型的。

  具体实现方式如下:

  Nmap内部包含了2600多已知系统的指纹特征(在文件nmap-os-db文件中)。将此指纹数据库作为进行指纹对比的样本库。
分别挑选一个open和closed的端口,向其发送经过精心设计的TCP/UDP/ICMP数据包,根据返回的数据包生成一份系统指纹。
将探测生成的指纹与nmap-os-db中指纹进行对比,查找匹配的系统。如果无法匹配,以概率形式列举出可能的系统。

masscan

优势

  masscan使用的是无状态扫描的方法。TCP连接是有状态的,需要对SYN-ACK包进行seq number的校验这个等待连接的过程需要在缓冲区占用很大的资源,因此限制了扫描的速度。masscan无状态的扫描则是masscan与目标主机不建立完整的TCP连接,扫描者主机先向目标主机发送一个SYN请求连接数据包,目标主机会向扫描者主机回复一个SYN/ACK确认连接数据包,当扫描者主机收到目标主机发送回来的SYN/ACK确认连接数据包之后,扫描者主机向目标主机发送RST结束连接(选项–banners除外(因为要获取banner信息,必须要进行完整的三次握手))。即masscan不建立完整的TCP连接,收到SYN/ACK之后,发送RST结束连接(选项--banners除外)。masscan采用异步的方式批量的把数据包发出去,然后记录有回应的IP。因此,效率上得以大幅提高。

特点:

  • 允许自定义任意的地址范围和端口范围;
  • 设置黑白名单;
  • 设置扫描速率;
  • 指定发包的源IP地址、源端口和源MAC地址进行伪装。
  • 结果输出支持xml、binary、JSON、list等多种格式。
  • 为了配合用户的各种扫描需求,Masscan提供了重试次数、UA字段值、发出数据包的TTL值、发包后的等待时间等扫描设置。
  • Banner获取直接在扫描命令里使用—banners即可。

无状态扫描的原理

TCP协议中三次握手的前两次

客户端在向服务器第一次握手时,会组建一个数据包,设置syn标志位,同时生成一个数字填充seq序号字段。
服务端收到数据包,检测到了标志位的syn标志,知道这是客户端发来的建立连接的请求包,服务端会回复一个数据包,同时设置syn和ack标志位,服务器随机生成一个数字填充到seq字段。并将客户端发送的seq数据包+1填充到ack确认号上。
在收到syn和ack后,我们返回一个rst来结束这个连接,如图所示

参考文献:

https://www.cnblogs.com/huyangshu-fs/p/13324701.html
https://www.freebuf.com/sectool/119340.html