banner
soapffz

soapffz

github
steam
bilibili
douban

信息收集-端口扫描及服务识别

端口扫描及服务识别#

这部分重点介绍nmap常见参数搭配用法,这也是我一直想弄懂的,借写文章的机会来梳理一下

这篇文章先介绍在已知主机的情况下对主机进行端口扫描,最后补充下前面文章遗留的问题:

nmap zmap massca对 C 段进行扫描

御剑高速 TCP 全端口扫描工具#

属于纯端口扫描工具

工具主要针对一段 IP 段内的详细全端口检测,下载地址就不提供了很好搜,用软件扫一下我网站的真实 ip 看下结果:

image

还是有一些端口扫描不到,不过速度还是非常快的

censys.io#

这是一个在线服务器扫描网站,能扫描网站的服务器信息,暂且把它归为端口扫描工具:

image

扫描速度还是很快的,而且识别出了我用的是腾讯云的 CDN,扫描出了服务器的真实 ip 以及三个端口 (虽然还是没扫全),值得推荐!

nmap#

如果是自己去网上找 nmap 用法,由于每个师傅的用法不同以及 nmap 版本更新中的参数作用变化等原因

你可能会在不同的师傅那看到某个参数不同的解释和用法 (踩坑的人对自己踩过的坑总是显得尤为在意)

所以,直接查看官方文档:https://nmap.org/book/man.html

虽然官方中文文档也有,但是它是根据Nmap4.5.0版本来介绍的,而截至写文章时Nmap的版本是7.70

故要看最新的用法还是用谷歌浏览器翻译英文文档看好了

nmap 安装及配置#

Linux比如Kali中是自带的,就不说了,我们这里下载的是Window下的便捷版:

image

下载完我们先配置一下环境变量,就不用每次进到nmap的目录打开命令行了:

image

nmap 参数解释#

nmap有六种常用的端口状态:

Open 表示目标计算机上的应用程序正在侦听该端口上的连接/数据包。
Closed 端口没有应用程序监听它们。
Filtered 意味着防火墙,过滤器,或其他网络障碍物阻塞的端口,使得Nmap不能确定是open或closed。
unfiltered 当端口响应Nmap的探测器时,Nmap无法确定它们是打开还是关闭。
open|filtered、closed|filtered nmap不能确定端口处于这两种状态中的哪种状态

以下为官方文档翻译过来的参数,我将一部分一部分做讲解

参考文章:

选择目标:

可以传递主机名,IP地址,网络等。
例如:scanme.nmap.org,microsoft.com / 24,192.168.0.1; 10.0.0-255.1-254
-iL <inputfilename>:从主机/网络列表输入
-iR <num hosts>:选择随机目标
--exclude <host1 [,host2] [,host3],...>:排除主机/网络
--excludefile <exclude_file>:从文件中排除列表

这个就很简单了:

  • 扫描网站:nmap soapffz.com
  • 扫描内网网段:nmap 192.168.2.0/24或者nmap 192.168.2.3-5

选择目标这里的参数基本都用不到

主机发现:

-sL 列表扫描,仅将指定的目标IP列举出来,不进行主机发现
-sn 和 -sP一样,只利用ping扫描进行主机发现,不扫描目标主机的端口
-Pn 将所有指定的主机视为已开启状态,跳过主机发现过程
-PS TCP SYN ping,发送一个设置了SYN标志位的空TCP报文,默认端口为80,也可指定端口
-PA TCP ACK ping,发送一个设置了ACK标志位的空TCP报文,默认端口为80,也可指定端口
-PU UDP ping,发送一个空的UDP报文到指定端口,可穿透只过滤TCP的防火墙
-PR 使用ARP ping
-n/-R -n不用域名解析,加速扫描,-R为目标IP做反向域名解析,扫描较慢一些
-dns-servers 自定义域名解析服务器地址
--system-dns:使用OS的DNS解析器
-traceroute 目标主机路由追踪

-sn-Pn是对立的,前者使用ping扫描,禁用端口扫描,后者禁用ping扫描,为什么会有这两个选项呢?

