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