nmap
nmap
0x01 活跃主机发现技术
注意:使用任何扫描工具得到的扫描结果仅供参考
nmap主机发现技术分析
nmap中提供了
--packet-trace
选项来观察nmap发出了哪些数据包,收到了哪些数据包,由此可知
nmap在进行主机发现的时候,无论指定了何种方式,nmap都会先判断一下目标主机是否和自己处于同一个子网中,如果处于同一个子网,nmap会直接使用ARP协议扫描的方式,而不会使用你指定的扫描方式只探测目标主机是否活跃,不进行对于端口扫描
- 使用参数
-sn
- 之前的版本是-sP参数
- 命令语法:
nmap -sn [ 目标 ]
- 使用参数
1.1 基于ARP协议的活跃主机发现技术
原理:
如果想要知道处在同一网段的IP地址为
*.*.*.*
的主机是否为活跃主机,
只需要构建一个ARP请求数据包,并广播出去,如果得到了回应,则说明
该主机为活跃主机优点:
准度高
因为不遵守ARP协议将无法通信缺点:
不能对不同网段的目标主机进行扫描
使用参数
-PR
- 命令语法:
nmap -PR [ 目标 ]
- 命令语法:
1.2 基于ICMP协议的活跃主机发现技术
ICMP协议中包含了很多方法,但是基于ICMP协议的扫描方式往往也是安全防御的重点,因此经常得不到准确的结果
ICMP的报文的种类
ICMP 报文的种类 类型的值 ICMP 报文的类型 差错报告报文 3 终点不可达 4 源抑制 11 超时 12 参数失灵 5 重定向 查询报文 8或0 响应请求或应答 13或14 时间戳请求或应答 17或18 地址掩码请求或应答 10或9 路由器询问或通告 ICMP活跃主机发现技术主要使用表格中的高亮部分的查询报文
1.3 基于TCP协议的活跃主机发现技术
TCP协议简介
TCP(Transmission Control Protocol,传输控制协议)是一个位于传输层的协议。
它是一个面向连接、可靠的、基于字节流的传输层通信协议。nmap使用TCP协议的原理
nmap中常用的TCP协议扫描方式有两种,分别是TCP SYN扫描与TCP ACK扫描, 这两种扫描方式其实都是利用TCP三次握手实现的。
TCP协议中结束连接的方法就是向目标发送一个RST数据包
注意:很多服务器的安全机制会屏蔽掉它提供服务以外的端口,向这些端口发包,可能会得不到响应,就不能确定目标是否存活。
如果namp向目标发包后没有收到任何应答,nmap将判断目标不在线(哪怕只是目标过滤掉了数据包)TCP SYN扫描
- 参数
-PS
- 命令语法:
nmap -PS[端口1, 端口2, ···] [目标]
- 命令语法:
- 说明:
nmap使用
-PS
选项来向目标主机发送一个设置了SYN标志的数据包,这个数据包的内容部分为空。
探测的默认端口为80,也可以在选项后面指定端口,当指定多个端口时,nmap会对这些端口并发的进行测试
当目标端口开发, 目标会返回一个SYN/ACK数据包
当目标端口是关闭的,目标存活的话就会返回RST数据包
故只要收到目标返回的数据包,就意味着目标存活,反之,目标不在线
- 参数
TCP ACK扫描(不好用,很少得到准确的结果)
- 参数
-PA
- 命令语法
nmap -PA[端口1,端口2,···] [目标]
- 不指定端口,默认为80
- 注意参数
-PA
和指定端口直接不能有空格,端口直接的逗号也不能有空格 - 示例:
nmap -PA2333,2334 1.1.1.1
- 命令语法
- 参数
1.4 基于UDP协议的活跃主机发现技术
UDP协议简介
UDP协议也是一个位于传输层的协议。
它是一个非面向连接的、不可靠的传输层通信协议
当一个UDP端口收到一个UDP数据包时,如果它是关闭的,就会给源端发回一个ICMP端口不可达的数据包(type=3、code=3);
但是如果它是开放的,就会忽然这个数据包,也就是将它丢弃而不返回任何数据包。nmap使用UDP协议的原理
namp需要扫描目标主机关闭的端口,与TCP不同;
因为只有端口是关闭的,udp协议才会返回ICMP数据包(type=3、code=3)使用UDP协议进行主机发现
- 参数
-PU
- 命令语法
nmap -PU[端口1,端口2,···] [目标]
- 不指定端口默认为40125
- 注意参数
-PU
和指定端口直接不能有空格 - 示例:
nmap -PU2333,2334 1.1.1.1
- 命令语法
- 参数
1.5 基于SCTP协议的活跃主机发现技术
SCTP协议解析(支持这种协议的主机并不多)
- SCTP于TCP同属于传输层上的协议。
- SCTP协议与TCP完成的任务是相同的
- 但是两者存在着很大的不同之处:
- TCP协议一般是单地址连接的,而SCTP却可以用于多地址连接
- TCP协议是基于字节流,SCTP是基于消息流的
- TCP连接的建立是通过3次握手,而SCTP是通过一种4次握手的机制实现的
使用SCTP协议进行主机发现
- 参数
-PY
- 命令语法:
nmap -PY[port1,port2,...] [目标]
- 不指定端口默认为80
- 范例:
nmap -sn -PY 1.1.1.1
- 对1.1.1.1这个主机发送一个SCTP INIT数据包进行SCTP协议类型的扫描
- 注意:目前支持这个协议的主机并不多,因此这种方法只能作为一种备用手段
- 命令语法:
- 参数
1.6 基于IP协议进行主机地址发现
IP协议解析
IP协议是TCP/IP协议族中的核心协议,也是TCP/IP的载体
所有的TCP、UDP、ICMP、IGMP数据都以IP数据包格式传输
IP数据包的8-16位用来区分服务,用来标识是哪个协议向IP传送数据;
比如:ICMP为1,IGMP为2, TCP为6, UDP为17,GRE为47,ESP为50等。使用IP协议进行主机发现
nmap中允许向目标主机发送IP数据包来检测目标主机是否活跃,理论上可以使用的协议多达上百个。
- 参数
-PO
- 命令语法:
nmap -PO [协议号1,协议号2,...] [目标]
- 如果不指定协议标识号,nmap默认使用ICMP(1)、IGMP(2)、IP-in-IP(4)三个协议
- 即
nmap -PO 1.1.1.1
相当于nmap -PO 1,2,4 1.1.1.1
- 即
- 注意:只用
-PO
参数发出的数据包内容都是空的,这种数据包很容易被检测出来,可以使用参数--data-length
来向数据包填入随机数据- 例如:
nmap -sn -PO --data-length 25 1.1.1.1
- 例如:
- 命令语法:
- 参数
1.7 Namp中的DNS选项
- 对一个网段进行nmap扫描,该网段可能有活跃的主机与非活跃的主机,如果直接进行扫描,nmap只会对处于活跃状态的主机进行DNS转换,而非活跃的主机将不予处理
- 如果希望所有目标的IP无论是否活跃都进行DNS转换将对应域名列出来
- 可以使用参数
-R
- 命令语法:
nmap -R [目标IP]
- 命令语法:
- 可以使用参数
- 如果强制将每个IP都转换为域名,会浪费时间,已知主机的域名,则不需要转换
- 用参数
-n
取消对域名的转换- 命令语法
nmap -n [目标IP]
- 命令语法
- 用参数
- 如果不想在自己的DNS服务器上留下这次查询的记录,可能需要指定DNS服务器来查询目标
- 可以使用参数
--dns-servers
- 命令语法
nmap --dns-servers [server1,server2] [目标IP]
- 命令语法
- 可以使用参数
0x02 端口扫描技术
- 在端口扫描时,一般都已经确定目标在线了,所以跳过主机发现阶段
- nmap中对于端口给出了6种不同状态的描述
端口状态 说明 open 表明该端口有应用程序接收TCP连接或UDP报文 closed 这里要注意 closed
并不意味着端口是关闭的,状态为closed
的端口是可访问的,这种端口可以接收nmap的探测报文并做出响应,只是没有应用程序在open上监听。filtered 产生这种结果的原因主要是存在目标网络数据包过滤,由于这些设备过滤了探测数据包,导致nmap无法确定目标端口是否开放。这种设备可能是路由器、防火墙、甚至是专门的安全软件。 unfiltered 这种结果很少见,它表明端口是可以访问的,但是nmap无法判断它是 open
还是closed
的。通常只有在进行ACK扫描时才会出现这种状态。open|filtered 无法确定端口是开放的还是被过滤了。开放的端口不响应就是一个例子。 closed|filtered 无法确定端口是关闭的还是被过滤了。只有在使用idle扫描时才会发生这种情况。 2.2 UDP端口扫描技术
- 使用UDP扫描时目标的应答与对应端口的状态
目标主机的应答 目标端口的状态 从目标端口得到任意UDP的应答 open 如果目标主机没有给出应答 open|filtered ICMP端口不可抵达(type=3, code=3) closed ICMP无法抵达错误(type=3, code=1、2、9、10、13) filtered - 要注意UDP扫描速度是相当慢的。使用参数
-sU
进行UDP端口扫描 SYN扫描
- SYN扫描是最为流行的一种扫描方式,也是nmap默认的扫描方式。
- SYN扫描速度快,不容易被网络中的安全设备所发现,因为没有完整建立TCP三次握手
- SYN扫描需要root或administrator权限
- 对目标进行SYN扫描时目标主机的应答与对应端口的状态
目标主机的应答 目标端口的状态 如果目标主机给出了一个SYN/ACK应答 open 如果目标主机给出了一个RST应答 closed 如果目标主机没有给出应答 filtered ICMP无法抵达错误(type=3, code=1、2、9、10、13) filtered - 使用参数
-sS
进行SYN端口扫描- 命令语法:
nmap -sS [target]
- 命令语法:
Connect扫描
- 这种扫描与SYN扫描很像,但是其建立了完整的TCP三次握手
- 隐蔽性降低,可能留下访问日志
- 这种扫描无需root或administrator权限
- 使用参数
-sT
进行Connect端口扫描- 命令语法:
nmap -sT [target]
- 命令语法:
FIN 扫描
- TCP FIN 扫描方法向目标端口发送一个FIN数据包。按照RFC-739的规定,对于所有关闭的端口,目标系统应该放回RST标志
- 使用参数
-sF
进行FIN端口扫描- 命令语法:
nmap -sF [target]
- 命令语法:
NULL 扫描
- TCP NULL 扫描是向目标端口发送一个不包含任何标志的数据包。按照RFC-739规定,对于所有关闭的端口,目标系统应该放回RST标志
- 使用参数
-sN
进行NULL端口扫描- 命令语法:
nmap -sN [target]
- 命令语法:
Xmas Tree 扫描
僵尸扫描优缺点介绍
- 可以绕开一些网络中的安全机制,如路由器中的访问控制列表技术(ACL),某些单位的内部网络限制只允许指定IP地址对其内部进行访问
- 极其隐蔽,需要借助肉鸡来实现
- 条件苛刻
- 肉鸡必须是整数递增的
IP ID
- 肉鸡必须空闲,因为大量无关的流量将导致结果极为混乱
- 肉鸡必须是整数递增的
- 速度慢
僵尸扫描原理介绍
- 给肉鸡发送SYN/ACK数据包,检测肉鸡返回的RST数据包的
IP ID值
并记录下来。 - 在本机上伪造一个源地址为肉鸡的数据包,并将数据包发送给目标主机端口,根据目标端口状态的不同,目标主机可能导致肉鸡的
IP ID值
增加。- 如果目标主机端口开放,将向肉鸡返回SYN/ACK数据包,于是肉鸡将向目标返回一个RST数据包,导致肉鸡的
IP ID值
增加一; - 如果目标主机端口关闭,将向肉鸡返回RST数据包,肉鸡收到后将不做响应,
IP ID值
不变。
- 如果目标主机端口开放,将向肉鸡返回SYN/ACK数据包,于是肉鸡将向目标返回一个RST数据包,导致肉鸡的
- 再次给肉鸡发送SYN/ACK数据包,检测肉鸡返回的RST数据包的
IP ID值
与步骤一的IP ID值
进行比较。- 如果增加一,则肉鸡在这期间没有向外发送数据包,说明目标端口是关闭的;
- 如果增加二,则肉鸡在这期间向外发送了数据包,说明目标端口是开放的。
- 给肉鸡发送SYN/ACK数据包,检测肉鸡返回的RST数据包的
nmap中僵尸扫描的使用方法
- 发现僵尸机
- 法一:对一台主机进行扫描时,执行一个端口扫描以及系统检测,启动详细模式(
-v
),nmap就会检测操作系统IP ID
增长的方法,如果返回值为IP ID Sequence Generation: Incremental
,说明IP ID
递增,但还需要确定一下,因为很多系统其实为每一个通信都开启了一个IP ID
,另外,如果这台主机和外界进行大量的通信,这种方法也不适用。 - 法二:使用ipidseq NSE脚本(推荐这种)
- 命令语法:
nmap -p[端口] [肉鸡IP] --script=ipidseq.nse
- 命令语法:
- 法一:对一台主机进行扫描时,执行一个端口扫描以及系统检测,启动详细模式(
- 利用僵尸机对目标进行扫描
- 利用参数
-sI
指定肉鸡IP- 命令语法:
nmap -sI [肉鸡IP] -p[端口] [target]
- 命令语法:
- 利用参数
- 发现僵尸机
2.5 指定扫描的端口
扫描常见的100个端口
- 命令语法:
nmap -F [target]
- 命令语法:
扫描常用的个端口
- 命令语法:
nmap --top-ports [number] [target]
- 范例:对目标10个常见端口进行扫描
nmap --top-ports 10 1.1.1.1
- 命令语法:
指定某一端口
- 命令语法:
nmap -p [port] [target]
- 命令语法:
使用名字来指定某一端口
- 命令语法:
nmap -p [port name(s)] [target]
- 范例:
nmap -p smtp,http 1.1.1.1
- 命令语法:
使用协议来指定某一端口
- 命令语法:
nmap -p U:[UDP ports],T:[TCP ports] [target]
- 范例:
nmap -p U:53,T:25 1.1.1.1
- 命令语法:
扫描所有端口
- 命令语法:
nmap -p- [target]
- 或者
nmap -p* [target]
- 范例:
nmap -p- 1.1.1.1
- 这种扫描方法销毁资源很大,慎用
- 命令语法:
0x03 远程操作系统与服务检测技术
3.1 远程操作系统检测简介
nmap进行识别的探针和响应对应的关系保存在
nmap-os-db
文件中。nmap会根据对目标响应的特征来与nmap-os-db
文件做对比识别对应指纹
nmap在探测时会验证如下参数:
- 供应商的名字:微软、SUN、Cisco等
- 操作系统:Windows、Linux、Mac OS X等
- 操作系统的版本:Windows XP、Centos7等
- 当前设备的类型:比如通用计算机、打印服务器、媒体播放器、路由器、WAP或电力装置等
使用参数
-O
通过端口扫描来完成对操作系统的扫描- 命令语法:
nmap -O [target]
- 这个命令将会使用nmap默认SYN扫描方式来完成端口探测,不过也可以结合其他的检测技术来指定扫描方式。
- 启用参数
-O
或-A
后扫描目标操作系统的可选项选项 意义 –osscan-limit 只对满足”同时具有 open
和closed
状态的端口“条件的主机进行操作系统检测–osscan-guess 猜测 最接近目标的匹配操作系统类型 –max-retries 对操作系统检测尝试的次数,默认为5 - 范例:
nmap -P0 -sT -F -O --osscan-limit 1.1.1.1
- 命令语法:
3.2 操作系统指纹简介
远程判断目标计算机操作系统的方法一般可分成两类:
- 被动式方法:并不祥目标系统发送任何数据包,而是通过各种抓包工具来收集流经网络的数据报文,再从这些报文中得到目标操作系统的信息。
- 主动式方法:指客户端主动向远程服务器发送信息,远程服务器一般要对这些信息做出反应,回复一些信息,发送者对这些返回的信息进行分析,就有可能得知远程主机的操作系统类型。这些信息可以是通过正常的网络程序如Telnet、FTP等与主机交互的信息,也可以是一些经过精心构造、正常的或残缺的数据报文。
nmap并不使用被动式的方法。nmap中的主动式方法采用多达15个指针的操作系统指纹扫描包
指纹扫描作为管理工具
- nmap也可以作为一个网络管理器。
- 对一个子网执行如下命令
nmap --O [ip subnet]
- 或者
nmap -sV -F --fuzzy --ossan-guess [target ip]
- 这种情况下,nmap会输出目标系统的TCP/IP指纹文件,并给出各个系统类型的可能性,输出结果可查看官方文档进行理解
3.3 服务发现
nmap进行服务发现的过程:
- 首先进行端口扫描,默认情况下使用SYN扫描,此时会对常用端口的服务进行猜测
- 其次进行服务识别,发送探针报文,得到确认值,确认服务
- 最后进行版本识别,发送探针报文,得到返回的报文信息,分析得出服务的版本
nmap会将版本探测结果与
nmap-service-probes
数据库中内容进行比较,如果匹配成功,将确定该端口的服务
可以使用以下参数打开和控制版本检测
- 使用参数
-sV
开启版本探测- 命令语法:
nmap -sV [target]
- 也可以使用参数
-A
同时开启操作系统检测服务发现-A
参数相当于-O -sV
- 只有开启这个参数后面的参数才能生效
- 命令语法:
- 使用参数
--allports
不为版本探测排除任何端口- 命令语法:
nmap -sV --allports [target]
- 说明:
- 通常,nmap在进行版本探测时不会对目标的全部端口进行探测,而会跳过一些端口。
- 例如对TCP 9100端口时,如果目标恰好是一台打印机,那么这台打印机可能会将数据全部打印出来。
- 如果确实有必要的话,可以使用
--allprots
来扫描所有端口。
- 命令语法:
- 使用参数
--version-intensity <intensity>
设置版本扫描强度- 命令语法:
nmap -sV --version-intensity <intensity> [target]
- 说明:
- 当进行版本扫描时,nmap发送的一系列报文都被赋予一个
1到9
之间的值。 - 这里的强度水平说明了应该使用哪些探测报文。数值越高,服务越有可能被正确的识别。但是,高强度的扫描花更多时间。
- 强度值必须在
0-9
之间,默认是7。
- 当进行版本扫描时,nmap发送的一系列报文都被赋予一个
- 命令语法:
- 使用参数
--version-light
打开轻量级模式- 说明:
--version-light
相当于--version-intensity 2
- 这种轻量级模式加快了扫描速度,降低了对服务的扫描成功率
- 说明:
- 使用参数
--version-all
尝试每个都探测- 说明:
--version-light
相当于--version-intensity 9
- 保证对每个端口尝试所有的探测报文。
- 说明:
- 使用参数
--version-trace
进行跟踪版本扫描活动- 说明:
- 这将使nmap打印出关于正在进行扫描的详细调试信息。
- 它的输出结果是参数
--packet-trace
的子集
- 说明:
- 使用参数
-sR
进行RPC(远程过程调用)扫描- RPC:调用远程计算机上的服务,就像调用本地服务一样
- 命令语法:
nmap -sV -sR [target]
- 说明:
- 这种方法和许多端口扫描方法联合使用。
- 它对所有被发现开放的TCP/UDP端口执行SunRPC程序NULL命令,试图确定它们是否RPC端口,如果是,可以确定是什么程序和版本号。
- 使用参数
0x04 nmap伪装技术
4.1 报文分段
使用参数
-f
对nmap发送的探测数据包进行分段- 命令语法:
nmap -f [target]
- 说明:
- 使用这个参数将原来的数据包分成几个部分,将使IDS对数据包检测时变得更困难。
- 需要谨慎使用该参数,一些老旧的系统在处理分段的包时经常会出响死机的情况。
- 这个功能可能在Windows下无法正常工作。
- 命令语法:
使用参数
--mtu
来指定MTUMTU(最大传输单元)是指一种通信协议的某一层上面所能通过的最大数据包的大小(以字节为单位)。nmap可以使用
--mut
来指定MTU的大小,但是这里MTU的值必须为8的整数倍- 命令语法:
nmap --mtu [target]
- 范例:
nmap --mtu 8 1.1.1.1
- 命令语法:
使用参数
-D <decoy1[, decoy2][, ME], ...>
进行诱饵主机隐蔽扫描通常在对目标进行扫描时可能会被发现。nmap支持使用诱饵主机来隐藏自身的IP
- 命令语法:
nmap -D <decoy1[, decoy2][, ME], ...> [target]
- 范例:
nmap -D RND:10 1.1.1.1
- 说明:
- 使用逗号分隔每个诱饵IP地址,也可以使用自己的真实IP作为诱饵,自己的IP可以使用ME选项。
- 如果在第6个位置或更后的位置使用ME选项,一些常用的端口扫描检测器就不会报告这个真实IP。
- 如果不使用ME选项,nmap将真实IP放在一个随机的位置。
- 注意;作为诱饵的主机必须处于工作状态,否则这次扫描就成了SYN洪水攻击
- 在发现阶段或端口扫描以及远程操作系统检测阶段可以用诱饵主机选项,但是在进行版本检测(-sV)或TCP连接扫描时(-sT),诱饵主机选项无效。
- 命令语法:
使用参数
--source-port <portnumber>
或-g <portnumber>
进行源端口欺骗网络安全控制中有一种访问控制列表技术,这种技术主要是依靠IP地址和端口来对数据包进行限制,例如有时需要保证DNS和FTP协议正常工作,很多新手管理员会将来自53端口(DNS)和20端口(FTP)的数据放入网络,导致攻击者可以构造恶意的流量来利用这些端口。
- 命令语法:
nmap -g <portnumber> [target]
- 或者:
nmap --source-port <portnumber> [target]
- 范例:
nmap -g 88 1.1.1.1
- 说明:只要有一个被目标检测机制遗忘的端口,nmap就可以利用这个选项来伪造源端口发送数据,大部分TCP/UDP扫描都完全支持这些选项。
- 命令语法:
使用参数
data-length <number>
来在发送报文时附加随机数据默认情况下,nmap发送的报文中只有头部内容部分是空的,因此TCP数据包的大小只有40字节,而ICMP ECHO请求只有28字节。这种内容为空的报文很容易被IDS发现,所以可以使用该参数来增加内容。
- 命令语法:
nmap --data-length <number> [target]
- 范例:
nmap --data-length 25 1.1.1.1
- 说明:这个选项会让大部分ping和端口扫描变慢,但是影响不大。
- 命令语法:
使用参数
--ttl <value>
来设置IP time-to-live域- 命令语法:
nmap --ttl <value> [target]
- 范例:
nmap --ttl 30 1.1.1.1
- 命令语法:
使用参数
--spoof-mac <mac address, prefix, of vendor name>
进行MAC地址欺骗通过这个选项可以人为指定nmap在进行扫描工作时发送以太网帧MAC地址。
这个选项隐含地使用了--send-eth
选项,这样才是真正的以太网包。- 命令语法:
nmap --spoof-mac <mac address, prefix, of vendor name> [target]
- 范例:
nmap --spoof-mac 0 1.1.1.1
nmap -spoof-mac Apple 1.1.1.1
nmap -spoof-mac 01:02:03:04:05:06 1.1.1.1
nmap -spoof-mac 0020F2 1.1.1.1
- 说明:
- 如果使用字符串”0”,nmap选择一个完全随机的MAC地址
- 如果给定的字符是使用分号分隔的十六进制数字,nmap将使用这个地址。
- 如果是小于12的十六进制数字,nmap将会随机填充剩下的字节。
- 如果参数不是0或十六进制数字,nmap将通过
nmap-mac-prefixes
查找厂商的名称(区分大小写),如果找到匹配,nmap将使用厂商的OUI(3字节前缀),然后随机填充剩下的3字节。
- 命令语法:
0x05 nmap的格式化输出
…