当前位置: 代码迷 >> 综合 >> (SEED-Lab) Sniffing_Spoofing
  详细解决方案

(SEED-Lab) Sniffing_Spoofing

热度:30   发布时间:2023-11-21 15:50:54.0

(SEED-Lab) Sniffing_Spoofing

欢迎大家访问我的GitHub博客

https://lunan0320.cn

文章目录

  • (SEED-Lab) Sniffing_Spoofing
  • 一、实验目标
  • 二、实验原理
    • 2.1 Sniffing原理
    • 2.2 Spoofing原理
  • 三、实验器材
  • 四、Lab Task Set 1: Using Tools to Sniff and Spoof Packets
    • 4.1 Task1.1 Sniffing Packets
      • 4.1.1 Task1.1A
      • 4.1.2 Task1.1B
    • 4.2 Task 1.2: Spoofing ICMP Packets
    • 4.3 Task 1.3: Traceroute
    • 4.4 Task 1.4: Sniffing and-then Spoofing
  • 五、Lab Task Set 2: Writing Programs to Sniff and Spoof Packets
    • 5.1 Task 2.1: Writing Packet Sniffing Program
      • 5.1.1 Task 2.1A: Understanding How a Sniffer Works
        • ?Question1:描述在sniff程序中的调用序列
        • ?Quesion2: 嗅探过程为什么需要root权限?没有root的话哪里出错?
        • ?Question3: 打开嗅探程序的混杂模式,打开和关闭这个模式的区别是什么?
      • 5.1.2 Task 2.1B: Writing Filters
      • 5.1.3 Task 2.1C: Sniffing Passwords
    • 5.2 Task 2.2: Spoofing
      • 5.2.1 Task 2.2A: Write a spoofing program
      • 5.2.2 Task 2.2B: Spoof an ICMP Echo Request
    • 5.3 Task 2.3: Sniff and then Spoof

一、实验目标

1、掌握基本嗅探sniff程序的使用方法
2、对spoof过程有较为清晰的认识
3、在sniff_spoof的过程中学会使用python库函数调用
4、可以尝试使用C语言完成sniffing_spoofing过程

二、实验原理

2.1 Sniffing原理

OS内核 为嗅探程序 提供了 一个Raw Socket API ,当数据包到达链路层驱动位置,会进行复制,经过raw socket 交给嗅探程序,若是有多个嗅探程序,会复制多份,分别交付。
Sniffer程序并不须要得到全部的报文,可能只须要得到其中的一小部分报文,好比UDP报文,这里就须要进行过滤,UNIX系统添加了一个BSD 数据包过滤器(BSD packet filter,BPF)
在数据包复制以前进行过滤,以后进行复制的数据包相应大大减小

2.2 Spoofing原理

正常的应用程序仅仅向OS内核提供数据,目的IP地址,目的端口等信息,其余构造数据包的过程都交给OS内核去完成,而不能随意的去构造各个包头。与嗅探同样,这也可用raw socket API,进行数据包的构造,而后交给下层,发送出去。
本次实验就是基于以上原理,在Seed Ubuntu16.04下模拟整个过程。

三、实验器材

1.Seed Ubuntu16.04
2.Wireshark等常用捕包工具。

四、Lab Task Set 1: Using Tools to Sniff and Spoof Packets

4.1 Task1.1 Sniffing Packets

使用Scapy工具Sniff and Spoof packets测试scapy的使用
在这里插入图片描述

4.1.1 Task1.1A

在VMA上root权限下,运行嗅探程序
?嗅探程序sniffer.py,抓取icmp类型的包,并将相关信息通过pkt.show()打印出来。Snifer.py程序如下
在这里插入图片描述

?此时,另一台VMB对VMA执行ping IP 的命令,向VMA发送ICMP包。过程如下:
可以看到,共发送了两个ICMP包,并且均得到VMA的回送包。
在这里插入图片描述
?在VMA上可以看到sniffer.py抓取到的包的详细信息:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
其中第一个和第三个ICMP包为request类型即请求包,src地址是VMB的IP地址,发往VMA。第二个和第四个ICMP包类型为reply回复包,src为VMA的IP地址,发往VMB。
?在VMA上普通用户seed条件下运行sniffer.py
在这里插入图片描述
可以看到没有成功运行,原因是Operation not permitted 操作不被允许,也就是用户的权限不够。

4.1.2 Task1.1B

通过设置filter的不同模式来运行sniffer.py程序。
?Capture only the ICMP packet
在这里插入图片描述
在Task1.1A钟就是采用的过滤ICMP类型
?Capture TCP packet,特定IP,指定端口23
根据端口要求,修改filter限制条件
在这里插入图片描述
在VMA中运行sniffer.py程序:
在这里插入图片描述
在VMB中使用telnet IP命令连接VMA,并输入VMA登录的用户名seed以及密码dees:
在这里插入图片描述
在VMA中可以看到已经成功嗅探到了TCP包:
在这里插入图片描述
同时,在这个过程中在VMA使用wireshark工具成功捕获到了一系列的tcp包:
在这里插入图片描述
点开其中的某个数据包,追踪TCP流,可以看到在这个过程中VMB中输入的登录用户名和密码:
在这里插入图片描述
?捕获从特定子网发送的数据包
设置网络IP 202.108.0.0
在这里插入图片描述
在VMA上运行sniffer.py程序
在这里插入图片描述
在VMA上执行ping 202.108.22.5 ,均得到了回送reply
在这里插入图片描述
查看此时的嗅探程序,成功捕获到了来自子网202.108.0.0/16的回送包。说明嗅探程序可以通过改变filter的设置来捕获不同需求的数据包
在这里插入图片描述

4.2 Task 1.2: Spoofing ICMP Packets

冒充一个ICMP数据包
在这里插入图片描述
略微修改后,得到的VMA中的spoofing.py程序如下:
VMA的IP地址为:10.0.2.4,此时我们spoofing时候需要修改src地址,VMB的IP地址为:10.0.2.5 也就是此时的src地址
在这里插入图片描述
此时在VMA中运行spoofing程序,成功send
在这里插入图片描述
在VMB中通过wireshark捕获到VMA中发送的spoofing的数据包
显示src的IP地址为:10.0.2.9,而实际src的IP地址为:10.0.2.4,spoofing成功!
在这里插入图片描述

4.3 Task 1.3: Traceroute

写python程序自动更新数据包,重发
设置目标dst 的IP地址为202.182.118.135,设置跳数的上限为25。
在这里插入图片描述
执行此程序
在这里插入图片描述
在这里插入图片描述
在VMA中通过wireshark工具观察流量信息:

可以看到,黑色部分均为时间超过,不可达的数据包,直到最后才得到了目的主机的reply信息,说明此时数据包可以route到目的主机上去。

4.4 Task 1.4: Sniffing and-then Spoofing

首先根据例题得到,Sniffing程序
在这里插入图片描述
在这里插入图片描述
?在VMA中启动sniffing3.4
在这里插入图片描述
?在VMB中使用ping IP 命令,ping值定 IP地址
在这里插入图片描述
可以看到,在VMA中的程序运行中,成功sent packets,达到Sniffing and Spoofing的目的
?在VMB中即使ping的是一个不存在的ip地址1.2.3.4,但是均得到了reply
在这里插入图片描述
查看VMB中wireshark工具中截获的流量信息:
在这里插入图片描述
?
可以看到,此时ping命令reply包的src地址为1.2.3.4,但是这个reply包实际则是VMA伪造的,而VMA的IP地址为10.0.2.4,成功达到了Sniffing and Spoofing的目的。
?查看VMA中wireshark工具在伪造发送packets时候的流量信息:
在这里插入图片描述
可以看到,此时在VMA中是以1.2.3.4为srcIP地址来发送数据包的,在这个过程中隐瞒了真实的VMA的IP地址10.0.2.4
?Ping一个在LAN中不存在的IP地址:10.9.0.99
在VMB中同样可以成功ping通
在这里插入图片描述
?在VMB中同样可以看到,src地址来源是10.9.0.99
在这里插入图片描述
?Ping一个在Internet上存在的host IP
在VMB中也是可以成功ping通
在这里插入图片描述
?VMB中通过wireshark抓包看到reply的源头也是8.8.8.8
在这里插入图片描述
三种情况下都可以成功达到Spoofing的目的
此即在一个LAN中能够完成对其他主机的嗅探和欺骗功能

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

5.1 Task 2.1: Writing Packet Sniffing Program

根据提供的sample code,尝试运行sniff程序,学习嗅探过程
在这里插入图片描述
在VMB中执行ping命令ping VMA的IP地址,在VMA中执行sniffer程序,可以看到,VMB中发出去的ICMP包都得到了有效的会应,此时VMA中也嗅探到了这些数据包,Got a packet即捕获到了数据包。
在这里插入图片描述
在这里插入图片描述

5.1.1 Task 2.1A: Understanding How a Sniffer Works

Sniffer程序需要对每个捕获到的数据包将其源IP地址和目的IP地址打印出来。
可知,源地址和目的IP地址是位于IP数据包的头部部分的,在接收到数据包的时候需要将数据帧类型转换为以太网头部,继而去判断以太网头部的类型字段是否是0x800,是的话需要将数据交付IP协议处理。
?判断是否需要IP协议处理采用以太网头部的类型字段是因为查阅资料后得知,当数据包采用IP协议时,以太网的头部类型字段是0x800
在这里插入图片描述
?由此分析以太网头部结构,6字节的dst IP,6字节的src IP,以及2字节的type类型字段组成。
在这里插入图片描述
定义以太网头部结构如下:
在这里插入图片描述
?从数据链路层上交网络层IP协议时,需要创建IP数据包的大小,总大小即为pkt的大小与以太网头部的大小之和。之后打印出IP头部的src_IP与dst_IP即可。
在这里插入图片描述
构造IP头部时候,需要考虑头部的组成,查阅资料后得知组成部分分为4bits版本号、4bits头部长度、8bits服务类型、16bits总长度、16bits标识、3bits标识、13bits位偏移、8bitsTTL、8bits协议、16bits头部校验和、32bits源IP和目的IP。总共20bytes构成(不考虑选项字段)
在这里插入图片描述
由此,可以构造出如下的IP首部:
在这里插入图片描述
起初,IP_head中的src_ip与dst_ip,设置为int类型,但是在程序运行的时候不建议使用int作为ip地址32位的类型,根据提示,修改了ip的类型,改为struct in_addr。
在这里插入图片描述
?最后的main函数则与sample code类似
在这里插入图片描述
?在VMA中先运行IP_sniff程序,在VMB中去ping VMA的IP地址,可以在VMA中看到打印出了src以及dst的IP地址。
在这里插入图片描述
在这里插入图片描述

?Question1:描述在sniff程序中的调用序列

1.打开pcap session,设置设备为当前设备enp0s3
2.编译filter
3.抓包:handle_loop以及handle_close

?Quesion2: 嗅探过程为什么需要root权限?没有root的话哪里出错?

Sniff的过程是安全级别比较高的,需要有较高的优先级方可使用,并不代表普通用户也可随意sniff过程,使用普通用户时候将会出现如下情况。提示出错而不允许执行sniff过程。
没用root权限则无法执行混杂模式下的操作。

?Question3: 打开嗅探程序的混杂模式,打开和关闭这个模式的区别是什么?

混杂模式下可以受到同网段下的其他主机发送出去的数据包,但是关闭混杂模式之后,则只能收到发送给自己的数据包。

5.1.2 Task 2.1B: Writing Filters

?ICMP packets:
?抓取两台特定主机间的ICMP包,设置过滤器filter条件
在这里插入图片描述
?此时在VMA中捕获到的数据包只有10.0.2.4发往10.0.2.5的数据包,而10.0.2.5发往10.0.2.4的数据包则被过滤掉。成功嗅探到两台特定主机的数据包。
在这里插入图片描述
?TCP packets:
先telnet IP的方式 嗅探,此时默认port为23。可以看到,方法可行,嗅探成功
在这里插入图片描述
?打开VMA的8080端口,在VMB中通过telnet IP 8080 的方式去探测VMA的8080端口
在这里插入图片描述
可以看到,此时VMB可以对VMA的8080端口访问到,但是VMA并没有sniff这个过程发送来的数据包。
在这里插入图片描述
?这是因为我们设置了filter条件 端口的模式为10-100之间的port,8080端口被过滤掉。
在这里插入图片描述

5.1.3 Task 2.1C: Sniffing Passwords

此时需要对sniff程序进行修改,使其能够sniff到输入的password。考虑到password是属于传输层TCP协议中的payload中,因此需要构造tcp的首部。
分别为端口号、序号、确认号、偏移、保留、字符、窗口、校验和紧急指针。

?TCP包的结构部分参考了网上
SEED-Labs-Packet-Sniffing-and-Spoofing-Lab的实验代码,如下。
在这里插入图片描述
?读取payload,按字符读取
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
?在VMA中运行sniff pwd的程序

?在VMB中telnet 10.0.2.4
?在VMA中嗅探到了如下数据包的payload
?右图所示即为嗅探到的password
在这里插入图片描述
在这里插入图片描述

5.2 Task 2.2: Spoofing

5.2.1 Task 2.2A: Write a spoofing program

题目要求 写一个spoofing 程序,能够成功发送IP数据包。
?首先需要了解数据包报文的整体结构,需要关注的是IP头部以及TCP还有数据部分。
由于TCP是面向连接的,伪造包采用UDP数据包的格式。
此时需要构造的伪造报文结构有三部分:IP、UDP、Data
在这里插入图片描述
而构造数据包必然用到一些头部结构,因此将其定义为了”headers.h”这个头文件。里面包括了Ethernet头部、IP头部、ICMP头部、TCP头部、UDP头部。
?其中在本题中需要新定义的是UDP头部结构。
在这里插入图片描述
从图中可以看出UDP头部的定义由四部分组成:16bits的源端口号、16bits目的端口号、16bits的长度、16bits的校验和。
据此可以定义UDP的头部结构体。(8bytes的头部)
在这里插入图片描述
?Send_rawsocket()参考指导手册以及查阅相关资料后学习到
rawsocket的发送过程主要由四部分组成:
1、创建socket
2、设置socket的option选项
3、组织socket结构
4、发送socket包
在这里插入图片描述
?在此基础上,组织数据包结构并自定义数据部分
在这里插入图片描述
?设置UDP、IP包结构部分
此处伪造设置了源地址6.6.6.6,目的地址9.9.9.9
源端口6666,目的端口9999
在这里插入图片描述
?在VMA中运行spoofing程序,查看到可以成功spoofing UDP数据包。
在这里插入图片描述
?抓包分析
在这里插入图片描述
追踪UDP流可以看到数据包中的数据就是之前在代码中自定义好的”HACKED Successfully”,可以看到Src地址和Dst地址也均是之前数据包中设置好的。
成功伪造了6.6.6.6主机给9.9.9.9主机发送的UDP数据包。Src端口:6666,Dst端口9999,捕捉字节也可以看到具体信息。数据包伪造成功!
在这里插入图片描述

5.2.2 Task 2.2B: Spoof an ICMP Echo Request

本题中需要伪造一个ICMP的发送包,此时需要攻击机伪装成另一台主机,给其他主机发送ICMP数据请求包,查看其他主机是否会成功reply回显内容。
需要伪造基于ICMP协议的数据包,即数据包结构主要由两部分组成:IP、ICMP。

