220 likes | 341 Views
FACE. 端口扫描技术. 一、概述. 网络安全扫描系统可以自动检测远程或本地主机安全脆弱点,通过采用适度的模拟攻击对目标可能存在的已知安全漏洞进行逐项检查,发现远程服务器的各种 TCP 端口的分配及提供的服务和它们的软件版本,根据扫描结果向系统管理员提供周密可靠的安全性分析报告,为提高网络安全整体水平提供重要依据。.
E N D
FACE 端口扫描技术
一、概述 网络安全扫描系统可以自动检测远程或本地主机安全脆弱点,通过采用适度的模拟攻击对目标可能存在的已知安全漏洞进行逐项检查,发现远程服务器的各种TCP端口的分配及提供的服务和它们的软件版本,根据扫描结果向系统管理员提供周密可靠的安全性分析报告,为提高网络安全整体水平提供重要依据。 网络扫描的工作原理是基于端口的。端口这个概念是在传输层提出的,是传输层标识服务的手段。传输层有两个重要的传输协议:传输控制协议(TCP)及用户数据报协议(UDP)。UDP协议比较简单,TCP协议是大部分常用的应用层协议(如FTP、Telnet、SMTP等等)的基础。
二、理论基础 1.1、TCP通信 TCP提供了连在网上的两个终端节点之间的可靠的全双工流连接,每个TCP连接可以用一个四元组: {源IP地址, 目的IP地址, 源PORT号, 目的PORT号} 来描述,每个发送字节都用一个32位的序列号标记,而接收方则对该序列号予以确认。
通信图 Client Server Connect() SYN_SENT ESTABLISHED Connect return WRITE READ Return Close() FIN_WAIT_1 FIN_WAIT_2 TIME_WAIT SYN x, MSS=m1 LISTEN Accept() SYN_RCVD ESTABLISHED Accept return READ Process Write Closeed Return 0 CLOSE_WAIT Close() LAST_ACK CLOSED SYN y,ACK x+1,MSS=m2 ACK y+1 Data (Request) Data (Reponse) ACK Data FIN xf ACK xf+1 FIN yf ACK yf+1 图1 TCP通信过程示意图
状态图 原理 TCP通信状态转换示意图
变量 为了便于分析,引入下面一些变量来描述连接状态: RCV_SEQ:服务方下一个字节发送时用来作标记的序列号。 RCV_ACK:服务方接收的下一个字节应具有的序列号。 RCV_WIND:服务方基于“滑动窗口”流量控制机制的接收窗口大小。 RCV_SEQ0:初始的接收序号。 SND_SEQ:客户方下一个字节发送时用来作标记的序列号。 SND_ACK:客户方接收的下一个字节应具有的序列号。 SND_WIND:客户方基于“滑动窗口”流量控制机制的接收窗口大小。 SND_UNA:客户方未得到应答的发送序号 ; SND_SEQ:客户方下一个发送序号 ; SND_SEQ0:初始的发送序号。 SEG_SEQ:报文序号 ; SEG_ACK:报文应答号 ; SEG_LEN:报文长度 ; SEG_WIND:接收方传输给发送方的接收窗口大小,用于流量控制。
1)建立连接 Server Client 发送SYN seq=x SYN seq=x 接收SYN报文 发送SYN seq=y, ACK=x+1 SYN seq=y, ACK=x+1 接收SYN+ACK报文 发送ACK=y+1 ACK=y+1 接收ACK报文 建立TCP正常连接示意图 1)建立连接。
1)建立连接 建立连接时,若连接处于无数据交换的状态,有: SND_ACK=RCV_SEQ RCV_ACK=SND_SEQ。 成立,但当存在数据交换的时候,上面的关系式就应改为: RCV_ACK≤SND_SEQ≤RCV_ACK+RCV_WIND, SND_ACK≤RCV_SEQ≤SND_ACK+SND_WIND。
客户方发送数据时会设置SEG_SEQ=SND_SEQ和SEG_ACK=SND_ACK。TCP通过“三次握手”机制来建立连接。设客户方的初始序列号为SND_SEQ0,服务方的初始序列号为RCV_SEQ0,连接建立完毕后,连接双方将处于ESTABLISHED状态。此时,有下面的等式成立:客户方发送数据时会设置SEG_SEQ=SND_SEQ和SEG_ACK=SND_ACK。TCP通过“三次握手”机制来建立连接。设客户方的初始序列号为SND_SEQ0,服务方的初始序列号为RCV_SEQ0,连接建立完毕后,连接双方将处于ESTABLISHED状态。此时,有下面的等式成立: SND_SEQ=SND_SEQ0+1 SND_ACK=RCV_SEQ0+1 RCV_SEQ=RCV_SEQ0+1 RCV_ACK=SND_SEQ0+1
2)传输数据 2)传输数据。 当连接双方进入ESTABLISHED状态后,对服务方而言,只有收到的报文的序列号在范围[RCV_ACK,RCV_ACK+RCV_WIND]内,该报文才会被接受。 对客户方而言,只有收到的报文的序列号在范围[SND_ACK,SND_ACK+SND_WIND]内,该报文才会被接受。否则,报文将被抛弃,并且接收方会发送一个反馈报文,通知发送方合法的序列号范围。
3)关闭连接 (应用程序关闭连接) 发送FIN seq=x FIN x 接收FIN报文 发送ACK x+1 关闭读通道 (通知本端应用程序) ACK x+1 接收ACK报文 写通道关闭 FIN y (应用程序关闭连接) 发送FIN seq=y,ACK x+1 接收FIN+ACK报文 发送ACK y+1 关闭读通道 ACK y+1 接收ACK报文 关闭写通道 关闭连接示意图 3)关闭连接。 当主机要关闭连接的时候,它将发送一个设置了FIN或RST控制位的包,对端主机收到后就进入CLOSED状态,并将同该连接相关的各种资源释放。通常情况下,含RST标志位的包是不被确认的。任何随后而来的报文都会被简单地抛弃。
TCP包头中同攻击相关的参数有: • SourcePort:源端口号。 • DestinationPort:目的端口号。 • SequenceNumber:报文中第1个字节的序列号。 • AcknowledgementNumber:期待收到的包的序列号。 • DataOffset:数据的偏移位置(因为存在变长包头)。 • FlagBits:特定的控制信息,包括: • FIN:设成1,表示请求关闭连接。 • SYN:设成1,表示请求建立连接。 • RST:设成1,请求重置连接。 • PSH:设成1,接数据后,不缓存,立即传给高层应用程序。 • ACK:设成1,确认序列号有效。 • URG:设成1,使用紧急数据指针。 • Window:发送方的滑动窗口大小。 • Checksum:TCP包中包头和数据的校验和。 • Options:TCP选项,包括下面几种选项: • SEG_SEQ:描述该包的序列号。 • SEG_ACK:描述该包携带的确认序列号。 • SEG_FLAG:描述FlagBits控制标记位的值。
三、端口扫描技术 根据扫描时发送端发送的报文类型来分,端口扫描技术可分为:TCP链接扫描、TCP同步扫描、FIN系列扫描、UDP扫描、ACK(应答)扫描和窗口扫描。
1、 TCP connect扫描 1、 TCP connect扫描技术 扫描者向被扫描机器的目标端口发送SYN报文,等待目标端口发送SYN&ACK报文,收到后返回报文后,证明目标端口开放,于是向目标端口发送ACK报文,扫描机进入连接状态,目标机收到ACK报文后,也进入连接状态。如TCP状态图所示,源主机和目标主机双双进入ESTABLISHED状态,即完成“三次握手”。 对SOCKET用户来说,只需调用一个connect()函数,检查connect返回状态就可完成这三个报文交换。
如果发送SYN报文后,未收到目标端口的SYN&ACK响应报文,可以多次重发SYN报文,若都失败,connect()函数将返回ETIMEOUT的错误。如果发送SYN报文后,未收到目标端口的SYN&ACK响应报文,可以多次重发SYN报文,若都失败,connect()函数将返回ETIMEOUT的错误。 如果目标端口没有服务进程在等待连接,目标机的TCP协议将返回RST数据段,connect()函数受到该数据段后,立即返回错误ECONNREFUSED。 这种扫描技术简单易行, 它不需超级用户权限,任何希望管理端口服务的人都可以使用。但如果将它运用于探测别人的网络服务时,很容易被目标主机记录。
2、 TCP SYN 扫描技术 TCP同步扫描其实就是向目标端口发送伪造的SYN控制报文, 如果SYN标志位置1,目标机先进行安全性检查,再进行优先级检查,如果其中之一不能通过检查, 目标端口处于CLOSED状态,发送RST响应报文,报文格式为: [SEQ =0] [ACK =SEG_SEQ +SEG_LEN] [CTL =RST,ACK] 然后丢弃到达的SYN控制报文,处理完成 。 (虽然协议中这么要求,但是很多网络内核的TCP不进行这样的检查 )。
如果优先级和安全性两项检查通过,则目标端口处于LISTEN即监听状态。设置如果优先级和安全性两项检查通过,则目标端口处于LISTEN即监听状态。设置 RCV_NXT =SEG_SEQ +1,RCV_SEQ0 =SEG_SEQ, 并且选择一个随机值INI_S作为初始序列号。发送SYN&ACK报文,格式为: [SEQ =INI_S] [ACK =RCV_NXT] [CTL =SYN,ACK] 这时SND_NXT被设置为INI_S +1,SND_UNA设置为INI_S,进入SYN_RCVD状态。 随后扫描方发送一个RST控制报文,处于SYN_RCVD状态的接收方端口默默丢弃它,然后返回LISTEN状态。这样,被扫描方就没有任何察觉,因为扫描前后被扫描主机状态没有改变。
3、 TCP FIN 扫描 3、 TCP FIN 扫描技术 正常的TCP通信是先进行“三次握手”的确认连接,然后进行数据传输和关闭连接。TCP FIN 扫描则绕过确认连接,直接向目标主机的目标端口发送FIN控制报文。处于CLOSED状态的目标端口发送RST控制报文,报文格式为: [SEQ =0] [ACK =SEG_SEQ +SEG_LEN] [CTL =RST,ACK] 而处于LISTEN状态的目标端口则忽略到达报文,不作任何应答。判断是否有报文收到,就可知目标主机的端口状态。
FIN系列扫描还有两种构造发送报文的格式:一种是报文的RST、FIN、URG标志全部置“1”,另一种是关闭所有标志。无论是哪一种,收到的响应报文都是一样的。但是,有些系统 (如Windows)却不遵守上面所说的响应规则,全部忽略。所以这种技术对系统的依赖性很强。一个积极的副作用是可以通过它判断目标系统是Windows系统。
4、 UDP扫描技术 4、 UDP扫描技术 UDP协议和TCP协议一样是建立在IP协议基础上,但UDP提供非面向连接和不可靠的数据报服务。应用程序可以构造一个UDP数据报,通过低层的IP协议传给目标机,目标机的UDP协议收到UDP数据报后,将数据报传给数据报定义的目标端口相应的接收缓冲区。 如果UDP目的端口打开,接收缓冲区未满则没有应答报文,当接收缓冲区已满时,丢弃该UDP数据报,但不返回错误信息;如果目的端口关闭,则返回会端口不可达(Unreachable)的ICMP报文。这样,只需构造一个UDP报文,观察响应报文就可知道目标端口的状态。
5、 ACK扫描技术 5、 ACK扫描技术 主要用来探测过滤性防火墙的过滤规则。应用程序可以构造一个数据包,将ACK标志位置1(不设RST标志),目标机TCP协议受到ACK报文后,会产生RST响应报文。 若目标端口处于CLOSED状态,TCP发送RST响应报文。报文的格式: [SEQ =SEG_ACK] [CTL =RST] 若目标端口处于LISTEN状态, 因为处于这一状态的端口没有发送任何数据报文,不应收到应答报文,说明到达报文非法。TCP也发送RST响应报文,格式同上。然后丢弃到达报文,处理完成。 对于防火墙,如果端口被过滤,要么收不到报文,要么收到ICMP的目标不可达报文;相反,如果没有被过滤时,则收到上面的RST报文。
6、 WINDOW扫描 6、 WINDOW扫描技术 TCP滑动窗口协议允许随时改变窗口大小,接收方在对每个TCP数据段的确认中,除了指明下一个期待接收字节的序列号外,还包括一个窗口通告说明当前接收缓冲区的大小,以保证TCP的可靠传输和提供流量控制。一些网络实现,比如BSD4. 3,在LISTEN状态对于到达的窗口控制报文,发送的RST响应报文中却包含了当前的窗口大小。这样,只要检查RST报文的SEQ_WIND,就可通过窗口扫描得到目标端口的状态。 如果以应答报文 (ACK)的方式向目标端口发送窗口控制报文,可以和ACK扫描一样用来探测过滤性防火墙的过滤规则。