macOS的15個(gè)安全技巧(一)
自2004年以來(lái),我每天都在使用macOS,自從OSX Panther(2003年10月發(fā)布)以來(lái),我使用過(guò)該操作系統(tǒng)的每一個(gè)版本,而且自從Lion 10.7(2011年7月發(fā)布)以來(lái),我每年都會(huì)對(duì)macOS的每一個(gè)版本進(jìn)行beta測(cè)試。雖然這可能聽(tīng)起來(lái)很繁瑣,但我還是會(huì)在這個(gè)過(guò)程中學(xué)習(xí)蘋(píng)果桌面環(huán)境的所有知識(shí)。但在實(shí)踐過(guò)程中,蘋(píng)果的操作系統(tǒng)總能帶來(lái)一些新的驚喜。例如,有關(guān)選項(xiàng)鍵的技巧可能會(huì)被隱藏多年,而由于蘋(píng)果每年發(fā)布一次,誰(shuí)知道還有多少未被發(fā)現(xiàn)的技巧?
盡管如此,多年來(lái),我還是發(fā)現(xiàn)并經(jīng)常使用一些技巧,這些技巧在macOS的安全任務(wù)中非常有用,無(wú)論是編寫(xiě)代碼、搜索漏洞、記錄惡意軟件行為還是篩選受感染的設(shè)備。在這篇文章中,我想分享其中一些技巧,希望其他人可以使用它們。以下是我最常用的15個(gè)macOS安全技巧!
查找任何應(yīng)用程序的Bundle ID
技巧:
- lsappinfo list | grep
或
- grep -A1 -i bundleidentifier "$(mdfind -name .app | head -n 1)"/Contents/Info.plist
介紹:
App Bundle ID(Bundle IDentifier)是系統(tǒng)APP唯一bai識(shí)別du的ID。其用來(lái)捆綁識(shí)別用,表明應(yīng)用和其他App的區(qū)別。App Bundle ID一般zhi用于軟件開(kāi)發(fā)者在生成軟件時(shí)需要進(jìn)dao行捆綁的特殊字串,并且每一個(gè)APP僅有一個(gè)專(zhuān)有Bundle ID,其他軟件開(kāi)發(fā)不可使用。常規(guī)Bundle ID采用“com.
- com.apple.finder
Bundle ID在應(yīng)用程序Bundle的Info.plist文件中設(shè)置,并在Bundle寫(xiě)入磁盤(pán)后立即注冊(cè)到Launch Services數(shù)據(jù)庫(kù)中。這樣,如果你知道應(yīng)用程序的Bundle ID,那么就很容易找到它的位置,而不必像使用Finder或shell find命令那樣花費(fèi)不必要的處理器資源。
第一個(gè)示例使用lsappinfo從輸出中查詢(xún)所有正在運(yùn)行的應(yīng)用程序和grep,以獲得Bundle ID。該實(shí)用程序的列表信息非常豐富,不僅可以告訴你包的ID,還可以告訴你可執(zhí)行文件的路徑,當(dāng)前的PID和許多其他詳細(xì)信息。有關(guān)更多詳細(xì)信息,請(qǐng)參見(jiàn)官網(wǎng)。

