优雅地寻找网站源码

优雅地寻找网站源码

0x0 前言

渗透过程当中若是能获取到网站的源代码,那么无疑开启了上帝视角。虽然以前出现过很多经过搜索引擎查找同类网站,而后批量扫备份的思路,可是却没人分享其具体过程,这里笔者便整理了本身开发分布式扫描器的目录扫描模块的一些尝试的思路,同时分享一些寻找源码的其余手段,但愿能给读者带来一些新的体验。php

0x1 搜索技巧

0x1.1 代码托管平台

国外的github和国内的gitee都是第三方代码托管平台,经过一些搜索技巧,咱们能够从中发现不少泄露的敏感信息,其中就包括一些程序的源代码。html

这里笔者对码云平时用的很少,故对此只是简单提提,下面,则重点介绍github的用法:python

学习这个用法就我我的而言最大的好处是,遇到返回大量数据的时候,能够根据一些特色来过滤掉一些垃圾数据。git

Github的搜索页面:github.com/searchgithub

(1) quick cheat sheetdocker

基础查询:api

搜索仓库:bash

搜索代码:markdown

搜索用户:cookie

(2)我的查询Dork

filename:config.php dbpasswdfilename:.bashrc passwordshodan\_api\_key language:pythonpath:sites datab ases password"baidu.com" ssh language:yamlfilename:file.php admin in:pathorg:companyname "AWS\_ACCESS\_KEY_ID:"
复制代码

(3)针对某个关键词查询

用双引号括起来,如"qq.com"

(4)可使用GitDorker来自定义dork,实现自动化查询。

git clone https://github.com/obheda12/GitDorker.gitcd GitDorkerdocker build -t gitdorker .docker run -it gitdorkerdocker run -it -v $(pwd)/tf:/tf gitdorker -tf tf/TOKENSFILE -q tesla.com -d dorks/DORKFILE -o tesladocker run -it -v $(pwd)/tf:/tf xshuden/gitdorker -tf tf/TOKENSFILE -q tesla.com -d dorks/DORKFILE -o tesla
复制代码

免安装使用:

python3 GitDorker.py -tf ./TF/TOKENSFILE -q ximalaya.com -d ./Dorks/alldorksv3 -o x mly
复制代码

image-20210731205211026

参考:

github.com/techgaun/gi…

infosecwriteups.com/github-dork…

0x1.2 搜索引擎

Google:

XX源码XX完整包xx安装程序xx备份xx代码xx开源xx源程序xx框架xx ext:rar | ext:tar.gz |ext:zip
复制代码

image-20210731212133521

0x1.3 网盘搜索

www.feifeipan.com/

www.dalipan.com/

www.chaonengsou.com/ 这个网站作了个集合,比较全。

image-20210731213021461

0x2 曲线思路

若是如0x1所述,依然没办法找到源码,说明目标系统是那种小众或者商业类型的,致使没有在互联网流传普遍,故没办法搜索到。

这个时候,咱们即可以采用曲线思路,经过寻找本网站根目录下的备份文件,源代码包进行下载,若是仍然没有找到,则去寻找同套系统的其余网站,扫描这些网站目录下的备份文件和源代码包,从而获取到系统源码。

咱们不能作思想上的巨人,行动上的矮子,那么如何高效地完成这一过程呢? 能够划分为下面几个步骤来完成。

0x2.1 提取特征

关于特征,重点收集主页特征,即直接访问域名显示的页面,由于主页是最容易被搜索引擎爬虫爬到的,次之,则是收集主页可访问到的其余标志性页面特征。

(1) logo 特征

请求favicon.ico获取hash

image-20210801001330490

(2) 关键词特征

网站title、网站版权信息、j avas cript关键字信息、html源码结构信息、http返回头特征。

0x2.2 资产收集

关于资产收集,除了调度本身写的脚本集成fofa,shodan,zoomeye三个平台以外,我还很喜欢使用一个工具,由于它的功能比较丰富且运行也较为稳定——-fofaviewer。

下载地址:github.com/wgpsec/fofa…

image-20210801011008850

0x2.3 简单fuzz

收集到资产以后,前期,我喜欢用httpx进行一些路径的简单探测

cat targets.xt|deduplicate|httpx -path '/wwwroot.zip' -status-code

image-20210801091211002

至关于作一层简单的过滤,来帮助nuclei减小请求的量。

0x2.4 编写nuclei插件

阅读和学习编写插件的官方文档:Guide可知:

编写插件第一步: 插件信息

新建back-up-files.yaml文件,写入以下内容

参考:nuclei.projectdiscovery.io/templating-… 可知

id是必须的,不能包含空格,通常与文件名相同

info区域是动态的,除了name, author, des cription, severity and tags,也能够添加其余key:value,tags是支持用于nuclei检索调用的,可参照同类插件来写。

id: back-up-filesinfo:  name: Find Resource Code Of Target Template  author: xq17  severity: medium  tags: exposure,backup
复制代码

编写插件的第二步:发送请求

参考:nuclei.projectdiscovery.io/templating-… 可知

