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)
