小白菜一棵,進修視頻學習中!
1 ARP流量監控
- ARP攻擊,使目標主機無法與外界通信:
攻擊主機制造假的arp應答,併發送給局域網中除被攻擊之外的所有主機。arp應答中包含被 攻擊主機的IP地址和虛假的MAC地址。
攻擊主機制造假的arp應答,併發送給被攻擊的主機,arp應答中包含除被攻擊攻擊主機之外的所有主機的IP地址和虛假的MAC地址。
- ARP欺騙攻擊,充當中間人,獲取中間流量的信息:
以太網設備(比如網卡)都有自己全球唯一的MAC地址,它們是以MAC地址來傳輸以太網數據包的,但是以太網設備卻識別不了IP數據包中的IP地址,所以要在以太網中進行IP通信,就需要一個協議來建立IP地址與MAC地址的對應關係,使IP數據包能夠發送到一個確定的主機上。這種功能是由arp(AddressResolution Protocol)來完成的。
ARP欺騙就是破壞IP與MAC的真實對應關係。
ARP包的關鍵參數,psrc,hwsrc,op
op=(1/2) (who-has/is-at) (request/reply)
使用scapy監控(當IP與MAC綁定時):
# -*- coding=utf-8 -*-
import sys
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)#清除報錯
from ARP_Table import ARP_Table #導入合法的IP-ARP映射關係字典
from scapy.all import *
def arp_monitor_callback(pkt):
if ARP in pkt and pkt[ARP].op in (1,2): #找到op=1或2的數據包
if ARP_Table.get(pkt[ARP].psrc):#IP地址在合法的IP-ARP映射字典中
if ARP_Table[pkt[ARP].psrc] == pkt[ARP].hwsrc:#與合法的IP-ARP映射字典中MAC地址相符
print("IP地址: " + pkt[ARP].psrc + " MAC地址: " + pkt[ARP].hwsrc + " 匹配")
else:#與合法的IP-ARP映射關係字典中MAC地址不相符
print("IP地址: " + pkt[ARP].psrc + " MAC地址: " + pkt[ARP].hwsrc + " 不匹配!!!")
else:#IP地址在合法的IP-ARP映射字典中不存在
print("IP地址: " + pkt[ARP].psrc + " MAC地址: " + pkt[ARP].hwsrc + " 未找到條碼!!!")
#捕獲數據包,並通過方法arp_monitor_callback進行處理,filer過濾arp數據包,store=0不保存數據,iface指派接口
PTKS=sniff(prn=arp_monitor_callback, filter="arp", store=1, timeout =30,iface='eth0')
wrpcap('arp.cap',PTKS)
#保存數據包,必須設置timeout
ARP_Table.py
ARP_Table = {
"IP":"mac",
"ip":"mac"
}
2 Scapy分析PCAP包中的TCP
Python讀取PCAP文件
提取所有TCP的源IP,目的IP,目的端口,並把這三元素作爲字典的鍵,記錄這三元組的會話數量。
如果數量超過3個,就報有DoS攻擊發生
# -*- coding=utf-8 -*-
import logging
from scapy import *
from scapy.all import rdpcap
import sys
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)#清除報錯
def dos_find(filename):
pkts=rdpcap(filename)
pktlist = pkts.res
print('正在分析'+filename+'\n ***************************')
dos_dict = {}
for pkt in pktlist:
try:
if pkt[0][2].fields['flags'] == 2:
sourceip = pkt[0][1].fields['src']
desip = pkt[0][1].fields['dst']
desport = pkt[0][2].fields['dport']
socket = sourceip,desip,desport
try:
dos_dict[socket]
except:
dos_dict[socket]=1
else:
dos_dict[socket] = dos_dict[socket]+1
except:
pass
for socket,num in dos_dict.items():
if num >3:
print('可能存在來自'+str(socket[0])+' 發往'+str(socket[1])+' 端口爲'+str(socket[2])+'的DOS攻擊 '+'連接次數:'+str(num))
if __name__ == "__main__":
dos_find(sys.argv[1])
測試結果: