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

滥用MacOS授权执行代码

原创
作者头像
franket
发布2020-09-03 12:55:50
2.6K0
发布2020-09-03 12:55:50
举报
文章被收录于专栏:技术杂记技术杂记

最近,我通过H1向Microsoft和Microsoft通过MSRC向Dropbox和PortSwigger公开了一些漏洞,这些漏洞与MacOS上的应用程序权利有关。我们将探索什么是权利,您将如何使用它们,以及如何将其用于绕过安全产品。

这些都尚未发布。

什么是权利?

在MacOS上,权利是一个字符串,它授予应用程序特定的权限来执行特定的任务,这些任务可能会影响系统的完整性或用户隐私。可以使用命令查看授权codesign -d --entitlements - $file

对于上面的图像,我们可以看到关键权利,com.apple.security.cs.allow-unsigned-executable-memory并且com.apple.security.cs.disable-library-validation-他们完全允许他们在罐子上说什么。我们将首先探讨Dropbox,因为这是两者中要利用的更多内容。

投寄箱

就像Windows具有PE和Linux具有ELF一样,MacOS也具有自己的可执行格式Mach-O(Mach-Object的缩写)。从iOS到tvOS到MacOS,所有Apple产品都使用Mach-O文件。实际上,所有这些操作系统都具有NeXTStep的共同遗产,尽管这不在本文讨论范围之内。

MacOS具有各种安全保护措施,包括Gatekeeper,AMFI(AppleMobileFileIntegrity),SIP(系统完整性保护,一种强制访问控制形式),代码签名等。Gatekeeper与Windows SmartScreen相似,它可以对文件进行指纹识别,检查将它们与Apple服务器上的列表相对应,并返回值以确定文件是否可以安全运行。`

这大大简化了。

共有三个可配置选项,尽管默认情况下第三个是隐藏的-仅App Store,App Store和已确定的开发人员,以及“随处可见”,第三个大概是隐藏的,以最大程度地减少意外损害。也可以通过命令行工具来管理Gatekeeper spctl(8),以更精细地控制系统。甚至可以通过完全禁用Gatekeeper spctl --master-disable,但这需要超级用户访问权限。要注意的是,这不会使系统策略数据库(/var/db/SystemPolicy)中已有的规则失效,但是无论公证等如何,都允许数据库中未存在的任何内容不受阻碍地运行。

现在,回到Dropbox。Dropbox使用强化的运行时进行编译,这意味着没有特定的权限,就无法执行JIT代码,自动忽略DYLD环境变量,并且不加载未签名的库(通常会导致二进制文件的SIGKILL。)我们可以看到Dropbox允许未签名的可执行内存,允许注入shellcode,并禁用了库验证-意味着可以将任何库插入到进程中。但是如何?

使用LIEF,我们可以轻松地向Dropbox添加新的LoadCommand。在下面的图片中,您可以看到我的工具yololibCoronzon基于yololib进行了相同的操作。

代码语言:javascript
复制
import lief

file = lief.parse('Dropbox')
file.add_library('inject.dylib')
file.write('Dropbox')

使用类似于以下内容的代码,您可以在Dropbox进程的上下文中执行代码(尽管可以通过使代码签名无效-最好剥离代码签名,否则它将无法从/运行Applications/)。您必须删除代码签名或对其进行临时签名,以使其从运行/Applications/,尽管该应用程序将失去之前授予的任何权利和TCC权利。您必须使用一种称为dylib proxying- 的技术,也就是说,用与重新导出要替换的库相同的名称之一替换应用程序捆绑包中的库。(使用链接时标志`-Xlinker -reexport_library $(PATH_TO_LIBRARY))。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <syslog.h>

__attribute__((constructor))
static void customConstructor(int argc, const char **argv)
 {
     printf("Hello from dylib!\n");
     syslog(LOG_ERR, "Dylib injection successful in %s\n", argv[0]);
     system("open -a Calculator");
}

这是一个简单的示例,但与类似frida-gum的影响结合起来会变得更加严重-允许应用程序自省和运行时修改而无需用户的知识。由于将Dropbox添加为LaunchItem ,因此可以实现持久的用户模式植入。

视觉工作室

微软发布了其首要的MacOS IDE的简化版本,主要用于Xamarin,.NET Core和Mono的C#开发。尽管是“缩减版”,但它仍支持原始版本的许多功能,包括NuGet,IntelliSense等。

它还具有一些有趣的权利。

当然,MacOS用户在Microsoft生态系统中被视为二等公民,Microsoft无法对这对最终用户的影响一概而论-尽管影响更为严重,但与上述影响相似。我们可以看到,基本上禁用了强化运行时的每个功能-通过DYLD_INSERT_LIBRARIES环境变量启用最简单的代码注入方法。以下视频演示了如何在Visual Studio上下文中轻松执行代码。

请记住:在此上下文中执行的代码将继承父级的权利和TCC值。不难想象,Microsoft试图“强化” Visual Studio for Mac可能导致IP(知识产权)被盗的情况。与Dropbox一样,所有安全隐患都是相同的,但是由于允许使用DYLD环境变量,因此容易实现大约30倍的提取。

我相信大多数阅读本文的人都对Burp Suite熟悉。如果不是这样的话,这是一种可利用网络进行侦查的瑞士军刀,可帮助进行侦察,侦破和侦破。那我们为什么不利用呢?

这次,我们将利用Burp Suite安装程序。您可能现在已经猜到了,它具有一些有趣的权利。

除了缺少换行符的输出外,这种情况下的利用也不同。安装中没有外壳程序脚本(也没有允许存在DYLD环境变量的权利),并且,如果我们要创建一个恶意安装程序,则需要使用已打包的程序。因此,我们将篡改安装程序随附的JRE(jre.tar.gz)。

实际上,有两种解决方法-完全替换dylib或劫持dylib。Dylib劫持与其在Windows上的合作伙伴DLL劫持相似,在于它滥用可执行文件来搜索可能存在或可能不存在的库,通常由@rpath“弱引用” 指定或有时由“弱引用” 指定。弱引用是不需要加载但可以加载的库。有关dylib劫持的详细信息,我建议这个客观见的帕特里克·沃德尔精彩介绍。为简便起见,我们将在JRE中替换.dylib。

安装程序的执行方式是在安装过程中将JRE提取到一个临时位置,该位置将用于其余的安装。这个临时位置是随机的,实际上给我们的攻击增加了一层混乱,因为没有两个执行将JRE提取到同一位置。扩展JRE后,将加载它并尝试安装Burp Suite。这使我们能够在Burp Suite的幌子和环境下执行未签名的代码,在用户不了解的后台运行代码。值得庆幸的是,Burp Suite不需要(当前)需要提升的特权才能在macOS上安装。但是,由于容易伪造恶意安装程序以及Gatekeeper并非明智之举,因此这是一个问题。

可以在下面查看概念证明。

结论

权利既是MacOS安全模型的重要组成部分,又可以是一把双刃剑。您已经了解了如何通过利用弱小的应用程序作为蹦床来绕过Gatekeeper和现有的操作系​​统保护,由于Dropbox的TCC权限是继承的,并且是LaunchItem,因此我认为这种情况下影响最大的就是Dropbox。从而获得持久性。因此,对于任何红军或赏金猎人而言,权利为MacOS的攻击面提供了宝贵的补充。但是,您的里程可能会有所不同-Dropbox和Microsoft似乎并不在乎。(另一方面,PortSwigger承认,由于Burp Suite的设计和固有的语言内在特性,要防止此类攻击非常困难,而且我不会指责它们)。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是权利?
  • 投寄箱
  • 视觉工作室
  • 结论
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档