更新时间
2022年09月06日16:20:10
完成nmap介绍,目标选择,主机发现部分
2022年10月28日21:19:20
完成最基本的内容,端口扫描,版本和系统探测,安全其他等
打算的更新计划:更多案例和图片,导出xml文件转为Excel分析(周末先休息一下吧)
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:打印此帮助摘要页。
--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类似,不知道是关闭还是被过滤了。
主机发现
针对于不同的设备和网络环境,不同的扫描方式会有着截然不同的效果。
大体上分为这几种:
sL通过向DNS服务器反向解析(当然不要加上-n)
PU
PS,发送SYN握手包
PA,发送ACK确认包
sP,发送ICMP echo-Request报文
ICMP发现主机
TCP端口连接发现主机
UDP端口连接发现主机
DNS反向解析
-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