实验目标
- 掌握TCP connect()扫描
- 掌握TCP SYN扫描
- 掌握FIN数据包扫描/Xmas扫描/空扫描
- 掌握UDP扫描
- 掌握ACK扫描
实验环境
实验机器:deepin系统(GNU/Linux) nmap
目标机器:centos系统(GNU/Linux)
实验原理
端口扫描就是通过连接到目标系统的TCP或UDP端口,来确定什么服务正在运行。一个端口就是一个潜在的通信通道,也就是一个入侵通道。从对黑客攻击行为的分析和收集的漏洞来看,绝大多数都是针对某一个网络服务,也就是针对某一个特定的端口的。对目标计算机进行端口扫描,能得到许多有用的信息。
-
全TCP连接
这是最基本的TCP扫描,实现方法最简单,直接连到目标端口并完成一个完整的三次握手过程(SYN,SYN/ACK和ACK)。Socket API提供的Connect ( )系统调用,用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么Connect ( )就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大优点是不需要任何权限,系统中的任何用户都可以使用这个调用。另一个好处就是速度。如果对每个目标端口以线性的方式,使用单独的Connect()调用,那么将会花费相当长的时间,你可以通过同时打开多个套接字,从而加速扫描。这种扫描方法的缺点是很容易被目标系统检测到,并且被过滤掉。目前的系统会对连接进行记录,因此目标计算机的日志文件会显示大量密集的连接和连接出错的消息记录,并且能很快地使它关闭。如:TCP Wrapper监测程序通常用来进行监测,可以对连接请求进行控制,所以它可以用来阻止来自不明主机的全连接扫描。针对这一缺陷,便产生了TCP SYN扫描,也就是通常说的半开放扫描.
-
TCP SYN扫描
在这种技术中,扫描主机向目标主机的选择端口发送SYN数据段。如果应答是RST,那么说明端口是关闭的,按照设定就探听其它端口;如果应答中包含SYN和ACK,说明目标端口处于监听状态。由于在SYN扫描时,全连接尚未建立,所以这种技术通常被称为半打开扫描。SYN扫描的优点在于即使日志中对扫描有所记录,但是尝试进行连接的记录也要比全扫描少得多。缺点是在大部分操作系统下,发送主机需要构造适用于这种扫描的IP包,并且在通常情况下必须要有超级用户权限才能建立自己的SYN数据包
-
TCP FIN扫描
对某端口发送一个TCP FIN数据报给远端主机。如果主机没有任何反馈,那么这个主机是存在的,而且正在监听这个端口;主机反馈一个TCP RST回来,那么说明该主机是存在的,但是没有监听这个端口。由于这种技术不包含标准的TCP三次握手协议的任何部分,所以无法被记录下来,从而比SYN扫描隐蔽得多,也称作秘密扫描。另外,FIN数据包能够通过只监测SYN包的包过滤器
这种扫描技术使用FIN数据包来探听端口。当一个FIN数据包到达一个关闭的端口,数据包会被丢掉,并且会返回一个RST数据包。否则,当一个FIN数据包到达一个打开的端口,数据包只是简单的丢掉(不返回RST)。这种方法和系统实现有一定的关系,有的系统不管端口是否打开,都回复RST,如:Windows,CISCO。这种技术通常适用于UNIX目标主机,跟SYN扫描类似,FIN扫描也需要自己构造IP包。但是,也可以利用这个特点进行操作系统的探测。例如,如果使用SYN扫描发现有端口开放(回复了SYN/ACK),而使用FIN扫描发现所有端口关闭的话(按照FIN方法,恢复RST表示端口关闭,但Windows全部回复RST),则操作系统很可能是Windows系统
但现在半开放扫描已经不是一种秘密了,很多防火墙和路由器都有了相应的措施。这些防火墙和路由器会对一些制定的端口进行监视,将对这些端口的连接请求全部进行记录,这样,即使是使用半开放扫描仍然会被防火墙或路由器记录到日志中。有些IDS也可以检测到这样的扫描
-
TCP Xmas(圣诞树扫描)和TCP Null(空扫描)
这两种扫描方式是TCP FIN 扫描的变种,Xmas扫描打开FIN,URG,PUSH 标记,而NULL扫描关闭所有标记。这些组合的目的为了通过对FIN 包的过滤。当一个这种数据包达到一个关闭的端口,数据包会被丢掉并且返回一个RST数据包。如果是打开的端口则只是丢掉数据包不返回RST包。种方式的缺点跟上面的类似,都是需要自己构造数据包,只适用于UNIX主机
-
UDP ICMP 端口不可达扫描
由于UDP协议很简单,所以扫描变得相对比较困难。这是由于打开的端口对扫描探测并不发送一个确认,关闭的端口也并不需要发送一个错误数据包。幸运的是,许多主机在你向一个未打开的UDP端口发送一个数据包时,会返回一个 ICMP_PORT_UNREACH错误。这样你就能发现哪个端口是关闭的。由于 UDP 协议是面向无连接的协议,这种扫描技术的精确性高度依赖于网络性能和系统资源。另外,如果目标主机采用了大量的分组过滤技术,那么UDP扫描过程会变的非常慢。比如大部分系统都采用了 RFC1812 的建议,限定了 ICMP 差错分组的速率,比如 LINUX 系统中只允许 4 秒最多只发送 80 个目的地不可达消息,而 Solaris 每秒只允许发送两个不可到达消息,然而微软仍保留了它一贯的做法,忽略了RFC1812的建议,没有对速率进行任何限制,因此,能在很短的时间内扫完WINDOWS机器上所有64K 的UDP端口。说到这里,我想大家都应该心里有数,在什么情况下可以有效的使用UDP扫描,而不是一味去埋怨扫描器的速度慢了。UDP和 ICMP错误都不保证能到达,因此这种扫描器必须还实现在一个包看上去是丢失的时候能重新传输。同样,这种扫描方法需要具有root权限。
实验步骤
实验机为:localhost
目标机为:codebear.fun
-
不带任何命令行参数运行Nmap,显示命令语法,如图所示
扫描类型:主要有以下几种:
- -sT:扫描TCP数据包以建立的连接connect()
- -sS:扫描TCP数据包带有SYN数据的标记
- -sP:以ping方式进行扫描
- -sU:以UDP数据包格式进行扫描
- -sF,-sX,-sN:以Fin,Xmas,Null方式扫描
-
nmap -sP codebear.fun
Nmap给每个扫描到的主机发送一个ICMP echo和一个ACK, 主机对任何一种的响应都会被Nmap得到,可用来检测局主机是否正在运行
运行结果分析:目标主机正在运行
-
nmap –sT codebear.fun
Nmap将使用connect()系统调用打开目标机上相关端口的连接,并完成三次TCP握手
-
nmap -sS codebear.fun
使用半开SYN标记扫描,在一定程度上防止被扫描目标主机识别和记录。-sS命令将发送一个SYN扫描探测主机或网络。通过发送一个SYN包(是TCP协议中的第一个包)开始一次SYN的扫描。任何开放的端口都将有一个SYN|ACK响应。然而,攻击者发送一个RST替代ACK,连接中止。三次握手得不到实现,也就很少有站点能记录这样的探测。如果是关闭的端口,对最初的SYN信号的响应也会是RST,让NMAP知道该端口不在监听
-
nmap -sS -O codebear.fun
利用不同的系统对于nmap不同类型探测信号的不同响应来辨别系统
-
nmap -sS -P0 -D codebear.fun codebear.fun
伪造多个攻击主机同时发送对目标网络的探测和端口扫描,这种方式可以使得IDS 告警和记录系统失效
实验思考
connect()扫描截图:
半开放扫描截图:
主机开放的端口:
- 20:ftp服务(数据)
- 21:ftp服务(控制)
- 22:ssh服务(远程连接)
- 80:http网页默认端口
- 443:https网页默认端口
- 3306:mysql数据库服务端口
- 8888:我自己设置的宝塔面板的服务端口
- 888:phpMyAdmin默认端口