TCP/IP Attack

TCP相关知识以及相关攻击

TCP三次握手

假设A为客户端,B为服务器端:

  • 首先B处于Listen状态,等待客户的连接请求
  • A向B发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号x
  • B收到连接请求报文,如果同意建立连接,则向A发送确认连接报文,SYN=1,ACK=1,确认号为x+1,同时也选择一个初始的序号y
  • A收到B的连接确认报文后,还要向B发出确认,确认号为y+1,序号为x+1
  • B收到A的确认后,连接建立

为什么要进行第三次握手呢?

第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。

客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。

三次握手的过程中:

当server收到SYN时,存在TCB中(即为半连接half-open connect)

当server收到ACK时,从TCB去除,完整的TCP连接存在别处

如果一直没收到,server会重复发送SYN+ACK,直至最终丢弃TCB

Attack 1: SYN Flooding Attack

主要思想:使TCB满载从而不能接受新的SYN请求

实现方法:

  • attacker用random IP address
  • 由于没有真正使用该随机IP的client,server回复SYN+ACK时会被drop,半连接会一直存储在TCB中,直至超时

造成结果:TCB中有许多SYN_RECV状态;CPU使用不多,已经连接的TCP仍然存在,但是不能有新的连接建立

解决方法:

SYN Cookies:

  • receiver接收到SYN后,加密信息得到H(密钥只有server知道)
  • 将H作为seq发给client,如果不是attacker,则会回复ACK=H+1,server检查ACK,建立连接,此时才会分配资源

即:server不存half_open的连接,资源只会分给接收到final ACK的client

Attack 2: TCP Reset Attack

主要思想:断开TCP的连接

断开连接有两种方式:

  • 发送FIN:A发送FIN给B,B回复ACK,关闭A-B的连接;B发送FIN给A,A回复ACK,关闭B-A的连接。此时才完全结束A-B的通信
  • 发送RST,立刻断开

实现方法:attacker伪造RST:通过已知的src,src_port,dst,dst_port,seq

得到src,src_port,dst,dst_port,seq的方式:

  • 在Telnet:使用wireshark,嗅探traffic,得到信息
  • 在SSH:SSH加密只加密data部分,所以可以是可以成功通过sniff&spoof方式得到
  • 在视频流连接:seq增长的非常快,wireshark抓包后再输入command不可能实现,所以需要自动化攻击,sniff-and-spoof(借助netwox工具)

Attack3: TCP Session Hijacking

主要思想: inject data 在已经建立好的连接中注入data

实现方法: 需要得到src, src_port, dst, dst_port, seq

利用TCP收包的性质: 即使包不是按序到达的,也会在buffer中放在正确的位置

实现方法:

  • 在已经获得seq=x的基础上,发送x+a(a不能过大),该包会存在对应的位置上,直到前面缺失的包被收到。

结果:攻击成功后,如果建立了telnet通道,会造成不管输入什么信息不再会有相应

原因: 双方都进入死锁

  • server收到spoofed包,若对此包进行回复,会附着seq。但是client还没有发到seq,所以会被drop。Server会认为包丢失了,会重发,然后client会重复drop
  • 同理,对于Client来说,本应该发送的seq已经被attacker占用了,所以sevrer会drop正确的包,从而对于client来说包也是丢失的,所以会重复发送。