信息搜集-二層發現 Scapy

信息蒐集-二層發現 Scapy

點擊右上角【關注】發哥微課堂頭條號,get更多相關技能~


0x00:簡介

scapy 是一個很強大的庫文件,是 python 為了操作網絡流量而寫的一個庫。它可以抓包分析包以及創建修改等很多強大的功能,這篇記錄 scapy 怎麼去做二層發現,這個工具在後面幾層也會用到。

0x01:scapy 使用

scapy 可以直接在 kali 命令行輸入 scapy 進行啟動,如下圖:

信息蒐集-二層發現 Scapy


啟動後就進入到了 scapy 中,隨後就可以按照 scapy 的語法輸入相關的命令去執行相關的請求,例如輸入 ARP() 則代表調用 arp 函數,在 scapy 中,函數名稱一律大寫,當輸入 ARP() 時會發現沒有輸出,這時需要接一個 display() 來進行顯示才會輸出內容。命令是:ARP().display(),arp 是函數名稱,display 是這個函數下的方法,圖如下:

信息蒐集-二層發現 Scapy


arp 函數里的內容其實就是一個 arp 包頭,裡面的字段就是包頭包含的一些變量和值,其含義如下:

信息蒐集-二層發現 Scapy


其實這就是一個 arp 包頭,這裡通過 wireshark 抓一個 arp 協議類型的包進行對比,如下圖:

信息蒐集-二層發現 Scapy


通過上面可以知道,arp 函數已經包含了 arp 協議包頭結構,那麼 arp 函數使用的時候,只需要設置 arp 函數中的相應字段的值,然後把它發出去即可。

通常情況下,首先需要把要使用的函數賦給一個變量,這樣後續操作會方便很多,例如:arp=ARP(),這樣就把 ARP 函數賦給了 arp 變量,然後給 arp 變量中的 pdst 字段指定一個值(pdst 是要查的目標 ip,也就是要掃描的機器 ip),例如:arp.pdst="172.168.1.104", 最後可以 arp.display() 來查看一下設置都是否正確,過程如下:

信息蒐集-二層發現 Scapy


設置好要發送的目標 ip 後,就可以發包了,發包是 sr1 函數,參數是傳一個 arp 包,也就是剛才設置的,例如:sr1(arp),圖如下:

信息蒐集-二層發現 Scapy


結果可以看到完成發送了一個包,返回了一個包,含有一個回答,丟失了 0 個包。然後就是返回包的一些信息,包含了目標的 mac 和 ip,因為要滿足以太網最小包的大小,而包的內容一共大小不滿足的時候,就會使用 padding 來補全,使用的是十六進制的 0 來補全的。

默認輸出的包是沒有格式的,都在一行上,如果想方便查看,可以把結果賦給一個變量,然後直接變量 display 即可。

0x02:python 腳本和 scapy

python 腳本可以把 scapy 當作模塊使用,然後實現批量掃描,例如以下 python 腳本:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import logging
import subprocess
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
if len(sys.argv)!=2:
print "參數錯誤,正確示例例如:./scapy-arp-1.py eth0"
sys.exit()
interface=str(sys.argv[1])
ip=subprocess.check_output("ifconfig "+interface+" | grep 'inet ' | cut -d 't' -f 2 | cut -d '.' -f 1-3",shell=True).strip()
prefix=ip.split('.')[0]+'.'+ip.split('.')[1]+'.'+ip.split('.')[2]+'.'
for addr in range(0,254):
answer=sr1(ARP(pdst=prefix+str(addr)),timeout=0.1,verbose=0)
if answer == None:
pass
else:
print prefix+str(addr)

腳本首先導入了相應的庫,然後判斷使用腳本時的參數,是否跟了一個網卡,隨後獲取自己 ip 的前三段,然後循環第四段從 1 到 254,最後用 scapy 的 ARP 函數進行循環執行。

腳本是單線程的,所以速度可能會慢,有一點是 sr1 裡面設置 timeout 超時時間,因為 scapy 默認如果去給一個不存在的目標發請求的話,他會不斷的請求,並且不退出,直到目標上線。所以設置 timeout,超過一定時間就執行下一步。

運行示例如下:

信息蒐集-二層發現 Scapy


通過 wireshark 抓包如下:

信息蒐集-二層發現 Scapy


可以看到協議是 ARP 的,每個 ip 的發送數量默認是兩個,所以是兩遍,scapy 為了準備不誤報,會確認一下目標是否真的存在。

當已經有要掃描的 ip 表時,可以存到文件中,然後 scapy 去讀取文件的內容進行掃描發現,示例腳本如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
if len(sys.argv)!=2:
print "參數錯誤,使用示例:./scapy-arp-2.py filename"
sys.exit()
filename=str(sys.argv[1])
file=open(filename,'r')
for addr in file:
answer=sr1(ARP(pdst=addr.strip()),timeout=0.1,verbose=0)
if answer == None:
pass
else:
print addr.strip()

運行腳本時後跟要掃描的文件名即可。

0x03:總結

scapy 很強大,這篇博客只記錄了二層發現時的一些用法,後續其它層發現也會涉及到 scapy,二層發現記錄了 arping、nmap、netdiscover 和 scapy,主要使用的 arp 協議。


分享到:


相關文章: