网络安全(一):信息收集之玩转nmap(理论篇)
nmap
nmap(Network Mapper)是免费、开源的网络发现和安全审计工具,通常我们用于收集网络中的比如主机和端口等信息,从而为下一步的攻击提供突破口,制定攻击的计划。也可为网络管理员使用,从而针对性修复可能暴露的安全漏洞。
具体的功能介绍可以登录官网https://nmap.org,来获取软件包和官方教程。
- 当我们下载好nmap后在命令行中会多出这些命令:
- nmap,集成了:
- 主机发现(Host Discovery)
- 端口扫描(Port Scanning)
- 版本侦测(Version Detection)
- 操作系统侦测(Operating System Detection)
- zenmap,zenmap为nmap的图像化版本。
- ncat,可进行灵活的数据传输,重定向。
- ndiff,对比扫描结果的工具。
- nping,包生成和响应工具。
图1.Windows查看nmap提供的可执行文件
nmap命令
nmap发现的原理无非就是,发送数据包到目标主机,依据响应报文来识别已经开放的端口等信息等,属于主动攻击。
- nmap的命令基本上可以分为有“三要素”,其中扫描的目标是必选的。扫描类型默认使用-sT。
-
nmap
[<扫描类型>
...] [<选项>
] {<扫描目标说明>
}
-
- 可以使用-h参数或者无参数,以输出帮助信息。
- 一下介绍的主机发现、端口扫描的方式都可以排列组合来使用。
下面的篇幅较长,如果是忘记了命令,可以只看这部分即可,我在这里翻译了nmap -h原文,并做了小总结。时间宝贵,头发也宝贵呢。
Nmap 7.93 (https://nmap.org)
用法:nmap [扫描类型] [选项] {要扫描的目标}
扫描的目标:
可以是 主机名、IP 地址、网络等。
#(可以使用逗号,指定不连续的ip段 减号-指定连续ip段 斜杠/指定掩码 星号*代表全部)
例如:scanme.nmap.org、microsoft.com/24、192.168.0.1; 10.0.0-255.1-254
-iL <inputfilename>: 从文件中读取要扫描的主机列表
-iR <主机数量>: 选择随机目标 #0为无限生成
--exclude <host1[,host2][,host3],...>:要排除的 主机/网络
--excludefile <exclude_file>: 从文件中选择要排除的主机列表
主机发现:
-sL: 列表扫描 - 打印主机的列表(对域名进行扫描时,可以得到IP列表 )
-sn: Ping 扫描,同时禁用端口扫描,用来检查主机存活状态。
-Pn: 禁用 Ping 扫描,默认所有主机都是存活状态
-PS/PA/PU/PY[端口列表]:对指定的端口通过 TCP SYN/ACK、UDP 或 SCTP 扫描来发现主机
-PE/PP/PM: 对指定的端口通过 ICMP、时间戳和网络掩码请求发现和探测主机
-PO[协议列表]: IP 协议 Ping
-n/-R: 不进行DNS解析/ 进行DNS解析 [默认]
--dns-servers <serv1[,serv2],...>: 指定自定义 DNS 服务器
--system-dns: 使用操作系统的 DNS 解析器
--traceroute: 跟踪每个主机的跃点路径
扫描技术:
-sS/sT/sA/sW/sM: TCP SYN / Connect() / ACK / Window / Maimon 扫描
-sU: UDP 扫描
-sN/sF/sX: TCP Null、FIN 和 Xmas 扫描
--scanflags <flags>: 自定义 TCP 扫描标志
-sI <僵尸主机[:僵尸端口]>: 空闲扫描
-sY/sZ: SCTP INIT/COOKIE-ECHO 扫描
-sO: IP 协议扫描
-b <FTP 中继主机>: FTP 反弹扫描
指定扫描端口、扫描顺序:
-p <端口范围>:只扫描指定的端口
例如:-p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9
--exclude-ports <端口范围>: 从扫描中排除指定端口
-F: 快速模式。 扫描比默认扫描更少的端口
-r: 连续扫描端口。不要随机化,即按顺序扫描端口
--top-ports <number>: 扫描<number>个最常用的端口
--port-ratio <ratio>: 扫描比<ratio>更常见的端口
服务/版本检测:
-sV: 探测开放端口以确定服务/版本信息
--version-intensity <level>:设置从 0(轻)到 9(尝试所有探针)
--version-light: 限制最可能的探测(强度 2)
--version-all: 尝试每一个探测(强度 9)
--version-trace: 显示详细的版本扫描活动(用于调试)
脚本扫描:
-sC: 相当于--script=default
--script=<Lua scripts>: 使用脚本进行扫描,多个脚本时用逗号分隔,支持通配符。
--script-args=<n1=v1,[n2=v2,...]>: 为脚本提供参数
--script-args-file=filename: 从文件中提供 NSE 脚本参数
--script-trace: 显示所有发送和接收的数据
--script-updatedb: 更新脚本数据库。
--script-help=<Lua 脚本>: 显示有关脚本的帮助。
操作系统检测:
-O: 启用操作系统检测
--osscan-limit: 将操作系统检测限制为有希望的目标
--osscan-guess: 更积极地猜测操作系统
时间和性能:
默认是秒,也可以 “ms”(毫秒),'s'(秒)、'm'(分钟)或 'h'(小时)到值(例如 30m)。
-T<0-5>: 设置时序模板(越高扫描速度越快,但是准确性降低)
--min-hostgroup/max-hostgroup <size>: 并行主机扫描组大小
--min-parallelism/max-parallelism <numrobes>:探针并行化
--min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <时间>: 指定探测往返时间。
--max-retries <tries>: 限制端口扫描探测重传的次数。
--host-timeout <time>: 多长时间后放弃目标
--scan-delay/--max-scan-delay <time>:调整探针之间的延迟
--min-rate <number>: 每秒发送数据包不低于 <number>
--max-rate <number>: 每秒发送数据包的速度不超过 <number>
防火墙/IDS 逃避和欺骗:
-f; --mtu <val>: 分片数据包(可选地 w/给定的 MTU)
-D <诱饵IP1,诱饵IP2[,本机IP],...>:使用诱饵隐藏扫描。即发送参杂着假ip的数据包检测
-S <IP 地址>: 欺骗源地址。就是伪造源主机IP地址。
-e <网络接口>: 指定从哪个网卡发送和接收数据包。
-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地址/前缀/供应商名称>: 欺骗你的MAC地址
--badsum: 发送带有虚假 TCP/UDP/SCTP 校验和的数据包
输出:
-oN/-oX/-oS/-oG <file>: 扫描结果写入到文件。
正常,XML,s|<rIpt kIddi3,Grepable 格式,
-oA <basename>: 一次输出三种主要格式
-v: 增加详细程度(使用 -vv 或更多以获得更好的效果)
-d: 增加调试级别(使用 -dd 或更多以获得更好的效果)
--reason: 显示端口处于特定状态的原因
--open: 仅显示打开(或可能打开)的端口
--packet-trace: 显示所有发送和接收的数据包
--iflist: 打印主机接口和路由(用于调试)
--append-output: 附加到而不是破坏指定的输出文件
--resume <文件名>: 恢复中止的扫描
--noninteractive: 通过键盘禁用运行时交互
--stylesheet <path/URL>:将 XML 输出转换为 HTML 的 XSL 样式表
--webxml: 参考 Nmap.Org 的样式表以获得更便携的 XML
--no-stylesheet: 防止 XSL 样式表与 XML 输出相关联
杂项:
-6: 启用 IPv6 扫描
-A: 也叫全面扫描。操作系统检测、版本检测、脚本扫描和跟踪路由。
--datadir <dirname>: 指定自定义 Nmap 数据文件位置
--send-eth/--send-ip:使用原始以太网帧或 IP 数据包发送
--privileged: 假设用户拥有完全特权
--unprivileged: 假设用户缺乏原始套接字权限
-V:打印版本号
-h:打印此帮助摘要页。
有关更多选项和示例,请参见手册页 (https://nmap.org/book/man.html)
扫描目标
/,-*符号
nmap命令中扫描的目标是不可省略的参数,可以使用/,-*
符号来确认目标范围。当然这三种都可以混合使用。
# 直接单台主机ip,当然直接使用域名也可以,就是不怎么灵活而已
nmap 192.168.1.1
# 直接使用/掩码,扫描网段内全部ip
nmap 192.168.1.1/24
# 使用,指定对象,一般针对于不连续的网段
nmap 192.168.2.1,10,172,192,254
# 使用-选择连续的范围
nmap 192.168.3.1-255
# 使用*选择本段全部,和0-255一样
nmap 192.168.4.*
# ,/-*四者可以任意结合起来使用
nmap 192.168.1,2,3.*
nmap 192.168.1-192,240.1/24
--exclude排除host
# 比如你指定了大范围内的ip,但是某些ip你又想排除,后面可以无限写 nmap 192.168.1.1/24 --exclude 192.168.1.1 192.168.1.100
-iL从文件中导入和--excludefile排除
有时候从dhcp服务器中导出了在线的ip,可以使用文件来批量的选择扫描的目标,比如某公司禁止公司内部电脑开启web服务等,使用文件导入的方法,可以跳过离线主机进行的扫描。
-iL <目标ip的文件路径>
--excludefile <排除ip的文件路径>
文件格式中ip之间可以使用换行(\n),同时也支持,/-语法。
-iR随机扫描
-iR <随机生成ip数量>
-iR 0
# 0代表无限次
以下是我使用nmap -iR 2后的抓包,可以看到ip是随机的,默认的
图2.默认扫描发送的报文
扫描类型可以省略,缺省时使用-sT参数,即TCP连接扫描,缺省情况下发送三个报文
- ICMP Echo Request
- TCP SYN 80和443
端口模式
nmap将端口分成六个状态:
- open(开放)
- 有回显
- closed(关闭)
- 无回显,可能是关闭了,也可能是防火墙设置为drop(丢弃而不做回应)。
- filtered(被过滤)
- 在扫描者和被扫描着之间,此端口可能在防火墙、设备上的服务器、交换机路由器acl等过滤了。返回拒绝访问。
- unfiltered(未被过滤)
- 可以访问端口,但是无法确认端口是否开放,一般情况只在TCP ACK扫描中出现。
- open|filtered(开放或者被过滤)
- 当无法确定端口是开放还是被过滤的,可能是开放的端口不响应也可能返回目标端口报文在中途被防火墙、acl过滤了或者网络丢包了
- closed|filtered(关闭或者被过滤)
- 和上面open|filtered类似,不知道是关闭还是被过滤了。
主机发现
针对于不同的设备和网络环境,不同的扫描方式会有着截然不同的效果。
- 大体上分为这几种:
- ICMP发现主机
- sP,发送ICMP echo-Request报文
- TCP端口连接发现主机
- PS,发送SYN握手包
- PA,发送ACK确认包
- UDP端口连接发现主机
- PU
- DNS反向解析
- sL通过向DNS服务器反向解析(当然不要加上-n)
- ICMP发现主机
-sL(列表扫描)
其实这个参数不会对目标进行扫描操作,但因为nmap默认情况下是会对本机设置的所有DNS服务器反向解析其IP,即获取hostname,所以使用起来可以起到获取目标IP域名的效果。
图3.sL扫描会向本机DNS依据IP反解析hostname
我的本机默认的DNS是192.168.24.8和223.5.5.5。话说对公网的DNS服务器反向解析内网的IP的hostname,是不是有点太搞笑了。
-dns-servers <DNS Server>
指定DNS服务器-n
不解析DNS,那就真的只是列出IP地址而已了- -R 强制解析DNS
┌──(kali㉿kali)-[~]
└─$ nmap -sL 192.168.24.1/30 -dns-servers 192.168.28.8
Starting Nmap 7.93 ( https://nmap.org ) at 2022-10-26 22:39 EDT
Nmap scan report for 192.168.24.0
Nmap scan report for redmiAX6(192.168.1.1)
Nmap scan report for xiaomi10s(192.168.24.2)
Nmap scan report for 192.168.24.3Nmap done: 4 IP addresses (2 hosts up) scanned in 0.01 seconds
-sP(Ping扫描)
只使用Ping的方式判断主机存活。就和使用ping命令判断主机在线一样,如果有icmp回显那么nmap就认为其是存活的。
- 只发送icmp echo-request
- 有icmp echo-reply(icmp回显)就在线
图4.sP方式扫描
┌──(kali㉿kali)-[~]
└─$ nmap -sP 192.168.24.1-100
Starting Nmap 7.93 ( https://nmap.org ) at 2022-10-26 23:14 EDT
Nmap scan report for 192.168.24.1
Host is up (0.0034s latency).
Nmap scan report for 192.168.24.4
Host is up (0.0021s latency).
Nmap scan report for 192.168.24.6
Host is up (0.0026s latency).
Nmap scan report for 192.168.24.9
Host is up (0.0027s latency).
Nmap scan report for 192.168.24.10
Host is up (0.0033s latency).
Nmap scan report for 192.168.24.15
Host is up (0.0025s latency).
...省略
-P0 (无ping)、-Pn
如果对方关闭了icmp回显的功能,那么nmap会判断本主机不在线,同时后续的端口扫描等也不会进行,会给扫描结果带来干扰。
Windows下开关回显:
图5.Windows系统可在防火墙规则开关icmp回显
Linux关闭回显:
#临时关闭
echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all
#永久
echo net.ipv4.icmp_echo_ignore_all=0 >> /etc/sysctl.conf
sysctl -p
图6.ping测试下的icmp开关效果
所以为了排除干扰,可以加上-P0
参数,这样后续的端口扫描等操作也不会被干扰。请注意,P0虽然可以更彻底的扫描,但是代价是如果该地址本就真的不存在设备或者设备不在线,那么将花费大量的时间做无用功。
Windows主机上开启smb文件共享,确认开启445端口。并且是关闭的icmp回显。
图7.使用netstat查看端口监听情况
对于关闭icmp回显的设备,加不加-P0参数对扫描的结果有很大的影响。
图8.使用nmap 添加和不添加-P0的测试
-PS[portlist] (TCP SYN Ping)
向目标主机的常用端口发送标志SYN=1的TCP握手报文,默认-PS不加参数时候会向常用的TCP端口发送SYN报文,并不需要建立TCP连接,只要有回应那么就说明主机在线的。在判断主机存活时候随便还探测了开放的TCP端口。
- 这个常用的TCP端口官方说默认的目标端口是80,但是实际上抓包发现其实都有很多,因为默认情况下自带了对TCP1660个常用端口的扫描。
图9.PS抓取报文的效果
#PS不带参数
nmap -PS 192.168.5.1/24
#如果需要添加指定端口,比如你发现目标喜欢使用65522作为ssh端口,或者65000到65535这些都有可能,可以添加到扫描列表中,默认情况下预设的TCP端口也依旧会扫描
nmap -PS65522,65000-65535 192.168.5.1/24
-PA[portlist] (TCP ACK Ping)
-PA和PS其实是类似的,向目标主机的常用端口发送TCP报文,只不过这次是ACK=1的TCP确认报文。主要是用于通过一些有防火墙防火墙,因为防火墙会依据SYN报文来识别TCP连接,比较容易暴露自己。
一般情况ACK和SYN一起发送效果比较好。
nmap -PS -PA 192.168.5.1/24
-PU[portlist] (UDP Ping)
前面-PS和PA都是基于TCP扫描,PU使则是使用UDP扫描,如果网络中TCP的SYN和ACK都被防火墙隔离了,那就使用UDP。
nmap -PU 192.168.5.1/24
-PR (ARP Ping)
TCP和UDP这些都是基于IP扫描,如果只需要扫描局域网内(同网段,不跨越网关),可以使用ARP扫描,往往都不容易被察觉也比网络层扫描更可靠,当广播询问IP的对应MAC地址时候,当有回应那么就认为主机在线。
nmap -PR 192.168.5.1/24
-n (不用域名解析)
- nmap会对目标的IP地址进行反向域名解析。注意如果和-sL一起使用那就真的是只列出IP地址。
-R (为所有目标解析域名)
- 强制nmap对目标IP地址进行反向域名解析。 一般只有当发现机器正在运行时才进行这项操作。
端口扫描
-p <port ranges>指定目标端口
如果使用-p自定义范围。
- -p和主机发现类似的用法,可以使用,-来选择范围。
nmap -sS -p 1-1024,3389,3306 192.168.5.1/24
- 也可以使用U:和T:来选择UDP端口、TCP端口范围。
nmap -sS -sU -p U:53,67,68,T:1-1024,3389,3306 192.168.5.1/24
-F和--top-ports快速扫描
默认是使用常见的1000个端口作为目标,如果觉得不够快也可以使用-F将使用最常见的100个端口作为目标。使用--top-ports也可以规定前几的端口为目标,-F相当于--top-ports 100的情况。
# 使用-F扫描最常用的100端口 nmap -F 192.168.5.1 # 使用--top-ports 自定义扫描最长用的端口,比如最常用的500个端口 nmap --top-ports 500 192.168.5.1
-r顺序端口扫描
一个小参数,设置了可以按顺序扫描端口,默认情况是先扫常用端口再扫用户自定义的端口,其实意义不是那么大。
-sS (TCP SYN扫描)
此模式需要管理员(administrator或root)权限。
sS是最常用的扫描方式,不会建立完整的TCP连接,只发送SYN连接请求,所以速度很快,而且通常不会被扫描目标记录。
- 发送SYN,返回SYN/ACK->open开放
- 发送SYN,返回RST->closed关闭
- 发送SYN,等待超时,发送SYN,等待超时->filtered被过滤
- 发送SYN,返回ICMP不可达->filtered被过滤
nmap -sS -p 1-65535 192.168.5.1
-sT (TCP connect()扫描)
sT需要建立完整的TCP连接,即三次握手。所以判断端口开放更可靠,但是很有可能会被记录下连接的日志。
默认情况下不加参数都是使用此方法作为端口扫描。
nmap -sT 192.168.5.1
-sU (UDP扫描)
此模式需要管理员(administrator或root)权限。
对UDP端口进行扫描,使用-sT、-sS都不扫描UDP端口,所以如果有需要扫描UDP那就务必加上此。当然也可以结合TCP扫描来使用。
其原理为想目标端口发送UDP探测包,等待相应,返回ICMP端口不可达(ICMP port unreachable)为端口关闭,等待超时则为端口被过滤
sudo nmap -sS -sU -p U:53,67,68,161,162,T:1-65535 192.168.5.1/24
-sN; -sF; -sX ;-sM (TCP Null扫描,TCP FIN扫描,Xmas扫描,TCP Maimon扫描)
此模式需要管理员(administrator或root)权限。
nmap发现TCP端口开放与否对不同标志位上TCP报文有不同回应,回复RST报文则认为开放,超时则认为关闭或过滤。因为对于服务器来说这些TCP报文都是错误的,不保证所有端口的都可以正确的相应,但是这比SYN和整个TCP连接都要来得更隐蔽。(不过我都没有用过啊)
-sN
,TCP Null扫描,发送标志位都为0的TCP包,用于测试防火墙。-sF
,TCP FIN扫描,发送标志位FIN=1(关闭连接)的TCP包。端口扫描效果不是很好,但是很隐蔽。-sX
,Xmas扫描,这个更过分了,直接把FIN,PSH和URG标志位都置1了。-sM
,TCP Maimon扫描,发送标志位FIN,ACK的TCP报文。--scanflags
(定制的TCP扫描),这些标志位你甚至可以自己定义,不过记得配合其他TCP扫描。-
sudo nmap -sA -F 127.0.0.1 --scanflags URGACKPSHRSTSYNFIN # 控制位可以任意顺序,并且嘛之间不用空格,直接连着一起写
-
-sA (TCP ACK扫描)
此模式需要管理员(administrator或root)权限。
ACK扫描,将TCP报文标志位ACK=1,可以用于检测防火墙屏蔽了哪个端口,不过滤的主机端口反而啥也扫不出。
有空要补上图。因为我手机上并没有模拟出来效果啊。
-s0(IP协议扫描)
IP 协议扫描确定目标机支持哪些IP协议 (TCP,UDP,ICMP,IGMP等等)。从技术上说,这不是端口扫描 ,既然它遍历的是IP协议号,但是也可以使用-p来指定端口,只不过这个端口对应的是协议的号码。
图10.这里的数字不是代表端口,而是协议
-sI <zombie host[:probeport]> (空闲扫描)
僵尸主机也就是肉鸡,利用side-channel攻击,nmap对此端口进行扫描操作,从而更加隐蔽的进行扫描,若安全设备溯源也是溯源到肉鸡的IP。
-sI <host>[:<port>]
端口可以不写,默认80- -sI 192.168.1.1:8888
sudo nmap -sI 192.168.2.8:8080 192.168.2.1/24 -Pn
-b <ftp relay host> (FTP弹跳扫描)
这个是利用FTP代理链接漏洞,允许用户连接到一台FTP服务器,然后要求文件送到一台第三方服务器。可以有效的隐藏自己。
这里参数格式是-
-b <username>:<password>@<server>:<port>
sudo nmap -sS ftp:123@192.168.1.1:21
版本探测和系统探测
不同服务也有不同版本,比如SNMP有v1、v2c、v3三种版本,SMB也有v1.0、v2.0、v3.0三种版本。不同的版本也有不同的特性,为此这些信息也是很重要的内容。
-sV (版本探测)
- -sV 打开版本探测。在端口扫描的基础上进行开放端口的服务分析。
- --allports (不为版本探测排除任何端口) 默认情况下会跳过tcp:9100,因为某些打印机简单地打印送到该端口的任何数据,这回导致数十页HTTP get请求,二进制 SSL会话请求等等被打印出来
- --version-intensity <intensity> (设置 版本扫描强度) 强度范围:0和9,默认是7。强度越高越精确,但是耗时更久。
- --version-light (轻量级模式) 相当于--version-intensity 2
- --version-all (尝试每端口探测) 相当于--version-intensity 9
- --version-trace(显示正在进行的扫描的调试信息)可以看到具体的日志。
-sR(RPC扫描)
- -sR 利用RPC协议来进行版本探测,不过现在使用sV就涵盖了其中,少用。其实我也不太懂RPC,之前配置NFS时候遇到过RPC:111和113端口。
-O (启用操作系统探测)
- -O 启用操作系统探测,
- --osscan-limit (针对指定的目标进行操作系统检测)
- 如果发现一个打开和关闭的TCP端口时,操作系统检测会更有效。 采用这个选项,nmap只对满足这个条件的主机进行操作系统检测,这样可以 节约时间,特别在使用-P0扫描多个主机时。
-
--osscan-guess; --fuzzy (推测操作系统检测结果)
-
当Nmap无法确定所检测的操作系统时,会尽可能地提供最相近的匹配,Nmap默认 进行这种匹配,使用上述任一个选项使得Nmap的推测更加有效。
-
- --osscan-limit (针对指定的目标进行操作系统检测)
-A(操作系统探测和版本探测)
- -A 操作系统和版本探测都进行,和启动-sV和-O一样,sV和O的参数在这里也可以使用。
时间与性能、显示
因为nmap通常对整个进行扫描,倘若网段范围主机非常多,适当的添加参数调整参数会大大的节约时间。
-T <Paranoid|Sneaky|Polite|Normal|Aggressive|Insane> (设置时间模板)
只要记住这个就可以了,因为够用了,其他时间选项其实更加细致的设置,T时间模板已经封装好。
- -T<number> 范围0-5,可以使用数字来代替paranoid (0)、sneaky (1)、polite (2)、normal(3)、 aggressive (4)和insane (5)
- -T3 即为默认
- -T0,T1,可以用于躲避IDS的探测,但是速度比较慢
- -T2 降低扫描速度
- -T4 加快扫描速度,也是一般情况也试用比较可靠有线网络
- -T5 最快的扫描速度,但是可能让目标主机处理不过来从而导致扫描结果不准确。
--min-hostgroup <size>; --max-hostgroup <size> (调整并行扫描组的大小)
原来扫描结果需要最后才可以全部看到,但是可以设置组的大小,从而让当前组扫完就可以的看结果,如果组的大小定义为50,扫描50个主机扫描完成后可以得到报告(详细模式中的补充信息 除外)。
不过其实个人觉得-v或者-vv参数更有效果吧。
--scan-delay <milliseconds>; --max-scan-delay <milliseconds> (调整探测报文的时间间隔)
设置扫描包的发送间隔,单位ms。
--min-parallelism <numprobes>; --max-parallelism <numprobes> (调整探测报文的并行度)
--min-rtt-timeout <milliseconds>, --max-rtt-timeout <milliseconds>, --initial-rtt-timeout <milliseconds> (调整探测报文超时)
--host-timeout <milliseconds> (放弃低速目标主机)
跳过通信差的主机,设置多少ms延迟才跳过。比如楼下蹭网的邻居,每一次扫描需要等待许久,非常消耗时间,干脆跳过。
防火墙/IDS躲避和哄骗
-D <decoy1 [,decoy2][,ME],...>(使用诱饵隐蔽扫描)
使用诱饵隐藏扫描。即发送参杂着假ip的数据包检测。作为诱饵ip须在线。
使用逗号分隔每个诱饵主机,比如:
sudo nmap -sS -D 192.168.1.1,192.168.2.1,192.168.3.1,192.168.5.1 192.168.5.2-254
-S <IP_Address> (源地址哄骗)
- -S 伪造IP报文中原地址,若有多张网卡那么要指定发送和接收的网卡。
- -e <network interface>指定网卡 比如 -e eth0,在Windows上可以使用--iflist查看网卡。
--source-port <portnumber>; -g <portnumber> (源端口哄骗)
自定义源端口
--data-length <number> (发送报文时 附加随机数据)
默认时候发送的IP报文都是没有数据的空白报文,追加随机的数据可以减小被怀疑的可能,但是性能消耗会增加。
设置ttl,比如--ttl 255
--randomize-hosts (对目标主机的顺序随机排列)
--spoof-mac <mac address,prefix,or vendor name> (MAC地址哄骗)
这个比较有趣,可以输入完整的mac地址,也可以输入前面3Byte的mac,也可以输入厂家的名字(使用自带库中的预设)。
比如 ----spoof-mac 01:01:01:01:22:1a,a20123,Cisco
输出
nmap可以将结果输出为文件,同时也可以配合--resume实现继续之前未完成的任务。
-oA <basename> (输出至所有格式)
输出以下的全部,当然如果不需要也可以任意选择需要的:
- -oN <filespec> (标准输出) 标准输出可以用于--resume断点继续。
- --append-output (在输出文件中添加)
- -oX <filespec> (XML输出) 推荐使用此格式,因为XML使用场景很广,可方便被编程语言调用。比如使用python的脚本导结果为excel表格等。
- -oG <filespec> (Grep输出) 可以很方便的在grep、awk、cut、sed、diff等命令中展现。
-v (提高输出信息的详细度)
- -vv 比起-v更详细,但是终端打印消息太多可能主要的信息就不太好看得见了。
- -d [level] (提高或设置调试级别) 这个一般情况是调试用的
--packet-trace (跟踪发送和接收的报文)
要求Nmap打印发送和接收的每个报文的摘要,也可以方便初学者理解nmap工作原理。
--iflist (列举接口和路由)
用于分析路由,如果报文发送错误网卡可以使用-e来定义网卡接口,但是nmap中的命名是Linux那一套,在Windows要注意。
图11.显示网卡和路由