因为如果主机屏蔽了 ping 请求,Nmap 可能会认为该主机没有开机。这将使得 Nmap 无法进行进一 步检测,比如端口扫描、服务版本识别和操作系统识别等探测工作。为了克服这一问题,就需要禁用 Nmap 的主机检测功能。在指定这个选项之后,Nmap 会认为目标主机已经开机并会进行全套的检测工作,所以,一般来说在这两个选项之前我们更倾向于使用后者

一般建议使用-Pn选项

另外域名解析会浪费一部分时间,虽然默认是有时会解析域名,但是我建议设置为-n从不进行DNS解析以节约解析时间。

扫描方法:

-sS / sT / sA / sW / sM:TCP SYN / Connect()/ ACK / Window / Maimon扫描

-sS TCP 同步扫描 (TCP SYN),因为不必全部打开一个 TCP 连接,所以这项技术通常称为半开扫描 (half-open)。这项技术最大的好处是,很少有系统能够把这记入系统日志。不过,你需要 root 权限来定制 SYN 数据包(Windows即为管理员权限)。
-sT TCP connect() 扫描,建立TCP的三次握手连接来进行信息的传递。这种扫描很容易被检测到,在目标主机的日志中会记录大批的连接请求以及错误信息。一般不建议使用。
-sA ACK 扫描,原理是发送一个ACK包给目标主机,不论目标主机的端口是否开启,都会返回相应的RST包,通过判断RST包中的TTL来判断端口是否开启,TTL值小于64端口开启,大于64端口关闭。这项高级的扫描方法通常可以用来穿过防火墙。
-sW 滑动窗口扫描,非常类似于 ACK 的扫描。
-sM 探测报文是 FIN/ACK。 根据 RFC 793 (TCP) ,无论端口开放或者关闭,都应该对这样的探测响应 RST 报文。 然而,Uriel 注意到如果端口开放,许多基于 BSD 的系统只是丢弃该探测报文。

-sU:UDP扫描,唯一的UDP扫描方式。

虽然UDP扫描结果没有 TCP扫描结果的可靠度高,但渗透测试人员不能因此而轻视UDP扫描,毕竟UDP端口代表着可能会有价值的服务端程序。但是UDP扫描的最大问题是性能问题。由干Linux内核限制1秒内最多发送一次ICMP Port Unreachable信息。按照这个速度,对一台主机的65536个UDP端口进行完整扫描,总耗时必定会超过18个小时。
优化方法主要是:
1.进行并发的UDP扫描;
2.优先扫描常用端口;
3.在防火墙后面扫描;
4.启用--host-timeout选项以跳过响应过慢的主机。
假如我们需要找到目标主机开放了哪些 UDP端口。为提高扫描速度,我们仅扫描53端口(DNS)和161端口(SNMP)。
可以使用命令nmap -sU 192.168.56.103 -p 53,161

-sN / sF / sX:TCP Null,FIN和Xmas扫描

NULL 扫描不设置任何控制位; FIN扫描仅设置FIN标志位:XMAS扫描设置FIN、PSH和URG的标识位。如果目标主机返回了含有RST标识位的响应数据,则说明该端口处于关闭状态;如果目标主机没有任何回应,则该端口处于打开|过滤状态。

NULL扫描是一种反向的扫描方法,通过发送一个没有任何标志位的数据包给服务器,然后等待服务器的返回内容。这种扫描的方法比前面提及的扫描方法要隐蔽很多,但是这种方法的准确度也是较低的, 主要的用途是用来判断操作系统是否为windows,因为windows不遵守RFC 793标准,不论端口是开启还是关闭的都返回RST包

但是虽然NULL具有这样的一些用处,但是NULL也有如下缺点
1、NULL方法的精确度不高,端口的状态返回的不是很准确
2、要获取目标主机的运行系统,可以使用参数(-O),来获取对于一些操作系统无法准确判断的,可以加上参数(-osscan-guess)
3、NULL扫描易被过滤

