wireshark抓不到包

跟开不开混杂模式没关系

因为现在的局域网用的都是交换机,交换机它不会把别人的包传到你这里来

它使用ARP协议,然后之后直接找到对应的MAC地址,直接是发到对应的主机上去了

然后如果连的是无线网的话,它就是相当于一个路由器,它也不会这样子

用wireshark时,大多数情况下我们都是用的电脑自带的无线网卡,所以只能抓取到流经本机网卡的网络包。也就是说除了局域网内的广播包外你无法抓到其他设备的网络包。除非你买一个专用usb抓包网卡,这里不讨论这种情况。

突破wireshark的局限性

有两种方式

  1. 运行wireshark的设备的成为网络的分享者
  2. arp欺骗

    运行wireshark的设备的成为网络的分享者

    比如我们希望抓取局设备dev1和云端server通信的数据,我们需要用自己的电脑开一个热点(Ap),即建立一个私有的局域网。dev1做为(Station)连接到Ap。这样当我们在自己的电脑上运行wireshark时就可以抓到dev1和server的通信数据了。

AP.webp

局限性

其实在局域网内抓包并不是个容易的事,上面的情况是Dev1和server通信的情况下wireshark可以抓到包,但如果我们需要抓取局域网内两个设备Dev1和Dev2之间通信数据的话,这种情况就无法抓取了。

limit.webp

明明在同一个局域网,为什么PC上的wireshark无法抓取Dev1和Dev2的通信呢?原因正是因为Dev1和Dev2在同一个局域网的原因,它俩的通信数据在经过PC的网卡时只涉及Mac层,压根就不会进入PC的IP层协议处理,所以运行在PC上的wireshark自然就看不到任何数据了。而Dev1和server通信的情况就不同了,它需要PC将数据路由至外网的server,需要路由的数据必然会经过IP层协议,所以wireshark能够很好的抓取二者的通信数据包。

arp欺骗

ARP欺骗(ARP spoofing),又称ARP毒化(ARP poisoning),通过欺骗局域网内访问者PC的网关MAC地址,使访问者PC错以为攻击者更改后的MAC地址是网关的MAC,从而实现窃听数据包

发送arp包,让目标机以为是网关发过来的,并且网关mac对应的是攻击机ip,使目标机以为攻击机mac为网关的mac

虚拟机ubuntu16.04 IP地址192.168.43.158 mac 00:0c:29:79:b6:a2

目标机win10 IP地址192.168.43.76 网关192.168.43.1 mac f2-d9-6d-01-e8-ba

首先将虚拟机的连接方式改为桥接模式,在虚拟机中打开终端,输入ifconfig命令得到虚拟机的IP地址跟mac地址以及网卡名为ens33

虚拟机地址.png

查看主机和网关地址
PC地址.png

gatewayip.png

下面进行arp欺骗,欺骗后主机就会误认为虚拟机时网关,所以请求都会经过虚拟机,这样你就可以捕捉到主机的流量了,但是你得先设置虚拟机IP数据包转发功能,不然主机无法上网。

要查看Ubuntu是否已经开启了IP数据包转发功能,可以执行

1
cat /proc/sys/net/ipv4/ip_forward

暂时开启

如果IP数据包转发未启用,您可以通过以下命令启用它:

1
sudo sysctl -w net.ipv4.ip_forward=1

这将立即启用IP数据包转发功能,但这个设置在系统重启后将会失效。如果想要在系统重启后依然保持设置,可以编辑 /etc/sysctl.conf 文件,找到 net.ipv4.ip_forward 行并确保它设置为 “1”。

永久开启

1
sudo nano /etc/sysctl.conf

在文件末尾添加以下行,表示开启 IP 转发功能:

1
sudo sysctl -p

首先打开虚拟机终端输入arpspoof -i ens33 -t 192.168.43.76 192.168.43.1 其中ens33即一开始得到的网卡名,-t后为目标ip和网关ip

arpspoof.png

主机输入arp -a命令查看注册表,会发现此时网关的mac地址已经变成了虚拟机的mac地址,如下

macchange.png

用主机ping 百度的网站,同时在虚机打开wireshark使用过滤命令ip.dst==36.152.44.95可以截获主机的包。

在虚拟机中按ctrl+c即可终止欺骗

socket和scapy抓包

scapy

1
2
3
# 设置要抓包的网络接口
network_interface = "ens33"
sniff(iface=network_interface, prn=packet_handler)

socket

1
2
3
4
5
6
7
8
def getsocket():
# 创建原始套接字,需要管理员或root权限
raw_socket = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003))

# 设置网络接口为混杂模式
interface = "ens33" # 你需要替换为实际的网络接口名称
raw_socket.bind((interface, 0))
return raw_socket