1.HTTP Requests start with a request block which specifies the start of the requests for the template.

2.Request method can be GET, POST, PUT, DELETE, etc depending on the needs.

3.Redirection conditions can be specified per each template. By default, redirects are not followed. However, if desired, they can be enabled with redirects: true in request d etails.

4.The next part of the requests is the path of the request path. Dynamic variables can be placed in the path to modify its behavior on runtime.

Variables start with {{ and end with }} and are case-sensitive.

{{b aseURL}} - This will replace on runtime in the request by the original URL as specified in the target file.

{{Hostname}} - Hostname variable is replaced by the hostname of the target on runtime.

5.Headers can also be specified to be sent along with the requests. Headers are placed in form of key/value pairs. An example header configuration looks like this:

# headers contains the headers for the requestheaders: # Custom user-agent header User-Agent: Some-Random-User-Agent # Custom request origin Origin: https://google.com
复制代码

6.Body specifies a body to be sent along with the request. (发送POST包须要用到)

7.To maintain cookie b ased browser like session between multiple requests, you can simply use cookie-reuse: true in your template, Useful in cases where you want to maintain session between series of request to complete the exploit chain and to perform authenticated scans.(Session重用,做用是串联攻击链,实现登陆验证再攻击)

# cookie-reuse accepts boolean input and false as defaultcookie-reuse: true
复制代码

8.Request condition allows to check for condition between multiple requests for writing complex checks and exploits involving multiple HTTP request to complete the exploit chain.

with DSL matcher, it can be utilized by adding req-condition: true and numbers as suffix with respective attributes, status_code_1status_code_3, andbody_2 for example.(编写复杂攻击链)

  req-condition: true   matchers:     - type: dsl       dsl:         - "status\_code\_1 == 404 && status\_code\_2 == 200 && contains((body\_2), 'secret\_string')"
复制代码

…还有许多高级用法好比支持raw http,race之类的,可是这里用不上,文档这个东西,够用就行。

requests:  - method: GET    path:    - "{{b aseURL}}/wwwroot.zip"    - "{{b aseURL}}/www.zip"
复制代码

编写插件的第三步: 判断返回内容

参考:nuclei.projectdiscovery.io/templating-… 知

Multiple matchers can be specified in a request. There are basically 6 types of matchers:

status(状态码) size(返回包大小) word(字符串) regex(正则匹配) binary(二进制文件)

还有一个dsl,高度自定义验证返回内容,能够对返回内容作一些操做(这里暂时用不上)

image-20210801101714061

可用的辅助函数: nuclei.projectdiscovery.io/templating-…,

对于words and regexes,能够对返回内容的多个匹配条件用ANDOR进行组合。

Multiple words and regexes can be specified in a single matcher and can be configured with different conditions like AND and OR

能够对返回的包,选定match的区域,默认是body,也支持选择header等任意地方。

Multiple parts of the response can also be matched for the request, default matched part is body if not defined.

支持对条件取反,这个就是反证法的妙处了。

All types of matchers also support negative conditions, mostly useful when you look for a match with an exclusions. This can be used by adding negative: true in the matchers block.

支持使用多个matchers

Multiple matchers can be used in a single template to fingerprint multiple conditions with a single request.

支持matchers-condition

While using multiple matchers the default condition is to follow OR operation in between all the matchers, AND operation can be used to make sure return the result if all matchers returns true.

结合上面文档的介绍,能够写入以下的判断。

    matchers-condition: and    matchers:      - type: binary        binary:          - "504B0304"  # zip        part: body      - type: dsl        dsl:          - "len(body)>0"      - type: status        status:          - 200
复制代码

编写插件的第四步: 连接起各个部分

上面的代码内容按顺序连接起来,则是以下:

id: back-up-filesinfo:  name: Find Resource Code Of Target Template  author: xq17  severity: medium  tags: exposure,backuprequests:  - method: GET    path:    - "{{b aseURL}}/wwwroot.zip"    - "{{b aseURL}}/www.zip"    matchers-condition: and    matchers:      - type: binary        binary:          - "504B0304"  # zip        part: body      - type: dsl        dsl:          - "len(body)>0"      - type: status        status:          - 200
复制代码

0x2.5 测试插件

本地起一个靶机,进行调试:

python3 -m http.server 9091
复制代码

image-20210801113949221

而后调试:

echo 'http://127.0.0.1:9091' | nuclei -t back-up-files.yaml -debug -timeout 2 -stats -proxy-url http://127.0.0.1:8080/
复制代码

image-20210801115848508

发包过程:

image-20210801120003129

能够看到nuclei应用上插件以后,能够快速Fuzz出网站备份文件。

0x3 总结

第一篇主要是介绍了一些思路和nuclei插件编写简单思路,用于帮助新手快速入门,第二篇则是关于如何加强该插件,增长扫描目录列表,更精确的判断返回值等内容(这里建议读者,能够先自行阅读下nuclei-template的文档,这样学习效果更佳!),第三篇则是运用前两篇的知识点和加强型插件,来完成一次真实的寻找网站源码之旅。

相关文章
相关标签/搜索