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 ...