python信息收集(二)

    在第二層主機發現中,除了使用arping命令外,還可以使用Kali下自帶的一個工具————netdiscover。
     netdiscover是一個專門用於二層主機發現的工具,它有兩種掃描方式:主動掃描和被動掃描。其中,主動掃描的原理就是對外發送ARP廣播,操作也很簡單。例如,我本機的IP所在的網段為192.168.80.0/24,我要掃描我這個網段的存活主機,指令為netdiscover -r 192.168.80.0/24 這裡的掃描參數為r。被動掃描的原理是將我們自己機器的網卡設置為混雜模式,接受網絡中的ARP廣播,被動掃描相比主動掃描的好處是被動掃描可以隱蔽自己。操作指令為netdiscover -p,如下所示:

    介紹完工具之後,我們來用python實現一下這個功能,與之前利用python模塊subprocess發送arping命令不同是,這次我們使用python下的另外一個模塊————scapy。
    scapy模塊的優勢在於可以自由的去構造一系列的報文,並通過scapy發送出去,再接收回應。另外scapy模塊對接收到的回應只做解碼,而不做解釋,它只會如實顯示響應的報文,不會去提供分析的結論,至於判斷和利用都由我們自己來決定。,並且scapy可以在二、三、四層工作。
    先上代碼

import os
import time
from scapy.all import * 
from threading import Thread
from optparse import OptionParser

def sweep(ip):
    try:
        pakt=Ether(dst="ff:ff:ff:ff:ff:ff",src="")/ARP(
        hwsrc="",psrc="",hwdst="00:00:00:00:00:00",pst=ip
        )
        #src源mac,hwsrc源mac,psrc寫源ip
        if result:
            time.sleep(0.1)
            print ip,'在線'
            return
    except:
        return
        
def main():
    usage="Usage: %prog -f <filename> -i <ip address>"
    parser=OptionParser(usage=usage)
    parser.add_option("-f","--file",type="string",dest="filename",help=
    "specify the IP address file")
    parser.add_option("-i","--ip",type="string",dest="address",help=
    "specify the IP address")
    (options,args)=parser.parse_args()
    filename=options.filename
    address=options.address
    
    if(filename == None and address == None):
        print "請指定IP列表文件或者IP地址"
        sys.exit()
        
    if filename:
        if not os.path.exists(filename):
            print "指定文件不存在,請重新輸入"
            sys.exit()
        f=open(filename,"r")
        for i in f.readlines():
            ip = i.strip("\n")
            t=Thread(target=sweep,args=(ip,))
            t.start()
        
    if address:
        prefix=address.split(".")[0]+"."+address.split(".")[1]+"."+address.split(".")[2]+"."
        for i in range(1,255):
            ip=prefix+str(i)
            t=Thread(target=sweep,args=(ip,))
            t.start()
        
if __name__=='__main__':
    main()

代碼的一些解釋

1.sweep()函數中是這個腳本的主要功能,我們通過scapy構造一個ARP廣播包。dst為目的mac地址,這裡由於我們要發現主機,所以填寫廣播地址ff:ff:ff:ff:ff:ff ,src為本機的mac地址,可以不填寫。hwsrc同樣為本機的mac地址,psrc為本機的ip地址,hwdst為被攻擊的mac地址,這裡保持默認就好。
2.verbose=0的作用是不反饋各種信息,如果不加這條,會返回很多影響我們判斷的信息,建議寫上。
3.-f選項是讀取文件,-i選項是選擇ip地址
4.readlines()方法是一次性把內容都讀取到內存中,當文件很大時,可能會導致內存不夠用。要讀取大文件的話,一般是一行一行的讀,
如  f=open(‘password.txt’)
     for i in f:
          print i.strip()

Tags: