实验1 数据包嗅探和欺骗

实验1 数据包嗅探和欺骗

  • 相关概述:

数据包嗅探和欺骗

数据包嗅探和欺骗是网络安全中的两个重要概念;它们是网络通信中的两大威胁。

数据包嗅探是指通过监视网络上的数据流量来获取信息的过程。在Linux系统中,可以使用工具如tcpdump或Wireshark来进行数据包嗅探。这些工具基于libpcap库,可以捕获网络接口上的数据包,并将它们显示出来,供用户分析。

数据包欺骗是指发送伪造的数据包到网络上,以欺骗其他主机或网络设备。常见的数据包欺骗技术包括ARP欺骗、DNS欺骗和ICMP欺骗等。

两种嗅探模式

设备通过网络接口卡(networkinterface card, NIC, 简称“网卡”)接入网络。网卡是位于计算机和网络之间的物理或者逻辑连接,每一个网卡都有一个硬件地址,称作MAC地址。常用的本地通信网络(localcommunication network)、以太网(Ethernet)和WiFi本质上都是广播型介质,意思是网络中的设备均连接到一个共享的介质上。

混杂模式。网卡会丢弃目标地址和自身MAC地址不匹配的数据帧,而不会交给CPU处理,因此嗅探程序也无法得到这些数据帧幸运的是,大多数网卡都有一种特殊的模式,称为混杂模式。在该模式下,网卡把从网络中接收到的每个数据帧都传递给内核,而不管其目的地址是否与网卡的MAC地址相吻合。如果内核中注册了嗅探处理回调函数,那么所有数据帧都会由内核交给该嗅探程序处理。还有一点需要注意,操作系统通常需要较高的权限(如root 权限)才能将网卡设置成混杂模式。

监听模式。与有线网络中的混杂模式相似,无线网卡也可以通过监听模式进行嗅探。与以太网不同的是,无线设备存在相邻设备干扰的问题,这会严重影响网络连接的性能。为了解决这个问题,WiFi设备通过不同的信道传递数据,接入点将相邻的设备用不同的信道连接起来,从而减少了冲突带来的影响。 WiFi 网卡的设计也做了相应的调整,可以在整个可用带宽和信道的分片上进行通信(Sanders,2011)。由于这样的设计,当网卡处于监听模式时,它只能捕捉所监听信道中的 802.11数据帧。这意味着,与以太网能监听所有的数据帧不同,由于存在不同的信道,可能会错过同一个网络中其他信道传输的信息。大多数无线网卡都不支持监听模式,即便支持,也默认被其制造商所禁用。

虚拟机连接的三种模式

桥接模式将主机网卡与虚拟的网卡利用虚拟网桥进行通信。类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一个接口上,物理主机也同样插在这个交换机当中,所以所有桥接下的网卡与网卡都是交换模式的,相互可以访问而不干扰。在桥接模式下,虚拟机IP地址需要与主机在同一网段,如果需要联网,则网关与DNS需要与主机网卡一致。

NAT模式桥接模式可能会导致一定的ip资源紧缺,这时候NAT模式时最佳选择。在NAT模式中,主机网卡直接与虚拟NAT设备相连,然后虚拟NAT设备与虚拟DHCP服务器一起连接在虚拟交换机上,这样就实现了虚拟机联网。VMware Network Adapter VMnet8网卡是为了实现主机与虚拟机之间的通信。可见NAT模式下主机更像是虚拟机们的"路由器",通过VMnet8虚拟网卡为虚拟机分发地址。所以虚拟机和主机不再同一网段下,可以理解为主机是虚拟机的"上级"。而桥接模式下的虚拟机和主机是"平等"的,共用同一个路由器

仅主机模式仅主机模式可有看成是NAT模式去除了虚拟NAT设备,然后使用VMware Network Adapter VMnet1虚拟网卡连接VMnet1虚拟交换机来与虚拟机通信的,Host-Only模式将虚拟机与外网隔开,使得虚拟机成为一个独立的系统,只与主机相互通讯。

  • 实验准备:

虚拟机环境:Ubuntu 20.04桌面版

网络环境:桥接模式

python环境:python3.8

用到的工具:

Scapy:Scapy是用Python编写的交互式数据包处理工具。使用Scapy可以伪造或解码各种协议的数据包,在线发送它们,捕获它们,匹配请求和答复等等。

WireShark:WireShark是非常流行的网络封包分析工具,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程中各种问题定位。

  • 实验内容:
  1. 环境安装:

pip安装:

sudo apt-get install python3-pip 

scapy安装:

sudo pip3 install scapy

如果太慢可以加这个参数

-i https://pypi.tuna.tsinghua.edu.cn/simple

wireshark安装:

sudo apt-get update

sudo apt-get install wireshark

启动wireshark

sudo wireshark

  1. 使用scapy嗅探

测试代码,打印自己虚拟机ip的地址:

#!/usr/bin/python3

from scapy.all import *

a = IP()

a.show()

sniff函数是Scapy中的探嗅函数,进行流量抓取,是本实验研究的主要内容。如下是一些它的参数列表:

其中比较重要的就是filter参数,我们可以根据它设置我们的过滤参数。如下代码进行了对imcp协议包的过滤:

#!/usr/bin/python3

from scapy.all import *

def print_pkt(pkt):

pkt.show()

pkt = sniff(filter='icmp', prn=print_pkt)

我们运行这段代码,开始流量监听,过滤条件是icmp协议包,在主机电脑上我们用ping命令测试虚拟机ip,正常收到所有ICMP回应数据包。

在虚拟机监听端,我们就会得到一下信息,从虚拟机发往主机的ICMP回应数据包。如下图标注。

