Python 實現ZmapScan 掃瞄

2021-10-08 20:45:56 字數 4951 閱讀 1305

python是一門很好的用來編寫滲透指令碼的語言,擁有很多成熟的庫,我們可以直接拿來使用。我們今天來看一下如何用python實現乙個簡單的zamp掃瞄器。

zmap掃瞄器由durumeric領導密西根大學研究團隊開發,掃瞄速度很快,可以在45分鐘內掃瞄全網ipv4位址。

這種掃瞄的原理就是不進行三次握手,而是只傳送syn,隨後傳送rst,清空連線,再繼續傳送下乙個資料報。那怎麼知道對應埠是否開發呢?有乙個專門的收包模組來識別收到的包。在這裡zmap將ip位址和port做了乙個對映並儲存,如果收到的資料報驗證後能對映到我們已發包的ip位址和port,就說明該主機的該埠是開放的。

kali linux 2.0

我們在這裡只是簡單的實現,並不做這樣的對映。首先我們分成兩個模組,乙個是收包模組,乙個是發包模組。

這裡我們使用kali linux中的scapy,掃瞄埠、網絡卡、子網是自己根據自己情況寫好的,定義了乙個發包函式,函式中對ip位址生成的子網位址做乙個遍歷。對每個位址的對應埠傳送syn包和rst包。本地傳送的端**們選擇乙個基本不被別的程序占用的高階口,防止干擾。傳送結束就自動結束執行。

from scapy.

allimport

*from netaddr import ipnetwork

iface =

'eth0'

#網絡卡portlist =[80

,8080

]#埠列表

source =

'192.168.38.168'

#本機ip

subnet =

'192.168.38.0/24'

#目標子網

defpackage_send()

:#發包函式

print

"start port scannering*********************"

for ip in ipnetwork(subnet)

:#遍歷子網ip

print

"[-] scannering :"

,ip for port in portlist:

#遍歷埠列表

send(ip(src=source,dst=

str(ip)

)/tcp(sport=

50000

,dport=port,flags=2)

,verbose=0)

#傳送syn包

send(ip(src=source,dst=

str(ip)

)/tcp(sport=

50000

,dport=port,flags=4)

,verbose=0)

#傳送rst包

exit(

0)退出

package_send(

)

收包模組這裡我們定義乙個收包函式叫做package_sniffer,在這裡先對包進行乙個判斷,我們只接受第四層為tcp,且目的主機是本機,而且標誌位是syn+ack的資料報,並且將它交給deal函式處理,deal函式再判斷ip位址是否在我們定義的子網中,在的話就列印出來包的位址和源埠,表示其開放。

from scapy.

allimport

*from netaddr import ipnetwork, ipaddress

iface =

'eth0'

portlist =[80

,8080

]source =

'192.168.38.168'

subnet =

'192.168.38.0/24'

defdeal

(data)

:if data[ip]

.src in ipnetwork(subnet)

:# 如果包源ip在子網裡,就處理

print

"port open host:%s, port:%s"

%(data[ip]

.src, data[tcp]

.sport)

defpackage_sniffer()

:while

true

:#迴圈嗅探

sniff(iface=iface,

filter

="tcp and dst %s and tcp[13:1] & 18 == 18"

%source, prn=deal)

#嗅探iface網絡卡,過濾規則是第四層為tcp,且目的主機是本機,而且標誌位是syn+ack,將收到的資料報交給deal函式處理

package_sniffer(

)

最後我們將發包和收包模組使用執行緒結合起來。並且使用argparse模組新增一些命令列引數。在命令列中使用./zmapscanner.py -i eth0 -h 192.168.1.0/24指定網絡卡和ip子網即可。

#!/usr/bin/python

from scapy.

allimport

*from netaddr import ipnetwork #用於劃分子網

import threading

import time

import argparse

import sys

subnet =

"" portlist =[80

,8080

]#埠列表

source =

'192.168.38.168'

#源主機

defpackage_send()

:for ip in ipnetwork(subnet)

:#遍歷子網ip

print

"[-] scannering :"

,ip for port in portlist:

#遍歷埠

send(ip(src=source,dst=

str(ip)

)/tcp(sport=

50000

,dport=port,flags=2)

,verbose=0)

#傳送syn包,且不顯示詳細資訊

send(ip(src=source,dst=

str(ip)

)/tcp(sport=

50000

,dport=port,flags=4)

,verbose=0)

#傳送rst包,且不顯示詳細資訊

exit(0)

defdeal

(data)

:#資料處理函式

if data[ip]

.src in ipnetwork(subnet)

:#如果包的源ip在子網裡,就處理

print

"[+] port open host:%s, port:%s"

%(data[ip]

.src, data[tcp]

.sport)

defpackage_sniffer

(iface)

:#嗅探函式

while

true

:#嗅探iface網絡卡,過濾規則是第四層為tcp,且目的主機是本機,而且標誌位是syn+ack,將收到的資料報交給deal函式處理

sniff(iface=iface,

filter

="tcp and dst %s and tcp[13:1] & 18 == 18"

%source, prn=deal)

defmain()

:global subnet

parser = argparse.argumentparser(prog=

"./zmapscanner.py"

, description=

"this program is used to scanner 80/8080 port open. usage: ./zmapscanner.py -i eth0 -h 192.168.1.0/24"

)#新增程式執行的提示

parser.add_argument(

'-i'

, dest=

"inte***ce"

,help

="select inte***ce such as eth0"

,type

=str

)#定製網絡卡

parser.add_argument(

'-h'

, dest=

"host"

,help

="select hosts such as 192.168.1.0/24"

,type

=str

)#定製子網

option, args = parser.parse_known_args(

)#得到命令列引數

iface = option.inte***ce

addr = option.host

if iface ==

none

or addr ==

none

:#如果輸入不符合規則,就提示退出

parser.print_help(

) sys.exit(0)

subnet = addr #賦值子網

sniffer_thread = threading.thread(target=package_sniffer, args=

(iface,))

#新建嗅探執行緒

sniffer_thread.start(

)print

"start port scannering*********************"

send_thread = threading.thread(target=package_send)

#新建發包執行緒

send_thread.start(

)main(

)

python實現線性回歸 python實現線性回歸

參考 機器學習實戰 machine learning in action 一 必備的包 一般而言,這幾個包是比較常見的 matplotlib,用於繪圖 numpy,陣列處理庫 pandas,強大的資料分析庫 sklearn,用於線性回歸的庫 scipy,提供很多有用的科學函式 我一般是用pip安裝,...

python爬蟲基礎實現 Python實現基礎爬蟲

初次使用urllib實現爬蟲的資料請求 urllib.request.urlopen url 發起get請求 urllib.parse.quote 將中文進行url編碼 from urllib.request importurlopen,urlretrieve,requestfrom urllib....

python實現快取 Python實現快取

注意 本文是乙個存根。稍會將發布有關不同的簡單快取實現的更詳細分析。請參閱下面的註解獲得大致的摘要。簡單快取實現 用法 注意,該實現使用普通列表來跟蹤訪問順序,以便能夠在快取填滿時丟棄最近最少使用的專案。列表型別沒有真正為此目的而優化,但是這種方法對於較小的快取非常有效,特別是當快取訪問遵循80 2...