1. 开篇

        不知道大家在平日工作中有没有遇到过一些端口,使用浏览器打开是下面这样子的:

image.png


上图中我找了几个在不同端口下的例子。

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,如下图所示:

 image.png

  下面是一个python写的远程调用的Demo:

  image.png

3. Selenium-server分析

       为了方便我们分析,我在Mac下启用一个Sever, 服务端就是一个独立端JAR文件,下载地址:点击下载

      可以直接这样启用:

image.png

浏览器访问,打开console看看,如下图:      

image.png

     

   new_6.gif    

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正在作业如图:

image.png

        哪么我们可以通过自己编写脚本,调用API接口,实时获取该浏览器的信息。如:

             比如下面展示的,某一个浏览器正在进行重置密码的-自动化操作,我们可以通过API接口实时拿到该浏览器当前的URL地址。(很关键拿到这个URL就可以为所欲为了。。。)image.png

image.png

        当然这个返回的是页面截图的Base64,转化一下如下:

image.png


      如果只是简单的URL监控,思路利用burpsuite就可以实现,这里我实验了一下,如图:

image.png

     利用这类思路,我们可以自己编写脚本利用其提供的API接口,对网络空间里的这类Selenium Server的行为进行24h的实时监控,

记录其xx行为。


        4.2 以此为跳板,对内网实施攻击

              利用Selenium Server对特点,创建或者可控一个正在作业的远程浏览器,向内网发起攻击。

           说到利用跳板发起内网攻击,可能最开始想到的是被大家玩出花的SSRF了。相比一般的SSRF漏洞,这里我们手里拿到的攻击筹码是远超过一般的SSRF漏洞的。敌方后防一个完全可控的浏览器,能够下发任意的JS代码,控制浏览器访问任意的URL这简直不能再爽!

            这里可以做一下实践,测试代码的demo如下:

        image.png

                这里的hook.js文件可以为任意XSSRays的hook文件,这里的是用的beef,在测试中这个hook.js文件还需要做点改动才能加载执行。(前端学的太渣)           

          这里的demo代码,实现的是连接远程Selenium Server,打开一个网页,然后在当前网页动态加载一个hook.js文件。动态加载的代码部分是这样实现的:

image.png

        这里通过selenium 提供的execute_script函数,在远程浏览器执行一段JS,js内容是加载远程的JS文件,这里默认加载的beef的hook文件是没有执行的,需要做改动如下:image.png

        经过上面的改动,现在就可以成功的注入beef的js文件并执行上线了,效果如下图:    image.png

        测试到此,同理想必也应该知道挖矿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()

        然后结果就是这样的:

image.png

      甚至读取到了shadow

      image.png

        当然最简单的方式是直接在Console里直接操作,步骤:Create a New Session -> chrome or firefox -> Load Script ->添入 file:///etc/passwd 然后OK -> 然后 Take a ScreenShot 你就能看到了。下面是测试的截图

image.png


        看到这里,是不是震惊了?赶紧回去问问你们的研发,你们的QA,有没有用到它,小心菊花不保!!


         4.4 远程挖矿

              近两年来很流行的浏览器挖矿

           从去年6月后吧,利用浏览器进行虚拟货币挖矿的事件越来越多来,网站代码中暗藏JS挖矿机脚本

            挖矿脚本上GitHub一搜索就能找到很多,Github搜索地址 这里就不做过多测试了,不玩这个!

      

5. 网络空间调查

     使用Shodan, Censys, Zoomeye, FOFA 等一些知名的网络搜索引擎进行关键字搜索,看看网络空间里有多少Selenium Server以及分布情况。

  

  •   Zoomeye

        搜索地址:搜索链接


        搜索结果如下图:

image.png

        搜索发现在Zoomeye引擎中记录,在整个网络空间中存在有大约有 1.5万左右的Selenium Server运行着。

  •        FOFA引擎

   搜索地址:搜索链接

        使用FOFA引擎,匿名用户 normal模式进行搜索,获得了1.3k左右的记录


搜索结果:

image.png

  •   Shodan引擎

     搜索地址:搜索链接

      在SHODAN引擎中关键字搜索,仅44条记录。


      搜索结果:

image.png

          SHODAN引擎主要采集基础组件端口信息,采集网页信息较少,所以用网页关键字:SeleniumHQ 搜索的结果较少,但是我们如果搜索Selenium Server 所使用的组件 Jetty,就会发现搜索结果比较多了,如下图所示。这些结果中一定存在一定数量的Selenium Server运行着的。

  搜索地址:搜索链接


搜索结果:

image.png



6. 进一步研究方向

   能想到的可行的研究方向:

  •    1. 网络空间的基于Selenium的自动化攻击监控

          从网络空间搜索引擎里采集Selenium Server服务端IP,实时采集并记录其远程浏览器的自动化行为。

  •   2. 主动探测网络空间里部署Selenium Server服务器分布

  使用探测工具主动探测存在于网络空间的Selenium Server分布情况,记录和观测这些探测得到的IP,这些IP都有自动化攻击,薅羊毛的潜在可能。