# 为什么要写这样的工具

在平时挖洞渗透的过程中,我发现,前端往往会暴露很多敏感信息,但是如果我们手动去一个个的筛选,就会很浪费时间。而且涉及到深度较深的 js 还可能无法看到或者忽略。网上现有的工具如 jsfinder,hae 等工具也都有一些缺陷。因此这里博百家之长,自己重新实现了一个爬虫,并针对一些敏感数据进行正则匹配,从而帮助我们发现前端中泄露的各种信息让我们更方便的挖洞。

# PupilSearch

https://github.com/ruyueattention/PupilSearch

PupilSearch 本质上就是一个爬虫,能够自动帮我们查询搜索 web 前端中泄露的信息。包括 api 接口、url、各种敏感信息(JWT TOKEN、IP、Email、Phone、身份证、AccessKey、SecretKey、APPID、UserName、Password、SSHKey、RSAKey)。

该爬虫已应用于 Kunyu ,感谢风起 (我小儿)。

https://github.com/knownsec/Kunyu

其工作流程大致如下:

image-20220316151115942

# 功能特点

  1. 递归回溯,根据输入参数设定追溯深度,自动递归回溯获取到的资源,再从中匹配敏感信息。
  2. 文件各模块功能清晰,简介易改。
  3. 保存有访问历史,根据访问历史自动去除追溯队列中的重复请求。
  4. 初次访问会调用 chromium 进行渲染页面,防止部分数据是由 js 动态渲染添加的,导致识别不到的问题。
  5. 按域名去重复保存结果
  6. 判断当前 js 是否为 webpack 打包的 js,对于疑是 webpack 打包的 js,尝试获取 map。
  7. 多线程,不值一提。
  8. 根据正则匹配大量敏感信息(可自行修改正则),目前支撑匹配 JWT TOKEN、IP、Email、Phone、身份证、AccessKey、SecretKey、APPID、UserName、Password、SSHKey、RSAKey 等等。

# 使用方法

# 环境准备

pip install -r requirement.txt

# 快速使用

# 输入目标

python3 PupilMain.py -u http://target.com

其他参数不设置的话,就默认追溯深度为 2、线程为 5、不对接口进行追溯、不对非当前 host 的 url 进行追溯。

如果要设置请参考各个参数的功能,合理设置。

# 自定义参数

当前支持参数有 -t 线程 -d 追溯深度 -a 对所有抓取到的 url 进行追溯 -f 对获取到的接口进行追溯

特别说明:

-u 目标:该有的 / 不能少,比如目标域名是 aaa.com/sso/不能偷懒为 aaa.com/sso 。并且 url 中不能存在 #。

​ -d 追溯深度:0 则代表只针对当前 url 搜索,不追溯其他 url,1 则代表对当前 url 得出的 js 等结果进行追溯,2 则是对它的结果的结果进行追溯。一般的网站追溯到 3 就没数据了。

​ -a:默认情况下是不会对抓取到的所有 url 都进行追溯的,只会追溯当前 host 的 url。开启后,则追溯全部的 url,所以该参数慎用。在开启这个功能的情况下,推荐追溯深度调小。

-f:默认情况下不对获取到的接口进行追溯。

--proxy : 代理设置。

python3 PupilMain.py -u http://target.com -d 3 -a True -f True --proxy=http://127.0.0.1:8080

image-20220316163054510

# 输出结果

结果会 print 在控制台,同时也会保存在 result 目录下。

image-20220321172935254

image-20220321172848541

# 已知缺陷

  1. 数据是经正则进行匹配的,可能会导致部分数据匹配不成功或者匹配到脏数据。尤其是 ip 和 password 和 username 等信息。

    可根据自己的具体使用进行正则修改,在 SearhData.py 中。

image-20220316163201802

2. 部分页面在渲染页面的时候会有一些小 bug,这里在遇到 bug 的时候会逃过渲染,这可能导致结果不准确。

# 各个文件的作用

PupilMain.py

入口文件,初始化各种参数,同时对一些参数进行简单的处理。

TrackUrl.py

追溯文件,主要是发送 requests 请求。

SearchData.py

数据获取文件,将 requests 获取到的数据在这里进行匹配处理。

在这里可以修改各种正则匹配式,匹配自己想要的数据。

ExportHandler.py

数据的输出,主要是对数据做一些简单的去重处理。

这里可以修改数据的返回形式。

GlobalVariable.py

设置跨文件全局变量。