检测到目标url存在内部ip地址泄露_Cendertron,动态爬虫与敏感信息泄露检测

21a64af0e217ff96b8a8c130f65e0011.png

Cendertron,动态爬虫与敏感信息泄露检测

Cendertron = Crawler + Rendertron

Cendertron https://url.wx-coder.cn/HinPM 是基于 Puppeteer 的 Web 2.0 动态爬虫与敏感信息泄露检测工具。其依托于 xe-crawler 的通用爬虫、调度与缓存模型,新增了 Monkey Test 以及 Request Intercept 等特性,以期尽可能多地挖掘页面与请求。同时针对渗透测试的场景,Cendertron 内置了目录扫描、敏感文件扫描的能力,能够模拟用户实际在浏览器登录状态下的自定义字典爆破。Cendertron 在大量实践的基础上设置了自身的去重策略,能够尽可能地避免重复爬取,加快扫描速度。Cendertron 同时也是正在闭源开发的 Chaos-Scanner 模块化安全扫描解决方案的一部分,为基础扫描与智能扫描提供前置输入。

32c5bf57c1d051385420c3cfc6fab6af.png

Usage | 使用

Locally Development | 本地开发

在本地开发中,我们只需要如正常的 Node 项目一样启动,其会使用 Puppeteer 内置的 Headless Chrome 来执行界面渲染操作:

$ git clone https://github.com/wx-chevalier/Chaos-Scanner
$ cd cendertron
$ yarn install
$ npm run dev

启动之后可以按提示打开浏览器界面:

9b3e254c700fc2f074bd0c2308e025de.png

这里我们可以以 DVWA 作为测试目标,在输入框内输入 http://localhost:8082/ 然后执行爬取,即可得到如下结果:

{"isFinished": true,"metrics": {"executionDuration": 116177,"spiderCount": 51,"depth": 4},"spiderMap": {"http://localhost:8082/vulnerabilities/csrf/": [{"url": "http://localhost:8082/vulnerabilities/view_source.php?id=csrf&security=low","parsedUrl": {"host": "localhost:8082","pathname": "/vulnerabilities/view_source.php","query": {"id": "csrf","security": "low"}},"hash": "localhost:8082#/vulnerabilities/view_source.php#idsecurity","resourceType": "document"}// ...]}
}

需要说明的是,因为 DVWA 是需要登录后爬取,因此如果想进行完整的测试请参考下文的 POST 方式创建任务。

Deploy in Docker | 部署在 Docker 中

# build image
$ docker build -t cendertron .# run as contaner
$ docker run -it --rm -p 3033:3000 --name cendertron-instance cendertron# run as container, fix with Jessie Frazelle seccomp profile for Chrome.
$ wget https://raw.githubusercontent.com/jfrazelle/dotfiles/master/etc/docker/seccomp/chrome.json -O ~/chrome.json
$ docker run -it -p 3033:3000 --security-opt seccomp=$HOME/chrome.json --name cendertron-instance cendertron# or
$ docker run -it -p 3033:3000 --cap-add=SYS_ADMIN --name cendertron-instance cendertron# use network and mapping logs
$ docker run -d -p 3033:3000 --cap-add=SYS_ADMIN --name cendertron-instance --network wsat-network cendertron

Deploy as FC | 以函数式计算方式部署

Install cendertron from NPM:

# set not downloading chromium
$ PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true$ yarn add cendertron
# or
$ npm install cendertron -S

Import Crawler and use in your code:

const crawler = new Crawler(browser, {onFinish: () => {callback(crawler.spidersRequestMap);}
});let pageUrl =evtStr.length !== 0 && evtStr.indexOf('{') !== 0? evtStr: 'https://www.aliyun.com';crawler.start(pageUrl);

If you want to use it in Alibaba Function Computing Service, cendertron-fc provides simple template.

Strategy | 策略

Cendertron 的内部架构如下所示:

411c83621b2308c6038167d880baf937.png

Crawler Scheduler 会负责定期重启 Headless Chrome 以控制缓存,并且针对待爬取的请求返回已缓存的内容。Crawler Scheduler 会为每个无缓存的目标创建 Crawler,Crawler 会根据策略创建不同的 Spider,每个 Spider 依次执行并且将结果推送到 Crawler 中;Crawler 在全部 Spider 执行完毕后会将结果推送到缓存并且通知 Crawler Scheduler:

export interface CrawlerOption {// 爬取深度,如果设置为 1 就是单页面爬虫depth: number;// 爬虫的唯一编号uuid?: string;// 爬虫缓存crawlerCache?: CrawlerCache;// 单页面爬取出的最多的子节点数maxPageCount: number;// 总站点的总延时timeout: number;// 单页面的延时pageTimeout: number;// 是否仅爬取同站内容isSameOrigin: boolean;// 是否忽略媒体资源isIgnoreAssets: boolean;// 是否设置为移动模式isMobile: boolean;// 是否开启缓存useCache: boolean;// 是否使用弱口令扫描useWeakfile: boolean;// 页面 Cookiecookie: string;// 页面的 localStoragelocalStorage: object;
}

模拟操作

14acd06f3bca97cc65f2f3f10ea9abd6.png

Cendertron 内置了 Click Monkey, Gremlins 等多种随机执行器,会点击按钮并且执行一些随机操作:

function initGermlins() {gremlins.createHorde().gremlin(gremlins.species.formFiller()).gremlin(gremlins.species.clicker().clickTypes(['click'])).gremlin(gremlins.species.toucher()).gremlin(gremlins.species.scroller()).gremlin(function() {if ('$' in window) {window.$ = function() {};}}).unleash();
}

请求监听与提取

Cendertron 会监听打开的页面与所有的 Ajax 请求:

await page.setRequestInterception(true);// 设置目标监听
const targetCreatedListener = (target: puppeteer.Target) => {const opener = target.opener();if (!opener) {return;}// 记录所有新打开的界面opener.page().then(_page => {if (_page === page) {target.page().then(_p => {if (!_p.isClosed()) {openedUrls.push(target.url());_p.close();}});}});
};// 监听所有当前打开的页面
browser.on('targetcreated', targetCreatedListener);page.on('request', interceptedRequest => {// 屏蔽所有的图片if (isMedia(interceptedRequest.url())) {interceptedRequest.abort();} else if (interceptedRequest.isNavigationRequest() &&interceptedRequest.redirectChain().length !== 0) {interceptedRequest.continue();} else {interceptedRequest.continue();}requests.push(transformInterceptedRequestToRequest(interceptedRequest));// 每次调用时候都会回调函数cb(requests, openedUrls, [targetCreatedListener]);
});

URL 归一化与过滤

所谓的 URL 归一化,就是将同一资源下被随机串处理的 Path 们泛化成同一个 Pattern,从而减少重复爬取的数目;当然,在安全扫描的场景下我们需要进行尽可能地去重,而在数据爬取的场景下,则往往不需要进行过多的过滤。目前 Cendertron 只是采取了简单的 UTL 归一化算法,并且使用 Set 进行过滤,如果你想了解更复杂的 URL 归一化与聚类算法,可以参考自然语言处理 https://url.wx-coder.cn/JcINy 或者哈希表实战 https://url.wx-coder.cn/WfdWP 中的关联章节。

export function hashUrl(url: string): string {// 将 URL 进行格式化提取const _parsedUrl = parse(url, url, true);let urlHash = '';if (!_parsedUrl) {return urlHash;}// 提取出 URL 中的各个部分const { host, pathname, query, hash } = _parsedUrl;// 判断是否存在查询参数const queryKeys = Object.keys(query).sort((k1, k2) => (k1 > k2 ? 1 : -1));if (queryKeys.length > 0) {// 如果存在查询参数,则默认全路径加查询参数进行解析urlHash = `${host}#${pathname}#${queryKeys.join('')}`;} else {// 如果不存在查询参数,则去除 pathname 的最后一位,并且添加进来const pathFragments = pathname.split('/');// 判断路径是否包含多个项目,如果包含,则将所有疑似 UUID 的替换为 IDif (pathFragments.length > 1) {urlHash = `${host}#${pathFragments.filter(frag => frag.length > 0).map(frag => (maybeUUID(frag) ? 'id' : frag)).join('')}`;} else {urlHash = `${host}#${pathname}`;}}if (hash) {const hashQueryString = hash.replace('#', '');const queryObj = parseQuery(hashQueryString);Object.keys(queryObj).forEach(n => {if (n) {urlHash += n;}});}return urlHash;
}

权限认证

以 DVWA 为例,可以用 Docker 快速开启测试环境:docker run --rm -it -p 8082:80 vulnerables/web-dvwa,然后向 /scrape 提交 POST 请求:

{"url": "http://localhost:8082/vulnerabilities/csrf/","cookies": "tid=xx; PHPSESSID=xx; security=low"
}

在 Cendertron 中,其会使用如下方式设置 Cookie:

const puppeteer = require('puppeteer');let rockIt = async () => {const browser = await puppeteer.launch({ headless: false });const page = await browser.newPage();var cookie = [// cookie exported by google chrome plugin editthiscookie{domain: 'httpbin.org',expirationDate: 1597288045,hostOnly: false,httpOnly: false,name: 'key',path: '/',sameSite: 'no_restriction',secure: false,session: false,storeId: '0',value: 'value!',id: 1}];await page.setCookie(...cookie);await page.goto('https://httpbin.org/headers');console.log(await page.content());await page.close();await browser.close();
};
rockIt();

未来也会支持 localStorage 等存储方式:

await page.evaluate(() => {localStorage.setItem('token', 'example-token');
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

屏幕坏点检测图片_iPhone新机如何检测质量 iPhone新机检测质量步骤【详解】

iPhone新机怎么检测好坏_iPhone新机检测质量方法 说实话,苹果对于iPhone的品控把握确实一代不如一代,特别是去年发布的iPhone7系列,很多用户都反映自己新买的手机存在划痕、屏幕发黄、掉漆等问题。那么当我们购买一部全新的iPhone7时&#xf…

excel单元格斜线_怎么在excel中画斜线?怎么在excel表格中画斜线?

在excel表格中画斜线的技巧教程:1.在Excel中打开一个空白工作簿。 2.您可以在任何大小的单元格中执行此操作,但是如果先将其增大则更容易理解。为此,我们只需单击并按住第1行和第2行之间的线,然后将其拖动到所需的高度即可。然后对…

xbox one s驱动_理想照进现实 理想ONE开始接受预定

2016年4月22日,车和家创始人&CEO李想在源码资本第二届码会年会首谈车和家,改造城市出行。车和家 创始人&CEO 李 想2016年码会年会演讲2019年4月10日,增程式智能电动车「理想ONE」正式公布售价并开始接受预订,并将于2019年…

date设置时间_解决 IDEA 无法找到 java.util.Date 的问题

原文首发于 https://studyidea.cn/问题最近在项目中频繁使用到 java.util.Date,但是使用 IDEA 提示查找 Date 类,却无法找到 java.util.Date。可以看到,智能提示的结果没有 java.util.Date。没办法,只能暂时手动导入该包。最近闲下…

mysql插入语句例句,一句简单的MySql插入语句怎么写 ?

守候你守候我insert into 表名 values(default,"名字","2011-04-15 12:22:25"); //default可以换成null------------------------------insert into 表名 (name,datetime) values("名字","2011-04-15 12:22:25");使用SQL语法大写&…

路由器下一跳地址怎么判断_网络基本功三:细说路由器

介绍以太网交换机工作在第二层即数据链路层,用于在同一网络内部转发以太网帧。但是,当源和目的IP地址位于不同网络时,以太网帧必须发送给路由器。路由器负责在不同网络间传输报文,通过路由表来决定最佳转发路径。当主机将报文发送…

python函数的作用域_python学习第五篇 函数 变量作用域

原博文 2019-07-18 23:40 − 函数 函数是组合好的,可以重复使用的,用来实现单一或相关联功能的代码片段作用 能提高应用的模块性和代码的重复利用率函数的创建 第一函数的规则 1.函数代码块一def关键字开头,后接函数标识符名称和圆括号‘&…

python pip使用_Python——pip的安装与使用

pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。目前如果你在 python.org 下载最新版本的安装包,则是已经自带了该工具。Python 2.7.9 或 Python 3.4 以上版本都自带 pip 工具。pip 官网:https://pypi.o…

php文章列表样式,PHPCMS V9 文章列表循环样式自定义方法

在此,再次分享Whidy的文章"phpcms文章列表循环不同样式制作方法",下面CMSYOU来与大家具体分享,原地址为http://whidy.net/phpcms-list-with-different-style.html,在这里感谢。大家在用PHPCMS系统做网站的时候,有时候在…

查看ie保存的表单_解决浏览器保存密码自动填充问题

解决浏览器保存密码自动填充问题问题描述话说有一天,我如往常一样打开我的开发网站进行登录操作。浏览器很平常的在我们进行登录操作之后询问我是否需要记住密码,懒惰如我点击了记住密码。一切都很正常的进行着,没有什么异常发生。然而&#…

python mysql 正则表达式,MySQL之正则表达式(REGEXP)

MySQL中正则表达式通常被用来检索或替换符合某个模式的文本内容,根据指定的匹配模式匹配文中符合要求的特殊字符串。例如,从一个文件中提取电话号码,查找一篇文章中重复的单词或替换用户输入的敏感语汇等,这些地方都可以使用正则表…

pyecharts anaconda_Pyecharts安装使用和绘图案例

一次偶然的机会,接触了pyecharts,发现做图交互效果非常棒,便深究、摸索、入坑。这篇文章主要讲述自己在安装和使用中遇到的问题,解决方法,最后还会有pyecharts中自己比较喜欢的绘图功能。pyecharts是一款将python与ech…

如何把密度函数化为标准正态二维分布_概率微课:第三章(22) 二维随机变量及分布函数定义...

主要内容二维随机变量及分布函数定义更多系列视频概率微课:第二章(1) 随机变量的定义概率微课:第二章(2) 离散型随机变量概率微课:第二章(3) 两点分布及伯努利试验概率微课:第二章(4) 二项分布1概率微课:第二章(5) 二…

php中的缓,php中的缓存机制解释

php缓存的理解,先列出ob系列函数的作用:ob_start(func) 开启php缓存,回调函数是对缓存内数据的处理函数ob_gzhandler 作为 ob_start 的回调函数,对数据进行gz压缩ob_implicit_flush(true/false) 打开或关闭apache缓存&#xff0c…

php 下拉菜单多选get,Jquery实现select二级联动多选下拉菜单

前言平时虽然也有写前端,但是对于一些复杂的功能实现仍是一知半解。这次项目需要实现一个多选下拉菜单,并且该菜单要和上级下拉菜单保持联动。更加麻烦的是,我需要完成以下操作,以省、市二级联动菜单为例:选择河北省 &…

idea快捷键打开run的窗口_看了上篇文章,你不了解的IDEA操作……

注意作者:卡洛小豆。换种方式写文章,写的不好请多多见谅。未经授权,禁止转载夜,结束了一天的喧嚣后安静下来,伴随着远处路灯那微弱的光。风,毫无预兆地席卷整片旷野,撩动人的思绪万千。那是一个…

arma模型_Eviews经典案例 | 初学者必看!ARMA模型精讲

【本期分析师介绍】希音老师,《数据分析学堂》金牌分析师,对eviews的时间序列、ARMA、VAR、VECM、ARCH、GARCH等操作有深入的研究和实战经验,累计服务客户1000。今天邀请希音老师给大家分享eviews的详细操作步骤。长文预警!可在文末联系麻瓜学…

c# 路径下的最近文件夹_C#8.0的两个有趣的新特性以及gRPC

最近每天忙着跑很多地方,回家就不想动了,没什么心情写东西。今天有空,稍微写一点。下文中:关于C#语法特性的部分需要Visual Studio 2019支持。关于.NET Core的部分需要安装.NET 3.0 Preview4,低版本或许也可以但我没实…

alter table add column多个字段_ElementUI表格el-table表头固定自适应高度解决方案

一、前言ElementUI、iView都以相同的方式提供了表格组件表头固定的方法,即设置组件的height属性。表头固定很重要,就在于当表格数据项很多时,滚动条出现在表格组件内,而不是出现在表格组件外——这样的优点在于,滚动浏…

oracle ora 12011,执行oracle中的job报错:ORA-12011:无法执行作业1

LZ在做一个job执行每天新增一个表的操作时,存储过程运行没问题,job也创建成功,但运行job时,却报错: ,后又用sys用户登陆创建了同样的存储过程和job,结果可以执行成功。当时就猜测是权限问题。后…