Python 流量分析

小白菜一棵,進修視頻學習中!

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])

測試結果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章