SubFinder子域枚举源码结构分析

2024-11-08 2 0

SubFinder是一个子域发现工具,可以为任何目标枚举海量的有效子域名。它已成为sublist3r项目的继承者

地址:https://github.com/projectdiscovery/subfinder

本文主要对Subfinder的源码进行学习(如有错误,恳请指正)

一 初始化

Options

入口main,首先调用ParseOptions(),做了一些参数的获取和准备工作

SubFinder子域枚举源码结构分析插图

获取参数部分

SubFinder子域枚举源码结构分析插图1

往下走最重要的部分是然后判断了provider config 文件是否存在,如果不存在的话创建

SubFinder子域枚举源码结构分析插图2

遍历passive中的所有需要apikey的source,并且以yaml形式保存

SubFinder子域枚举源码结构分析插图3

NeedKey方法

SubFinder子域枚举源码结构分析插图4

可以看一下AllSources,这里是subfinder对接的所有搜索源(有些源查询需要apikey),这个yaml的作用就是保存key

SubFinder子域枚举源码结构分析插图5

provider-config.yaml,如果想要获取更多结果,可以将自己的key填入

SubFinder子域枚举源码结构分析插图6

NewRunner

这里可以看到通过loadProvidersFrom函数解析yaml中的key

SubFinder子域枚举源码结构分析插图7

通过Unmarshal来解析

SubFinder子域枚举源码结构分析插图8

接着调用了runner.initializePassiveEngine()返回passiveAgent(保存了一个source数组,存储了各个source结构体)

SubFinder子域枚举源码结构分析插图9SubFinder子域枚举源码结构分析插图10

NewRunner继续向下,这里初始化了source的速率限制,在后期会进行使用

SubFinder子域枚举源码结构分析插图11

SubFinder子域枚举源码结构分析插图12

二 子域发现

首先在withValues中创建了一个上下文,走到RunEnumerationWithCtx()

SubFinder子域枚举源码结构分析插图13

简单拼接了一下domain,调用EnumerateMultipleDomainsWithCtx(),同样支持从文件中读取domain

SubFinder子域枚举源码结构分析插图14

遍历每个domain(感觉刚刚用 \n 凭借的操作有点多余)做了一个Ip的正则匹配

SubFinder子域枚举源码结构分析插图15

判断是否指定保存文件或者目录,最终都走到了EnumerateSingleDomainWithCtx()

SubFinder子域枚举源码结构分析插图16

EnumerateSingleDomainWithCtx中通过r.passiveAgent.EnumerateSubdomainsWithCtx实现子域的获取,返回了一个chan(passiveResults),在下面的代码默认将结果遍历存到uniqueMap,并且最后打印到屏幕上

SubFinder子域枚举源码结构分析插图17

SubFinder子域枚举源码结构分析插图18

打印结果

SubFinder子域枚举源码结构分析插图19

并且为了提高准确率,如果指定移除通配符,会执行这个代码,这块暂且不看,看主要部分的r.passiveAgent.EnumerateSubdomainsWithCtx

//如果开启r.options.RemoveWildcard,将会创建一个任务池,进行Dns查询
	var resolutionPool *resolve.ResolutionPool
	if r.options.RemoveWildcard {
		resolutionPool = r.resolverClient.NewResolutionPool(r.options.Threads, r.options.RemoveWildcard)
		err := resolutionPool.InitWildcards(domain)
		if err != nil {
			// Log the error but don't quit.
			gologger.Warning().Msgf("Could not get wildcards for domain %s: %s\n", domain, err)
		}
	}

EnumerateSubdomainsWithCtx()函数

创建了一个速率的限制器,这个就是上面初始化时提到的

SubFinder子域枚举源码结构分析插图20

SubFinder子域枚举源码结构分析插图21

然后创建了一个Session,这个session实际封装了与特定网络请求会话相关的所有配置和状态,之后对source发起请求均通过session进行

SubFinder子域枚举源码结构分析插图22

SubFinder子域枚举源码结构分析插图23

SubFinder子域枚举源码结构分析插图24

新建了一个带有超时时间的上下文,循环调用Sources里的source的run方法,并且将resp输出到result

SubFinder子域枚举源码结构分析插图25

可以看一下这些source源的run方法

quake(没有配置key,自动跳过,其实可以直接定义到外面,避免每个source都重复一次这个代码)

SubFinder子域枚举源码结构分析插图26

subdomaincenter

SubFinder子域枚举源码结构分析插图27

三 值得借鉴和学习的部分

1 是已经搜集好的各种源,可以直接拿来使用

SubFinder子域枚举源码结构分析插图28

2 在代码中很多通过上下文(ctx)传输数据,方便了参数的传递,简化了不少代码

3 正如passiveResults这里对chan的处理一样,函数主体一个先返回一个chan,然后协程进行数据处理,代码会看起来非常优雅

4 agent的封装,省去大量重复代码

四 Subfinder的对接

subfinder直接提供了将其当作库函数的实例 ,在example中

SubFinder子域枚举源码结构分析插图29

使用案例:

直接封装个结构体调用即可

SubFinder子域枚举源码结构分析插图30

最后有对速率限制这方面有部分代码看的不是特别明白,求指点


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

Java已死,大模型才是未来?
前端做了快两年了,盘点一下我的前端技术栈
我国政府网站公开发布的文档普遍存在泄露内部人员信息的现象,存在较大网络安全风险
Fscan源码结构学习和混淆免杀
EVTX:一款针对Windows EVTX事件日志的快速安全解析工具
INTEl产品安全漏洞大起底

发布评论