但是,你可能希望找到當(dāng)前未運(yùn)行的應(yīng)用程序的bundle標(biāo)識(shí)符。為此,請(qǐng)使用利用mdfind實(shí)用程序的第二個(gè)版本。
請(qǐng)注意,mdfind只顯示用戶(hù)有權(quán)訪(fǎng)問(wèn)的文件的結(jié)果:這就是為什么你不會(huì)得到常規(guī)' find '命令中所有的權(quán)限錯(cuò)誤(除非你將stderr重定向到/dev/null)。但這沒(méi)關(guān)系,因?yàn)檎麄€(gè)Launch Services數(shù)據(jù)庫(kù)都是與用戶(hù)相關(guān)的:它只會(huì)返回用戶(hù)有權(quán)啟動(dòng)的應(yīng)用的結(jié)果。mdfind命令就是Spotlight功能的終端界面,這意味著如果Spotlight被禁用,mdfind命令也將無(wú)法工作。mdfind命令非常迅速、高效。
尋找缺乏硬化運(yùn)行時(shí)(Hardened Runtime)的應(yīng)用程序
技巧:
- for i in /Applications/*.app; do codesign -dv "${i}" &>> /tmp/codes; done; grep -B3 'none' /tmp/codes | grep ^Executable | sed 's/^Executable=/No\ Hardened\ Runtime:\ /g'; rm -rf /tmp/codes
介紹:
從macOS 10.15 Catalina開(kāi)始,默認(rèn)情況下,所有的應(yīng)用程序都必須經(jīng)過(guò)公證才能啟動(dòng),但是有一些免責(zé)條款意味著你的系統(tǒng)中可能有未經(jīng)公證的應(yīng)用程序。首先,用戶(hù)可以在本地完成對(duì)公證的要求,這并不需要管理員權(quán)限。這是一種常見(jiàn)的macOS惡意軟件技術(shù),可對(duì)用戶(hù)進(jìn)行社交工程設(shè)計(jì)以做到這一點(diǎn)。其次,蘋(píng)果在早期階段在公證要求上有些搖擺不定,在2020年2月之前在不那么嚴(yán)格的要求下進(jìn)行了公證并安裝的應(yīng)用程序,比如沒(méi)有硬化的運(yùn)行時(shí),即使在更嚴(yán)格的要求生效后,也可以在Catalina上正常運(yùn)行。
如果你安裝的Xcode工具的單行代碼短得多,則可以檢查應(yīng)用程序是否沒(méi)有公證“票證”:
- for i in /Applications/* ; do stapler validate "${i}"|grep -B 1 -v worked;done
但是,這有兩個(gè)問(wèn)題,除了需要Xcode命令行工具之外。
首先,無(wú)需憑票即可對(duì)應(yīng)用進(jìn)行公證;實(shí)際上,許多開(kāi)發(fā)人員將票證附加到DMG或安裝程序,而不是應(yīng)用程序本身,因此僅檢查票證不會(huì)產(chǎn)生準(zhǔn)確的結(jié)果。
其次,從安全性角度來(lái)看,公證的主要好處是,在最嚴(yán)格的規(guī)則下,它需要強(qiáng)化的運(yùn)行時(shí)標(biāo)志。沒(méi)有這種標(biāo)志的應(yīng)用程序可以被惡意進(jìn)程修改,因此,使用此技巧,我們實(shí)際上要在“應(yīng)用程序”文件夾中列出所有應(yīng)用程序。當(dāng)然,你可以并且應(yīng)該考慮將相同的技術(shù)應(yīng)用于包含應(yīng)用程序的其他文件夾,然后測(cè)試它們是否都缺少必需的標(biāo)志。單行代碼將代碼簽名的結(jié)果輸出到一個(gè)臨時(shí)文件,然后對(duì)文件中所有根本沒(méi)有標(biāo)志的條目進(jìn)行抓取,這表明沒(méi)有強(qiáng)化的運(yùn)行時(shí)。在輸出與搜索匹配的可執(zhí)行文件列表之后,單行代碼還會(huì)清除此臨時(shí)文件。

查找連接到局域網(wǎng)的設(shè)備
技巧:
- while true; do clear; arp -alnx; c=$(arp -alnx | wc -l); let n=$c-1; printf '\tCount: \t'$n'\n'; sleep 2; done;
介紹:
這個(gè)單行程序利用arp實(shí)用程序會(huì)打印出連接到LAN的設(shè)備的信息,包括本地IP地址、MAC地址(又稱(chēng)鏈路層地址)和失效時(shí)間等。該命令使用2秒鐘延遲的無(wú)限while循環(huán),以便它不斷更新,直到你使用鍵盤(pán)命令Ctl-C中斷它為止
如果你還保留網(wǎng)絡(luò)上允許的MAC地址的清單,這可能是一種非常容易的方法,可以手動(dòng)發(fā)現(xiàn)家庭,實(shí)驗(yàn)室或其他小型網(wǎng)絡(luò)中出現(xiàn)的惡意設(shè)備。對(duì)于自動(dòng)化企業(yè)解決方案,請(qǐng)使用SentinelOne的Ranger之類(lèi)的工具。

對(duì)文件進(jìn)行inflate處理,改變它的哈希
技巧:
- for i in {1..3000000}; do echo '0' >> ; done
介紹:
當(dāng)測(cè)試已知的惡意軟件時(shí),在某些情況下,你可能需要改變文件的大小或哈希,以擊敗安全檢測(cè)規(guī)則。這個(gè)技巧在我們最近的一篇關(guān)于如何在Catalina上繞過(guò)XProtect的文章中介紹過(guò),但這肯定不是你想使用它的唯一原因。任何文件大小檢查以及針對(duì)文件哈希的信譽(yù)檢查都可以通過(guò)這種方式進(jìn)行。在后一種情況下,不需要將文件擴(kuò)展到一個(gè)字節(jié)以上,因此將條件中的第二個(gè)數(shù)字從3000000調(diào)整為2,并將其調(diào)整為比你試圖打破的規(guī)則中提到的大小稍微大一點(diǎn)的數(shù)字。

查找所有日志子系統(tǒng)的名稱(chēng)
技巧:
- ls -al /System/Library/Preferences/Logging/Subsystems | awk '{print $9}' | sed 's/.plist//g'
介紹:
蘋(píng)果的內(nèi)置日志工具允許你訪(fǎng)問(wèn)os_log、os_trace和其他日志系統(tǒng)創(chuàng)建的系統(tǒng)范圍日志消息。一旦你掌握了如何使用它,通用日志系統(tǒng)就是一個(gè)強(qiáng)大的實(shí)用工具。不過(guò),這需要清除幾個(gè)障礙。一個(gè)是習(xí)慣使用基于謂詞的過(guò)濾。另一個(gè)是知道哪些子系統(tǒng)可供查詢(xún)。
在這個(gè)技巧中,我們從系統(tǒng)中提取所有可用的子系統(tǒng),并將它們打印到stdout。

通過(guò)此列表,我們現(xiàn)在可以將搜索范圍縮小到特定區(qū)域,這對(duì)于錯(cuò)誤查找和漏洞評(píng)估非常理想。

查找具有完全磁盤(pán)訪(fǎng)問(wèn)權(quán)限的應(yīng)用程序
技巧:
- sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "SELECT client,allowed FROM access WHERE service == 'kTCCServiceSystemPolicyAllFiles'" | grep '1'$
介紹:
全磁盤(pán)訪(fǎng)問(wèn)(FDA)是macOS Mojave中引入的一種用戶(hù)保護(hù)機(jī)制,并在macOS Catalina中得到了顯著擴(kuò)展。它是否真的能有效地提供現(xiàn)實(shí)世界的保護(hù)還有待商榷,但毋庸置疑的是,對(duì)于開(kāi)發(fā)人員和高級(jí)用戶(hù)來(lái)說(shuō),這常常是令人沮喪的原因,因?yàn)樵S多常見(jiàn)的應(yīng)用程序和腳本功能將無(wú)法工作,除非執(zhí)行過(guò)程獲得FDA的許可。
這個(gè)技巧允許你快速確定給定設(shè)備上的哪些應(yīng)用程序被授予了該權(quán)限。在大多數(shù)情況下,輸出應(yīng)該與你在系統(tǒng)首選項(xiàng)“安全和隱私”窗格中看到的一致(參見(jiàn)“隱私”選項(xiàng)卡下的“全磁盤(pán)訪(fǎng)問(wèn)”)。但是,如果你的設(shè)備是由MDM解決方案管理的,那么系統(tǒng)首選項(xiàng)不會(huì)顯示實(shí)際具有完整磁盤(pán)訪(fǎng)問(wèn)權(quán)限的所有項(xiàng),因此在這種情況下,這個(gè)技巧也很有用。注意sudo命令的使用:你需要管理員權(quán)限才能讀取TCC SQLITE3數(shù)據(jù)庫(kù)。

值得注意的是,如果你在末尾停止對(duì)grep的調(diào)用,那么你將看到一個(gè)更長(zhǎng)的條目列表,其他條目的末尾為0。這些應(yīng)用程序已經(jīng)出現(xiàn)在FDA的列表中,但目前還沒(méi)有啟用。
獲取Mac的UUID, Board-ID
技巧:
- ioreg -rd1 -c IOPlatformExpertDevice | grep UUID | awk '{print $NF}' | sed 's/\"//g'
或
- /usr/sbin/system_profiler SPHardwareDataType | grep UUID | awk '{print $NF}'
介紹:
這是macOS廣告軟件常用的技巧,由于多種原因,它很有用。從攻擊者的角度來(lái)看,IOPlatformUUID是攻擊者跟蹤受感染的受害者的好方法,并且UUID可以作為URL的一部分從受害者的計(jì)算機(jī)發(fā)送到攻擊者的C2。從防御者的角度來(lái)看,監(jiān)視對(duì)ioreg和system_profiler的調(diào)用是值得的,這些調(diào)用專(zhuān)門(mén)查找IOPlatformExpertDevice屬性或解析UUID。
請(qǐng)注意,ioreg同一屬性列表中的“board-id”鍵是惡意進(jìn)程辨別它是運(yùn)行在裸機(jī)上還是在研究人員的虛擬機(jī)上的幾種方法之一。
- ioreg -rd1 -c IOPlatformExpertDevice | grep board-id

類(lèi)似地,從system_profiler獲得完整的硬件概述提供了大量有用的環(huán)境信息(使用與上面相同的命令,但是刪除對(duì)grep的調(diào)用和之后的所有內(nèi)容)。
system_profiler命令實(shí)際上是系統(tǒng)信息的命令行版本,位于應(yīng)用程序文件夾內(nèi)的工具子文件夾中的應(yīng)用程序。使用system_profiler -listDataTypes查看可以查詢(xún)的所有不同部分,本文將為你提供有關(guān)該實(shí)用程序的其他有用信息。
將十六進(jìn)制字符串轉(zhuǎn)換為ASCII(然后再轉(zhuǎn)換)
技巧:
- echo '' | xxd -r -p
或
- echo 'hello world' | xxd -p
或
- echo 'hello world' | od -t c -t x1
或
- python -c "print bytearray.fromhex('')"
介紹:
如果你注意設(shè)備的安全性,那么就幾乎不可避免地會(huì)經(jīng)常遇到在十六進(jìn)制編碼的字符串和ASCII字符之間進(jìn)行轉(zhuǎn)換的情況。如上面的代碼所示,實(shí)際上有很多方法可以實(shí)現(xiàn),具體取決于你的偏好。就我個(gè)人而言,我更喜歡使用xxd,因?yàn)樗俣瓤?,易于記憶且輸入?jiǎn)短。確保使用-p開(kāi)關(guān)來(lái)獲得漂亮的連續(xù)打印字符串。通過(guò)-r開(kāi)關(guān),可以將十六進(jìn)制轉(zhuǎn)換回ASCII碼。
od實(shí)用程序提供的輸出略有不同,以ASCII和十六進(jìn)制并行顯示每個(gè)字節(jié),這在你要直觀(guān)地將每個(gè)字節(jié)與其ASCII表示形式進(jìn)行比較的情況下很有用。

批量將PNG圖像文件夾轉(zhuǎn)換為JPEG
技巧:
- mkdir jpegs; sips -s format jpeg *.* --out jpegs
介紹:
無(wú)論你是進(jìn)行滲透測(cè)試、研究還是寫(xiě)作,安全領(lǐng)域中的另一個(gè)常見(jiàn)任務(wù)是截屏。默認(rèn)情況下,macOS屏幕捕獲實(shí)用程序?qū)⑹褂?png格式。但是,如果你將屏幕截圖上傳到網(wǎng)頁(yè),通常首選JPEG格式,因?yàn)檫@些文件更輕巧,并且頁(yè)面加載速度更快。
盡管你可以更改screencapture的默認(rèn)文件格式(請(qǐng)參見(jiàn)man screencapture),但我發(fā)現(xiàn)將默認(rèn)值保留為.png很有用,因?yàn)樗ǔJ窃S多其他任務(wù)的首選格式。幸運(yùn)的是,這種單行代碼幾乎可以立即遍歷當(dāng)前工作目錄中的所有圖像,創(chuàng)建一個(gè)名為“JPEGS”的新文件夾,并使用JPEG格式的所有PNG副本填充該文件夾。sips工具是一個(gè)鮮為人知的實(shí)用程序,具有許多有用的功能。Sips是Mac提供的一個(gè)處理圖片的命令行工具,與Photoshop這種重量級(jí)選手相比,自然功能上要差很多。不過(guò)話(huà)說(shuō)回來(lái)如大小裁剪、圖片翻轉(zhuǎn)和旋轉(zhuǎn)這些日常小功能其實(shí)也不必非得動(dòng)用Photoshop這樣專(zhuān)業(yè)級(jí)的工具。簡(jiǎn)單學(xué)習(xí)一下像sips這樣的終端指令可以快速輔助你完成任務(wù)??赡苣沁匬S還沒(méi)完全打開(kāi),這邊圖片已經(jīng)處理好了。

本文翻譯自:https://www.sentinelone.com/blog/15-macos-power-tricks-for-security-pros/