--scanflags <flags>:自定义TCP扫描标志
-sI <zombie host [:probeport]>:空闲扫描

采用-sI选项后,将通过指定的僵尸主机发送扫描数据包。本机并不与目标主机直接通信。如果对方网络里有IDS,IDS将认为发起扫描的主机是僵尸主机。

-sY / sZ:SCTP INIT / COOKIE-ECHO扫描

SCTP INIT 扫描类似 TCP SYN 扫描,他也是打开一个半开的连接,而不是建立一个完整的 SCTP 关联。如果目标端口回复一个 INIT-ACK 数据包,则说明端口是开放的,如果回复一个 ABORT 数据包,端口是关闭的,如果没有回复,端口会被标记标记为被过滤,当然如果收到了 ICMP 不可达的消息( type 3, code 0, 1, 2, 3, 9, 10, or 13 )也会被标记为被过滤。
如果目标端口开放,则会丢弃之前没有发起关联请求的 SCTP COOKIE ECHO 数据包,如果端口是关闭的则会返回一个 SCTP ABORT 数据包。所以这个扫描技术,无法分辨过滤和开放,只能分辨出关闭的端口。

-sO:IP协议扫描
-b <FTP中继主机>:FTP反弹扫描

从参数解释中我们可以看出-sT选项是默认的也是最不推荐的,一般我们使用半开扫描-sS

当发现可能有防火墙时,我们可以使用-sA-sW选项来尝试绕过防火墙扫描。

另外,我们也可以使用-sUUDP 扫描方式来探测常见的 UDP 端口,可能会有意外收获。

扫描端口及扫描端口的方式:

-p <端口范围>:仅扫描指定的端口
例如:-p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9
--exclude-ports <端口范围>:从扫描中排除指定的端口
-F:快速模式 - 扫描比默认扫描更少的端口,一般来说只扫描100个常用端口
-r:连续扫描端口,从小到大扫描端口
--top-ports <number>:扫描<number>最常见的端口,比如扫描最常见的300个端口:--top-ports 300
--port-ratio <ratio>:扫描端口比<ratio>更常见

个人建议,在快速概览主机端口的时候使用选项--top-ports 1000

当你想要完整的扫描报告的时候,还是需要所有端口都扫一遍-p1-65535

服务 / 版本检测:

-sV:探测开放端口以确定服务/版本信息

由于不是所有的 Nmap 侦测都会得到反馈,需要对侦测的强度进行设定,在服务侦测中有三个等级。
等级越高,侦测过程中的尝试次数越多,识别服务的可能性就会越大。

--version-intensity <level>:从0(亮)到9(尝试所有探针)设置
--version-light:限制最可能的探针(强度2)
--version-all:尝试每一个探针(强度9)

--version-trace:显示详细的版本扫描活动(用于调试)

-sV建议使用,但是后面的-A 选项的功能中包含这个功能

脚本扫描:

-sC:相当于--script = default
--script = <Lua scripts>:<Lua scripts>是逗号分隔的列表
目录,脚本文件或脚本类别
--script-args = <n1 = v1,[n2 = v2,...]>:为脚本提供参数
--script-args-file = filename:在文件中提供NSE脚本args
--script-trace:显示发送和接收的所有数据
--script-updatedb:更新脚本数据库。
--script-help = <Lua scripts>:显示有关脚本的帮助。
<Lua scripts>是以逗号分隔的脚本文件列表或脚本的类别。

-sC建议使用,但是后面的-A 选项的功能中包含这个功能

操作系统检测:

-O:启用OS检测
--osscan-limit:将OS检测限制为有希望的目标
--osscan-guess:更积极地猜测操作系统

这里的--osscan-guess可能会在你想知道对方的主机系统时派上用场。

时间和性能:

采用<time>的选项以秒为单位,或追加'ms'(毫秒),
该值的's'(秒),'m'(分钟)或'h'(小时)(例如30m)。
-T <0-5>:设置时序模板(越高越快)

paranoid(0):扫描周期为5分钟,且不会以并行方式同时发送多组数据。这种模式 的扫描不会被IDS检测到。
sneaky(1):扫描周期为15秒,且不会以并行方式同时发送多组数据。
polite(2):扫描周期为0.4秒,且不会以并行方式同时发送多组数据。
normal(3):此模式同时向多个目标发送多个数据包,为	Nmap默认的模式,该模式能自动在扫描时间和网络负载之间进行平衡。
aggressive(4):在这种模式下,Nmap对每个既定的主机只扫描5分钟,然后扫描下一台主机。它等待响应的时间不超过1.25秒。
insane(5):在这种模式下,Nmap对每个既定的主机仅扫描75秒,然后扫描下一台主机。它等待响应的时间不超过0.3秒。
快的扫描也是有缺点的,扫描的周期过快,会很容易被防火墙和IDS发现并记录
因为防火墙大多数会将端口周期过段识别为扫描从而屏蔽掉

--min-hostgroup / max-hostgroup <size>:并行主机扫描组大小
--min-parallelism / max-parallelism <numprobes>:探测并行化
--min-rtt-timeout / max-rtt-timeout / initial-rtt-timeout <time>:指定探测往返时间。
--max-retries <tries>:端口扫描探测重传的上限数量。
--host-timeout <time>:在此之后放弃目标
--scan-delay /  -  max-scan-delay <time>:调整探针之间的延迟
--min-rate <number>:发送数据包的速度不低于每秒<number>
--max-rate <number>:发送数据包的速度不超过<number>每秒

时间和性能这里,一般用不到指定并行数量和发包速度这么详细。

时序模板默认为-T3,也就是normal不做任何优化

防火墙 / IDS 逃脱和防御:

-f; --mtu <val>:分段数据包(可选择w /给定MTU),这个选项可避免对方识别出我们探测的数据包。

指定这个选项之后, Nmap将使用8字节甚至更小数据体的数据包。

-D <decoy1,decoy2 [,ME],...>:用诱饵披露扫描,这个选项应指定假IP,即诱饵的IP。

启用这个选项之后,Nmap在发送侦测数据包的时候会掺杂一些源地址是假IP(诱饵)的数据包。这种功能意在以藏木于林的方法掩盖本机的真实IP。也就是说,对方的log还会记录下本机的真实IP。您可使用RND生成随机的假IP地址,或者用RND:number的参数生成<number>个假IP地址。您所指定的诱饵主机应当在线,否则很容易击溃目标主机。另外,使用了过多的诱饵可能造成网络拥堵。尤其是在扫描客户的网络的时候,您应当极力避免上述情况。

-S <IP_Address>:欺骗源地址

源地址欺骗的原理是:通过将自己的IP伪装成为其他的IP去扫描目标主机从而骗过目标主机的追踪
假设要伪装成为1.1.1.1:参数-S 1.1.1.1 使用1.1.1.1进行扫描,让防火墙误以为是来自1.1.1.1的扫描行为
在使用的时候要注意与-e进行使用,因为除了制定要伪装成为的对象IP外,还要指定返回的IP地址

-e <iface>:使用指定的接口
-g /  -  source-port <portnum>:使用给定的端口号
--proxies <url1,[url2],...>:通过HTTP / SOCKS4代理的中继连接
--data <hex string>:为发送的数据包附加自定义有效负载
--data-string <string>:为发送的数据包附加自定义ASCII字符串
--data-length <num>:将随机数据附加到已发送的数据包
--ip-options <options>:发送带有指定ip选项的数据包
--ttl <val>:设置IP生存时间字段
--spoof-mac <mac address / prefix / vendor name>:欺骗你的MAC地址
--badsum:使用伪TCP / UDP / SCTP校验和发送数据包

当你已经探测到可能有防火墙时,可以使用-F选项来减小探测包的大小,从而绕过防火墙。

-D选项构造虚假 ip 也是经常被用到的,RND生成随机假的IP地址这个选项不建议使用,因为如果生成的 ip 对应的诱饵主机是关闭的或者不存在的,那么就不可能发送扫描的命令给目标主机,容易造成目标主机崩溃

