Python3+Scapy 自動化探測IP位址

Python3+Scapy 自動化探測IP地址

Scapy 是一個強大的交互工具,可用於捕獲,分析,操作甚至創建協議兼容的網絡流量,然後注入到網絡中。 Scapy 也是一個可以在 Python 中使用的庫,從而提供創建高效的腳本,來執行網絡流量處理和操作的函數。 這個特定的秘籍演示瞭如何使用 Scapy 執行 ARP 發現,以及如何使用P ython 和 Scapy 創建腳本來簡化第二層發現過程。

準備

要使用 Scapy 執行 ARP 發現,你需要在 LAN 上至少擁有一個響應 ARP 請求的系統。

操作步驟

為了瞭解 ARP 發現的工作原理,我們使用 Scapy 來開發自定義數據包,這允讓我們能夠使用 ARP 識別 LAN 上的主機。 要在 Kali Linux 中開始使用 Scapy,請從終端輸入 scapy 命令。 然後,你可以使用 display() 函數以下列方式查看在Scapy 中創建的任何 ARP 對象的默認配置:

root@kali:~# scapy

INFO: Can't import PyX. Won't be able to use psdump() or pdfdump().

WARNING: No route found for IPv6 destination :: (no default route?)

WARNING: IPython not available. Using standard Python shell instead.

AutoCompletion, History are disabled.

aSPY//YASa

apyyyyCY//////////YCa |

sY//////YSpcs scpCY//Pp | Welcome to Scapy

ayp ayyyyyyySCP//Pp syY//C | Version 2.4.0

AYAsAYYYYYYYY///Ps cY//S |

pCCCCY//p cSSps y//Y | [url=https://github.com/secdev/scapy]https://github.com/secdev/scapy[/url]

SPPPP///a pP///AC//Y |

A//A cyP////C | Have fun!

p///Ac sC///a |

P////YCpc A//A | We are in France, we say Skappee.

scccccp///pSP///p p//Y | OK? Merci.

sY/////////y caa S//P | -- Sebastien Chabal

cayCyayP//Ya pY/Ya |

sY/PsY////YCc aC//Yp

sc sccaCY//PCypaapyCP//YSs

spCPY//////YPSps

ccaacs

>>> ARP().display()

###[ ARP ]###

hwtype= 0x1

ptype= 0x800

hwlen= 6

plen= 4

op= who-has

hwclass="lazy" src="//p2.ttnews.xyz/loading.gif" data-original= 00:0c:29:24:94:d1

pclass="lazy" data-original= 172.16.155.150

hwdst= 00:00:00:00:00:00

pdst= 0.0.0.0

請注意,IP 和 MAC 源地址都會自動配置為與運行 Scapy 的主機相關的值。 除非你需要偽造源地址,否則對於任何 Scapy 對象永遠不必更改這些值。 ARP 的默認操作碼值被自動設置為 who-has ,表明該封包用於請求 IP 和 MAC 關聯。 在這種情況下,我們需要提供的唯一值是目標 IP 地址。 為此,我們可以使用 ARP 函數創建一個對象,將其賦給一個變量。 變量的名稱是無所謂(在提供的示例中,使用變量名稱 arp_request )。 看看下面的命令:

>>> arp_request=ARP()

>>> arp_request.pdst="172.16.155.1"

>>> arp_request.display()

###[ ARP ]###

hwtype= 0x1

ptype= 0x800

hwlen= 6

plen= 4

op= who-has

hwclass="lazy" data-original= 00:0c:29:24:94:d1

pclass="lazy" data-original= 172.16.155.150

hwdst= 00:00:00:00:00:00

pdst= 172.16.155.1

>>>

注意, display() 函數可以在新創建的 ARP 對象上調用,來驗證配置值是否已更新。 對於此練習,請使用與實驗環境網絡中的活動計算機對應的目標 IP 地址。 然後 sr1() 函數可以用於發送請求並返回第一個響應:

>>> sr1(arp_request)

Begin emission:

................*Finished sending 1 packets.

Received 17 packets, got 1 answers, remaining 0 packets

>

>>>

或者,也可以通過直接調用該函數,並將任何特殊配置作為參數傳遞給它,來執行相同的任務,如以下命令所示。 這可以避免使用不必要的變量的混亂,並且還可以在單行代碼中完成整個任務:

>>> sr1(ARP(pdst="172.16.155.1"))

Begin emission:

................ Finished sending 1 packets.

*

Received 17 packets, got 1 answers, remaining 0 packets

>

>>>

注意,在這些情況的每一箇中,返回響應表明, 172.16.155.1 的 IP 地址的MAC 地址為 00:50:56:c0:00:08。 如果執行相同的任務,但是目標 IP 地址不對應實驗環境網絡上的活動主機,則不會收到任何響應,並且該功能將無限繼續分析本地接口上傳入的流量 。 你可以使用 Ctrl + C 強制停止該函數。 或者,你可以指定一個 timeout 參數來避免此問題。 當 Scapy 在P ython 腳本中使用時,超時的使用將變得至關重要。 要使用超時,應向發送/接收函數提供一個附加參數,指定等待傳入響應的秒數:

>>> arp_request.pdst="172.16.155.1"

>>> sr1(arp_request,timeout=1)

Begin emission:

......................*Finished sending 1 packets.

Received 23 packets, got 1 answers, remaining 0 packets

>

>>>

通過使用超時功能,發送到非響應主機的請求將在指定的時間之後返回,並顯示捕獲到 0 個應答。 此外,此函數收到的響應也可以賦給變量,並且可以通過訪問此變量對響應執行後續處理:

>>> response=sr1(arp_request,timeout=1)

Begin emission:

............... Finished sending 1 packets.

*

Received 16 packets, got 1 answers, remaining 0 packets

>>> response.display()

###[ ARP ]###

hwtype= 0x1

ptype= 0x800

hwlen= 6

plen= 4

op= is-at

hwclass="lazy" data-original= 00:50:56:c0:00:08

pclass="lazy" data-original= 172.16.155.1

hwdst= 00:0c:29:24:94:d1

pdst= 172.16.155.150

###[ Padding ]###

load= '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'

>>>

Scapy也可以用作 Python 腳本語言中的庫。 這可以用於高效自動執行 Scapy 中執行的冗餘任務。 Python 和 Scapy 可以用於循環遍歷本地子網內的每個可能的主機地址,並向每個子網發送 ARP 請求。 下面的示例腳本可用於在主機的連續序列上執行第二層發現:

#!/usr/bin/python3

import logging

import subprocess

logging.getLogger("scapy.runtime").setLevel(logging. ERROR)

from scapy.all import *

print(sys.argv)

if len(sys.argv)!=2:

print("Usage - ./arp_disc.pyp[interface]")

print("Example - ./arp_dic.py eth0")

print("Example will perform an ARP scan of the local subnet to which eth0 is assigned")

sys.exit()

interface=str(sys.argv[1])

ip=subprocess.check_output("ifconfig "+interface+" | grep 'inet' | head -n 1| cut -d ' ' -f 10",shell=True).strip() #這裡的cut -d ' ' -f 10 不同的操作系統響應的也不太一樣,請自行修改

ip=ip.decode()

