python內網主機存活探測

2021-10-18 10:30:49 字數 4616 閱讀 5940

1.在ubuntu系統下進行發包

2.使用python中的scapy模組

​ arp協議是「address resolution protocol」(位址解析協議)的縮寫。其作用是在乙太網環境中,資料的傳輸所依懶的是mac位址而非ip位址,而將已知ip位址轉換為mac位址的工作是由arp協議來完成的。

在區域網中,網路中實際傳輸的是「幀」,幀裡面是有目標主機的mac位址的。在乙太網中,乙個主機和另乙個主機進行直接通訊,必須要知道目標主機的mac位址。但這個目標mac位址是如何獲得的呢?它就是通過位址解析協議獲得的。所謂「位址解析」就是主機在傳送幀前將目標ip位址轉換成目標mac位址的過程。arp協議的基本功能就是通過目標裝置的ip位址,查詢目標裝置的mac位址,以保證通訊的順利進行。

arp請求

任何時候,當主機需要找出這個網路中的另乙個主機的實體地址時,它就可以傳送乙個arp請求報文,這個報文包好了傳送方的mac位址和ip位址以及接收方的ip位址。因為傳送方不知道接收方的實體地址,所以這個查詢分組會在網路層中進行廣播。

arp響應

區域網中的每一台主機都會接受並處理這個arp請求報文,然後進行驗證,檢視接收方的ip位址是不是自己的位址,只有驗證成功的主機才會返回乙個arp響應報文,這個響應報文包含接收方的ip位址和實體地址。這個報文利用收到的arp請求報文中的請求方實體地址以單播的方式直接傳送給arp請求報文的請求方。

所以在區域網內進行主機存活探測時我們可以使用廣播arp報文的形式,看看是否收到了arp報文來判斷此主機是否存活。

​ 下面我們建立了乙個多執行緒的子類

使用threading模組

建立多執行緒子類的模板如下,重寫了run方法,在我們啟動執行緒時run()方法就是執行緒的開始

class

mythread

(threading.thread)

:def

__init__

(self)

: threading.thread.__init__(self)

defrun

(self)

:

我們的子類寫得比較簡單

class

ipscan

(threading.thread)

:def

__init__

(self, qu,li)

:#將有儲存有ip位址的佇列qu傳入類中

threading.thread.__init__(self)

self.qu = qu

self.li = li

defcreatarp

(self, ip)

:#構造arp報文

page = ether(

)/arp(pdst = ip)

result = srp1(page, timeout =

0.5)

#使用srp1第二層發包及按照我們ether()報頭里的格式發

if result:

#因為沒有收到響應的響應時,會返回none

+'\t'

'the mac:'

+ result[arp]

.hwsrc)

#將響應的ip以及實體地址儲存

defrun

(self)

:#執行緒的入口

while

not self.qu.empty():

self.creaticmp(self.qu.get(

))

幾個發包方式可見scapy幾種傳送

上面就是我們的多執行緒子類

接下來我們還的編寫乙個main()函式

​ 首先對傳進去的引數判斷是否是乙個網段還是單個ip(雖然可以直接arp(pdst=『192.168.0.1/24』)便可以直接掃瞄整個網段,但是為了練習一下正規表示式以及多執行緒還是乙個的發)使用正規表示式進行判斷。

thread_list =

list_host =

threadnumber =

1 qu = queue.queue(

) flag =

false

if re.match(r'^\d.\d.\d.\d$'

,ip)

!=none

: qu.put(ip)

#判斷是否為單個ip,將得到的ip壓入棧中

elif re.match(r'^\d.\d.\d.\d/\d$'

, ip)

!=none

:#判斷是否為乙個網段,然後將所有ip壓入棧中

ip_str = re.match(r'^\d.\d.\d.'

, ip)

.group(

)for x in

range(0

,256):

qu.put(ip_str +

str(x)

)else

: flag =

true

​ 如果是單個ip我們就使用乙個執行緒如果是個網段就使用多執行緒

if flag:

threadnumber =

10for x in

range

(threadnumber):)

#建立乙個個的多執行緒子類物件,將ip佇列傳入,將list_host傳入用來儲存存活的ip以及他們的實體地址

for x in thread_list:

#啟動執行緒

x.start(

)for x in thread_list:

#在程序中阻塞執行緒,等待所以執行緒執行完畢

x.join(

)

接下來輸出存活的ip

for x in list_host:

print

(x)

完整的**()

from scapy.

allimport

*from scapy.layers.l2 import arp, ether

import threading

import queue

import re

class

ipscan

(threading.thread)

:def

__init__

(self, qu, li)

: threading.thread.__init__(self)

self.qu = qu

self.li

defcreaticmp

(self, ip)

: page = ether(

)/arp(pdst = ip)

page.show(

) result = srp1(page, timeout =

0.5)

print

(result)

if result:

+'\t'

'the mac:'

+ result[arp]

.hwsrc)

defrun

(self)

:while

not self.qu.empty():

self.creaticmp(self.qu.get())

defmain

( ip):#

thread_list =

list_host =

threadnumber =

1 qu = queue.queue(

) flag =

false

if re.match(r'^\d.\d.\d.\d$'

,ip)

!=none

: qu.put(ip)

elif re.match(r'^\d.\d.\d.\d/\d$'

, ip)

!=none

: ip_str = re.match(r'^\d.\d.\d.'

, ip)

.group(

)for x in

range(0

,256):

qu.put(ip_str +

str(x)

)else

: flag =

true

if flag:

threadnumber =

10for x in

range

(threadnumber):)

for x in thread_list:

x.start(

)for x in thread_list:

x.join(

)for x in list_host:

print

(x)if __name__ ==

'__main__'

: main(

'192.168.0.0/24'

)

還有這種屬於敏感操作得以root許可權啟動pycharm,我們在編寫過程中才更好除錯

外網主機A連線內網主機B

實現通過外網的主機a連線內網的主機b 在主機b中輸入下面的命令,並且一直回車 ssh keygen 然後會在 root ssh 下生成2個檔案 id rsa和id rsa.pub。可以用下面的命令檢視 ls root ssh 在外網主機a中建立自己的資料夾,用來存id rsa.pub檔案。把內網主機...

內網資訊收集 之探測域內存活主機資訊

netbios,為網上基本輸入輸出系統 英語 network basic input output system 的縮寫,它提供了osi模型中的會話層服務,讓在不同計算機上執行的不同程式,可以在區域網中,互相連線,以及分享資料。嚴格來說,netbios不是一種網上協議,而是應用程式介面 api 引數...

內網主機發現掃瞄

可用 ipconfig all 檢視ip資訊 route print 檢視路由表 netstat ano 檢視連線資訊,可能會有其他網段的連線資訊 net view 檢視已經連線的共享,獲取到主機名,ping通從而得到ip net session 檢視連線的主機 要是能控制到域控上,dsquery ...