一次性付费进群,长期免费索取教程,没有付费教程。
进微信群回复公众号:微信群;QQ群:460500587
教程列表 见微信公众号底部菜单 | 本文底部有推荐书籍微信公众号:计算机与网络安全
ID:Computer-network
TCP是面向连接的协议,所以每次发出的请求都需要对方进行确认。TCP客户端与TCP服务器在通信之前需要完成三次握手才能建立连接。本文介绍三次握手的过程。
1、第1次握手
第1次握手建立连接时,客户端向服务器发送SYN报文(SEQ=x,SYN=1),并进入SYN_SENT状态,等待服务器确认,如图1所示。
图1 第1次握手
2、第2次握手
第2次握手实际上是分两部分来完成的,即SYN+ACK(请求和确认)报文。
服务器收到了客户端的请求,向客户端回复一个确认信息(ACK=x+1)。
服务器再向客户端发送一个SYN包(SEQ=y)建立连接的请求,此时服务器进入SYN_RECV状态,如图2所示。
图2 第2次握手
3、第3次握手
第3次握手,是客户端收到服务器的回复(SYN+ACK报文)。此时,客户端也要向服务器发送确认包(ACK)。此包发送完毕客户端和服务器进入ESTABLISHED状态,完成3次握手,如图3所示。
图3 第3次握手
SEQ表示请求序列号,ACK表示确认序列号,SYN和ACK为标志位。
4、分析握手过程中字段的变化
我们知道每一次握手时,TCP报文中标志位的值是不同的。为了更好地分析3次握手时每个标志位的变化,下面以抓包方式分析每个数据包的信息。
使用Wireshark捕获TCP连接数据包并进行分析。
1)捕获到3次握手包,如图4所示。图中,第22个数据包的源IP地址为192.168.59.135,目标IP地址为192.168.59.131。在Transmission Control Protocol中可以看到,Flags为SYN,并且值设置为1,表示该数据包是主机192.168.59.135向主机192.168.59.131发起的请求,希望建立TCP连接。Sequence number表示请求序列号EQ,值为0,是由主机192.168.59.135随机生成的。
图4 第1次握手
2)选择第23个数据包进行查看,如图5所示。该数据包源IP地址为192.168.59.131,目标IP地址为192.168.59.135。在Transmission Control Protocol中可以看到,Flags为(SYN,ACK),并且将SYN置为1,表示该数据包是主机192.168.59.131用来回复主机192.168.59.135发送的TCP连接请求。Acknowledgment number表示ACK,值为1。该值是回复主机192.168.59.135发来的连接请求SEQ,因此在SEQ的基础上加1,以代表确认。Sequence number值为0,该值是由主机192.168.59.131生成的,是向主机192.168.59.135发送的SYN,表示同意该主机发来的连接请求。
图5 第2次握手
3)选择第24个数据包进行查看,如图6所示。源IP地址为192.168.59.135,目标IP地址为192.168.59.131。在Transmission Control Protocol中可以看到,Flags为ACK。表示该数据包是主机192.168.59.135对主机192.168.59.131发来的同意连接数据包后做出的确认回复。Acknowledgment number的值为1,该值是在主机192.168.59.131发来的SEQ的基础上加1得到的。Sequence number的值为1,表示收到主机192.168.59.131发来的同意连接数据包后,再次向该主机发送连接请求,表示要连接了。
图6 第3次握手
5、构造3次握手包
客户端与服务器通过3次握手建立连接,实际上是端口与端口之间的连接。用户可以伪造3次握手包,连接指定的端口,或者使用未启用的端口回复连接,以误导连接者,使其认为已经正确连接了端口。构造3次握手包需要使用netwox工具中编号为42的模块。
已知主机A的IP地址为192.168.59.131,端口443处于开放状态。主机B的IP地址为192.168.59.135,端口8080处于开放状态。通过主机A连接主机B,构造3次握手。
1)在主机A上构造第1次握手包,连接主机B的8080端口,执行命令如下:
root@daxueba:~# netwox 42 -x -s 192.168.59.131 -d 192.168.59.135 -S443 -D 8080 -n 2
输出信息如下:
IP______________________________________________________________.
|version| ihl | tos | totlen
|___4___|___5___ |____0x00=0_____ |___________0x0028=40___________
| id |r|D|M| offsetfrag
|____________0x2262=8802________|0|0|0|________0x0000=0_________
| ttl | protocol | checksum
|_____0x80=128___|______0x06=6____|____________ 0x2013__________
| source
|__________________________192.168.59.131_________________________
| destination
|__________________________192.168.59.135_________________________
TCP_____________________________________________________________.
| source port | destination port
|____________0x01BB=443__________ |__________0x1F90=8080__________
| seqnum
|_____________________ 0xA97F8D14=2843708692_____________________
| acknum
|_________________________0x00000000=0__________________________
| doff | r | r | r | r | C | E | U | A | P | R | S | F| window
|_ 5_| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0|______0x05DC=1500______
| checksum | urgptr
|___________0x59CC=22988___________|__________0x0000=0__________
上述输出信息的IP部分为IP数据报字段。其中,源IP地址为192.168.59.131,目标IP地址为192.168.59.135。TCP部分为TCP数据报字段。其中,源端口为443,目标端口为8080,并且S的值为1,表示SYN值为1。
2)通过抓包验证的确构造了第1次握手包。捕获的数据包如图7所示。图中,第13个数据包源IP地址为192.168.59.131,目标IP地址为192.168.59.135。在Transmission Control Protocol中可以看到Flags为(SYN),并且SYN的值被设置为1,说明该数据包为成功构造的第1次握手包。第14个数据包为主机B返回的[SYN,ACK]响应包。
图7 构造第1次握手包
3)如果构造的握手包连接主机B未开放的端口,将不会收到对应的[SYN,ACK]响应包。例如,连接端口8081,捕获数据包如图8所示。其中,第9个数据包为构造的第1次握手包。由于目标主机8081端口未开放,没有收到第2次握手包。
图8 端口未开放
4)为了干扰判断,这时就可以在主机B上构造第2次握手包了。执行命令如下:
root@daxueba:~# netwox 42 -x -s 192.168.59.135 -d 192.168.59.131 -S 8081 -D 443 -n 3
输出信息如下:
IP______________________________________________________________.
|version | ihl | tos | totlen
|___4___ |___5___|____0x00=0_____ |___________0x0028=40___________
| id |r|D|M| offsetfrag
|____________ 0x37E2=14306_______ |0|0|0|________0x0000=0_________
| ttl | protocol | checksum
|_____0x80=128___|______0x06=6____|____________ 0x110E____________
| source
|__________________________192.168.59.135_________________________
| destination
|__________________________192.168.59.131_________________________
TCP_____________________________________________________________.
| source port | destination port
|____________ 0x1F91=8081_________|_________ 0x01BB=443__________
| seqnum
|_____________________ 0xAC34C455=2889139285_____________________
| acknum
|_________________________ 0x0000C166=49510______________________
| doff | r | r | r | r | C | E | U | A | P | R | S | F| window
|_ 5_ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |__________
0x05DC=1500__________
| checksum | urgptr
|___________ 0x5E5E=24158_________|___________0x0000=0___________
从IP部分可以看到,源IP地址为主机B的地址192.168.59.135,目标IP地址为主机A的地址192.168.59.131。从TCP部分可以看到,源端口为8081,目标端口为443,并且A和S的值为1,也就是SYN和ACK的值为1。
5)通过抓包验证成功构造的第2次握手包,如图9所示。其中,数据包源IP地址为192.168.59.135,目标IP地址为192.168.59.131。在Transmission Control Protocol中可以看到,Flags为(SYN,ACK),并且SYN和Acknowledgment的值被设置为1,说明该数据包为成功构造的第2次握手包。这样,就可以干扰主机A的判断,使其认为主机B上的8081端口是开放的。
图9 构造第2次握手包
6)在主机A上构造第3次握手包,执行命令如下:
root@daxueba:~# netwox 42 -x -s 192.168.59.131 -d 192.168.59.135 -S 443 -D 8080 -n 4
输出信息如下:
IP______________________________________________________________.
|version | ihl | tos | totlen
|___4___ |___5___|____0x00=0______|___________ 0x003C=60__________
| id |r|D|M| offsetfrag
|____________ 0x029B=667________|0|0|0|________0x0000=0_________
| ttl | protocol | checksum
|_____0x80=128___|______0x06=6____|____________ 0x3FC6____________
| source
|__________________________192.168.59.131_________________________
| destination
|__________________________192.168.59.135_________________________
TCP_____________________________________________________________.
| source port | destination port
|____________0x01BB=443___________|__________0x1F90=8080__________
| seqnum
|_____________________ 0x6339F336=1664742198_____________________
| acknum
|_________________________ 0x000018C9=6345________________________
| doff | r | r | r | r | C | E | U | A | P | R | S | F| window
|_ 5_ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |__________
0x05DC=1500__________
| checksum | urgptr
|___________ 0x0A33=2611__________|__________0x0000=0____________
68 65 6c 6c 6f 2c 20 68 6f 77 20 61 72 65 20 79 # hello,
how are y
6f 75 20 3f # ou ?
从TCP部分可以看到,A的值为1,也就是ACK的值。下面的信息为TCP分段数据信息。
7)抓包验证成功构造了第3次握手包,如图10所示。在Transmission Control Protocol中可以看到,Flags为(ACK),并且Acknowledgment的值被设置为1,说明该包为成功构造的第3次握手包。
图10 构造第3次握手包
微信公众号:计算机与网络安全
ID:Computer-network
【推荐书籍】