?定义IP、ICMP数据包结构如下。
在这里插入图片描述
其中ip数据包的版本号、头部长度、以及IP包长度、源地址和目的地址、使用协议。
IP包的长度主要是包括IP头部和ICMP头部长度。其中icmp数据包类型字段设置为8,表示是回显请求request的数据包。校验和字段也需要另外设置。根据icmp数据包的头部部分,计算其校验和。
在这里插入图片描述
?校验和计算
查阅资料并参考RFC文档之后,了解到校验和的计算主要分为4个部分:
1、将校验和字段置为0。
2、将每两个字节(16位)相加(二进制求和)直到最后得出结果,若出现最后还剩一个字节继续与前面结果相加。
3、(溢出)将高16位与低16位相加,直到高16位为0为止。
4、将最后的结果(二进制)取反。
在这里插入图片描述
?在VMA中运行该spoofing程序,因为伪造的数据包目的地址是VMB的IP地址,因此
在VMB中适用wireshark进行抓包,查看是否VMB收到是了回显请求的数据包,并且是否成功回显回复的数据包。
在这里插入图片描述
在VMB中wireshark抓包情况:
在这里插入图片描述
可以看到,ICMP request成功伪造,VMA10.0.2.4代表了6.6.6.6主机发送了伪造的Echo request数据包,并且成功欺骗了VMB 10.0.2.5主机,发送了Echo reply数据包。说明伪造成功!
?Question4. Can you set the IP packet length field to an arbitrary value, regardless of how big the actual packet is?
Answer:不能设置IP数据包的长度为任意数值,因为规定了最大数据单元MTU,限制了IP数据包的长度
?Question 5 Using the raw socket programming, do you have to calculate the checksum for the IP header?
Answer:没有,计算校验和字段是对于ICMP的头部计算的,不需要计算IP部分。
?Question 6. Why do you need the root privilege to run the programs that use raw sockets? Where does the program fail if executed without the root privilege?
Answer:因为对包的嗅探和伪造是高安全级别的,不允许普通用户有权利执行此操作。在普通用户情况下的运行是会出错的,如图所示。
在这里插入图片描述

5.3 Task 2.3: Sniff and then Spoof

根据题目要求,在本题中需要在VMB中运行程序,当VMA去ping任意ip地址时(包括错误地址),VMB的程序可以sniff到echo request请求,并立刻发送spoof的icmp echo reply数据包。
整体过程与之前的任务大同小异,无非就是sniff和spoof的结合技术。
主要过程就是分为:sniff->echo_reply->spoofing。此时需要额外做的就是echo_reply的过程,对数据包如何构造reply包。
?构造reply数据包
在构造过程中,将抓到的ip数据包的内容复制进buffer。构造一个回显reply包的过程类似于2.2B中构造ICMP Request的过程,不同的是此时需要对I原P包的源地址和目的地址更换。
除此之外,对构造的ICMP数据包的还需要定义气type字段。需要注意的是,ICMP中类型字段为8表示的是Echo Request,类型字段为0表示Echo Reply数据包。
其余过程即是sniff技术与spoofing技术的结合使用。
在这里插入图片描述
?在VMB上运行程序。
可以看到,在嗅探阶段,会打开pcap、BPF编译等工作。
在这里插入图片描述
?VMA上ping 任意IP地址
此处,为了观察方便,设置了发送的icmp包的数量是3
可以看到,在VMA上显示,三个包均收到了回显回复,没有包的丢失。在VMA上看来是1.2.3.4的主机回复来的数据包。实则收到的是VMB伪造的数据包。
在这里插入图片描述
?VMB上显示收到了数据包,并成功Spoofing,对于收到的三个ICMP数据包,均伪造成功,并回送给了源IP地址。
在这里插入图片描述
?在VMA上适用wireshark抓包查看,可以看到,确实收到了从1.2.3.4主机发送来的reply数据包(显然,这已经达到了伪造数据包并成功欺骗的目的)