一、前言
首先分享一下写这篇文章的原因吧,在秋招找工作的过程中四处碰壁每一次都感觉会遇到自己的知识盲区,每一次都饱含失落在面试亚信安全的时候被面试官询问工具的各种功能的原理给问得不知所措,也让自己决心总结关于工具原理的文章
二、主机探测
主机探测没有指定参数的时候
- 在普通用户执行的时候使用的向目标主机的80和443端口发送SYN报文
- 使用的是root用户执行的时候会在发送了SYN报文之后进行端口探测,使用的是SYN报文进行探测的
通过抓包分析可以看到会向DNS服务器进行反向解析请求,并且会向端口发送SYN报文(在root权限下)进行端口探测,如果是普通用户执行nmap只向目标的80和443端口发送SYN报文通过判断这两个端口的开放与否来判断主机是否存活
普通用户的时候
如果目标没有开放这两个端口就会判断会主机不在线存在一定的误差
2.1 主机扫描的参数有:
-sL:简单的列出网络上的主机不发送任何数据包
-sP/-sn:表示只进行主机存活探测
-PU:使用UDP协议探测主机的存活
-PP:发送ICMP时间戳请求
-PM:发送ICMP地址掩码请求
-PE:发送echo数据包探测主机的存活
-PA:发送ACK包探测主机的存活
-PS:发送SYN包探测主机的存活
-PY:使用SCTP协议探测主机的存活
-PR:使用ARP协议探测主机的存活
-Pn/-P0:不进行主机存活的探测默认所有主机都是存活的
-n: 不使用DNS服务
-R:进行DNS反向解析
--dns-servers : 指定DNS服务器
--system-dns:使用系统DNS
--traceroute: 跟踪路由
2.2 参数原理、演示
-sL
使用-sL参数只是简单的列出我们给定的网络中的主机如下所示我们给的是192.168.1.0-20就会列出0-20的ip地址
- ┌──(root💀kali)-[~]
- └─# nmap -sL 192.168.1.0-20
- Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-19 22:12 CST
- Nmap scan report for 192.168.1.0 (192.168.1.0)
- Nmap scan report for 192.168.1.1 (192.168.1.1)
- Nmap scan report for 192.168.1.2 (192.168.1.2)
- Nmap scan report for 192.168.1.3 (192.168.1.3)
- Nmap scan report for 192.168.1.4 (192.168.1.4)
- Nmap scan report for 192.168.1.5 (192.168.1.5)
- Nmap scan report for 192.168.1.6 (192.168.1.6)
- Nmap scan report for 192.168.1.7 (192.168.1.7)
- Nmap scan report for 192.168.1.8 (192.168.1.8)
- Nmap scan report for 192.168.1.9 (192.168.1.9)
- Nmap scan report for 192.168.1.10 (192.168.1.10)
- Nmap scan report for 192.168.1.11 (192.168.1.11)
- Nmap scan report for 192.168.1.12 (192.168.1.12)
- Nmap scan report for 192.168.1.13 (192.168.1.13)
- Nmap scan report for 192.168.1.14 (192.168.1.14)
- Nmap scan report for 192.168.1.15 (192.168.1.15)
- Nmap scan report for 192.168.1.16 (192.168.1.16)
- Nmap scan report for 192.168.1.17 (192.168.1.17)
- Nmap scan report for 192.168.1.18 (192.168.1.18)
- Nmap scan report for 192.168.1.19 (192.168.1.19)
- Nmap scan report for 192.168.1.20 (192.168.1.20)
- Nmap done: 21 IP addresses (0 hosts up) scanned in 0.22 seconds
复制代码
只使用该参数不会向目标发送任何报文但是会向DNS服务器发送DNS报文执行DNS反向解析,使用wireshark抓包可以看到每个目标都向DNS服务器发送了DNS报文,可以使用-n参数指定不使用DNS解析就不会向DNS服务器发送反向解析报文
-sP/-sn
两个参数是表示只进行主机扫描查看存活主机,不使用该参数的话在root用户执行nmap,会在主机扫描之后进行端口探测,在同一个局域网下使用的是ARP进行探测的,如果不是在同一个局域网下的话:
- root用户会发送四种报文分别是ICMP请求、ICMP时间戳、SYN、ACK
- 普通用户发送SYN报文
同一个局域网下
- ┌──(root💀kali)-[~]
- └─# nmap -sn 192.168.127.130-140
复制代码
不同局域网下时root
- ┌──(root💀kali)-[~]
- └─# nmap -sP 114.114.114.114
复制代码
-PE
发送ICMP请求报文探测主机的存活
原理是发送ICMP回声请求报文,也就相当于ping主机查看是否收到回复来判断主机是否在线
- ┌──(root💀kali)-[~]
- └─# nmap -sP -PE 114.114.114.114
复制代码
-PP
发送ICMP的时间戳请求报文来判断主机是否在线
原理是如果主机在线将会收到一个时间回复报文,如果不在线将收不到任何回复,时间戳请求时允许一个主机向另一个主机请求查询当地的时间不包括日期
- ┌──(root💀kali)-[~]
- └─# nmap -sP -PP 114.114.114.114
复制代码
-PM
向主机发送ICMP地址掩码请求报文,判断主机存活性
原理是发送ICMP地址掩码请求报文,向其他系统请求查询自己的掩码信息,主机在线会收到ICMP掩码回复报文,不在线则收不到任何回复,存在一定不准确性可能主机对该报文不进行回复
- ┌──(root💀kali)-[~]
- └─# nmap -sP -PM 114.114.114.114
复制代码
-PA
发送ACK报文探测主机存活
原理是通过向目标端口发送TCP三次握手中的第三次握手的ACK确认报文,如果端口是开放的将回复一个RST报文表示没有收到请求报文该确认报文无效,如果未开放将收不到任何回复,通过端口的开放判断主机在线情况,默认是80端口可以使用-PU53指定为53端口或其他端口
- ┌──(root💀kali)-[~]
- └─# nmap -sP -PA 114.114.114.114
复制代码
如果是非root用户使用发送的是SYN报文,因为ACK报文需要root权限才能构造
-PS
使用SYN进行主机探测,通过向目标主机的80端口发送SYN报文探测主机的存活性,也可以指定端口-PS端口即可,如-PS8080表示向8080端口发送数据包
原理是通过构造TCP三次握手中的SYN请求连接数据包,向目标端口发起TCP连接请求,如果端口开放会进入第二次握手,目标主机回复一个ACK报文,如果端口关闭将无法收到任何回复,以此来判断端口是否开放通过端口的开放与否来判断主机是否在线
- ┌──(root💀kali)-[~]
- └─# nmap -sP -PS 114.114.114.114
复制代码
-PU
向UDP端口发送数据包,发送一个空的UDP报文到指定的端口上默认的端口是40125来探测主机的存活
原理是向目标主机端口发送一个UDP报文如果端口开放,会返回一个ICMP目标端口不可达的报文。如果端口是关闭的将收到其他的ICMP错误报文,以此判断端口的开放通过端口开放判断主机是否在线
- ┌──(root💀kali)-[~]
- └─# nmap -sP -PU53 114.114.114.114
复制代码
-PY
向目标主机发送SCTP的INIT报文探测主机的存活性
- ┌──(root💀kali)-[~]
- └─# nmap -sP -PY 114.114.114.114
复制代码
-PR
在局域网当中使用ARP协议进行主机存活性探测,这种方法对防火墙的穿透有比较好效果,因为防火墙不会拦截ARP报文
- ┌──(root💀kali)-[~]
- └─# nmap -sP -PR 192.168.1.1-100
复制代码
-P0/-Pn
该参数表示不进行主机存活探测把所有主机当作是在存活的进行后续的端口扫描或其他扫描
- ┌──(root💀kali)-[~]
- └─# nmap -P0 114.114.114.114
复制代码
-n
表示不进行DNS解析,默认情况下在主机探测的时候会对目标ip进行DNS反向解析,也就是查看ip对应的域名,从上面的抓包情况也可以看到基本每次探测都会带有一个DNS数据包,使用-n参数就不会再进行发送DNS包了
- ┌──(root💀kali)-[~]
- └─# nmap -n -sP -PA 114.114.114.114
复制代码
-R
该参数是指定每次都需要进行DNS反向解析,主机扫描的时候默认指定了该参数从上面抓包就可看到每次都有一个反向解析的DNS数据包
–system-dns
使用系统自带DNS解析器,默认情况DNS解析器是我们配置DNS服务器地址使用该参数表示使用系统自带的DNS解析器
- ┌──(root💀kali)-[~]
- └─# nmap -sP -PA --system-dns 114.114.114.114
复制代码
可以看到抓的包中没有再向配置的DNS服务器发送解析请求
–dns-server
指定DNS服务器地址
- ┌──(root💀kali)-[~]
- └─# nmap -sP 114.114.114.114 --dns-servers 192.168.1.156
复制代码
三、端口探测
3.1 端口探测的参数
端口扫描技术
官方端口扫描文档
-sT:使用TCP连接探测端口的开放,使用connect连接对方的TCP端口查看端口是否打开,存在缺点会在对方主机上留下大量的连接信息
-sS:使用半开扫描,向对方主机发送TCP连接的第一步SYN请求报文,如果端口开放也不进行TCP连接在第三次握手的时候回复RST关闭连接,由于没有进行完整的TCP连接所以一般不会在对方主机留下连接记录
-sF:发送FIN释放连接报文,如果对方端口打开将收不到任何回复,如果端口关闭将收到RST报因为没有该连接
-sU:使用UDP协议探测对方的UDP端口的开放状态
-sA:使用TCP的ACK确认报文探测端口的开放,端口开放将收到一个RST说明没有收到任何SYN请求报文这个确认报文无效,端口关闭将得不到任何回复
-sN:使用NULL数据包对目标端口进行探测
-sX:发送一个将FIN、PSH、URG等标志位打开的数据包,根据RFC793规定这些数据包回复一个RST数据包
-sW:TCP窗口扫描
-sM:TCP Maimon扫描
--scanflags \:自定义TCP扫描
-sI:空闲扫描
-sO:ip协议扫描
-b:FIN bounces扫描
端口扫描的选项配置
-p :设置端口使用-p-表示扫描所有端口-p 1-1000扫描1-1000的端口,-p 80,8080扫描80和8080两个端口
--exclude-ports \:在端口范围中排除指定的端口
-F:使用快速模式
-r:不进行随机端口扫描,Nmap默认会对端口扫描顺序进行随机化使用该参数表示进行有序的扫描
--top-ports \: 对常用的端口进行扫描节约时间
--port-ratio \:扫描指定频率以上的端口
3.2 参数原理与演示
-sT
原理就是对TCP端口进行建立连接,根据是否可以连接上来判断端口是否开放
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -sT -p 53 114.114.114.114
复制代码
抓包可以看到向我们指定的53端口发起SYN连接请求,然后收到ACK之后回复ACK确认报文完成三次握手建立TCP连接,之后释放连接
-sS
原理使用半开扫描也就是不进行TCP全连接,在收到对方的ACK报文之后回复RST端口连接,节约时间的同时由于没有进行全连接一般不会在对方主机上留下连接记录
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -sS -p 53 114.114.114.114
复制代码
通过抓包可以看到在收到对方回复的ACK之后没有回复ACK,而是直接回复RST断开连接
-sA
原理是发送ACK报文如果对方的端口开放的会收到一个RST报文,表示之前没有收到SYN连接请求端口这个连接,如果关闭将收不到任何报文
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -sA -p 53 114.114.114.114
复制代码
抓包可以看到发送一个ACK报文之后收到一个RST报文
-sF
原理是发送FIN报文断开连接,但是主机没有该连接所以不做任何处理,但是如果主机端口关闭回复一个RST表示断开连接端口时关闭的,如果对该数据包进行了过滤也会收不到任何回复所以在判断的时候可能存在一定的不准确性
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -sF -p 53 114.114.114.114
复制代码
这里主机可能对FIN数据包进行了过滤也会导致没有收到任何回复,在结果中就会显示open|filtered表示打开或者是被过滤了
-sU
对UDP端口进行探测,这个扫描的速度是非常慢的,对于关闭的端口会回复一个ICMP端口不可达报文,其他的时候可以判断为被过滤或是打开的
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 53,12345 -sU 114.114.114.114
复制代码
抓包没有收到任何回复,则判断为打开或者是被过滤了
-sN
原理是向目标端口发送一个没有任何标记的数据包,也就是不指明是SYN还是ACK等数据包,如果端口是关闭的将收到一个RST,端口关闭将收不到任何报文
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -sN -p 53 114.114.114.114
复制代码
抓包可以看到在数据包中没有任何指明是什么数据是none,但是这里没有收到RST报文有可能是主机过滤该类型的数据不进行回复的,所以在结果出会显示open|filtered打开或者是被过滤了无法进行判断
-sX
其原理是发送一个将FIN、PSH、URG标志设为1的报文,根据RFC文档描述端口关闭响应一个RST报文
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 53,12345 -sX 114.114.114.114
复制代码
抓包查看结果发现都没有返回RST可能是对该数据包进行了过滤也可能是关闭的
-sW
原理是启用端口扫描,在TCP的协议中存在一个窗口值,对于开放的端口的窗口值一般为一个整数而对于一个关闭的端口的窗口值一般为0,通过判断窗口的值来判断端口是否开放,存在一定的不准确性
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 53,12345 -sW 114.114.114.114
复制代码
抓包可以看到窗口的大小为整数所以nmap就直接判断端口是开放的,可是实际的情况可能端口并没有开放
-sM
其原理和Null扫描以及Xmas差不多只不过这里设置的标志位是FIN和ACK,根据RFC793描述,无论开放端口与否都回复一个RST报文,但是真实的系统中很多BCD都是收到该报文端口开放的时候直接丢弃不做任何回复
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 53,12345 -sM 114.114.114.114
复制代码
抓包可以看到都回复了RST报文所以都判断位关闭,但是真实的情况可能是遵从RFC协议的描述,都回复RST所以结果存在不准确性
–scanflags
定制标志位,选项可以是一个数字标记值如9 (PSH和FIN), 但使用字符名更容易些。 只要是URG, ACK,PSH, RST,SYN,and FIN的任何组合就行。例如,–scanflags URGACKPSHRSTSYNFIN设置了所有标志位,但是这对扫描没有太大用处。 标志位的顺序不重要。
除了设置需要的标志位,您也可以设置 TCP扫描类型(如-sA或者-sF)。 那个基本类型告诉Nmap怎样解释响应。例如, SYN扫描认为没有响应意味着 filtered端口,而FIN扫描则认为是 open|filtered。 除了使用您指定的TCP标记位,Nmap会和基本扫描类型一样工作。 如果您不指定基本类型,就使用SYN扫描。
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 53,12345 -scanflags FINPSH 114.114.114.114
复制代码
设置FIN和PSH位,抓包发现两个标志位为1
–sI
一种高级用法,不使用本机IP进行扫描,而是使用一些僵尸机进行扫描,IDC会把僵尸机当作是攻击机隐蔽性比较好
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 53,12345 -sI www.0day.co:80 114.114.114.114
复制代码
抓包可以看到对应的ip地址不再是我们本机的IP地址了
-sO
启用IP协议扫描,对支持IP协议的协议(TCP、UDP、ICMP),对这些协议进行扫描,探测目标主机上开启协议,同样可以使用-p选项这里的-p指定的就是协议号了,在IP协议的头部协议域中进行循环探测,根据响应进行判断
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 1,3,6 -sO 114.114.114.114
复制代码
抓包可以看到向目标主机发送了ip协议报文,设置了协议域为3,同时发送了协议域为1表示TCP,为6表示ICMP
-b
FTP协议的一个特征RFC 959 支持代理ftp连接。它允许用户连接到一台FTP服务器,然后要求文件送到一台第三方服务器。 许多服务器已经停止支持它了。可能导致FTP服务器对其它主机端口扫描。 只要请求FTP服务器轮流发送一个文件到目标主机上的所感兴趣的端口。 错误消息会描述端口是开放还是关闭的。 这是绕过防火墙的好方法,因为FTP服务器常常被置于可以访问比Web主机更多其它内部主机的位置。 Nmap用-b选项支持ftp弹跳扫描。参数格式是 :@:。 是某个脆弱的FTP服务器的名字或者IP地址。 您也许可以省略:, 如果服务器上开放了匿名用户(user:anonymous password:-wwwuser@)。 端口号(以及前面的冒号) 也可以省略,如果使用默认的FTP端口(21)
-p
-p参数主要是用来指定端口的在IP协议扫描当中也可以用来指定协议号,可以使用-p-表示所有端口、-p 1-1000表示1-1000端口、-p 80,8080表示扫描80和8080两个端口
如下所示表示只扫描53和12345端口,也就是指向这两个端口发送数据包进行端口探测
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 53,12345 114.114.114.114
复制代码
–exclude-ports
排除端口范围中的端口,也就是将我们扫描的范围中的一些不需要扫描的端口排除掉
如下表示从1-1000端口中排除掉80和8080端口,不对其进行扫描
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 1-1000 --exclude-ports 80,8080 114.114.114.114
复制代码
-r
指定端口扫描的顺序不是随机性的,而是顺序的进行
如下没有使用-r
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 1-20 114.114.114.114
复制代码
抓包发现发包的顺序是混乱的随机发送
当使用了-r参数之后
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 1-20 -r 114.114.114.114
复制代码
抓包可以看到数据包的顺序是有序的从1到20端口依此进行探测后面的有的是发的第二个数据包因为端口是关闭状态的时候会发送两个数据包进行探测
-F
指定为快速扫描扫描的速度会很快,因为不是所有端口都进行扫描而是扫描默认的端口,这些端口在nmap-services中有设置,也可以使用参数--datadir设置自己默认端口文件
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -F -r 114.114.114.114
复制代码
抓包看到扫描地端口明显少了很多
–top-ports
指定扫描常见地可能开放地1000个端口中的概率最高的n个,需要在该参数后加上一个数字,这些端口同样在nmap-services中有设置
如下扫描前10个端口,结果中会显示扫描的10个端口的情况
- ┌──(root💀kali)-[~]
- └─# nmap -P0 --top-ports 10 -r 114.114.114.114
- Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
- Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-24 12:01 CST
- Nmap scan report for public1.114dns.com (114.114.114.114)
- Host is up.
- PORT STATE SERVICE
- 21/tcp filtered ftp
- 22/tcp filtered ssh
- 23/tcp filtered telnet
- 25/tcp filtered smtp
- 80/tcp filtered http
- 110/tcp filtered pop3
- 139/tcp filtered netbios-ssn
- 443/tcp filtered https
- 445/tcp filtered microsoft-ds
- 3389/tcp filtered ms-wbt-server
- Nmap done: 1 IP address (1 host up) scanned in 3.08 seconds
复制代码
–port-ratio
扫描一定频率以上的端口,使用方法同--top-ports类似
四、版本探测
对于版本探测的原理,在nmap-services中保存了约2200条各种报文的信息,Nmap根据收到的报文的回复以及常见端口对应的服务如22对应ssh服务,结合对端口所开放的服务以及对应的服务的版本进行判断
4.1 服务版本侦测参数
-sV:启用服务版本探测功能
--version-intensity \:设置探测的强度
--version-light:轻量级扫描
--version-all:重量级扫描
--version-trace:获取版本详细信息
--sR:RPC扫描
4.2 参数演示与原理
-sV
启用服务版扫描
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 80,22 -sV ip
复制代码
抓取数据包,可以发现除了端口扫描所发送的SYN报文之外还发送了ACK报文,FIN/ACK报文以及对网站进行了访问发起了GET和POST请求,而Nmap就是根据这些返回的数据包在nmap-services中进行对比判断出端口所启动的服务以及版本号的
–version-intensity
设置扫描强度,范围是0-9默认的强度是7,相应的值越大准确度也就越高但是时间也就越长
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 80,22 -sV --version-intensity 0 ip
复制代码
可以看到设置为0了之后的数据包比起默认的7少了很多
–version-light
轻量级扫描也就是将前面的扫描强度的值设置为5
–version-all
重量级扫描扫描强度为9的时候就是重量级扫描
–version-trace
获取详细信息,不只是输出结果会将过程进行显示,如去探测如进行TCP连结请求,发起GET请求等等
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 80,22 -sV --version-trace 192.168.127.139
- Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
- Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-24 12:51 CST
- --------------- Timing report ---------------
- hostgroups: min 1, max 100000
- rtt-timeouts: init 1000, min 100, max 10000
- max-scan-delay: TCP 1000, UDP 1000, SCTP 1000
- parallelism: min 0, max 0
- max-retries: 10, host-timeout: 0
- min-rate: 0, max-rate: 0
- ---------------------------------------------
- NSE: Using Lua 5.3.
- NSE: Arguments from CLI:
- NSE: Loaded 45 scripts for scanning.
- mass_rdns: Using DNS server 192.168.127.2
- mass_rdns: 0.02s 0/1 [#: 1, OK: 0, NX: 0, DR: 0, SF: 0, TR: 1]
- DNS resolution of 1 IPs took 0.02s. Mode: Async [#: 1, OK: 1, NX: 0, DR: 0, SF: 0, TR: 1, CN: 0]
- 数据包捕获筛选器(设备lo):dst主机192.168.127.139和(icmp或icmp6或((tcp或udp或sctp)和(src主机192.168.127.139)))
- 总发送速率:1269.84包/秒,55873.02字节/秒。
- NSOCK INFO[0.3980s]NSOCK_iod_new2():NSOCK_iod_new(iod#1)
- NSOCK INFO[0.3990s]NSOCK_connect_tcp():请求到192.168.127.139:80(IOD#1)EID 8的tcp连接
- NSOCK INFO[0.3990s]NSOCK_trace_handler_callback():callback:EID 8的连接成功[192.168.127.139:80]
- 服务扫描发送探测空到192.168.127.139:80(tcp)
- NSOCK INFO[0.3990s]NSOCK#u read():来自IOD#1[192.168.127.139:80]的读取请求(超时:6000ms)EID 18
- NSOCK INFO[6.4070s]NSOCK_trace_handler_callback():callback:EID 18的读取超时[192.168.127.139:80]
- 服务扫描发送探测GetRequest到192.168.127.139:80(tcp)
- NSOCK INFO[6.4070s]NSOCK_write():将18个字节的请求写入IOD#1 EID 27[192.168.127.139:80]
- NSOCK INFO[6.4070s]NSOCK#u read():来自IOD#1[192.168.127.139:80]的读取请求(超时:5000ms)EID 34
- NSOCK INFO[6.4070s]NSOCK_trace_handler_callback():callback:EID 27的写入成功[192.168.127.139:80]
- NSOCK INFO[6.4080s]NSOCK_trace_handler_callback():callback:EID 34[192.168.127.139:80](8737字节)的读取成功
- 服务扫描匹配(探测GetRequest与GetRequest行10502匹配):192.168.127.139:80是http。版本:| Apache httpd | 2.4.46 |(Debian)|
- NSOCK INFO[6.4080s]NSOCK_iod_delete():NSOCK_iod_delete(iod#1)
- NSE:脚本扫描192.168.127.139。
- NSE:开始运行级别1(共2个)扫描。
- NSE:根据192.168.127.139:80启动hnap信息。
- NSOCK INFO[6.4300s]NSOCK_iod_new2():NSOCK_iod_new(iod#1)
- NSOCK INFO[6.4320s]NSOCK_connect_tcp():请求到192.168.127.139:80(IOD#1)EID 8的tcp连接
- NSE:根据192.168.127.139:80启动http trane信息。
- NSE:针对192.168.127.139:80启动https重定向。
- NSOCK INFO[6.4320s]NSOCK_iod_new2():NSOCK_iod_new(iod#2)
- NSOCK INFO[6.4330s]NSOCK_connect_tcp():请求到192.168.127.139:80(IOD#2)EID 16的tcp连接
- NSE:根据192.168.127.139:80启动vmware版本。
- NSOCK INFO[6.4330s]NSOCK_iod_new2():NSOCK_iod_new(iod#3)
- NSOCK INFO[6.4330s]NSOCK_connect_tcp():请求到192.168.127.139:80(IOD#3)EID 24的tcp连接
- NSE:[hnap info 192.168.127.139:80]HTTP:Host返回正确的404结果。
- NSE:完成了针对192.168.127.139:80的https重定向。
- NSE:[vmware版本192.168.127.139:80]无法下载文件:/sdk
- NSE:完成了针对192.168.127.139:80的vmware版本。
- NSE:[http trane info 192.168.127.139:80]http:Host返回正确的404结果。
- NSE:根据192.168.127.139:80完成hnap信息。
- NSE:根据192.168.127.139:80完成http特灵信息。
- NSE:开始运行级别2(共2个)扫描。
- NSE:根据192.168.127.139:80启动http服务器头。
- NSE:完成了针对192.168.127.139:80的http服务器头。
- 192.168.127.139(192.168.127.139)的Nmap扫描报告
- Host is up (0.000039s latency).
- Scanned at 2021-11-24 12:51:44 CST for 6s
- PORT STATE SERVICE VERSION
- 22/tcp closed ssh
- 80/tcp open http Apache httpd 2.4.46 ((Debian))
- Final times for host: srtt: 39 rttvar: 3756 to: 100000
- Read from /usr/bin/../share/nmap: nmap-payloads nmap-service-probes nmap-services.
- Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
- Nmap done: 1 IP address (1 host up) scanned in 6.47 seconds
复制代码
五、系统探测
5.1 系统探测的参数
-O:
--osscan-limit:只对满足有开放和关闭端口的主机进行系统探测,需要搭配-O或-A参数时才有效
--osscan-guess:
5.2 参数演示和原理
-O
系统的探测基于的原理有很多,比如有TTL的值在进行ping的时候,不同的操作系统的值是存在一定区别的。也可以根据TCP响应来判断,如不同的系统的ACK序号值取值存在区别。也可以基于ICMP的响应,不同的操作系统对ICMP报文的响应不同。在/usr/share/nmap/nmap-os-db保存了不同操作系统的指纹特征,在使用-O参数时会构造数据包发送根据返回的信息在该数据库中进行比对,具体的信息在nmap的官方文档中存在详细描述
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 1231,53 -O 192.168.1.156
复制代码
通过对比没加-O参数的时候对应的发送的数据包如下,只发送了TCP报文只有四个有一个端口开放之后断开连接回复的RST
如果加了-O参数之后的数据包可以看到除了前面的四个之外还多了很多的数据包有TCP协议、UDP协议、ICMP协议,官方文档说会向开放或关闭的端口发送最多16个数据包进行探测,根据RFC标准文档当中存在歧义的部分根据响应区别系统
Nmap 支持的 TCP/IP 指纹识别方法
Nmap OS 指纹识别通过向目标机器的已知打开和关闭端口发送最多 16 个 TCP、UDP 和 ICMP 探测来工作。这些探测器专门设计用于利用标准协议 RFC 中的各种歧义。然后 Nmap 侦听响应。分析并组合这些响应中的数十个属性以生成指纹。如果没有响应,每个探测数据包都会被跟踪并至少重新发送一次。所有数据包都是具有随机 IP ID 值的 IPv4。如果没有找到这样的端口,则跳过对开放 TCP 端口的探测。对于关闭的 TCP 或 UDP 端口,Nmap 将首先检查是否找到了这样的端口。如果没有,Nmap 将随机选择一个端口并希望最好。
–osscan-limit
只对满足一定条件的主机进行系统探测,需要满足有开放和关闭的端口的主机进行探测需要搭配-O或-A参数使用
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -O --osscan-limit 192.168.1.154
复制代码
–osscan-guess
对操作系统进行猜测,以百分比的形式进行猜测操作系统的类型
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -O --osscan-guess 192.168.1.5
复制代码
六、防火墙和IDS的绕过
6.1 绕过防护的参数
-f; --mtu :分片数据包,将TCP的头部信息分成多个数据包放入IP数据部分进行传输,对于一些基于数据包检测的规则可以进行绕过
-D :诱饵扫描,设置IP向目标主机发送数据,可以隐藏自己的·IP地址让检测设备无法判断是诱饵机扫描还是真实的在扫描
-S :恶搞源地址,指定一个源地址向目标发送数据包,但是收不到任何回复因为数据会发送到源地址上
-e :指定在哪个网口上收发数据
-g/--source-port :源端口欺骗因为有一些规则不完善为了简单一点允许一些特定端口的所有流量流入从而导致这种探测,如Windows 2000 和 Windows XP 附带的 IPsec 过滤器包含一个隐式规则,允许来自端口 88 (Kerberos) 的所有 TCP 或 UDP 流量
--proxies :
--data :指定一个二进制的字符串在数据包中进行发送,十六进制可以使用0xaabb或\xaa\xbb的形式发送
--data-string :指定一个字符串在数据包中作为有效载荷进行发送,只有使用嗅探器或自定义的IDS规则才能发现内容
--data-length : 指定数据包的大小,一般只发送协议的报文头如TCP的是40字节、ICMP为28字节,使用该选项来指定发送的数据的大小填充一些随机的字符绕过数据包过滤
--ip-options :
--ttl :将已发送的ipv4数据包的ttl值设置为指定值
--spoof-mac :
--badsum:
6.2 参数演示
-f
原理是利用数据包分片将一个TCP头部信息分成多个数据包,放入不同的IP数据包当中,这样一个数据包只有TCP头部信息的一部分一些基于数据包检测规则的设备就可能被绕过。如一个IDS的检测规则是收到的数据包中TCP头部的FIN、ACK等都是1则认为是探测的数据包进行报警,但是现在只有TCP头部的FIN部分其他的部分在另外的数据包中那么检测规则就可能失效
一个TCP数据的头部信息是20个字节,IP数据包的最大传输单元MTU为1500个字节,而使用该选项的话一个IP的数据包的最大传输单元被设置为8甚至更小(也可以使用–mtu设置最大传输单元的字节数,但是必须是8的倍数),也就是说一个20字节的TCP头部被拆为了三个部分放入了IP的数据部分进行传输
- ┌──(root💀kali)-[~]
- └─# nmap -Pn -sF -p 53 -f 114.114.114.114
复制代码
抓包可以看到此时发送多个IP数据包
点击每个IP数据包可以看到数据部分为8个字节,protocol为TCP也就是上层协议为TCP协议
- ┌──(root💀kali)-[~]
- └─# nmap -Pn -sX -p 53 -f --mtu 16 114.114.114.114
复制代码
抓包可以看到数据包变少了,数据部分为16字节
-D
使用诱饵欺骗的方式进行扫描,指定或随机生成IP地址利用该IP向目标主机发送数据,以达到迷惑管理员让其觉得这些所有都是诱饵,其实我们地真实IP就在其中,从而达到隐藏IP的目的,但是这种方法在系统探测或TCP扫描的时候是无效的
- ┌──(root💀kali)-[~]
- └─# nmap -Pn -p 53 -D 192.168.127.5,192.168.127.6 192.168.1.7
复制代码
抓包可以看到正在使用指定的IP向目标发送数据包,但是有一个是真实IP的,因此管理员可能觉得这些主机全部都是诱饵不进行处理但是又是有一个是真实的,这也需要我们指定的诱饵机不能全部都是不在线的不然很容易被识破哪个是真实的并且会造成目标主机的SYN泛洪攻击
-g/–source-port
源端口欺骗,因为有一些规则不完善或者管理员为了简单一点允许一些特定端口的所有流量流入从而导致这种探测,如Windows 2000 和 Windows XP 附带的 IPsec 过滤器包含一个隐式规则,允许来自端口 88 (Kerberos) 的所有 TCP 或 UDP 流量
- ┌──(root💀kali)-[~]
- └─# nmap -Pn -p 53 --source 53 192.168.1.7
复制代码
抓包可以看到源端口和目的端口都是53
–data
指定一个二进制或十六进制的字符串作为有效载荷利用NBSS协议进行发送,
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 445 --data 0x614a 192.168.43.62
复制代码
抓包可以看到发送了一个NBSS协议数据包数据就是我们指定的数据
–data-string
指定一个字符串作为有效载荷需要使用双引号进行包裹
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 445 --data-string "this payload" 192.168.43.62
复制代码
抓包可以看到数据中包含了我们输入的数据
–data-length
nmap发送的数据一般只包括协议的头部信息如TCP头部40字节、ICMP的28字节,使用该参数指定发送的有效载荷的大小会填充一些无用的信息绕过一些基于数据包的过滤规则
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 445 --data-length 50 192.168.43.62
复制代码
抓包可以看到TCP协议的payloady的长度为50个字节使用的是一些无用的字符串进行填充的
–ttl
设置ipv4数据包的ttl的值,从不同的网络进入到对方主机因为没经过一个路由器ttl值就会加1设置为128表示需要经过128个路由传递到达对方主机
- ┌──(root💀kali)-[~]
- └─# nmap -P0 -p 445 --ttl 128 192.168.43.62
复制代码
抓包发现ipv4报文的ttl选项设置为128了