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()
…