dirmap改造计划

本来昨天是第一天入职了,奈何水土不服,睡不着觉,第一天也就入职领了下东西,然后心久师兄和木雁师兄都给了任务。。钓着鱼看了看代码。。
根据任务需求,在指定资产中爬取关健字,再爆破生成关键字,然后两关键字组合生成关于特点资产的敏感目录字典扫描。

然后我仔细思索了下,自己写的肯定没有前人写的好,根据自己经常用的目录扫描,无非就dirmap.py、dirserach.py、御剑和7k了。

御剑和7k。。感觉有点跟不上时代,然后想着去把dirmap.py和dirsearch.py看完的。。 可是dirsearch.py的代码感觉好长好乱。。然后发现dirmap.py
的作者其实也已经借鉴了dirsearch的相关代码了,所以就在dirmap.py的基础上进行改造吧。

dirmap源码阅读

banner() 输出banner
setPaths() 设置字典、输出和配置文件的路径
cmdLineOptions.update(cmdLineParser().__dict__) 获取参数值并赋值到cmdlineOptions对象
initOptions(cmdLineOptions) 初始化
    EngineRegister(args) 并发引擎模块
    BruterRegister(args) bruter模块
    loadConf() 加载配置文件
        ConfigFileParser()
    TargetRegister(args) 加载目标模块
        Outputscreen() 颜色显示
        parseTarget(target) 识别目标,转列表
            genIP(target)  IP 段范围区间或者掩码网段地址解析成实际单个IP
run()
    initEngine()  扫描初始化
    scan() 协程模式扫描
        bruter(url) 爆破
            Inspector(url) 根据404,302,md5判断记录404的页面
           scanModeHandler()  扫描模式
                fuzz_mode fuzz模式 单独加载
                    generateSingleFuzzDict()  单字典fuzz
                    generateMultFuzzDict()  多字典fuzz
                dict_mode 字典模式
                    loadSingleDict(conf.dict_mode_load_single_dict) 加载单个字典
                    loadMultDict(conf.dict_mode_load_mult_dict) 加载多个字典
                blast_mode 爆破模式
                    generateBlastDict() 生成纯暴力字典,支持断点续生成
                        generateLengthDict(length) 生成length长度的字典
                crawk_mode 爬虫模式
                    header、cookie、ua设置
                    urlSimilarCheck() 相识url检测
                    crawl_mode_dynamic_fuzz 动态爬虫fuzz
                        loadSuffix()  添加动态爬虫字典后缀规则
                        generateCrawlDict(i) 生成动态爬虫字典
每个函数内的代码都跟了一下,最后发现dirmap已经实现了动态爬虫模式和爆破模式,我需要做的就是把两模式结合起来,其实最主要的就是generateLengthDict(length)和 generateCrawlDict(i) 
两个函数的相关代码。
后面经过测试大概写了个轮子
def generateCrawlDict(base_url):
    '''
    @description: 生成动态爬虫字典
    @param {base_url:}
    @return:
    '''
    def _splitFilename(filename):

        full_filename = filename.rstrip('.')
        extension = full_filename.split('.')[-1]
        name = '.'.join(full_filename.split('.')[:-1])

        return name, extension

    url = base_url.split('?')[0].rstrip('/')
    if not urllib.parse.urlparse(url).path:
        return list()

    path = '/'.join(url.split('/')[:-1])
    #print(path)
    filename = url.split('/')[-1]
    #print(filename)

    caue = url.split('/')[:-1]
    frist_caue  = list()
    frist_caue.extend(caue)
    frist_caue.extend(filename.split('.')[:-1])
    frist_caue = [i for i in frist_caue if i != '']
    #print(frist_caue)

    second_caue = list()
    for i in payloads.blast_mode_custom_charset_dict:
        for j in frist_caue:
            second_caue.append(j + i)
    #print(second_caue)



    # Check if target CMS uses route instead of static file
    isfile = True if '.' in filename else False

    if isfile:
        name, extension = _splitFilename(filename)

    final_urls = list()
    for each in payloads.suffix:
        new_filename = path + '/' + each.replace('{FULL}', filename)

        new_frist_caue = list()
        for i in frist_caue:
            new_frist_caue.append(each.replace('{FULL}',i))

        new_sceond_caue = list()
        for i in second_caue:
            new_sceond_caue.append(each.replace('{FULL}',i))

        if isfile:
            new_filename = new_filename.replace('{NAME}', name).replace('{EXT}', extension)
        else:
            if '{NAME}' in each or '{EXT}' in each:
                continue
        final_urls.append(urllib.parse.urlparse(new_filename.replace('..', '.')).path)

    final_urls.extend(frist_caue)
    final_urls.extend(second_caue)
    final_urls.extend(new_frist_caue)
    final_urls.extend(new_sceond_caue)

    return final_urls

然后发现很多问题。。:

  1. 爬取的静态相关的名字再去组合会生成太多没有的目录,根本没什么价值;
  2. 爬取的相关xpath关键词太少;
  3. 爆破的长度,还有爆破的字符串组合的敏感字符也太少。

我想的解决办法是

  1. 设置过滤字符的名单,一旦在 in 列表里 就不append;
  2. 关键词和敏感字符问题,明天得再好好翻翻字典,做下统计。

争取明天完成这个任务吧。

posted @ 2020-06-16 23:46  Ajatar  阅读(601)  评论(1编辑  收藏  举报