print(ip

prefix=ip.split('.') [0]+'.' +ip.split('.') [1]+'.' +ip.split('.') [2]+'.'

為地址在範圍 (0254):

應答 = sr1 (ARP (pdst = 前綴 + str (地址)), 超時 = 1, 詳細 = 0)

如果答案為 None:

通過

還:

打印 (前綴 + str (地址))

腳本的第一行標識了 Python 解釋器所在的位置,以便腳本可以在不傳遞到解釋器的情況下執行。 然後腳本導入所有 Scapy 函數,並定義 Scapy 日誌記錄級別,以消除腳本中不必要的輸出。 還導入了子過程庫,以便於從系統調用中提取信息。 第二個代碼塊是條件測試,用於評估是否向腳本提供了所需的參數。 如果在執行時未提供所需的參數,則腳本將輸出使用情況的說明。 該說明包括工具的用法,示例和所執行任務的解釋。 在這個代碼塊之後,有一個單獨的代碼行將所提供的參數賦值給 interface 變量。 下一個代碼塊使用 check_output() 子進程函數執行 ifconfig 系統調用,該調用也使用 grep 和 cut 從作為參數提供的本地接口提取 IP 地址。 然後將此輸出賦給 ip 變量。 然後使用 split 函數從 IP 地址字符串中提取 / 24 網絡前綴。 例如,如果 ip 變量包含 192.168.11.4 字符串,則值為 192.168.11 。 它將賦給 prefix 變量。 最後一個代碼塊是一個用於執行實際掃描的 for 循環。 for 循環遍歷介於 0 和 254 之間的所有值,並且對於每次迭代,該值隨後附加到網絡前綴後面。 在早先提供的示例的中,將針對 192.168.11.0 和 192.168.11.254 之間的每個 IP 地址廣播 ARP 請求。 然後對於每個回覆的活動主機,將相應的 IP 地址打印到屏幕上,以表明主機在 LAN 上活動。 一旦腳本被寫入本地目錄,你可以在終端中使用句號和斜槓,然後是可執行腳本的名稱來執行它。 看看以下用於執行腳本的命令:

root@KaliLinux:~# ./arp_disc.py

Usage - ./arp_disc.py [interface]

Example - ./arp_disc.py eth0

Example will perform an ARP scan of the local subnet to which et

h0 is assigned

如果在沒有提供任何參數的情況下執行腳本,則會將使用情況輸出到屏幕。 用法輸出表明此腳本需要一個參數,該參數定義應使用哪個接口執行掃描。 在以下示例中,使用 eth0 接口執行腳本:

root@kali:~# ./arp_disc.py eth0

['./arp_disc.py', 'eth0']

172.16.155.1

172.16.155.2

一旦運行,腳本將確定提供的接口的本地子網; 在此子網上執行 ARP 掃描,然後根據來自這些 IP 的主機的響應輸出 IP 地活動址列表。 此外,Wireshark 可以同時運行,因為腳本正在運行來觀察如何按順序廣播每個地址的請求,以及活動主機如何響應這些請求,如以下屏幕截圖所示:

Python3+Scapy 自動化探測IP地址

此外,我們可以輕易將腳本的輸出重定向到文本文件,然後可以用於隨後的分析。 可以使用尖括號重定向輸出,後跟文本文件的名稱。 一個例子如下:

root@kali:~# ./arp_disc.py eth0 > output.txt

root@kali:~# cat output.txt

['./arp_disc.py', 'eth0']

172.16.155.1

172.16.155.2

一旦輸出重定向到輸出文件,你可以使用 ls 命令驗證文件是否已寫入文件系統,或者可以使用 cat 命令查看文件的內容。 此腳本還可以輕鬆地修改為,僅對文本文件中包含的某些 IP 地址執行 ARP 請求。 為此,我們首先需要創建一個我們希望掃描的 IP 地址列表。 為此,模可以使用 Nano 或 VIM 文本編輯器。 為了評估腳本第二章 探索掃描41的功能,請包含先之前發現的一些活動地址,以及位於不對應任何活動主機的相同範圍內的一些其他隨機選擇的地址。 為了在 VIM 或 Nano 中創建輸入文件,請使用以下命令之一:

root@KaliLinux:~# vim iplist.txt

root@KaliLinux:~# nano iplist.txt

創建輸入文件後,可以使用 cat 命令驗證其內容。 假設文件已正確創建,你應該會看到你在文本編輯器中輸入的 IP 地址列表:

root@kali:~# cat iplist.txt

172.16.155.1

172.16.155.2

172.16.155.232

172.16.155.135

172.16.155.180

172.16.155.203

172.16.155.205

172.16.155.254

為了創建一個將接受文本文件作為輸入的腳本,我們可以修改上一個練習中的現有腳本,或創建一個新的腳本文件。 為了在我們的腳本中使用這個 IP 地址列表,我們需要在 Python 中執行一些文件處理。 工作腳本的示例如下所示:

#!/usr/bin/python3

import logging

import subprocess

logging.getLogger("scapy.runtime").setLevel(logging. ERROR)

from scapy.all import *

print(sys.argv)

if len(sys.argv)!=2:

print("Usage - ./arp_disc.py [filename]")

print("Example - ./arp_dic.py iplist.txt")

print("Example will perform an ARP scan of the IP addresses listed in iplist.txt")

sys.exit()

filename=str(sys.argv[1])

file1=open(filename,'r')

for addr in file1:

answer=sr1(ARP(pdst=addr.strip()),timeout=0.01,verbose=0)

#print('發送第'+str(addr)+"個包")

if answer==None:

pass

else:

print(addr.strip())

這個腳本和以前用來循環遍歷連續序列的腳本中唯一的真正區別是,創建一個稱為 file 而不是 interface 的變量。 然後使用 open() 函數,通過在腳本的相同目錄中打開 iplist.txt 文件,來創建對象。 r 值也傳遞給函數來指定對文件的只讀訪問。 for 循環遍歷文件中列出的每個 IP 地址,然後輸出回覆 ARP 廣播請求的 IP 地址。 此腳本可以以與前面討論的相同方式執行:

root@kali:~# ./arp_disc.py

['./arp_disc.py']

Usage - ./arp_disc.py [filename]

Example - ./arp_dic.py iplist.txt

Example will perform an ARP scan of the IP addresses listed in iplist.txt

root@kali:~#

如果在沒有提供任何參數的情況下執行腳本,則會將使用情況輸出到屏幕。 使用情況輸出表明,此腳本需要一個參數,用於定義要掃描的 IP 地址的輸入列表。 在以下示例中,使用執行目錄中的 iplist.txt 文件執行腳本:

root@kali:~# ./arp_disc.py iplist.txt

['./arp_disc.py', 'iplist.txt']

172.16.155.1

172.16.155.2

172.16.155.254

一旦運行,腳本只會輸出輸入文件中的 IP 地址,並且也響應 ARP 請求流量。 這些地址中的每一個表示在 LAN 上的活動系統。 使用與前面討論的相同的方式,此腳本的輸出可以輕易重定向到一個文件,使用尖1括號後跟輸出文件的所需名稱:

root@kali:~# ./arp_disc.py iplist.txt > output.txt

root@kali:~# ls output.txt

output.txt

root@kali:~# cat output.txt

['./arp_disc.py', 'iplist.txt']

172.16.155.1

172.16.155.2

172.16.155.254

一旦將輸出重定向到輸出文件,你可以使用 ls 命令驗證文件是否已寫入文件系統,或者可以使用 cat 命令查看文件的內容。

工作原理

通過使用 sr1() (發送/接收單個)功能,可以在 Scapy 中進行 ARP 發現。 此函數注入由提供的參數定義的數據包,然後等待接收單個響應。 在這種情況下,我們廣播了單個 ARP 請求,並且函數將返回響應。 Scapy 庫可以將此技術輕易集成更多腳本中,並可以測試多個系統。


分享到:


相關文章: