python實現FTP弱口令掃描器與簡單端口掃描器
目錄
FTP弱口令掃描器 簡單端口掃描器
參考:
https://blog.csdn.net/rebelqsp/article/details/22109925
https://www.aliyun.com/jiaocheng/434055.html?spm=5176.100033.2.10.3571581eheCuHX
FTP弱口令掃描器
# Ftp匿名掃描器的實現,需要使用FTP這個類 # Ftp這個類實現了Ftp客戶端的大多數功能,比如連接Ftp服務器、查看服務器中的文件、上傳、下載文件等功能, import ftplib import time import argparse #FTP匿名登錄掃描 # 首先用主機名構造了一個Ftp對象(即ftp),然后用這個ftp調用不帶任何參數的login()函數即表示要匿名登錄這個Ftp服務器,如果登錄過程中沒有產生異常,則表明匿名登錄成功,否則匿名登錄失敗! def anonScan(hostname): #參數是主機名 try: with ftplib.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弱口令的掃描依賴於用戶名和密碼字典,我們的實驗環境中會提供 pwd.txt 作為密碼字典,字典的格式如下圖所示: # 用戶名:密碼 # 循環從字典中讀取用戶名和密碼並嘗試登陸,登陸成功則表明找到用戶名和密碼。由於這個函數將主機名定義成了可以用“,”分割的字符串。找到密碼並不會終止程序,而是會繼續掃描其他主機的弱口令,直到所有的主機都掃描一遍。 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('[+]'+str(hostname)+':Trying: ' + userName + ':' + passWord) try: with ftplib.FTP(hostname) as ftp:#以主機名為參數構造Ftp對象 ftp.login(userName, passWord) #使用讀取出的用戶名密碼登錄Ftp服務器 #如果沒有產生異常則表示登錄成功,打印主機名、用戶名和密碼 print('[*] ' + str(hostname) + ' FTP Login successful: '+ userName + ':' + passWord) return (userName, passWord) except Exception as e: # 產生異常表示沒有登錄成功,這里我們不用管它,繼續嘗試其他用戶名、密碼 pass print("破解失敗") except IOError as e: print('Error: the password file does not exist!') print('[-] Cannot crack the FTP password, please change the password dictionary try again!') return (None,None) def main(): 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'])) ip = str(options.hostName) pwdFile = str(options.pwdFile) if anonScan(ip):pass else:vlcLogin(ip,pwdFile) if __name__ == '__main__': main()
簡單端口掃描器
這里使用多線程的操作是很有必要的。這里,一個很自然的思路就是為每一個端口單獨開一個線程進行掃描。 所以你也可以將需要掃描的端口列表定為從Nmap中得到的前1000個使用頻率最高的端口,例如下面:
port_list = [1,3,6,9,13,17,19,20,21,22,23,24,25,30,32,37,42,49,53,70,79,80,81,82,83,84,88,89,99,106,109,110,113,119,125,135,139,143,146,161,163,179,199,211,222,254,255,259,264
,280,301,306,3]
對於一個給定的ip地址,掃描的過程是這樣的: 1. 每一個端口創建一個線程,添加到線程列表 2. 利用connect_ex函數對該(ip,port)進行連接操作。
3. 調用thread.start()和thread.join()方法,使掃描的子線程開始工作並且命令主線程等待子線程死亡后再結束。
4. 重復這個過程直到所有的端口都被掃描過。
import socket, time, threading socket.setdefaulttimeout(3) def socket_port(ip,port): """ 輸入IP和端口號,掃描判斷端口是否開放 """ try: if port>=65535: print('端口掃描結束') s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) result=s.connect_ex((ip,port)) #返回值為0則表示端口open if result==0: print(ip+':',port,'端口開放') s.close() # except: print('端口掃描異常') def ip_scan(ip,thread_list): """ 輸入IP,掃描IP的0-65534端口情況 """ try: print('開始掃描 %s' % ip) start_time=time.time() for i in range(0,65534): t = threading.Thread(target=socket_port,args=(ip,i)) t.start() thread_list.append(t) for thread in thread_list: thread.join() print('掃描端口完成,總共用時 :%.2f' %(time.time()-start_time)) except: print('掃描ip出錯') if __name__=='__main__': ip=input('Input the ip you want to scan:\n') thread_list=[] lock = threading.Lock() ip_scan(ip,thread_list)