基于Python開發(fā)的跨平臺(tái)Nmap自動(dòng)化掃描工具
引言
在網(wǎng)絡(luò)安全測試、運(yùn)維巡檢場景中,Nmap(網(wǎng)絡(luò)映射器)是必備工具——小到探測單臺(tái)主機(jī)存活,大到批量掃描端口、識別操作系統(tǒng)和服務(wù)漏洞,都能輕松搞定。但手動(dòng)輸入Nmap命令不僅繁瑣,還容易因參數(shù)記錯(cuò)導(dǎo)致掃描失??;批量掃描時(shí)重復(fù)操作更是效率低下。
本人在應(yīng)用Nmap掃描系統(tǒng)的常用命令格式進(jìn)行整理,將基于Python編寫一款跨平臺(tái)Nmap自動(dòng)化掃描工具,把存活主機(jī)探測、全端口掃描、OS識別、漏洞檢測等常用操作封裝成可視化菜單,新手也能一鍵使用,大幅提升掃描效率。
一、前置準(zhǔn)備:環(huán)境搭建
在使用工具前,需先完成基礎(chǔ)環(huán)境配置,確保Python和Nmap能正常運(yùn)行。
1. 安裝Nmap(核心依賴)
Nmap是掃描的核心,需先安裝并配置環(huán)境變量:
- Windows:訪問Nmap官網(wǎng)下載頁,下載最新版安裝包,安裝時(shí)勾選“Add Nmap to the system PATH for all users”(添加到環(huán)境變量)。
- Linux(Ubuntu/Debian):執(zhí)行命令
sudo apt-get install nmap。 - macOS:執(zhí)行命令
brew install nmap(需先安裝Homebrew)。
驗(yàn)證安裝:打開終端/CMD,輸入 nmap -v,若輸出Nmap版本信息則安裝成功。
2. Python環(huán)境(工具運(yùn)行載體)
需安裝Python 3.6+版本(推薦3.8+),無需額外安裝第三方庫(工具僅使用Python內(nèi)置模塊:subprocess、os、sys、re、typing)。
二、工具核心功能:解決哪些痛點(diǎn)?
手動(dòng)使用Nmap時(shí),我們常遇到這些問題:
- 每次掃描都要手寫長命令,比如
nmap -sn 192.168.1.0/24,參數(shù)多易出錯(cuò); - 存活主機(jī)探測后,需手動(dòng)提取IP再進(jìn)行端口掃描,步驟割裂;
- 不同掃描場景(全端口、常用端口、OS探測)需重復(fù)輸入相似命令;
- 跨平臺(tái)(Windows/Linux)時(shí),命令行工具(如grep)不兼容,解析結(jié)果麻煩。
本工具針對這些痛點(diǎn),封裝了6大核心功能:
| 功能編號 | 功能名稱 | 適用場景 | 核心Nmap參數(shù) |
|---|---|---|---|
| 1 | 存活主機(jī)探測 | 快速定位網(wǎng)段內(nèi)在線設(shè)備 | -sn(Ping掃描)、-oG(輸出gnmap格式) |
| 2 | 全端口掃描 | 深度檢測主機(jī)開放端口(0-65535) | -sS(SYN掃描)、-p 0-65535 |
| 3 | 常用端口掃描 | 快速檢測高頻端口(如80、443、22) | 默認(rèn)掃描Top 100常用端口 |
| 4 | 操作系統(tǒng)探測 | 識別主機(jī)操作系統(tǒng)類型(Windows/Linux) | -O(OS檢測) |
| 5 | 服務(wù)版本檢測 | 識別端口對應(yīng)服務(wù)及版本(如Apache 2.4.49) | -sV(版本探測) |
| 6 | SMB Ghost漏洞掃描 | 檢測永恒之藍(lán)等SMB漏洞(445端口) | --script smb-ghost |
三、核心代碼解析:從原理到實(shí)現(xiàn)
工具的核心邏輯是“封裝Nmap命令+解析掃描結(jié)果+可視化菜單”,以下拆解關(guān)鍵模塊,讓你不僅會(huì)用,還懂原理。
1. 環(huán)境檢查模塊:確保Nmap可用
工具運(yùn)行前首先檢查Nmap是否安裝并加入環(huán)境變量,避免后續(xù)執(zhí)行命令報(bào)錯(cuò):
import subprocess
import sys
def check_nmap_installed() -> bool:
"""檢查 Nmap 是否安裝并加入環(huán)境變量"""
try:
# 執(zhí)行 nmap -v 檢測是否存在
result = subprocess.run(
["nmap", "-v"],
capture_output=True,
text=True,
timeout=5
)
return result.returncode == 0
except (subprocess.TimeoutExpired, FileNotFoundError):
return False
# 主程序入口檢查
if __name__ == "__main__":
if not check_nmap_installed():
print("? 錯(cuò)誤:未檢測到 Nmap,請先安裝并加入環(huán)境變量!")
sys.exit(1)
原理:通過subprocess.run執(zhí)行nmap -v命令,若返回碼為0則說明Nmap可用;若觸發(fā)“文件未找到”異常,說明Nmap未安裝或未配置環(huán)境變量。
2. 命令執(zhí)行模塊:統(tǒng)一管理Nmap調(diào)用
所有Nmap命令都通過該模塊執(zhí)行,實(shí)現(xiàn)“實(shí)時(shí)輸出日志+錯(cuò)誤處理+結(jié)果返回”,避免重復(fù)寫子進(jìn)程調(diào)用代碼:
def execute_command(cmd: List[str], desc: str) -> bool:
"""執(zhí)行系統(tǒng)命令并輸出日志"""
print(f"\n=== 開始執(zhí)行:{desc} ===")
print(f"執(zhí)行命令:{' '.join(cmd)}")
try:
# 實(shí)時(shí)輸出日志(避免卡頓)
process = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True,
bufsize=1
)
# 逐行打印Nmap掃描日志
for line in iter(process.stdout.readline, ''):
print(line.strip())
process.wait()
return process.returncode == 0
except Exception as e:
print(f"執(zhí)行異常:{str(e)}")
return False
亮點(diǎn):
- 實(shí)時(shí)流式輸出掃描日志,避免大掃描任務(wù)無響應(yīng);
- 統(tǒng)一捕獲異常,返回執(zhí)行結(jié)果(成功/失?。?;
- 兼容Windows/Linux的子進(jìn)程調(diào)用方式。
3. 存活主機(jī)探測:跨平臺(tái)解析結(jié)果
手動(dòng)掃描存活主機(jī)后,Windows沒有grep/cut命令,解析結(jié)果很麻煩。工具內(nèi)置正則解析gnmap格式文件,提取存活I(lǐng)P并寫入文件:
import re
import os
def discover_live_hosts(network: str = "192.168.1.0/24") -> bool:
"""探測存活主機(jī)(跨平臺(tái)版)"""
# 步驟1:執(zhí)行Nmap存活掃描,輸出到gnmap文件
cmd = ["nmap", "-sn", "-v", "-T4", "-oG", "Discovery.gnmap", network]
if not execute_command(cmd, "存活主機(jī)探測"):
return False
# 步驟2:解析gnmap文件,提取存活I(lǐng)P
live_hosts = []
try:
with open("Discovery.gnmap", "r", encoding="utf-8") as f:
for line in f:
# 匹配gnmap格式中"Status: Up"的行,提取IP
if "Status: Up" in line:
ip_match = re.search(r"Host: (\d+\.\d+\.\d+\.\d+)", line)
if ip_match:
live_hosts.append(ip_match.group(1))
except Exception as e:
print(f"解析失?。簕str(e)}")
return False
# 步驟3:寫入存活主機(jī)列表
if live_hosts:
with open("liveHosts.txt", "w", encoding="utf-8") as f:
f.write("\n".join(live_hosts))
print(f"? 發(fā)現(xiàn) {len(live_hosts)} 臺(tái)存活主機(jī),已寫入liveHosts.txt")
return True
else:
print("? 未發(fā)現(xiàn)存活主機(jī)")
return False
關(guān)鍵解析:
-sn:Nmap Ping掃描(不掃描端口,僅探測存活);-oG:輸出“可 grep”的gnmap格式,方便解析;- 正則
Host: (\d+.\d+.\d+.\d+):精準(zhǔn)匹配IP地址,跨平臺(tái)無需依賴外部命令。
4. 可視化主菜單:新手友好
將所有功能封裝成菜單,無需記命令,輸入編號即可執(zhí)行:
def main_menu():
"""主菜單"""
print("=" * 50)
print(" Nmap 自動(dòng)化掃描工具")
print("=" * 50)
print("1. 探測存活主機(jī)(生成 liveHosts.txt)")
print("2. 全端口掃描(基于 liveHosts.txt)")
print("3. 常用端口掃描(基于 liveHosts.txt)")
print("4. 操作系統(tǒng)探測(基于 liveHosts.txt)")
print("5. 服務(wù)版本檢測(基于 liveHosts.txt)")
print("6. SMB Ghost 漏洞掃描")
print("0. 退出程序")
print("=" * 50)
# 主循環(huán)
while True:
main_menu()
choice = input("請輸入操作編號:").strip()
if choice == "0":
print("?? 程序退出!")
break
# 執(zhí)行對應(yīng)功能(省略分支邏輯)
四、工具使用教程:一步到位
1. 完整代碼獲取
將本文所有代碼整合,保存為nmap_auto_scan.py(也可直接用文章開頭的完整代碼)。
2. 運(yùn)行工具
打開終端/CMD,進(jìn)入代碼所在目錄,執(zhí)行:
python nmap_auto_scan.py
若提示“Nmap檢測成功”,則進(jìn)入主菜單。
3. 功能使用示例
示例1:探測存活主機(jī)
- 輸入編號
1,按提示輸入掃描網(wǎng)段(默認(rèn)192.168.1.0/24); - 工具自動(dòng)執(zhí)行Nmap存活掃描,解析結(jié)果后生成
liveHosts.txt; - 查看文件,即可看到網(wǎng)段內(nèi)所有在線主機(jī)的IP。
示例2:全端口掃描
- 確保已生成
liveHosts.txt(先執(zhí)行示例1); - 輸入編號
2,工具自動(dòng)掃描存活主機(jī)的0-65535端口; - 掃描結(jié)果保存為
FullTCP,可打開查看開放端口、端口狀態(tài)等。
示例3:SMB Ghost漏洞掃描
- 輸入編號
6,輸入目標(biāo)網(wǎng)段(如192.168.1.0/24); - 工具掃描445端口,檢測是否存在SMB Ghost漏洞;
- 實(shí)時(shí)查看掃描日志,識別漏洞主機(jī)。
4. 結(jié)果文件說明
工具運(yùn)行后會(huì)生成多個(gè)結(jié)果文件,用途如下:
| 文件名 | 用途 |
|---|---|
| liveHosts.txt | 存活主機(jī)IP列表 |
| Discovery.gnmap | 存活探測原始結(jié)果 |
| FullTCP | 全端口掃描結(jié)果 |
| TopTCP | 常用端口掃描結(jié)果 |
| OSDetect | 操作系統(tǒng)探測結(jié)果 |
| ServiceDetect | 服務(wù)版本檢測結(jié)果 |
五、擴(kuò)展與優(yōu)化:讓工具更強(qiáng)大
基礎(chǔ)版本滿足日常使用,你還可以根據(jù)需求擴(kuò)展功能:
1. 增加多線程掃描
默認(rèn)Nmap掃描是單線程,可通過-min-parallelism參數(shù)增加并行度,或用Python多線程同時(shí)掃描多個(gè)網(wǎng)段。
2. 支持更多漏洞掃描
比如添加Heartbleed(心臟滴血)、Log4j漏洞掃描:
def scan_log4j(network: str = DEFAULT_NETWORK) -> bool:
"""Log4j漏洞掃描"""
cmd = [
"nmap", "-p", "80,443,8080",
"--script", "log4j-scan",
network
]
return execute_command(cmd, "Log4j漏洞掃描")
3. 結(jié)果可視化
將掃描結(jié)果解析為Excel/HTML格式,用pandas生成報(bào)表,或用matplotlib繪制端口開放率圖表。
4. 增加參數(shù)自定義
比如允許用戶自定義掃描速度(-T0~-T5)、超時(shí)時(shí)間、是否跳過Ping等:
# 新增參數(shù)輸入
scan_speed = input("請輸入掃描速度(0-5,默認(rèn)4):").strip() or "4"
cmd = ["nmap", "-sS", "-T" + scan_speed, "-p", "0-65535", ...]
5. 錯(cuò)誤重試機(jī)制
對掃描失敗的主機(jī),增加自動(dòng)重試邏輯:
def scan_with_retry(cmd: List[str], desc: str, retry: int = 2) -> bool:
"""帶重試的命令執(zhí)行"""
for i in range(retry + 1):
if execute_command(cmd, desc):
return True
print(f"第{i+1}次執(zhí)行失敗,重試中...")
return False
六、重要注意事項(xiàng)
- 合法授權(quán):掃描他人網(wǎng)絡(luò)/主機(jī)需獲得書面授權(quán),未經(jīng)授權(quán)的掃描可能違反《網(wǎng)絡(luò)安全法》,承擔(dān)法律責(zé)任;
- 掃描速度:避免使用
-T5(最快速度)掃描公網(wǎng),可能導(dǎo)致目標(biāo)網(wǎng)絡(luò)擁塞,建議內(nèi)網(wǎng)用-T4,公網(wǎng)用-T2; - 權(quán)限問題:Linux下執(zhí)行SYN掃描(
-sS)需要root權(quán)限,需加sudo運(yùn)行工具(sudo python nmap_auto_scan.py); - 跨平臺(tái)兼容:Windows下Nmap的部分腳本可能失效,建議優(yōu)先在Linux/macOS環(huán)境使用;
- 結(jié)果解讀:Nmap的OS探測、版本檢測并非100%準(zhǔn)確,需結(jié)合其他工具驗(yàn)證。
七、總結(jié)
本文通過Python封裝Nmap命令,實(shí)現(xiàn)了“一鍵式”網(wǎng)絡(luò)掃描工具,解決了手動(dòng)掃描的繁瑣問題。工具不僅兼容Windows/Linux/macOS,還提供了可視化菜單、跨平臺(tái)結(jié)果解析、詳細(xì)日志輸出等功能,新手也能快速上手。
無論是運(yùn)維人員做網(wǎng)絡(luò)巡檢,還是安全測試人員做漏洞掃描,這款工具都能大幅提升效率。你可以基于基礎(chǔ)版本,根據(jù)自身需求擴(kuò)展功能,打造屬于自己的專屬Nmap掃描工具。
最后再次強(qiáng)調(diào):網(wǎng)絡(luò)掃描需遵守法律法規(guī),僅在授權(quán)范圍內(nèi)使用工具,共同維護(hù)網(wǎng)絡(luò)安全!
以上就是基于Python開發(fā)的跨平臺(tái)Nmap自動(dòng)化掃描工具的詳細(xì)內(nèi)容,更多關(guān)于Python跨平臺(tái)Nmap自動(dòng)化掃描的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
OpenCV機(jī)器學(xué)習(xí)MeanShift算法筆記分享
這篇文章主要介紹了OpenCV機(jī)器學(xué)習(xí)MeanShift算法筆記分享,有需要的朋友可以借鑒參考下,希望可以對各位讀者的OpenCV算法學(xué)習(xí)能夠有所幫助2021-09-09
Python實(shí)現(xiàn)釘釘自動(dòng)化完整指南
本文詳細(xì)介紹如何使用 Python 實(shí)現(xiàn)釘釘自動(dòng)化,包括消息發(fā)送、部門管理、審批流程觸發(fā)等功能,內(nèi)容涵蓋實(shí)現(xiàn)步驟、前置條件、依賴項(xiàng)以及注意事項(xiàng),幫助快速上手并避免常見問題,需要的朋友可以參考下2025-03-03
Python 3 實(shí)現(xiàn)定義跨模塊的全局變量和使用教程
這篇文章主要介紹了Python 3 實(shí)現(xiàn)定義跨模塊的全局變量和使用,本文通過實(shí)例代碼相結(jié)合的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
Python中用altzone()方法處理時(shí)區(qū)的教程
這篇文章主要介紹了Python中用altzone()方法處理時(shí)區(qū)的教程,是Python入門中的基礎(chǔ)知識,需要的朋友可以參考下2015-05-05

