首页 > 其他分享 >嗅探与欺诈实验

嗅探与欺诈实验

时间:2024-10-30 16:47:27浏览次数:3  
标签:pcap 欺诈 IP 程序 嗅探 host 实验 ICMP 数据包

 

 

 

作业题目

包嗅探和欺骗是网络安全中的两个重要概念;它们是网络通信中的两大威胁。能够理解这两种威胁对于理解网络中的安全措施至关重要。有许多包嗅探和欺骗工具,如Wireshark、Tcpdump、Netwox等。其中一些工具被安全专家以及攻击者广泛使用。能够使用这些工具对学生来说很重要,但对于网络安全课程的学生来说,更重要的是了解这些工具是如何工作的,即包嗅探和欺骗是如何在软件中实现的。

本实验的目标是让学生掌握大多数嗅探和欺骗工具的基本技术。学生们将使用一些简单的嗅探和欺骗程序,阅读它们的源代码,修改它们,并最终对这些程序的技术方面有深入的了解。在本实验结束时,学生应该能够编写自己的嗅探和欺骗程序。

实验步骤及结果

0 :Environment Setup using Container

目的:创建实验需要环境。

在本次实验中,我们使用三个容器(seed-attacker,host A,host B)来充当三台连接到同一局域网的计算机。

进入实验给的Labsetup文件夹,创建docker:

1.1

出现错误,因为上次实验的容器和这次实验的用了重复的地址。

删除所有容器,再重新创建docker,这次成功开启docker:

1.2

1.3

1.4

当我们创建容器时就创建了一个新的网络来连接虚拟机和容器,这个网络的IP前缀是10.9.0.0/24,查看这个网络接口的ID(后面实验会用到):

1.4

Lab Task Set 1: Using Scapy to Sniff and Spoof Packets

目的:尝试使用Scapy。

Scapy是一个强大的交互式数据包处理程序,能够伪造或解码大量的网络协议数据包,能够发送、捕捉、匹配请求和回复包等,需要在root权限下运行。我们可以将Scapy函数集成到我们自己的程序中。

尝试使用Scapy:

1.5

我们导入了Scapy包,创建了一个没有设置任何参数的IP数据包,再把数据包中的内容打印了出来。

Task 1.1: Sniffing Packets

目的:使用Scapy嗅探网络接口。

通过上面的实验,我们已经得到docker创建的网络的接口是br-cceebc63acaf,我们创建Python代码嗅探此接口:

2.0

2.1

在这段代码中,sniff函数用于抓取网络上的数据包,iface=

'br-cceebc63acaf'指定要嗅探的网络接口,filter='icmp'指定要抓取的协议类型为ICMP;prn指定回调函数是print_pkt(),该函数打印pkt。

Task 1.1A.

使用root权限运行task1.1.py:

2.3

同时,使用虚拟机ping容器host A(ping命令会发送ICMP包):

2.2

Scapy嗅探到数据包:2.42.5

在非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):

1.4

执行程序:

1.2

远程连接host A:

1.3

成功捕捉数据包:

1.5 1.6

• 捕获来自或进入一个特定的子网的数据包(非容器在的子网)

选择子网128.230.0.0/16。

编写发送包程序sendpacket.py:

该程序向特定子网(128.230.0.0/16)发送一个包,再从这个子网发送一个包回来。为了避免广播,我们指定一个特定子网中的主机(128.230.0.1)。

2.2

同时需要注意,向128.230.0.1发送数据包时使用的网络接口和之前的不同,因此源IP为10.0.2.15.

2.1

编写捕捉包程序catchpacket.py:

2.7

使用summar()只展示一行摘要。

执行程序:

2.3

执行发送包程序:

2.4

捕捉到数据包:

  1. 向子网发送:

2.5

  1. 子网返回:

2.6

Task 1.2: Spoofing ICMP Packets

目的:伪造虚假源IP的ICMP包(同一子网)。

编写代码task1.2.py,伪造虚假源IP(host A)发送ICMP数据包到host B,让host B回复host A:

3.5

运行代码:

3.3

使用wireshark查看:

3.6

成功欺骗。

Task 1.3: Traceroute

目的:估算从虚拟机到特定IP之间的路由器距离。

特定的IP选为103.235.47.103(www.baidu.com)

编写两个代码文件,task1.3.py用于一遍遍发送ttl递增的ICMP数据包:

4.4

task1.3B.py用于捕获返回的ICMP数据包:

每收到一个ICMP数据包,ttl就加1,直到ICMP数据包的type为0(回显回答),输出最后的路径结果,程序结束。

4.2

执行task1.3B.py:

4.3

发送数据包:

4.6

多次尝试得到结果:

4.5

Task 1.4: Sniffing and-then Spoofing

目的:欺骗主机让它觉得自己ping通了。

正常ping host A:

用wireshark查看:

5.5

5.35.4

可以发现,我们在构造ICMP回复时,要注意:id要相同,seq为报文序列号,用于标记报文顺序,也要相同,源目的IP地址交换,源目的MAC地址交换,type为0(reply).

