作业题目
包嗅探和欺骗是网络安全中的两个重要概念;它们是网络通信中的两大威胁。能够理解这两种威胁对于理解网络中的安全措施至关重要。有许多包嗅探和欺骗工具,如Wireshark、Tcpdump、Netwox等。其中一些工具被安全专家以及攻击者广泛使用。能够使用这些工具对学生来说很重要,但对于网络安全课程的学生来说,更重要的是了解这些工具是如何工作的,即包嗅探和欺骗是如何在软件中实现的。
本实验的目标是让学生掌握大多数嗅探和欺骗工具的基本技术。学生们将使用一些简单的嗅探和欺骗程序,阅读它们的源代码,修改它们,并最终对这些程序的技术方面有深入的了解。在本实验结束时,学生应该能够编写自己的嗅探和欺骗程序。
实验步骤及结果
0 :Environment Setup using Container
目的:创建实验需要环境。
在本次实验中,我们使用三个容器(seed-attacker,host A,host B)来充当三台连接到同一局域网的计算机。
进入实验给的Labsetup文件夹,创建docker:
出现错误,因为上次实验的容器和这次实验的用了重复的地址。
删除所有容器,再重新创建docker,这次成功开启docker:
当我们创建容器时就创建了一个新的网络来连接虚拟机和容器,这个网络的IP前缀是10.9.0.0/24,查看这个网络接口的ID(后面实验会用到):
Lab Task Set 1: Using Scapy to Sniff and Spoof Packets
目的:尝试使用Scapy。
Scapy是一个强大的交互式数据包处理程序,能够伪造或解码大量的网络协议数据包,能够发送、捕捉、匹配请求和回复包等,需要在root权限下运行。我们可以将Scapy函数集成到我们自己的程序中。
尝试使用Scapy:
我们导入了Scapy包,创建了一个没有设置任何参数的IP数据包,再把数据包中的内容打印了出来。
Task 1.1: Sniffing Packets
目的:使用Scapy嗅探网络接口。
通过上面的实验,我们已经得到docker创建的网络的接口是br-cceebc63acaf,我们创建Python代码嗅探此接口:
在这段代码中,sniff函数用于抓取网络上的数据包,iface=
'br-cceebc63acaf'指定要嗅探的网络接口,filter='icmp'指定要抓取的协议类型为ICMP;prn指定回调函数是print_pkt(),该函数打印pkt。
Task 1.1A.
使用root权限运行task1.1.py:
同时,使用虚拟机ping容器host A(ping命令会发送ICMP包):
Scapy嗅探到数据包:
在非root权限下执行:
运行出错,提示我们操作不被允许,只有在root权限下网卡才会设置成为‘混杂模式’;所以在普通用户的权限下嗅探程序不能运行。
Task 1.1B.
目的:使用Scapy捕获特定类型的包
• 只捕获ICMP 包
Task1.1A中已完成
• 捕获来自特定IP以及目的端口是23的TCP包
Telnet是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式,它的默认端口号是23.
为了捕获到特定IP且目标端口号为23的TCP数据包,我们可以使用telnet命令远程登录host A。
构造嗅探程序taak1.1B.py(特定IP为本虚拟机IP10.9.0.1):
执行程序:
远程连接host A:
成功捕捉数据包:
• 捕获来自或进入一个特定的子网的数据包(非容器在的子网)
选择子网128.230.0.0/16。
编写发送包程序sendpacket.py:
该程序向特定子网(128.230.0.0/16)发送一个包,再从这个子网发送一个包回来。为了避免广播,我们指定一个特定子网中的主机(128.230.0.1)。
同时需要注意,向128.230.0.1发送数据包时使用的网络接口和之前的不同,因此源IP为10.0.2.15.
编写捕捉包程序catchpacket.py:
使用summar()只展示一行摘要。
执行程序:
执行发送包程序:
捕捉到数据包:
- 向子网发送:
- 子网返回:
Task 1.2: Spoofing ICMP Packets
目的:伪造虚假源IP的ICMP包(同一子网)。
编写代码task1.2.py,伪造虚假源IP(host A)发送ICMP数据包到host B,让host B回复host A:
运行代码:
使用wireshark查看:
成功欺骗。
Task 1.3: Traceroute
目的:估算从虚拟机到特定IP之间的路由器距离。
特定的IP选为103.235.47.103(www.baidu.com)
编写两个代码文件,task1.3.py用于一遍遍发送ttl递增的ICMP数据包:
task1.3B.py用于捕获返回的ICMP数据包:
每收到一个ICMP数据包,ttl就加1,直到ICMP数据包的type为0(回显回答),输出最后的路径结果,程序结束。
执行task1.3B.py:
发送数据包:
多次尝试得到结果:
Task 1.4: Sniffing and-then Spoofing
目的:欺骗主机让它觉得自己ping通了。
正常ping host A:
用wireshark查看:
可以发现,我们在构造ICMP回复时,要注意:id要相同,seq为报文序列号,用于标记报文顺序,也要相同,源目的IP地址交换,源目的MAC地址交换,type为0(reply).
使用host A作为被欺骗者,虚拟机充当它的网络接口,可以在虚拟机上运行嗅探和欺骗程序。
编写嗅探和欺骗程序sniff_spoof.py:
添加Raw作为应用层的数据,否则即使被欺骗的主机能收到了欺骗包,ping程序无法识别是响应包。
运行程序:
启动host A的shell,开始实验:
- ping互联网中不存在的主机1.2.3.4:
收到回复。
- ping局域网中不存在的主机10.9.0.99:
不可达。
hostA向局域网内的主机发包不会经过网关,因此攻击程序不会收到ICMP包,也就不会返回欺骗包。
- ping互联网中存在的主机8.8.8.8:
收到冗余包。
目标主机和攻击机都能收到ICMP包并做出响应,所以出现了冗余包。
Lab Task Set 2: Writing Programs to Sniff and Spoof Packets
Task 2.1: Writing Packet Sniffing Program
目的:编写一个嗅探程序来打印出每个捕获的数据包的源和目标IP地址。
分析实验给的示例代码。
代码首先使用pcap_open_live()开启了一个有效的pcap会话,用pcap_compile()编译过滤表达式后,将编译好的过滤器用pcap_setfilter()与pcap会话绑定。使用pcap_loop()进入永不停止的循环捕获数据包,一经捕获,使用回调函数got_packet()处理,最后使用pcap_close()关闭会话。
我们可以在示例代码的基础上修改got_packet()函数来完成任务功能。
编写程序sniff.c:
- 导入新包
- 修改got_packet()
在网络数据包中,以太网头之后就是IP头,在packet(指向以太网帧的指针)上加上sizeof(struct ether_header)(以太网头的大小)后,指针iph就是指向IP头的指针,再使用print_ip()函数打印IP地址。
- 修改网络接口
编译并运行sniff.c:
从host A ping host B:
得到结果:
Question 1:对嗅探程序至关重要的库调用的序列。
pcap_open_live():开启一个有效的pcap会话;
pcap_compile():编译过滤表达式;
pcap_setfilter():将编译好的过滤器与pcap会话绑定;
pcap_loop():永不停止地循环捕获数据包;
pcap_close():关闭会话。
Question 2:为什么需要root权限来运行一个嗅探器程序?如果没有root特权,程序在哪里失败?
不在root权限下运行程序:
报错segment fault。
通常在程序试图访问的内存区域它没有被授权访问,或者试图执行某些不允许的操作时,操作系统就会产生一个segment fault。
程序需要访问网络接口,这就需要root权限,如果没有root权限,那在第一步pcap_open_live()开启pcap会话就会失败。
Question 3:演示混杂模式在开启和关闭时的区别。
混杂模式开启时:
用host A ping host B,
成功捕获数据包:
混杂模式关闭时:
用host A ping host B,
没有捕获数据包:
用本虚拟机ping host B:
捕获到数据包:
网络中的每个网卡都能听到所有广播的数据帧,但网卡会检查数据帧目的地址是否与该网卡的MAC地址吻合,只有吻合的数据帧才会进入到操作系统的内核中。开启了混杂模式后,所有的数据帧都会传递给内核。所以,没有开启混杂模式时,只能捕获源目的IP是自己的包。
Task 2.1B: Writing Filters.
目的:编写过滤器
- 捕获两个特定主机(host A,host B)之间的ICMP数据包
在之前代码的基础上,更改过滤器表达式字符串:
编译并执行代码:
用host A ping host B:
可以捕获:
用本虚拟机ping host B:
没有捕获:
- 捕获目标端口号在10到100的TCP数据包
更改过滤器表达式字符串:
编译并执行代码:
用curl对host A的15端口发起请求:
捕获成功:
用curl对host A的1端口发起请求:
没有捕获:
Task 2.1C: Sniffing Passwords.
目的:telnet远程连接,捕获其登录名和密码。
telnet发送的数据固定在报文第66字节。
编写代码tel.c:
运行代码:
远程连接host A:
得到密码:
Task 2.2: Spoofing
Task 2.2A: Write a spoofing program.
目的:编写数据包欺骗程序
使用raw socket编写数据包欺骗程序。
raw socket会在缓冲区创建整个数据包,然后发送,所以使用raw socket编写数据包欺骗程序分为两步:在缓冲区中构造数据包和发送数据包。
编写代码spoofing.c。
- 构造发送数据包的代码:
在raw socket编程中,数据包已经包含了目的信息,因此,除了设置协议族信息和目的IP地址之外,没有必要设置sockaddr_in的其他字段。
- 在缓冲区中构造数据包:
函数in_cksum()实现生成校验和的功能:
在缓冲区构造数据包并调用send_raw_ip_packet()发送欺骗包:
程序欺骗host A 一个IP为1.2.3.4的主机向它发送了ICMP回应请求。
编译并执行:
用wireshark抓包检验代码效果。
10.9.0.5回复了这个不存在的IP,欺骗成功。
Task 2.2B: Spoof an ICMP Echo Request.
目的:代表互联网上的远程主机发送ICMP回应请求。
代表www.baidu.com发送ICMP回应请求。
修改源IP为220.181.38.150
编译执行代码:
欺骗成功。
Question 4:是否可以将IP数据包长度字段设置为任意值,而不管实际的数据包有多大?
不能,按照IP协议的规定,这个字段的值应该是整个IP数据包的字节数的正确值。如果尝试设置一个非法的值,那么大多数的操作系统和网络设备将会丢弃这个数据包,或者产生一个错误通知。
Question 5:使用原始套接字编程,是否需要计算IP报头的校验和?
不需要,在数据包发送过程中,操作系统会设置该字段。
Question 6:为什么需要root权限来运行使用原始套接字的程序?如果没有root权限执行,程序在哪里失败?
因为原始套接字提供了更低级别的网络访问,使得应用程序可以直接处理和修改网络数据包。
如果没有root权限,会在第一步,创建原始套接字就失败。
Task 2.3: Sniff and then Spoof
目的:嗅探并欺骗
将之前的两个代码进行整合,编写代码sniff_sp.c:
嗅探网络接口br-cceebc63acaf:
将回调函数got_packet()改为发送欺诈包:
设置源目的IP时交换嗅探到的包的源目的IP。
在本虚拟机编译并运行代码:
用host A ping 一个不存在的IP1.2.3.4:
得到回复:
欺骗成功。
标签:pcap,欺诈,IP,程序,嗅探,host,实验,ICMP,数据包 From: https://www.cnblogs.com/wxrwajiez/p/18516132