因为有的网站被攻击之后会被攻击者悄悄挂上暗链,用来提升恶意网站的搜索权重排名,突发奇想看一下暗链扫描工具是咋做的,去github上翻了一下,这次分析Libra

项目地址:https://github.com/rabbitmask/Libra

项目功能:网站篡改、暗链、死链监测平台

这里我们只分析暗链检测

使用

因为这里我想要测试暗链检测的功能,随便找一个18禁网址进行暗链检测

python3 Libra.py -u http://*******

暗链扫描工具分析_微信

运行结束后就会输出一份报告,并且列出具体结果

暗链扫描工具分析_html_02

实际在运行过程中会有一些问题,我自行在代码里进行了部分修改

原理

暗链检测原理很清晰:

  • 输入待检测网址
  • 获取该网址内的所有URL
  • 获取这些URL的源代码
  • 检测源代码中是否存在暗链关键字
  • 保存结果

下面对每一步进行阐述

输入待检测网址

这里使用argparse库来获取解析用户的输入参数,可以形成我们常见的命令行效果

如果我们输入--help参数就能够查看到使用用法

暗链扫描工具分析_html_03

源代码如下

parser = argparse.ArgumentParser()


parser.add_argument("-u", dest='url',help="The Target Url")

parser.add_argument("-m", dest='monitor',help="Monitor The Target Url")

parser.add_argument("-f", dest='file',help="The List Of Target Urls")

args = parser.parse_args()

看代码可以知道我们 -u 的时候就是输入待检测网址

获取该网址内的所有URL

跟进代码在crawler_api方法里面能够获取网址内的所有URL,这里的方式是通过re.compile直接匹配正则

def crawler_api(url):
    if isinstance(url, str):
        out_link=[]
        in_link=[]
        html=GetData(url)[1]
        href = re.compile('href="(.*?)"')
        src = re.compile('src="(.*?)"')
        res_href = href.findall(html)
        res_src = src.findall(html)
        res_html = res_href+res_src
        in_link.append(url)
        for i in res_html:
            file_ok=True
            for j in file_type_black:
                if j in i:
                    file_ok = False
                    break
            if file_ok and len(i)>0:
                # print(i)
                if i[:4] == 'http':
                    out_link.append(i)
                else:
                    if i[0]=='/':
                        in_link.append(url+i)
                    else:
                        in_link.append(url+'/'+ i)

        res=[]
        for i in list(set(out_link+in_link)):
            tmp=[]
            tmp.append(i)
            tmp.append(url)
            res.append(tmp)
        return res

获取这些URL的源代码

在getData方法中获取源代码

def GetData(url):
    try:
        r = requests.get(url, headers=headers, timeout=5)
        r.encoding = 'utf-8'
        return r.status_code,r.text
    except(requests.exceptions.ReadTimeout,requests.exceptions.ConnectTimeout,requests.exceptions.ConnectionError):
        return 'Timeout','Timeout'

检测源代码中是否存在暗链关键字

在hlfind方法中检测是否存在暗链关键字

def hlfind(res):
    rules = []
    host = True
    re_rules_list = get_re()
    for re_rules in re_rules_list:
        result = re.findall(r'{}'.format(re_rules[0]), res, re.S)
        if result != []:
            rules.append(re_rules[0])
            host = False
    if host == False:
        return rules
    else:
        pass

保存结果

通过libra_log方法保存检测后的数据

def libra_log(url,master,res_comparer,res_hlfind,res_diedlink,filename):

    if res_comparer or res_hlfind or res_diedlink != 200:
        fw = open(filename, 'a',encoding="utf-8")

        fw.write('### '+url+' `'+str(res_diedlink)+'` '+'\n')
        fw.write('* Master: `'+master+'`\n')
        fw.write('* Time: `'+ getDate()+'`\n')
        fw.write('```\n')

        if res_comparer:
            fw.write('========================篡改监测===============================\n')
            if push_token:
                push(master, "篡改监测", getDate())
            for i in res_comparer:
                if i[0]=='+' or i[0]== '-' or i[0] =='?':
                    fw.write(i+'\n')
        if res_hlfind:
            fw.write('========================暗链监测===============================\n')
            if push_token:
                push(master, "暗链监测", getDate())
            for i in res_hlfind:
                fw.write(i+'\n')
        if res_diedlink != 200:
            fw.write('========================死链监测===============================\n')
            if push_token:
                push(master, "死链监测", getDate())
            fw.write(url+' '+str(res_diedlink)+'\n')
        fw.write('==============================================================\n')
        fw.write('```\n\n')

        fw.close()

总结

代码整体的流程很清晰,但URL提取和关键字列表还有待维护,通过修改数据库中的关键字列表来进行优化即可

本来想自己写一个插件的,逻辑比较简单就算了

END



暗链扫描工具分析_github_04