使用host A作为被欺骗者,虚拟机充当它的网络接口,可以在虚拟机上运行嗅探和欺骗程序。

编写嗅探和欺骗程序sniff_spoof.py:

5.6

添加Raw作为应用层的数据,否则即使被欺骗的主机能收到了欺骗包,ping程序无法识别是响应包。

运行程序:

5.7

启动host A的shell,开始实验:

  1. ping互联网中不存在的主机1.2.3.4:

6.1

收到回复。

  1. ping局域网中不存在的主机10.9.0.99:

6.2

不可达。

hostA向局域网内的主机发包不会经过网关,因此攻击程序不会收到ICMP包,也就不会返回欺骗包。

  1. ping互联网中存在的主机8.8.8.8:

6.3

收到冗余包。

目标主机和攻击机都能收到ICMP包并做出响应,所以出现了冗余包。

Lab Task Set 2: Writing Programs to Sniff and Spoof Packets

Task 2.1: Writing Packet Sniffing Program

目的:编写一个嗅探程序来打印出每个捕获的数据包的源和目标IP地址。

分析实验给的示例代码。

1.1

1.2

代码首先使用pcap_open_live()开启了一个有效的pcap会话,用pcap_compile()编译过滤表达式后,将编译好的过滤器用pcap_setfilter()与pcap会话绑定。使用pcap_loop()进入永不停止的循环捕获数据包,一经捕获,使用回调函数got_packet()处理,最后使用pcap_close()关闭会话。

我们可以在示例代码的基础上修改got_packet()函数来完成任务功能。

编写程序sniff.c:

  1. 导入新包

1.4

  1. 修改got_packet()

在网络数据包中,以太网头之后就是IP头,在packet(指向以太网帧的指针)上加上sizeof(struct ether_header)(以太网头的大小)后,指针iph就是指向IP头的指针,再使用print_ip()函数打印IP地址。

1.3

  1. 修改网络接口

1.4

编译并运行sniff.c:

1.6

从host A ping host B:

1.7

得到结果:

1.8

Question 1:对嗅探程序至关重要的库调用的序列。

pcap_open_live():开启一个有效的pcap会话;

pcap_compile():编译过滤表达式;

pcap_setfilter():将编译好的过滤器与pcap会话绑定;

pcap_loop():永不停止地循环捕获数据包;

pcap_close():关闭会话。

Question 2:为什么需要root权限来运行一个嗅探器程序?如果没有root特权,程序在哪里失败?

不在root权限下运行程序:

1.5

报错segment fault。

通常在程序试图访问的内存区域它没有被授权访问,或者试图执行某些不允许的操作时,操作系统就会产生一个segment fault。

程序需要访问网络接口,这就需要root权限,如果没有root权限,那在第一步pcap_open_live()开启pcap会话就会失败。

Question 3:演示混杂模式在开启和关闭时的区别。

混杂模式开启时

2.5

2.2

用host A ping host B,

2.3

成功捕获数据包:

2.4

混杂模式关闭时

2.6

2.1

用host A ping host B,

2.7

没有捕获数据包:

2.8

用本虚拟机ping host B:

2.9

捕获到数据包:

2.91

网络中的每个网卡都能听到所有广播的数据帧,但网卡会检查数据帧目的地址是否与该网卡的MAC地址吻合,只有吻合的数据帧才会进入到操作系统的内核中。开启了混杂模式后,所有的数据帧都会传递给内核。所以,没有开启混杂模式时,只能捕获源目的IP是自己的包。

Task 2.1B: Writing Filters.

目的:编写过滤器

  • 捕获两个特定主机(host A,host B)之间的ICMP数据包

在之前代码的基础上,更改过滤器表达式字符串:

3.1

编译并执行代码:

3.3

用host A ping host B:

3.2

可以捕获:

3.4

用本虚拟机ping host B:

3.5

没有捕获:

3.6

  • 捕获目标端口号在10到100的TCP数据包

更改过滤器表达式字符串:

3.7

编译并执行代码:

3.8

用curl对host A的15端口发起请求:

3.9

捕获成功:

3.91

用curl对host A的1端口发起请求:

3.9

没有捕获:

3.91

Task 2.1C: Sniffing Passwords.

目的:telnet远程连接,捕获其登录名和密码。

telnet发送的数据固定在报文第66字节。

编写代码tel.c:

捕获3

运行代码:

捕获4

远程连接host A:

捕获2

得到密码:

捕获

Task 2.2: Spoofing

Task 2.2A: Write a spoofing program.

目的:编写数据包欺骗程序

使用raw socket编写数据包欺骗程序。

raw socket会在缓冲区创建整个数据包,然后发送,所以使用raw socket编写数据包欺骗程序分为两步:在缓冲区中构造数据包和发送数据包。

编写代码spoofing.c。

  1. 构造发送数据包的代码:

在raw socket编程中,数据包已经包含了目的信息,因此,除了设置协议族信息和目的IP地址之外,没有必要设置sockaddr_in的其他字段。

1.1

  1. 在缓冲区中构造数据包:

函数in_cksum()实现生成校验和的功能:

1.2

在缓冲区构造数据包并调用send_raw_ip_packet()发送欺骗包:1.3

程序欺骗host A 一个IP为1.2.3.4的主机向它发送了ICMP回应请求。

4.3

编译并执行:

2.22.3

用wireshark抓包检验代码效果。

2.1

10.9.0.5回复了这个不存在的IP,欺骗成功。

Task 2.2B: Spoof an ICMP Echo Request.

目的:代表互联网上的远程主机发送ICMP回应请求。

代表www.baidu.com发送ICMP回应请求。

修改源IP为220.181.38.150

3.2

编译执行代码:

3.4

3.3

欺骗成功。

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:

6.2

将回调函数got_packet()改为发送欺诈包:

6.1

设置源目的IP时交换嗅探到的包的源目的IP。

在本虚拟机编译并运行代码:

4.1

用host A ping 一个不存在的IP1.2.3.4:

4.3

得到回复:

4.2

欺骗成功。

标签:pcap,欺诈,IP,程序,嗅探,host,实验,ICMP,数据包
From: https://www.cnblogs.com/wxrwajiez/p/18516132

相关文章

  • TCP攻击实验
       作业题目本实验的学习目标是让学生获得有关漏洞以及针对这些漏洞的攻击的第一手经验。聪明人从错误中学习。在安全教育中,我们研究导致软件漏洞的错误。研究过去的错误不仅有助于学生理解为什么系统容易受到攻击,为什么“看似良性”的错误会变成灾难,以及为什么需要许多安......
  • 缓冲区溢出实验
       作业题目本实验的学习目标是让学生将从课堂上学到的有关缓冲区溢出漏洞的知识进行实践,从而获得有关该漏洞的第一手经验。缓冲区溢出是指程序试图将数据写入预先分配的固定长度缓冲区边界之外的情况。恶意用户可利用此漏洞改变程序的流控制,甚至执行任意代码。此漏洞是由......
  • shellcode编写实验
       作业题目shellcode广泛用于许多涉及代码注入的攻击中。编写shellcode是相当有挑战性的。虽然我们可以很容易地从互联网上找到现有的shellcode,但是能够从头开始编写我们自己的shellcode总是令人兴奋的。shellcode中涉及到几种有趣的技术。本实验室的目的是帮助学生理解这......
  • 环境变量与set-uid实验
       作业题目本实验室的学习目标是让学生了解环境变量如何影响程序以及系统行为。环境变量是一组动态命名值,可以影响正在运行的进程将在计算机上运行。大多数操作系统都使用它们,因为它们是1979年引入Unix。尽管环境变量会影响程序行为,但它们是如何实现的这一点很多程序员都......
  • XSS攻击实验(Elgg)
       作业题目跨站点脚本(XSS)是一种常见于web应用程序中的计算机安全漏洞。此漏洞使攻击者有可能将恶意代码(如JavaScripts)注入受害者的web浏览器。为了演示攻击者可以做什么,我们在预先构建的UbuntuVM映像中设置了一个名为Elgg的web应用程序。我们已经注释掉了Elgg的一些保护......
  • 实验 1:域名信息收集工具
    作业题目本次实验主要考察大家的编程能力及子域名的信息收集方法,在文件夹“Lab1_code”提供了使用Bing搜索引擎的域名收集功能。请对该代码进行扩展,使其可支持百度搜索引擎的域名收集功能。需要实现如下功能:a)支持百度搜索引擎的域名提取,其中从百度搜索引擎提取的域名需......
  • Javaweb 实验6 JSP内置对象
    我发现了有些人喜欢静静看博客不聊天呐,但是ta会点赞。这样的人呢帅气低调有内涵,美丽大方很优雅。说的就是你,不用再怀疑哦目的:掌握JSP内置对象的使用。理解JSP的作用域掌握JSP的表达式使用实验要求:完成实验题目要求提交实验报告,将代码和实验结果页面截图放入报告中第......
  • 实验3
    task11#include<stdio.h>23charscore_to_grade(intscore);4intmain(){5intscore;6chargrade;78while(scanf("%d",&score)!=EOF){9grade=score_to_grade(score);10printf(&quo......
  • 实验三
    实验一源代码#include<stdio.h>charscore_to_grade(intscore);intmain(){intscore;chargrade;while(scanf("%d",&score)!=EOF){grade=score_to_grade(score);printf("分数;%d,等级:%c\n\n",score......
  • 实验2 类和对象_基础编程1
    实验任务1头文件#pragmaonce#include<string>//类T:声明classT{ //对象属性、方法public: T(intx=0,inty=0);//普通构造函数 T(constT&t);//复制构造函数 T(T&&t);//移动构造函数 ~T();//析构函数 voidadjust(intratio); voiddispla......