专栏首页信安之路开源项目 dirsearch 的一些阅读感想

开源项目 dirsearch 的一些阅读感想

本文作者:Turn it up.(信安之路作者团队成员)

最近开始阅读一些优秀的开源项目,读完之后就顺手谢谢读后感吧,今天说说 dirsearch,开头嘛,先读个简单点的,哈哈。

1、解决 Debug

程序参数是从命令行获取的,而 debug 模式则是将一个 py 脚本作为程序入口的,笔者开始有点不知所措,突然临机一动,用下面这个代码不就解决了?

import dirsearch
import sys
sys.argv= ['dirsearch.py', '-u', 'http://192.168.1.55', '-e', 'jsp', '--proxy', 'http://127.0.0.1:18080', '-w', 'db/dicc_test.txt']
dirsearch.Program()

2、简说程序

dirsearch 是一款使用 python3 编写的,用于暴力破解目录的工具,其 README 有写到下面一点

Heuristically detects invalid web pages(启发式地检测无效 web 页面)

在读程序之前,我带着下面几点疑惑/好奇

1、它是如果做到”启发式“这一点的;

2、其线程方面的代码,是否有什么亮点;

3、有啥比较骚的功能不。

2.1 dirsearch 的启发式

从底层核心类开始说起。首先是 Scanner,主要用于分析并存储当前网站对各类无效目录/无效文件真正的 HTTP Resonse 的模式。

Scanner 在测试时,使用的路径/文件是一个包含 12 个随机字符的字符串,如 68yK0OccrHpt、68yK0OccrHpt.php

self.testPath= RandomUtils.randString()

有的网站系统,对请求无效 WEB 页面的 HTTP Request,返回的是 200 的状态码,当然,界面是一个友好界面;有的网站则会返回一个 301/302/307 的跳转。

当 Scanner 访问这些随机字符串路径时,如果服务器返回的状态码是 404,则 Scanner 不继续分析,直接返回;服务器返回的状态码不是 404,Scanner 会发送第二次请求,依然是随机字符串的路径/文件,之后分析两次Response Body 的相似度并保存该相似度的浮点值,如果两次 Response 都发生了跳转(301/302/307),那么还会为 Location 字段值(URL)生成一个正则,如下面所示。

generateRedirectRegExp("http://www.test.com","http://123.test.com")) ^.*http\:\/\/.*.test.com.*$

之后访问一个目录/文件时,发生跳转中的 Location 的值需要匹配该正则,也页面相似度不小于当前值时,该目录/文件才被认为是无效的。可以说,dirsearch 在这里做得很细致啊。

Scanner 是被 Fuzzer 创建并调用的,Fuzzer 为无后缀斜线目录(/dir)、有后缀斜线目录(/dir/)、用户指定扩展文件(/xx.php、/xx.jsp 等)分别创建了一个 Scanner,Scanner 在执行 setup() 函数时,会如本节开头所说的,会分析出该种目录/文件的无效目录/无效文件所对应的 HTTP Response 的模式。

2.2 dirsearch 的多线程

有人说 dirsearch 速度很快,笔者以为在多线程方面会有亮点,比如说用协程,但并没有啥亮点。

虽然有 GIL 这东西然人感到不舒服,但也习惯了用 threading,编写起来也快,笔者想着下一个项目还是得要求自己用用协程。

2.3 dirsearch的迭代遍历

--recursive 用于递归目录遍历,默认是关闭的,而设置该选项时,还可以设置 --exclude-subdi 排除不想做迭代的目录。

在 Controller 中设置了 matchCallbacks 函数,该函数会将当前有效的不在 exclude 中的目录添加到当前

self.fuzzer= Fuzzer(self.requester, self.dictionary, testFailPath=self.arguments.testFailPath,                    threads=self.arguments.threadsCount, matchCallbacks=matchCallbacks,                    notFoundCallbacks=notFoundCallbacks, errorCallbacks=errorCallbacks)

