zoukankan      html  css  js  c++  java
  • 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('
    [*] ' + str(hostname) + " FTP Anonymous login successful!") #不抛出异常则表明登录成功
                return True
        except Exception as e:#抛出异常则表明匿名登录失败
             print('
    [-] ' + 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:
    ')
        thread_list=[]
        lock = threading.Lock()
        ip_scan(ip,thread_list)
    

      

  • 相关阅读:
    一步一步学数据结构之(动态申请二维数组)
    运维自动化
    oracle查看登录到oracle服务器的客户端ip
    权限
    windows下使用SQLPLUS制作BAT执行SQL文件
    rsyslog传输type
    C经典实例
    mysql导出数据库数据及表结构
    解决oracle11g无法导出空表问题
    opennebula onenebula
  • 原文地址:https://www.cnblogs.com/-wenli/p/10258203.html
Copyright © 2011-2022 走看看