同理,我们指定规则捕获来自特定IP且目的端口号为23的任何TCP数据包。先写一个发送特定信息python执行文件,并指定tcp端口是23号:(注意:/ 运算符被IP类重载,因此不再代表除法;相反,这意味着添加b作为a的有效载荷字段,并相应地修改a的字段。)

#!/usr/bin/python3

import time

from scapy.all import *

ip = IP()

ip.src = "192.168.35.73"

ip.dst = "128.230.0.1"

tcp = TCP()

tcp.dport = 23

send(ip/tcp) #这是/运算符

设置监听函数,filter参数设定为tcp and src 192.168.35.73 and dst port 23:

#!/usr/bin/python3

from scapy.all import *

def print_pkt(pkt):

pkt.show()

pkt = sniff(filter='tcp and src 192.168.35.73 and dst port 23', prn=print_pkt)

不设置tcp包的发送,我们也捕获到一些其他流量指定源ip地址是虚拟机ip地址,目标端口是80:

捕获来自或去往特定子网的数据包。您可以选择任何子网,如128 . 230 . 0 . 0/16;您不应该选择虚拟机所连接的子网。设置监听函数,filter参数设定为net 128.230.0.0/16:

  1. 使用scapy进行欺骗

作为数据包欺骗工具,Scapy允许我们将IP数据包的字段设置为任意值。此任务的目标是利用任意源IP地址欺骗IP数据包。我们将欺骗ICMP回应请求数据包,并将它们发送到同一网络上的另一个虚拟机。我们将使用Wireshark观察我们的请求是否会被接收者接受。如果它被接受,一个回应应答包将被发送到欺骗的IP地址。

点击Option进行配置需要监听的网卡,这个点,桥接模式下,也许流量不走的是ens33网卡或者enth0网卡,可能监听不到,所以选择监听any流量选项。进行流量监听。

此任务的伪造ip地址回应ICMP包,本机ip地址为192.168.35.73,我们伪造成192.168.35.74:

#!/usr/bin/python3

import time

from scapy.all import *

ip = IP()

ip.src = "192.168.35.73"

ip.dst = "192.168.35.109"

icmp = ICMP()

send(ip/icmp) 

我们本身虚拟机的监听也可以监听到。

Wireshark也可以监听到。

此外我们也可以进行嗅探然后发送欺骗回应。同一局域网上需要两台虚拟机。从虚拟机A,您ping一个IP X。这将生成一个ICMP回应请求数据包。如果X还活着,ping程序会收到一个回应,并打印出响应。你的嗅探然后欺骗程序运行在虚拟机B上,它通过数据包嗅探来监控局域网。每当它看到一个ICMP回应请求时,不管目标IP地址是什么,您的程序都应该立即使用数据包欺骗技术发送一个回应回复。因此,不管机器X是否还活着,ping程序总会收到一个回复,表示X还活着。您需要使用Scapy来完成此任务。在你的报告中,你需要提供证据来证明你的技术是有效的。(虚拟机A也可以用主机代替吧,但是我用的是虚拟机。)

编写如下代码,接收到虚拟机A的发送流量之后,在虚拟机B端运行代码,进行伪造回应:

#!usr/bin/python3

from scapy.all import *

def print_pkt(pkt):

send(IP(src=pkt[IP].dst, dst=pkt[IP].src)/ICMP(type="echo-reply", code=0, id=pkt[ICMP].id, seq=pkt[ICMP].seq))

print("hhhhhhhhh")

pkt = sniff(filter="icmp[icmptype]==icmp-echo", prn=print_pkt)

如下进行演示,虚拟机A(HA)进行ping baidu.com命令,此时虚拟机B(NB)进行监听伪造。

  1. 追踪路线

使用Scapy来估计您的虚拟机和选定目的地之间的距离(根据路由器数量)。这基本上是traceroute工具实现的。在这个任务中,我们将编写自己的工具。这个想法很简单:只需向目的地发送一个数据包(任何类型),其生存时间(TTL)字段首先设置为1。该数据包将被第一台路由器丢弃,它将向我们发送一条ICMP错误消息,告诉我们生存时间已经超过。这就是我们获取第一台路由器的IP地址的方法。然后,我们将TTL字段增加到2,发送另一个数据包,并获得第二个路由器的IP地址。我们将重复这个过程,直到我们的数据包最终到达目的地。需要注意的是,这个实验只得到一个估计的结果,因为理论上,并不是所有的这些数据包都采用相同的路由(但实际上,它们可能在短时间内)。

编写代码:

#!/usr/bin/python3

from scapy.all import *

#if conf.ipv6_enabled:

# from utils6 import *

# from route6 import *

import sys

def traceroute(target, minttl=1, maxttl=30, dport=80):

    print("target: %s(port=%s)" % (target, dport))

    ans, unans = sr(IP(dst=target, ttl=(minttl,maxttl),id=RandShort())/TCP(flags=0x2, dport=dport), timeout=10)

    for snd,rcv in ans:

        print(snd.ttl, rcv.src)

if __name__ == '__main__':

    if len(sys.argv) <= 1:

        traceroute("baidu.com")

    else:

        traceroute(sys.argv[1])

看一下百度离我们有多远,如运行所示,有15个距离。

  • 总结

在这个实验中,我们通过配置Ubuntu虚拟机环境,使用Python编写并运行了基于Scapy和Wireshark的网络实验。通过嗅探网络流量、欺骗数据包以及追踪路线等操作,深入了解了网络数据包处理和欺骗的原理与方法。通过这些实验,我们不仅学习了如何使用这些工具进行网络分析和安全测试,还提升了对网络协议和数据包传输的理解,为进一步探索网络安全领域奠定了基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值