Python黑帽編程 3.2 ARP監控


Python黑帽編程 3.2 ARP監控

在第3.1ARP欺騙》中,我們學習了ARP的基本原理,使用Python實現了我們自己的ARP欺騙工具。在上一節的基礎上,我們來實現一個ARP監控程序,該程序存儲局域網中所有的IPMAC對應關系,如果有新加入的機器會動態添加到列表中,如果有機器的ARP記錄發生了變化,會發出警告。

實現這個程序的關鍵,只有一點,就是監聽網絡中ARP數據包。Scapy中的sniff方法可以滿足我們對ARP監聽的需求。

3.2.1 sniff方法

sniff方法是用來嗅探數據的,我們首先使用help查看一下此方法的使用說明:

2

sniff(count=0, store=1, offline=None, prn=None, lfilter=None, L2socket=None, timeout=None, opened_socket=None, stop_filter=None, *arg, **karg)

    Sniff packets

    sniff([count=0,] [prn=None,] [store=1,] [offline=None,] [lfilter=None,] + L2ListenSocket args) -> list of packets

   

      count: number of packets to capture. 0 means infinity

      store: wether to store sniffed packets or discard them

        prn: function to apply to each packet. If something is returned,

             it is displayed. Ex:

             ex: prn = lambda x: x.summary()

    lfilter: python function applied to each packet to determine

             if further action may be done

             ex: lfilter = lambda x: x.haslayer(Padding)

    offline: pcap file to read packets from, instead of sniffing them

    timeout: stop sniffing after a given time (default: None)

    L2socket: use the provided L2socket

    opened_socket: provide an object ready to use .recv() on

    stop_filter: python function applied to each packet to determine

                 if we have to stop the capture after this packet

                 ex: stop_filter = lambda x: x.haslayer(TCP)

sniff()函數有一個重要的參數是filter,用來表示想要捕獲數據包類型的過濾器,如只捕獲ICMP數據包,則filter=”ICMP”;只捕獲80端口的TCP數據包,則filter=”TCP and (port 80)”。其他幾個重要的參數有:count表示需要不活的數據包的個數;prn表示每個數據包處理的函數,可以是lambda表達式,如prn=lambda x:x.summary()timeout表示數據包捕獲的超時時間。

sniff(filter="icmp and host 66.35.250.151", count=2)

這段代碼過濾icmp協議,host地址為66.35.250.151,捕獲數據包個數為2個。

sniff(iface="wifi0", prn=lambda x: x.summary())

這段代碼綁定網卡wifi0,對捕獲的數據包使用summary進行數據匯總。

sniff(iface="eth1", prn=lambda x: x.show())

這段代碼綁定網卡eth1,對數據包調用show方法,顯示基本信息。

如何使用sniff方法過濾ARP請求呢?看下面的代碼:

3

#!/usr/bin/python

 

from scapy import sniff,ARP

 

def watchArp(pkg):

    pass

 

sniff(prn=watchArp,filter="arp",iface="eth0",store=0);

這段代碼先定義了一個空的watchArp方法,接收一個數據包對象,稍后我們會擴展該方法,用來提取數據包中的關鍵信息。接下來一行調用sniff方法,prn參數為watchArp方法,sniff會把捕獲的數據包傳遞給該方法;filter我們指定了arpiface是指定要監聽的網卡為“eth0”store設置為0,不存儲數據包。

數據包捕獲就這樣完成了,是不是體會到scapy的便捷性了呢?下面我們對捕獲的數據包進行處理。

3.2.2 解析數據包

首先我們定義一個字典變量,用來存儲ipMAC的對應關系。

ip_mac = {}

然后,我們完善watchArp方法。

4

首先對ARP包做類型判斷。

    if pkt[ARP].op == 2:

        print pkt[ARP].hwsrc + " " + pkt[ARP].psrc

如果是ARP響應包,打印MAC地址和ip地址。緊接着判斷ip地址是否存儲過。

if ip_mac.get(pkt[ARP].psrc) == None:

        print "Found new device " + \

        pkt[ARP].hwsrc + " " + \

        pkt[ARP].psrc

        ip_mac[pkt[ARP].psrc] = pkt[ARP].hwsrc

如果沒有在我們的字典中,我們判斷它是新加入網絡的主機,打印出它的MACIP地址。如果在我們的字典中,但是MAC值不一樣,肯定是某台機器變更了MAC地址,這是異常情況:

elif ip_mac.get(pkt[ARP].psrc) and ip_mac[pkt[ARP].psrc] != pkt[ARP].hwsrc:

      print pkt[ARP].hwsrc + \

      " has got new ip " + \

      pkt[ARP].psrc + \

      " (old " + ip_mac[pkt[ARP].psrc] + ")"

     

      ip_mac[pkt[ARP].psrc] = pkt[ARP].hwsrc

打印出現異常情況的主機,同時更新我們的字典。

3.2.3 完整代碼

將上面的代碼拼裝在一起,就是一個完整的例子了:

#!/usr/bin/python

 

from scapy.all import sniff,ARP

from signal import signal,SIGINT

import sys

 

ip_mac = {}

 

def watchArp(pkt):

    if pkt[ARP].op == 2:

        print pkt[ARP].hwsrc + " " + pkt[ARP].psrc

 

  # Device is new. Remember it.

    if ip_mac.get(pkt[ARP].psrc) == None:

        print "Found new device " + \

        pkt[ARP].hwsrc + " " + \

        pkt[ARP].psrc

        ip_mac[pkt[ARP].psrc] = pkt[ARP].hwsrc

 

  # Device is known but has a different IP

    elif ip_mac.get(pkt[ARP].psrc) and ip_mac[pkt[ARP].psrc] != pkt[ARP].hwsrc:

        print pkt[ARP].hwsrc + \

        " has got new ip " + \

        pkt[ARP].psrc + \

        " (old " + ip_mac[pkt[ARP].psrc] + ")"

 

        ip_mac[pkt[ARP].psrc] = pkt[ARP].hwsrc

 

sniff(prn=watchArp,filter="arp",iface="eth0",store=0);

下面我們運行看看效果:

5

 

3.2.3 小結

本節結合sniff和我們上一節的基礎知識,做一個ARP監控的小例子。大家要學會舉一反三,結合上一節的ARP欺騙,和本節的監控,二者是否可以結合呢?歡迎在微信訂閱號的本篇文章下留言討論。

下一節,我們針對很多小型的路由交換設備存在的ARP緩存區溢出問題,一起來完善一個MAC洪水攻擊的程序。

3.3節《MAC洪水攻擊》已經在微信訂閱號搶先發布,心急的同學進入訂閱號(二維碼在下方),從菜單專欄”—>”Python黑帽編程進入即可。

 

查看完整系列教程,請關注我的微信訂閱號(xuanhun521,下方二維碼),回復“python”。問題討論請加qq群:Hacking 1群):303242737   Hacking 2群):147098303

 

玄魂工作室-精彩不斷

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM