暴力破解 iOS 備忘錄的密碼
Secure Notes

專案探討

2022-10-28 by 高田鑑識

備忘錄的安全功能

Apple 裝置的備忘錄 APP 提供「安全備忘錄 – Secure Notes」密碼保護功能,在 iPhone、iPad、Mac 和 iCloud 網站上,都可讓使用者額外採用密碼保護特定備忘錄的內容。使用者也可以安全地與其他人共享備忘錄。

安全備忘錄

安全備忘錄是以使用者提供的密碼進行端對端 (end-to-end) 加密,在 iOS、iPadOS、macOS 裝置和 iCloud 網站上檢視【安全】備忘錄時需該密碼才可開啟備忘錄內容。每個 iCloud 帳號(包含「在我的」裝置帳號)都能使用獨立的密碼。

當使用者加密備忘錄時,會從使用者的密碼採 PBKDF2 和 SHA256 演算法衍生 16 位元組密鑰。備忘錄內的文章與所有的附件都使用 AES 搭配 Galois/計數器模式(AES-GCM)進行加密。新的安全備忘錄會在「Core Data」和 CloudKit 中製作,以儲存加密的備忘錄、附件、標籤和初始化向量。當安全備忘錄產生後,便會刪除原始未加密的備忘錄。支援加密的附件包含圖片、塗鴉 (sketch)、表格 (table)、地圖和網站。若備忘錄內有他非支援的附件類型則無法加密,不支援的附件無法加入安全備忘錄內。

若要檢視安全備忘錄,使用者必須輸入其密碼,或是使用 Face ID 或 Touch ID 來認證。使用者成功通過認證後,無論要檢視或製作安全備忘錄,「備忘錄」都會打開安全作業階段 (Secure Session)。安全作業階段打開時,使用者可以檢視或保護其他備忘錄,不需要進行其他認證。但是安全作業階段僅適用於受到所提供密碼保護的備忘錄。備忘錄若受到其他密碼的保護,使用者仍需認證。安全作業階段會在以下情況關閉:

  • 使用者點一下「備忘錄」中的「立即鎖定」按鈕時
  • 「備忘錄」切換至背景超過 3 分鐘(macOS 為 8 分鐘)時
  • iOS 或 iPadOS 裝置鎖定時

若要更改安全備忘錄的密碼,使用者必須輸入目前的密碼 (無法使用 Face ID 或 Touch ID 來變更備忘錄密碼)。設定新的密碼後,「備忘錄」App 會重新將所有現有的備忘錄(以先前的密碼加密的備忘錄)封裝到同一個帳號中。

如果使用者連續打錯密碼三次,「備忘錄」就會顯示使用者提供的密碼提示(若使用者在設定時有輸入)。若使用者仍無法想起密碼,可以在「備忘錄」的設定中重設。此功能可讓使用者以新的密碼製作新的安全備忘錄,但不允許他們查看先前保護的備忘錄。採用舊的密碼保護的備忘錄必須想起舊的密碼時才可檢視。重置密碼需要使用者的 iCloud 帳號密碼才可執行。

共享的備忘錄

沒有使用密碼進行端對端加密的備忘錄可以與其他人分享。在共享的備忘錄中,備忘錄中的任何文字或附件均自動採 CloudKit 進行資料加密。所有的資料一律使用 CKRecord 中加密的密鑰進行加密。建立和修改日期等 metadata 資料則不會加密。

安全備忘錄加密重點

  • notes 的加密方式: 自訂密碼 (一個密碼加密所有 notes)
  • 可透過 Touch ID / FACE ID 打開,但 Reset 時需原始安全備忘錄的密碼
  • Secure Notes 的前 123 characters 不加密: 包含標題與內文
  • 如何確認是否有密碼保護,可檢查 NoteStore.sqlite 資料庫的 ZICCLOUDSYNCINGOBJECT 表以下欄位
    • ZCRYPTOITERATIONCOUNT
    • ZISPASSWORDPROTECTED
  • 如何確認 Notes 是透過分享取得?
    • ZSERVERSHAREDATA

前置作業

進行暴力破解前請先下載並安裝以下程式或檔案

Strawberry Perl:Perl 程式語言工具。

iOS_notes.pl:計算 Secure Notes hash 的 Scripts。

Hastcat:密碼暴力破解工具。

NoteStore.sqlite:測試用的備忘錄 SQLite 資料庫檔案,可透過 iTunes 備份取得。

測試用字典檔案

破解流程說明

1. 使用 iOS_notes.pl 取得 hash

從測試用的 StoreNote.sqlite 資料庫檔案可看到,有三筆備忘錄已使用安全備忘錄機制保護。

圖一、備忘錄畫面

執行 iOS_notes.pl Perl script 並取得 NoteStore.sqlite hash。須注意若備忘錄內有多筆安全備忘錄,則會有多筆 hash 值,可取任一 hash 值作為後續 hashcat 暴力破解使用。

指令一、hash 資料

可使用以下指令僅輸出第一行 hash 值進行存檔,或單純從 dos 環境下複製貼上到 hash.txt 檔案內。

複製

指令二、輸出第一行 hash 值至檔案

2. 準備暴力破解用的字典檔案

請將 hast.txt 檔案,與測試用的字典檔案 example.dict 一起複製至 hastcat 的資料夾。

並從 Hashcat 的網站上,可查出藉由 iOS_notes.pl 提取出的 hash 值: $ASN$*19*20000*019e… 對應的破解模式代號為 16200

3. 執行 hashcat

請在 DOS 模式下輸入以下指令。因為示範使用,指令的攻擊模式採用字典檔案 (-a 0),這代表著字典檔案內必須要有符合的密碼,才可破解成功。

複製

指令三、執行 hashcat 暴力破解

複製

指令四、執行結果

從執行結果第六行狀態得知本次暴力破解成功 (Cracked),密碼為第三行最後一個冒號後面的字元。

進階 hashcat 攻擊說明

若要使用進階的攻擊方式,除提供基本的字典檔案外,還可配合用「規則攻擊模式 – Rule-based Attack」,讓 hashcat 依字典檔的內容額外自動產生不同的密碼增加暴力破解的成功率。