1、中南大学网络安全课外实验报告嗅探与欺骗中南大学 CENTRAL SOUTH UNIVERSITYSEED PROJECT实验报告学生姓名 孙毅 学 号 * 指导教师 王伟平 学 院 信息科学与工程 专业班级 信息安全1401 成时间 2016.12 Sniffing_Spoofing一、实验原理Sniffing就是一种能将本地网卡状态设成混杂状态的模式,当网卡处于这种“混杂”方式时,该网卡具备“广播地址”,它对遇到的每一个帧都产生一个硬件中断以便提醒操作系统处理流经该物理媒体上的每一个报文包。(绝大多数的网卡具备置成混杂模式的能力)一般来说,sniffing和poofing会联合起来使用。当攻
2、击者嗅探到关键信息时,通常会使用poofing技术来构造数据包来劫持会话或者去获取更多信息,通常会造成很大的危害。Poofing技术就是攻击者自己构造数据包的ip/tcp数据包帧头部数据来达到自己的目的。本次实验就是基于以上原理,在linux下模拟整个过程。二、实验器材1Ubuntu12.04。2Wireshark等常用捕包工具。三、实验步骤及运行结果Task1编写嗅探程序嗅探程序可以很容易地使用pcap库。利用PCAP,嗅探器的任务变得在pcap库调用一系列简单的程序。在序列结束时,数据包将被放置在缓冲区中,以进一步处理,只要它们被捕获。所有的数据包捕获的细节由pcap库处理。Tim Car
3、stens写了一个教程如何使用pcap库写的嗅探程序。1:深入理解并可以编写嗅探程序。2:编写过滤器。请为您的嗅探程序捕捉每个写过滤表达式如下。在你的实验报告,你需要包括screendumps显示应用这些过滤器的结果。捕获ICMP数据包。捕获TCP数据包有一个目的端口范围从端口10 - 100。运行结果如下:在程序中预设捕获10个数据包,当捕获数据包之后会将数据包进行处理,会下显示数据包的类型,还有数据包的源ip和目的ip,源端口和目的端口,当有数据时还会显示数据。对于任务一的2,主要是修改filter中的过滤条件,要实现只捕获ICMP类型的数据包,只需要将char filter_exp =
4、ip中的ip改为ICMP,然后要捕获端口在10-100之间的tcp数据包,同理,将这条语句中的条件改为tcp and dst portrange 10-100即可。Task2包欺骗在正常的情况下,当一个用户发送一个数据包时,操作系统通常不允许用户设置所有的在协议头字段(如TCP,UDP,和IP报头)。操作系统将大部分的领域,而只允许用户设置几个字段,如目标IP地址、目标端口号等。但是当用户有有root权限,他们可以在数据包标头设置为任意字段。这就是所谓的包欺骗,它可以通过原始套接字完成。原始套接字给程序员的数据包结构的绝对控制,允许程序员构建任何任意的数据包,包括设置头字段和有效载荷。使用原始
5、套接字是相当简单的,它包括四个步骤:(1)创建一个原始套接字,(2)设置套接字选项,(3)构建数据包,和(4)通过原始套接字发送数据包。有许多在线教程,可以教你如何使用原始套接字在C编程。我们已经把一些教程与实验室的网页联系起来了。请阅读它们,并学习如何写一个spoonfing程序包。我们展示了一个简单的的程序。运行结果如下:可以看到成功向193.123.123.11的80端口发送了伪造的的源IP为127.1.1.1且端口的234的数据包,这就实现包欺骗的过程。Task3:综合使用在这个任务中,你将嗅探和欺骗技术实现连接,并实现程序。你需要在同一局域网两虚拟机。从VMA ping 另一个VM的
6、 IP,这将产生一个ICMP回送请求报文。如果X是活着的,ping程序将收到一个回音答复,并打印出响应。你嗅探到数据包然后伪造程序运行在虚拟机B、监控网络数据包嗅探。每当它看到ICMP回送请求,不管目标IP地址是什么,你的程序应该立即发出回声应答数据包欺骗技术的使用。因此,考虑到机器X是否是活的,这个程序将总是收到一个回复,这表明X是活的。你要写这样一个程序,包括在你显示你的程序的工作报告screendumps。请在你的报告中附上代码。四、附件Task1#define APP_NAME sniffex#define APP_DESC Sniffer example using libpcap#
7、define APP_COPYRIGHT Copyright (c) 2005 The Tcpdump Group#define APP_DISCLAIMER THERE IS ABSOLUTELY NO WARRANTY FOR THIS PROGRAM.#include #include #include #include #include #include #include #include #include #include /* default snap length (maximum bytes per packet to capture) */#define SNAP_LEN 1
8、518/* ethernet headers are always exactly 14 bytes 1 */#define SIZE_ETHERNET 14/* Ethernet addresses are 6 bytes */#define ETHER_ADDR_LEN 6/* Ethernet header */struct sniff_ethernet u_char ether_dhostETHER_ADDR_LEN; /* destination host address */ u_char ether_shostETHER_ADDR_LEN; /* source host addr
9、ess */ u_short ether_type; /* IP? ARP? RARP? etc */;/* IP header */struct sniff_ip u_char ip_vhl; /* version 2 */ u_char ip_tos; /* type of service */ u_short ip_len; /* total length */ u_short ip_id; /* identification */ u_short ip_off; /* fragment offset field */ #define IP_RF 0x8000 /* reserved f
10、ragment flag */ #define IP_DF 0x4000 /* dont fragment flag */ #define IP_MF 0x2000 /* more fragments flag */ #define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ u_char ip_ttl; /* time to live */ u_char ip_p; /* protocol */ u_short ip_sum; /* checksum */ struct in_addr ip_src,ip_dst; /* source
11、and dest address */;#define IP_HL(ip) (ip)-ip_vhl) & 0x0f) /*与15与运算*/#define IP_V(ip) (ip)-ip_vhl) 4)/*ip_vhl的各二进位全部右移4位*/* TCP header */typedef u_int tcp_seq;struct sniff_tcp u_short th_sport; /* source port */ u_short th_dport; /* destination port */ tcp_seq th_seq; /* sequence number */ tcp_seq t
12、h_ack; /* acknowledgement number */ u_char th_offx2; /* data offset, rsvd */ #define TH_OFF(th) (th)-th_offx2 & 0xf0) 4) u_char th_flags; #define TH_FIN 0x01 #define TH_SYN 0x02 #define TH_RST 0x04 #define TH_PUSH 0x08 #define TH_ACK 0x10 #define TH_URG 0x20 #define TH_ECE 0x40 #define TH_CWR 0x80 #
13、define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR) u_short th_win; /* window */ u_short th_sum; /* checksum */ u_short th_urp; /* urgent pointer */;voidgot_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet);voidprint_payload(const u_char *payload, int len);v
14、oidprint_hex_ascii_line(const u_char *payload, int len, int offset);voidprint_app_banner(void);voidprint_app_usage(void);void /*输出相关信息*/print_app_banner(void) printf(%s - %sn, APP_NAME, APP_DESC); printf(%sn, APP_COPYRIGHT); printf(%sn, APP_DISCLAIMER); printf(n);return;voidprint_app_usage(void) pri
15、ntf(Usage: %s interfacen, APP_NAME); printf(n); printf(Options:n); printf( interface Listen on for packets.n); printf(n);return;voidprint_hex_ascii_line(const u_char *payload, int len, int offset) int i; int gap; const u_char *ch; printf(%05d , offset); ch = payload; for(i = 0; i len; i+) printf(%02
16、x , *ch); ch+; /* print extra space after 8th byte for visual aid */ if (i = 7) printf( ); /* print space to handle line less than 8 bytes */ if (len 8) printf( ); if (len 16) gap = 16 - len; for (i = 0; i gap; i+) printf( ); printf( ); ch = payload; for(i = 0; i len; i+) if (isprint(*ch) printf(%c,
17、 *ch); else printf(.); ch+; printf(n);return;voidprint_payload(const u_char *payload, int len) int len_rem = len; int line_width = 16; /* number of bytes per line */ int line_len; int offset = 0; /* zero-based offset counter */ const u_char *ch = payload; if (len = 0) return; if (len = line_width) p
18、rint_hex_ascii_line(ch, len, offset); return; for ( ; ) /* compute current line length */ line_len = line_width % len_rem; /* print line */ print_hex_ascii_line(ch, line_len, offset); /* compute total remaining */ len_rem = len_rem - line_len; /* shift pointer to remaining bytes to print */ ch = ch
19、+ line_len; /* add offset */ offset = offset + line_width; /* check if we have line width chars or less */ if (len_rem = line_width) /* print last line and get out */ print_hex_ascii_line(ch, len_rem, offset); break; return;voidgot_packet(u_char *args, const struct pcap_pkthdr *header, const u_char
20、*packet) static int count = 1; /* packet counter */ /* declare pointers to packet headers */ const struct sniff_ethernet *ethernet; /* The ethernet header 1 */ const struct sniff_ip *ip; /* The IP header */ const struct sniff_tcp *tcp; /* The TCP header */ const char *payload; /* Packet payload */ i
21、nt size_ip; int size_tcp; int size_payload; printf(nPacket number %d:n, count); count+; /* define ethernet header */ ethernet = (struct sniff_ethernet*)(packet); /* define/compute ip header offset */ ip = (struct sniff_ip*)(packet + SIZE_ETHERNET); size_ip = IP_HL(ip)*4; if (size_ip ip_src); printf(
22、 To: %sn, inet_ntoa(ip-ip_dst); /* determine protocol */ switch(ip-ip_p) case IPPROTO_TCP: printf( Protocol: TCPn); break; case IPPROTO_UDP: printf( Protocol: UDPn); return; case IPPROTO_ICMP: printf( Protocol: ICMPn); return; case IPPROTO_IP: printf( Protocol: IPn); return; default: printf( Protoco
23、l: unknownn); return; tcp = (struct sniff_tcp*)(packet + SIZE_ETHERNET + size_ip); size_tcp = TH_OFF(tcp)*4; if (size_tcp th_sport); printf( Dst port: %dn, ntohs(tcp-th_dport); /* define/compute tcp payload (segment) offset */ payload = (u_char *)(packet + SIZE_ETHERNET + size_ip + size_tcp); /* com
24、pute tcp payload (segment) size */ size_payload = ntohs(ip-ip_len) - (size_ip + size_tcp); /* * Print payload data; it might be binary, so dont just * treat it as a string. */ if (size_payload 0) printf( Payload (%d bytes):n, size_payload); print_payload(payload, size_payload); return;int main(int a
25、rgc, char *argv) char *dev = NULL; /* capture device name */ char errbufPCAP_ERRBUF_SIZE; /* error buffer */ pcap_t *handle; /* packet capture handle */ char filter_exp = ip; /* filter expression 3 */ struct bpf_program fp; /* compiled filter program (expression) */ bpf_u_int32 mask; /* 子网掩码 */ bpf_
26、u_int32 net; /* IP地址 */ int num_packets = 10; /* number of packets to capture */ print_app_banner(); /* check for capture device name on command-line */ if (argc = 2) dev = argv1; else if (argc 2) fprintf(stderr, error: unrecognized command-line optionsnn); print_app_usage(); exit(EXIT_FAILURE); els
27、e /* find a capture device if not specified on command-line */ dev = pcap_lookupdev(errbuf); if (dev = NULL) fprintf(stderr, Couldnt find default device: %sn, errbuf); exit(EXIT_FAILURE); /* get network number and mask associated with capture device */ if (pcap_lookupnet(dev, &net, &mask, errbuf) =
28、-1) fprintf(stderr, Couldnt get netmask for device %s: %sn, dev, errbuf); net = 0; mask = 0; /* print capture info */ printf(Device: %sn, dev); printf(Number of packets: %dn, num_packets); printf(Filter expression: %sn, filter_exp); /* open capture device */ handle = pcap_open_live(dev, SNAP_LEN, 1, 1000, errbuf); if (handle = NULL) fprintf(stderr, Couldnt open device %s: %sn, dev, e
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1