在测试该功能时还发现了一个 BUG,已经提交至 Issues。问题的来源是这样的,Requester 中有这样一行代码

url= urllib.parse.urljoin(url, self.basePath)

但是,这个 urllib 库者 urljoin 函数有点问题。

>>>from urllib import parse
>>>parse.urljoin("http://192.168.237.136","//admin/")
>>>'http://admin/'

笔者提交的修补代码是。

while True:
    path_tmp= self.basePath.replace('//', '/')
    if path_tmp== self.basePath:
        break
    self.basePath= path_tmp

比较郁闷的一点时,dirsearch 对待 wordlist 中结尾有“/”的,且该目录在当前目标 URL 中为有效时才会进行迭代遍历,比如:

访问 http://www.test.com/admin 时的 HTTP Response 状态码为 200 ,dirsearch 不会对该目录进行迭代遍历,访问 http://www.test.com/admin/ 时的 HTTP Response 状态码 200,dirsearch 会对该目录进行迭代遍历。为啥要把选择权交给 wordlist,作者为啥要做这种区分,吾不知所以然啊。

2.4 IP 选项

在渗透测试时,有时候做目录遍历时,不得不只能能用 BurpSuit,不知道同学们对此是否有所体会。其中的痛点需求是,我们希望底层的 Socket 连接的是一个指定的 IP,然后 HTTP 中的 Host 字段值则是另外一个指定的域名 /IP。

dirsearch 就很巧妙地解决了以上痛点需求。requests 传入的 URL 中的 host 值是来源于-ip,另外设置Headers 中的Host字段值为 --url 中的值。

3、不足之处

笔者十分在意的另外一点是,dirsearch 在扫目录时,没有主动区分 ”/dir"、“/dir/”,这两类目录(当然,前文也说了,作者把这两类作为是否迭代遍历的标志)。笔者的意思是,有时候,访问

http://www.test.com/admin

HTTP Response 状态码为 301;访问

http://www.test.com/admin/

HTTP Response 状态码为 404。所以笔者十分在意这一点,这也是一个痛点啊,dirsearch 并没有对此做一个主动性的区分。

结尾,dirsearch 的启发式识别 URL 是否有效确实挺不错的,可能是不同人有不同的想法,所以项目的一些地方会让笔者感到疑惑不解,而项目的整体逻辑也挺不错,适合像笔者这样的初学者好好看,好好学。

本文分享自微信公众号 - 信安之路(xazlsec)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 想要阅读一些开源项目或框架的源代码,不知道从哪里入手?

    我的建议是从Spring的源代码入手。至少我自己也是这么做的,毕竟Spring里有大量的设计模式和OO编程的最佳实践。我之前在SAP使用SAP自己的开发语言AB...

    Jerry Wang
  • 想要阅读一些开源项目或框架的源代码,不知道从哪里入手?

    我的建议是从Spring的源代码入手。至少我自己也是这么做的,毕竟Spring里有大量的设计模式和OO编程的最佳实践。我之前在SAP使用SAP自己的开发语言AB...

    Jerry Wang
  • 最近项目重构的一些感想

    来源:https://juejin.im/post/5b46121f5188251ac446d0b4

    程序猿DD
  • 最近项目重构的一些感想

    最近,因为多个因素综合作用的情况下,我有幸得以负责一个项目的重构事项,并且时间/空间上都是相当宽松。而且由于系统较为复杂,需要对接多个业务开发部门,导致各种大需...

    Java团长
  • 最近项目重构的一些感想

    1. 缘起2. 面向对象仍然是主流的设计风格3. 世界是有状态的,导致我们的代码也是充满了各种各样的状态4. 什么是『组合』,什么是『组合优于继承』5. 『继承...

    芋道源码
  • 我参与 Seata 开源项目的一些感悟

    我一直都有上 GitHub 搜索一些主流开源项目的习惯,我是从去年 5 月份从 GitHub 开始关注 Seata 项目的,经过入门上手之后,我就觉得它的设计理...

    张乘辉
  • GlasgowSmile-v2通关笔记

    正如上图看到的扫描结果并没有得到有用的东西,这个工具不行,显然要更换工具继续干。常用的WEB目录扫描工具有:Dirsearch、DirBuster 、御剑等。

    刘銮奕
  • FuzzScanner:信息搜集开源小工具

    fuzzScanner可用于批量快速的搜集网站信息,比别人更快一步的发现其他端口的应用或者网站管理后台等,也适合src漏洞挖掘的前期信息搜集。主要是用于对网站子...

    C4rpeDime
  • dirsearch:基于Python的网站目录结构扫描器

    dirsearch是一个基于python的命令行工具,旨在暴力扫描页面结构,包括网页中的目录和文件。 ? 系统支持 WindowsXP/7/8/10 GNU/L...

    FB客服
  • Kiterunner:一款功能强大的上下文感知型内容搜索工具

    长期以来,跟“内容搜索”相关的技术一直都是基于文件和文件夹查找来实现的。虽然这种方法对于托管静态文件或响应文件路径的Web服务器来说是有效的,但对于现代Web应...

    FB客服
  • 那些年用过的开源项目(一)

    近期微软收购github新闻热搜各大媒体,微软,曾经开源的极力反对者,近几年也是积极拥抱开源。我司近来也是积极的拥抱开源,贡献了包括ui5,cloudfoudr...

    Bruce Li
  • 安服神器 | FuzzScanner

    一个用来进行信息搜集的工具集,主要是用于对网站子域名、开放端口、端口指纹、c段地址、敏感目录、链接爬取等信息进行批量搜集。

    HACK学习
  • Dirmap:一款高级Web目录文件扫描工具

    本人是一名立志安全开发的大学生,有一年安全测试经验,有时在刷src的时候,需要检查所有target的web业务系统是否泄露敏感目录、文件,工作量十分庞大,于是D...

    FB客服
  • Dirmap:高级Web目录扫描工具

    本人是一名立志安全开发的大学生,有一年安全测试经验,有时在刷src的时候,需要检查所有target的web业务系统是否泄露敏感目录、文件,工作量十分庞大,于是D...

    FB客服
  • Web入门之攻防世界

    最近看了一下Web类型的题目,感觉还是很有趣的~学会了查看源码,也就是F12还有使用view-source:,当时还是感觉很有成就感的,感觉自己看到了一些不一样...

    安恒网络空间安全讲武堂
  • 一些值得学习的Fuzzer开源项目

    之前GitHub上有人整理过一个叫Awesome-Fuzzing的资料,整理了关于Fuzzing技术的电子书、视频、工具、教程以及用于练习的漏洞程序。整体上不错...

    泉哥
  • 网络安全自学篇(十七)| Python攻防之构建Web目录扫描器及ip代理池(四)

    自幼受贵州大山的熏陶,养成了诚实质朴的性格。经过寒窗苦读,考入BIT,为完成自己的教师梦,放弃IT、航天等工作,成为贵财一名大学教师,并想把自己所学所感真心传授...

    释然
  • Rock-ON:一款多功能合一的网络侦察工具

    今天给大家介绍的是一款名叫Rock-ON的网络侦察工具,它是一款多功能合一的情报侦察工具,广大研究人员只需要给它提供一个域名地址,剩下的工作就可以交给Rock-...

    FB客服
  • 网络安全自学篇(十七)| Python攻防之构建Web目录扫描器及ip代理池(四)

    网站目录和敏感文件扫描是网站测试中最基本的手段之一。如果通过该方法发现了网站后台,可以尝试暴库、SQL注入等方式进行安全测试;如果发现敏感目录或敏感文件,能帮我...

    天钧

扫码关注云+社区

领取腾讯云代金券