建议直接使用ping某个网站的 ip (禁止ping的网站除外),使用网站的ip作为诱饵主机

使用Me代表自己的真实地址,比如同时使用soapffz.com网站ip和我电脑真实ip一起快速扫描nmap.org

nmap -F -D 140.143.2.176,ME nmap.org

输出报告:

-oN / -oX / -oS / -oG <file>:正常输出扫描,XML,s | <rIpt kIddi3,和Grepable格式,分别为给定的文件名。
-oA <basename>:一次输出三种主要格式

-oN:正常输出,不显示runtime信息和警告信息。
-oX:生成的XML格式文件可以转换成HTML格式文件,还可被Nmap的图形用户界面解析,也便于导入数据库。
所以建议将结果都保存为XML文件。
-oS:输出类似于交互工具输出
-oG:生成便于Grep使用的文件,虽然这种文件格式已经过时,但仍然很受欢迎。这种格式的文件,其内容由注释(由#开始)和信息行组成。信息行包含6个字段,每个字段的字段 名称和字段值以冒号分割,字段之间使用制表符隔开。这些字段的名称分别为Host、Ports、Protocols、Ignored State、OS、Seq Index、IP ID Seq 和Status。这种格式的文件便于grep或awk之类的UNIX指令整理扫描结果。
为使用方便,利用-oA选项可将扫描结果以标准格式、XML格式和Grep格式一次性输出。分别存放在.nmap,.xml和.gnmap文件中。

-v:增加详细级别(使用-vv或更高级别以获得更好的效果)
-d:提高调试级别(使用-dd或更多以获得更好的效果)
--reason:显示端口处于特定状态的原因
--open:仅显示打开(或可能打开)的端口,这个很推荐使用。
--packet-trace:显示发送和接收的所有数据包
--iflist:打印主机接口和路由(用于调试)
--append-output:附加到而不是clobber指定的输出文件
--resume <filename>:恢复中止扫描
--stylesheet <path / URL>:用于将XML输出转换为HTML的XSL样式表
--webxml:来自Nmap.Org的参考样式表,用于更多可移植的XML
--no-stylesheet:防止与XML输出相关联的XSL样式表

建议使用-open -vv选项来输出详细信息并且只包含打开或可能打开的端口

报告输出建议使用-oX生成.XML的报告,或者直接-oA选项一次输出.nmap .xml .gnmap三种报告

杂项:

-6:启用IPv6扫描
-A:启用操作系统检测,版本检测,脚本扫描和跟踪路由
--datadir <dirname>:指定自定义Nmap数据文件位置
--send-eth /  -  send-ip:使用原始以太网帧或IP数据包发送
--privileged:假设用户具有完全特权
--unprivileged:假设用户缺少原始套接字权限
-V:打印版本号
-h:打印此帮助摘要页面。

当你使用-A选项时,相当于同时使用了以下四个命令:

服务版本识别(-sV)
操作系统识别(-O);
脚本扫描(-sC);
Traceroute(–traceroute)。

至于NSE脚本的漏洞探测脚本部分本篇不做介绍,因为本篇是针对端口和服务的扫描,漏洞的扫描将在下篇漏洞扫描器中讲到。

nmap 常用扫描#

** 在 nmap 运行的时候,如果我们可以像其他编程一样打 “断点”,直接按键盘的 d 键就行了,如果想知道运行的进度可以按下 X 键 **

我们用上面所学到的参数来扫描以下我的网站 (假设已绕过 CDN 获得了真实 ip,因为扫描 CDN 节点没有意义)

最终期望的结果是:

通过一条命令获得所有开放的端口,猜测端口上开启的服务,猜测服务器版本信息并尽可能地节省时间

是的,我打我自己.jpg

先尝试下默认的-sT扫描方式,快速扫描 100 个常见端口并打印详细信息:

nmap -sT -F -vv 140.143.2.176

image

1. 从结果中可以看到使用了ping消耗了 1.05s,DNS查询消耗了 3.86s 2. 我是直接扫描ip的你要查询DNS干啥,扫描的方式是完整的一次TCP三次握手

接下来尝试下禁ping,使用TCP同步扫描,也就是半开扫描,使用更快的扫描速度,尝试获取每个端口的服务及版本信息,扫描常见 1000 个端口,禁止使用DNS查询:

nmap -vv -Pn -sS -T4 -sV --top-ports 1000 -n 140.143.2.176

image

1. 可以看到扫描的方式变为了SYN Stealth Scan即 SYN 秘密扫描 2. 在增加了扫描的端口数量后,我们比上一次多扫出了一个888端口 3. 另外加了-sV选项之后扫描报告中多了一列VERSION,也就是服务的版本

耗费的时间只增加了一点点,但是扫描的结果比上一次更加全面了

我们在刚才的基础上使用-sAACK 扫描方式,使用更快速的方式,扫描所有端口,并且尽可能地探测操作系统:

nmap -vv -Pn -sA -T5 -sV -p1-65535 -O --osscan-guess -n 140.143.2.176

image

可以看到在相同情况下-sA选项比-sS更耗费时间

所以一般只有在对方存在防火墙想要绕过时才建议使用-sA选项,平时使用-sS足够

sA/sW/sM这三种探测方式消耗的时间排序:sM > sW > sA

另外三种扫描方式sN/sF/sX暂时没用到,后面用到再做介绍

最后给出能目前我知道的能扫描出所有端口及详细信息,最节省时间的nmap命令:

nmap -v -Pn -sS -T5 -sV -p1-13000 --version-light -O --osscan-guess -n 140.143.2.176

效果如下 (为了节省时间我只扫描前 13000 个端口):

image

image

果然我的12315端口不在常用端口里面,直到我指定范围才扫描出来

操作系统猜测最有可能为Linux4.4Linux4.0,实际上是3.10

image

但是这条命令还不是完美的,因为我指定了范围,我希望能以最快的速度扫描所有端口

但是即使是-sS也不太给力,从上面这两个例子我们可以看出nmap对全端口扫描并不在行

可以和后面介绍的无状态端口扫描器Masscan配合起来使用,实现 “精准制导”。

zmap#

ZMap 是一个开源网络扫描工具,可以帮助研究人员快速的进行全网检测。只需要一台机器和足够上行网络速度,就可以以达到千兆以太网的理论值速度并在 45 分钟内扫描全网络 IPv4 地址。

它是由我们前面介绍的censys.io的站长开发的工具。

GitHub 地址:

zmap不支持 Windows,我们这里使用一台Ubuntu Desktop 18.04.1 LTS来安装和使用zmap

执行:sudo apt install zmap -y 即可完成安装

常用参数如下:

-p, –target-port=port:需要扫描的TCP 端口号 (比如443)
-o, –output-file=name:将扫描结果输出到文件
-b, –blacklist-file=path:黑名单文件,即排除在扫描范围外的地址。在conf/blacklist.example文件中有实例,每同一行写一个网段,比如192.168.0.0/16。
-n, –max-targets=n,检测的上限范围,可以是一个数字如-n 10000,也可以是扫描地址空间中的百分比
-N, –max-results=n:接收到一定数量的结果后退出扫描
-t, –max-runtime=secs:最大扫描(发包)时间
-r, –rate=pps:设置发包速率(packets/sec)
-B, –bandwidth=bps:设置发包带宽(bits/second
-c, –cooldown-time=secs:接受返回的时间(default=8)
-T, –sender-threads=n:发包的线程数 (默认为1):-P, –probes=n
送达每个IP的探测器数量(默认为1):网络选项
-s, –source-port=port|range:发包的源端口(s)
-S, –source-ip=ip|range:发包的源IP,也可以是IP地址段
-G, –gateway-mac=addr:发包的网关MAC地址
-i, –interface=name:网络端口
–list-probe-modules:列出可用的探测器模块
-M, –probe-module=name:选择探测器模块 (默认为tcp_synscan)
–probe-args=args:设置探测器模块的参数
–list-output-fields:列出所选择的探测器模块
输出选项:ZMap 允许用户定义和编写自己的输出模块。输出模块负责处理探测器模块的返回结果并且展示给用户。
–list-output-modules:列出所有输出模块
-O, –output-module=name:设置输出模块
–output-args=args:设置输出模块的参数
-f, –output-fields=fields
列出所选择的输出模块:–output-filter
输出模块过滤器:附加选项
-C, –config=filename:读一个配置文件,其中可以包含特殊的选项
-q, –quiet:安静模式
-g, –summary:在扫描结束后,打印配置和结果汇总
-v, –verbosity=n:log的等级 (0-5, 默认为3)
-h, –help:显示帮助
-V, –version:打印版本

虽然zmap-p选项是指定端口,但是不能用1-65535这样的参数

zmap的用途更多的偏向于扫描指定范围内主机的某个指定端口是否开放,比如:

zmap -p 80 1.2.3.4 10.0.0.3:扫描1.2.3.4,10.0.0.3这两个ip的80端口
zmap -p 80 10.0.0.0/8 192.168.0.0/16:扫描扫描两个子网的80端口
zmap -p 80:在Internet上查找tcp/ 80上的主机并输出到stdout
zmap -N 5 -B 10M -p 80:找到5个HTTP服务器,以10 Mb/s扫描

使用zmap扫描临时获得baidu.com的 C 段:123.125.114.1/24 的8080端口:

image

基本 1s 就能扫完,但是这与本文扫描指定主机的所有端口目标不太符合,这里就不再继续介绍

Masscan#

Masscan 号称是最快的互联网端口扫描器,最快可以在六分钟内扫遍互联网。

masscan虽然能在Windows下使用,但是要配置MinGW等编译环境,所以在此做演示我们也使用Ubuntu环境

安装方式:

sudo apt-get install git gcc make libpcap-dev -y
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make

如果需要在任何位置使用masscan命令的话,执行:

cd ~
cp masscan/bin/masscan /bin

masscan常用选项:

-p               指定要扫描的端口,同时指定多个端口要用逗号隔开
--rate           指定发包速率,根据你自己的实际带宽来定,我自己是20M的光纤,一般给1000足矣,一两兆的vpn,给100就差不多了,都是粗略估计的,懒的算
--open-only      仅显示开放的端口
--banners        获取banners
-c               使用自定义的扫描配置文件
--ping           扫之前是否要先ping下目标
-oL              把扫描结果存到指定文件中
--excludefile    排除不扫描的ip段

先介绍下本文的原本目标,扫描指定 ip 的所有端口:

masscan -p1-65535 140.143.2.176

使用这条命令的话速度比nmap-sS还要慢一大截,这是因为默认情况下,

Masscan 扫描速度为每秒 100 个数据包,这是相当慢的。

你也可以使用--rate选项并指定一个值,我们比较下使用默认 100 发包速度和加快发包速率的结果:

masscan -p1-65535 140.143.2.176 --rate 1000 > 1.txt
masscan -p1-65535 140.143.2.176 > 2.txt

image

image

由此可见发包个数与扫描出来的端口数量成反比

其他的参数,保存,加载配置什么的,都没什么的好说的,核心就是直接指定端口扫就行了。

端口扫描及服务识别总结#

如果只是简单的扫描以下常见的端口,用御剑高速 TCP 全端口扫描工具或者censys.io已经完全足够

当然,有条件的话还是非常建议直接使用nmap,对上面的参数解释和用法最后归结为以下几条:

默认的扫描方式-sT不推荐,建议使用-sS选项
默认时-T3级别,日常扫描可以使用-T4
-A选项扫描太多东西了,一般使用-sV和-O --osscan-guess即可
端口扫描时

另外nmap还有很多用法比如主机探测部分我没有一一比较,后面我用到的时候会回来更新这篇文章。

当然,nmap-sS扫描常用端口及猜测端口对应的服务信息配合上masscan不改变速率的全端口扫描

基本上就能满足这篇文章的初衷 - 扫描指定服务器的所有端口及信息了。

本文完。

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.