谈谈Selenium Server的安全问题 - 未完
0x01 开篇
不知道大家在平日工作中有没有遇到过一些端口,使用浏览器打开是下面这样子的:
上图中我找了几个在不同端口下的例子。
0x02 Selenium-开源的自动化测试利器
本篇主要的主角-Selenium究竟是什么呢?有过QA经验或安全自动化测试经验的朋友应该知道,以下文字来自百度百科:Selenium是一个用于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/
我是怎么知道的?
- 点开console,自动跳转知道的。
- 百度selenium remote 知道的
- 查看源码发现是默认的- 源码
通过阅读源码能发现默认的端口为4444,如下图所示:
下面是一个Python写的远程调用的Demo:
0x03 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接口以供我们使用来完成我们对远程浏览器对控制操作,下面看看我们就一起研究下能怎么玩?
0x04 构想和实施你的玩法
问题:
在敌人后方,你拿到了一个完全可控的浏览器后,你能做些什么?
针对这种,下面是暂时想到的玩法。
实施对敌方远程浏览器自动化作业的监控(偷视)
利用上面学习的知识,我们通过接口:
http://127.0.0.1:4444/wd/hub/sessions
发现存在着有效的Session正在作业如图:
那么我们可以通过自己编写脚本,调用API接口,实时获取该浏览器的信息。如:
比如下面展示的,某一个浏览器正在进行重置密码的-自动化操作,我们可以通过API接口实时拿到该浏览器当前的URL地址。(很关键拿到这个URL就可以为所欲为了。。。)
当然这个返回的是页面截图的Base64,转化一下如下:
如果只是简单的URL监控,思路利用BurpSuite就可以实现,这里我实验了一下,如图:
利用这类思路,我们可以自己编写脚本利用其提供的API接口,对网络空间里的这类Selenium Server的行为进行24h的实时监控、记录其xx行为。
以此为跳板,对内网实施攻击
利用Selenium Server对特点,创建或者可控一个正在作业的远程浏览器,向内网发起攻击。
说到利用跳板发起内网攻击,可能最开始想到的是被大家玩出花的SSRF了。相比一般的SSRF漏洞,这里我们手里拿到的攻击筹码是远超过一般的SSRF漏洞的。敌方后防一个完全可控的浏览器,能够下发任意的JS代码,控制浏览器访问任意的URL这简直不能再爽!--- 还在实践ing
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,有没有用到它,小心菊花不保!!
远程挖矿
近两年来很流行的浏览器挖矿,从去年6月后吧,利用浏览器进行虚拟货币挖矿的事件越来越多来,网站代码中暗藏JS挖矿机脚本
挖矿脚本上GitHub一搜索就能找到很多,Github搜索地址 这里就不做过多测试了,不玩这个!
0x05 网络空间调查
使用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运行着的。
搜索地址:搜索链接
搜索结果:
0x06 进一步研究方向
能想到的可行的研究方向:
- 网络空间的基于Selenium的自动化攻击监控
从网络空间搜索引擎里采集Selenium Server服务端IP,实时采集并记录其远程浏览器的自动化行为。
- 主动探测网络空间里部署Selenium Server服务器分布
使用探测工具主动探测存在于网络空间的Selenium Server分布情况,记录和观测这些探测得到的IP,这些IP都有自动化攻击,薅羊毛的潜在可能。