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

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

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

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

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

通過此列表,我們現在可以將搜索范圍縮小到特定區域,這對于錯誤查找和漏洞評估非常理想。

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

值得注意的是,如果你在末尾停止對grep的調用,那么你將看到一個更長的條目列表,其他條目的末尾為0。這些應用程序已經出現在FDA的列表中,但目前還沒有啟用。
獲取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廣告軟件常用的技巧,由于多種原因,它很有用。從攻擊者的角度來看,IOPlatformUUID是攻擊者跟蹤受感染的受害者的好方法,并且UUID可以作為URL的一部分從受害者的計算機發送到攻擊者的C2。從防御者的角度來看,監視對ioreg和system_profiler的調用是值得的,這些調用專門查找IOPlatformExpertDevice屬性或解析UUID。
請注意,ioreg同一屬性列表中的“board-id”鍵是惡意進程辨別它是運行在裸機上還是在研究人員的虛擬機上的幾種方法之一。
- ioreg -rd1 -c IOPlatformExpertDevice | grep board-id

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

批量將PNG圖像文件夾轉換為JPEG
技巧:
- mkdir jpegs; sips -s format jpeg *.* --out jpegs
介紹:
無論你是進行滲透測試、研究還是寫作,安全領域中的另一個常見任務是截屏。默認情況下,macOS屏幕捕獲實用程序將使用.png格式。但是,如果你將屏幕截圖上傳到網頁,通常首選JPEG格式,因為這些文件更輕巧,并且頁面加載速度更快。
盡管你可以更改screencapture的默認文件格式(請參見man screencapture),但我發現將默認值保留為.png很有用,因為它通常是許多其他任務的首選格式。幸運的是,這種單行代碼幾乎可以立即遍歷當前工作目錄中的所有圖像,創建一個名為“JPEGS”的新文件夾,并使用JPEG格式的所有PNG副本填充該文件夾。sips工具是一個鮮為人知的實用程序,具有許多有用的功能。Sips是Mac提供的一個處理圖片的命令行工具,與Photoshop這種重量級選手相比,自然功能上要差很多。不過話說回來如大小裁剪、圖片翻轉和旋轉這些日常小功能其實也不必非得動用Photoshop這樣專業級的工具。簡單學習一下像sips這樣的終端指令可以快速輔助你完成任務。可能那邊PS還沒完全打開,這邊圖片已經處理好了。

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