Python 在網路安全領域中扮演著重要的角色,提供豐富的套件和工具,簡化了自動化任務的流程。從 SSH 連線管理到伺服器安全稽核,再到網路掃描,Python 都能有效提升效率。本文將示範如何使用 Paramiko 與 FTP、SFTP 和 SSH 伺服器互動,包含檔案傳輸和遠端命令執行。接著,將介紹 asyncssh 套件,展示如何建立 SSH 客戶端和伺服器,並探討如何使用 ssh-audit 和 Rebex SSH Check 等工具強化伺服器安全性。最後,將深入研究 Nmap 和 Python-nmap 的應用,涵蓋網路掃描、埠識別和服務偵測等技術,並提供實用的程式碼範例和安全注意事項。
與FTP、SFTP和SSH伺服器互動
在與伺服器建立連線後,我們使用cwd()方法更改到根目錄,將目錄路徑作為第一個引數傳遞。使用with指令,在區塊結束時連線會自動關閉,我們不需要手動關閉與伺服器的連線。
以下可能是前一個指令碼的輸出結果:
Enter the target hostname: localhost
Enter the target port: 22
Enter your username: linux
Enter your password:
Connection successfully established with server...
bin drwxr-xr-x 1 0 0 12288 27 Mar 00:16 bin
boot drwxr-xr-x 1 0 0 4096 27 Mar 00:17 boot
cdrom drwxrwxr-x 1 0 0 4096 26 Mar 22:58 cdrom
dev drwxr-xr-x 1 0 0 4500 10 Jul 18:09 dev
etc drwxr-xr-x 1 0 0 12288 09 Jul 19:57 etc
home drwxr-xr-x 1 0 0 4096 27 Mar 00:17 home
...
在這裡,我們可以看到在向localhost上的伺服器請求資料連線後,它傳回遠端目錄中的所有檔案。
現在您已經瞭解了使用paramiko和pysftp模組連線和傳輸檔案從SSH伺服器的基礎知識,讓我們繼續學習如何使用asyncssh模組實作SSH客戶端和伺服器。
使用asyncSSH和asyncio模組實作SSH客戶端和伺服器
asyncssh是一個Python套件,提供了SSHv2協定的伺服器實作和一個根據Python 3的asyncio模組的非同步客戶端。
安裝asyncssh
您可以使用以下命令安裝asyncssh:
$ python3 -m pip install asyncssh
使用asyncssh實作SSH客戶端
在下面的範例中,我們將實作一個客戶端SSH伺服器來執行使用者輸入的命令。您可以在asyncssh資料夾中的client_ssh.py檔案中找到以下程式碼:
import asyncssh
import asyncio
import getpass
async def execute_command(host, command, username, password):
async with asyncssh.connect(host, username=username, password=password) as connection:
result = await connection.run(command)
return result.stdout
if __name__ == '__main__':
hostname = input("Enter the target hostname: ")
command = input("Enter command: ")
username = input("Enter username: ")
password = getpass.getpass(prompt="Enter password: ")
loop = asyncio.get_event_loop()
output_command = loop.run_until_complete(execute_command(hostname, command, username, password))
print(output_command)
在前面的程式碼中,execute_command()方法在透過SSH連線到遠端主機後執行命令。如果命令執行成功,則傳回命令的標準輸出。該方法使用async和await關鍵字,這些是Python >= 3.6和asyncio特有的,用於以非同步方式連線。
使用asyncssh實作SSH伺服器
此模組還提供了使用create_server()方法建立自己的SSH伺服器的可能性,將一個名為MySSHServer的類別作為引數傳遞,該類別繼承自asyncssh.SSHServer,以及localhost伺服器、埠和包含私鑰的檔案。您可以在asyncssh資料夾中的server_ssh.py檔案中找到以下程式碼:
import asyncio
import asyncssh
import sys
class MySSHServer(asyncssh.SSHServer):
def connection_made(self, conn):
print('SSH connection received from %s.' % conn.get_extra_info('peername')[0])
async def start_server():
await asyncssh.create_server(MySSHServer, 'localhost', 22, server_host_keys=['/etc/ssh/ssh_host_ecdsa_key'])
loop = asyncio.get_event_loop()
try:
print("Starting SSH server on localhost:22")
loop.run_until_complete(start_server())
except (OSError, asyncssh.Error) as exc:
sys.exit('Error starting server: ' + str(exc))
loop.run_forever()
要執行前面的指令碼,您需要為建立伺服器時的server_host_keys屬性提供一個檔案。您需要檢查/etc/ssh資料夾中是否有名為ssh_host_ecdsa_key的檔案,以用作伺服器主機金鑰。
要執行前面的指令碼,您還需要使用以下命令以sudo執行:
$ sudo python3 server_ssh.py
Starting SSH server on localhost:22
使用ssh-audit工具檢查SSH伺服器的安全性
現在您已經瞭解了使用asyncssh實作SSH客戶端和伺服器的基礎知識,讓我們繼續學習如何使用ssh-audit工具檢查SSH伺服器的安全性。
ssh-audit簡介
如果我們需要驗證我們的SSH伺服器組態,我們有兩種選擇:
- 手動檢視組態檔案並對比資訊
- 使用
ssh-audit,這是一個用Python編寫的指令碼,可以掃描我們的SSH伺服器組態並指示我們所應用的不同組態是否安全
在本文中,我們將介紹第二種選擇——ssh-audit工具。
ssh-audit的主要功能
- 可以檢測登入橫幅,例如,如果我們正在使用不安全的協定,如SSH1
- 可以檢查金鑰交換演算法、主機公鑰和與身份驗證訊息和對稱加密相關的資訊
當ssh-audit以完全自動化的方式分析所有這些引數後,它將生成一份完整的報告,指出某個選項何時可用、是否已被刪除或停用、是否不安全或是否以安全的方式實作。根據伺服器組態的嚴重程度,我們可以在警告中看到不同的顏色。
安裝和執行ssh-audit
如果您正在使用根據Debian的Linux發行版,您可以使用以下命令安裝ssh-audit:
$ apt install ssh-audit
另一個安裝此工具的方法是透過GitHub儲存函式庫中的原始碼:
$ python3 ssh-audit.py [-nv] host[:port]
我們可以使用以下命令分析我們的localhost SSH伺服器:
$ ssh-audit.py -v localhost
此外,我們還可以審核外部網域伺服器,例如github.com,如下所示:
$ ssh-audit.py github.com
在下面的截圖中,我們可以看到該工具將以不同的顏色標記輸出,當某個演算法不安全、弱或安全時。這樣,我們可以快速識別出需要在伺服器上解決的安全問題。另一個提供的功能是,它允許我們根據演算法的資訊顯示所使用的SSH版本。
圖示說明:執行ssh-audit
此圖示顯示了執行ssh-audit的結果,包括不同顏色的輸出,以表示不同級別的安全性。
圖示內容解密:
- 紅色表示不安全的演算法或組態
- 黃色表示弱或不推薦的演算法或組態
- 綠色表示安全的演算法或組態
透過使用ssh-audit工具,我們可以輕鬆地檢查SSH伺服器的安全性,並根據報告結果進行相應的安全調整。
使用 ssh-audit 工具檢查 SSH 伺服器的安全性
正如前圖所示,這個指令碼顯示了有關以下內容的資訊:
- 我們正在使用的協定和軟體版本
- 金鑰交換演算法
- 主機演算法
- 加密演算法
- 訊息驗證演算法(雜湊)
- 對特定演算法的處理建議
除了 ssh-audit 工具之外,另一個替代方案是 Rebex SSH Check 工具。
Rebex SSH Check
Rebex SSH Check(https://sshcheck.com)允許掃描伺服器金鑰交換演算法和對稱加密演算法,以及我們目前在所分析的 SSH 伺服器上組態的 MAC 演算法:
在這一節中,我們分析瞭如何使用 ssh-audit 和其他線上工具(如 Rebex SSH Check)來稽核 SSH 伺服器的安全性。透過使用這些工具稽核 SSH 伺服器,我們可以確保伺服器的安全性得到維護,並且我們的資料保持安全。
使用 Nmap 掃描器
本章涵蓋瞭如何使用 Python nmap 作為 Nmap 的包裝器來收集有關網路、主機和在該主機上執行的服務的資訊。Python nmap 提供了一個特定的模組,以更好地控制掃描網路以檢測特定機器或伺服器中的開放埠和暴露服務的過程。因此,瞭解它至關重要。
我們將從介紹 Nmap 作為一個允許您識別開放、關閉或過濾埠的埠掃描器開始。然後,我將解釋 Python nmap 如何用於同步和非同步掃描。我們還將看到 nmap 如何與 os 和 subprocess 模組一起工作。最後,我們將介紹使用 nmap 指令碼和例程來發現給定網路或特定主機中的可能漏洞。
Nmap 簡介
讓我們首先檢視用於埠掃描的 Nmap 工具以及它支援的主要掃描型別。在第一節中,我們將瞭解 Nmap 作為一個允許我們分析特定主機上執行的埠和服務的埠掃描器。
一旦您識別了網路中的不同主機,下一步就是對每個已識別的主機執行埠掃描。支援通訊協定的電腦使用埠在它們之間建立連線。為了支援與多個應用程式的多個通訊,埠用於區分同一主機或伺服器中的不同通訊。
Nmap 和其掃描型別
網路對映器(Nmap)是一個免費且開源的工具,用於網路發現和安全稽核。它執行在所有主要電腦作業系統上,並且官方二進位制包可供 Linux、Windows 和 macOS X 使用。
Nmap 工具主要用於識別和掃描特定網路段中的埠。從 https://nmap.org/download.html 網站,我們可以下載該工具的最新版本,具體取決於我們要安裝它的作業系統。
如果我們從控制檯終端執行 Nmap 工具,我們可以看到它提供的所有選項:
使用 python-nmap 的埠掃描
python-nmap 提供了一個特定的模組,以更好地控制掃描網路以檢測特定機器或伺服器中的開放埠和暴露服務的過程。
使用 Nmap 的技術要求
在開始閱讀本章之前,您應該瞭解 Python 程式設計的基礎知識,並對 HTTP 協定有一定的瞭解。我們將使用可在 www.python.org/downloads 上取得的 Python 3.7 版本。
相關問題
下載檔案需要使用 ftplib 中的哪個方法,以及需要執行哪個 FTP 命令?
- 要下載檔案,需要使用
retrbinary()方法,並且需要先執行RETR命令。
- 要下載檔案,需要使用
paramiko 模組中的哪個方法允許我們連線到 SSH 伺服器,以及需要哪些引數(主機、使用者名稱和/或密碼)?
connect()方法允許我們連線到 SSH 伺服器,需要提供主機、使用者名稱和密碼等引數。
paramiko 模組中的哪個方法允許我們開啟一個會話,以便隨後執行命令?
invoke_shell()方法允許開啟一個會話。
告知 paramiko 在第一次連線時接受伺服器金鑰而不會中斷會話或提示使用者的指令是什麼?
- 需要設定
MissingHostKeyPolicy,通常使用AutoAddPolicy()。
- 需要設定
使用 asyncssh 模組的 create_server() 方法建立自己的 SSH 伺服器需要使用哪個類別?
- 需要使用
Server類別。
- 需要使用
程式碼範例與解析
import nmap
# 初始化 Nmap PortScanner 物件
nm = nmap.PortScanner()
# 對特定主機進行掃描
nm.scan('127.0.0.1', '1-1024')
# 列印掃描結果
for host in nm.all_hosts():
print('
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-')
print('Host : %s (%s)' % (host, nm[host].hostname()))
print('State : %s' % nm[host].state())
for proto in nm[host].all_protocols():
print('
---
-
---
---
')
print('Protocol : %s' % proto)
lport = nm[host][proto].keys()
sorted(lport)
for port in lport:
print ('port : %s\tstate : %s' % (port, nm[host][proto][port]['state']))
程式碼解析:
- 匯入必要的模組:首先匯入
nmap模組。 - 初始化 Nmap PortScanner 物件:建立
PortScanner物件nm,該物件用於執行 Nmap 掃描。 - 執行掃描:呼叫
scan()方法對指定的主機(在本例中為127.0.0.1或本地主機)進行掃描,掃描埠範圍是 1 到 1024。 - 處理掃描結果:遍歷所有被掃描的主機,並列印出每個主機的狀態、協定以及開放的埠和它們的狀態。
程式碼說明:
此程式碼展示瞭如何使用 python-nmap 函式庫來掃描本地主機上的開放埠。它首先匯入必要的函式庫,接著初始化一個 PortScanner 物件。然後,它對本地主機的1到1024埠進行掃描,並列印出掃描結果,包括主機狀態、協定以及每個埠的狀態。
安全注意事項:
- 確保在使用 Nmap 或任何網路掃描工具時遵守相關法律法規,避免未經授權的掃描行為。
- 謹慎處理掃描結果,因為它們可能揭示系統的安全漏洞。