はじめに
人気のある市販のモバイル・フォレンジック・ツールでテスト・デバイスを分析していたとき、私は興味深いものに出くわした。ツールはノートの概要(「ランス」と表示)を表示したが、実際の内容は消えていた。鍵の下に何が隠されているのか手がかりはなく、私には燃えるような疑問が残った。iOS 16のApple Notesを解読するワークフローが必要だった。
デバイスが動作していた iOS 16.7.10そして、NoteStore.sqliteデータベースを掘り下げた後、暗号化の手がかりがすべてそこにあり、解読されるのを待っていることに気づいた。オープンソースのツールの助けを借りて、パスワードを回復し、ノートの内容を解読することに取り掛かった。
この投稿では、以下のことを説明する。 完全なフォレンジックワークフロー どのように iOS 16でApple Notesを復号化する:
- 🔓 ハッシュキャット パスワードクラック用
- 🗄️ SQLite用DBブラウザ 暗号化パラメータの探索と抽出
- 🐍 Pythonスクリプト 鍵の導出とAES鍵のアンラッピングに使用する
- 🔍 サイバーシェフ 最終的なprotobufペイロードを復号、解凍、解析する。
⚠️ 重要な注意事項 このワークフローは、Apple Notesにロックされている場合にのみ適用されます。 iOS 16.x.iOS 17から、アップルは暗号化されたメモの保存方法を変更した。
ロックされたアップル・ノートに隠されたメッセージを明らかにしよう。
NoteStore.sqliteを掘り下げる
この時点で、暗号化されたノートの内容がNoteStore.sqlite、特にZICNOTEDATAテーブルに保存されていることがわかった。アップルはしばしば ジージップス しかし、ロックされたノートの場合、そのBLOB全体はまず 暗号化-つまり、直接解凍を試みても、読めるテキストは得られないということだ。そのため 右の復号キー 解凍やprotobufの解析が行われる前に。
スクリーンショットでは、ZDATAの生の16進数値を見ることができる。このデータは AES暗号化塩分や反復回数のような重要なメタデータは、データベースの他の部分に保存される。データベースから 科学捜査官の の観点からは、ノートが完全に暗号化されていることを認識することが、ZICCLOUDSYNCINGOBJECTテーブルをより深く掘り下げ、以下のことを行うために必要なパラメータを探す合図となります。 クラック パスコードと アンロック ノート🔓。
なぜiOS 16ではロックされたApple Notesが暗号化されるのか?
Apple Notesは、ロックされたメモを以下の組み合わせで保護します。 PBKDF2 (鍵の導出)と AES (暗号化)。ノートのパスワードが有効になっている場合、Appleは重要な暗号化メタデータをデータベースに保存します:
- zcryptoiterationcount
- ZCRYPTOSALT
- zcryptowrappedkey
これらの値は、正しいパスコードを持つ人だけがノートの内容を解読できることを保証する。
法医学的アプローチ
科学捜査の観点からは、通常、以下のような手順を踏む:
- 特定する ZICNOTEDATAおよびZICCLOUDSYNCINGOBJECTの関連するロックされたノート・エントリ。
- 抜粋 暗号の詳細、例えば反復回数、ソルト、ラップキーなど。
- クラック ユーザーのパスワードを ハッシュキャット (またはJohn the RipperやPasswareのようなパスワード回復ツール)。
- 導き出す の最後のキーである。 パイソンまたはサイバーシェフ そして デクリプト ノートのBLOB。
- 減圧 アンロックされたプロトブ サイバーシェフまたはPython)を使って最終的な平文を明らかにする。
ロックされたアップル・ノートのパスワードをHashcatで解読する
私の目標は、現実的なフォレンジック・シナリオをシミュレートすることだった。ロックされたアップル・ノートを持っていて、コンテンツを復号化するためにパスコードを回復する必要があった。そこで ハッシュキャット が登場する。Apple Secure Notesのハッシュ・モード(ID 16200)、Hashcatは正しいパスワードを見つけるまで、システマティックにパスワードを試行する。
必要な列の抽出
私はまず NoteStore.sqlite DBブラウザでZICCLOUDSYNCINGOBJECTテーブルのZISPASSWORDPROTECTED = 1の行をターゲットにしました。そして、以下のカラムを照会しました:
- Z_PK - ノート固有の識別子。
- ZCRYPTOSALT - PBKDF2の塩の値。
- ZCRYPTOWRAPPEDKEY - 後でラップが解除されるラップされたキー。
Hashcat入力ファイルは、小さなPythonスクリプトによって生成された。 notes_to_hashcat.pyこれは、これらの値をHashcatが解析できる1行にフォーマットしたもので、反復回数(ZCRYPTOITERATIONCOUNTより)も含まれている。
ロックされたApple Noteのパスワードを解読するためにHashcatを実行する
Hashcat入力ファイルと辞書を用意して、次のコマンドを実行した:
hashcat -m 16200 -a 0 <C:▶path_to_wordlist.txt
ここだよ:
- -m 16200はApple Secure Notesモードを指定する。
- -a 0はHashcatをストレート(辞書)攻撃モードにする。
- 辞書は次のようなものになる。 rockyou.txt またはデバイスのアーティファクトに由来するカスタムリスト。
Hashcatは正しいパスワードの特定に成功した:royalewithcheese。実際の調査では、辞書はもっと大きなものになるかもしれないが、この結果によって、ハッシュキャットが重い仕事を処理できることが確認された。
Apple Notes を復号するための暗号化キー(KEK)の導出
パスワードが手に入ったので、次のステップは 暗号化キー(KEK)これは、ノートのコンテンツを暗号化する最終的なAESキーをラップするために使用されます。KEKを導き出すには、ZICCLOUDSYNCINGOBJECTテーブルから以下の値が必要だった:
- パスフレーズ (クラックされたパスワード)
- 反復回数 (zcryptoiterationcount)。
- 塩 (ズクリプトサルト)
例えば、DBブラウザーを使ってクエリーを実行した:
SELECT ZCRYPTOITERATIONCOUNT, ZCRYPTOSALT FROM ZICCLOUDSYNCINGOBJECT WHERE Z_PK = ;
次に、私のお気に入りのツールであるCyberChef(🛠️)を開き、「PBKDF2キーの導出」操作をドラッグした。ハッシュ関数を SHA-256 パスワード、ソルト、反復回数を入力すると、CyberChefは次のように表示した。 16バイトKEK:
このプロセスを自動化するために、私は以下のPythonスクリプトを作成した。 get_key.pyこれはデータベースパス、ノートPK、パスワードを引数として受け取ります。実行するとKEKが16進数で返されます。
python get_kek.py NoteStore.sqlite
結果
注PK=16: KEK (hex) = a1dac1516302e1d3d73ad4fd4b6f8fef
iOS 16でロックされたApple Notesを復号化するAESキーの開封
次のステップは 鍵を開ける ノートの内容を暗号化するために使用されます。ラップされたキーはZICCLOUDSYNCINGOBJECTのZCRYPTOWRAPPEDKEY列に格納される。例えば
select zcryptowrappedkey from ziccloudsyncingobject where z_pk = 16;
包装解除オプション
オプション1:CyberChefでiOS 16のロックされたApple Notesを復号化するためのAESキーを解除する
以前の操作を無効にして、"AES Key Unwrap "を検索し、レシピ・ウィンドウにドラッグした。KEKとラップされたキーを貼り付けると、CyberChefはアンラップされたAESキーを出力した。
オプション2:unwrap.pyを使ったAES鍵のアンラップの自動化
というPythonスクリプトも開発した。 unwrap.py このスクリプトはデータベースパスとKEK(16進数)を引数に取る。このスクリプトを実行すると、キーがアンラップされ、16進数で表示される。私の場合、アンラップされたキーは以下の通りだった:
python unwrap.py NoteStore.sqlite
これは、ロックされたアップル・ノートのコンテンツを復号化するために使用される最終的なAESキーである。
iOS 16でAES-GCMを使用してApple Notes BLOBを復号化する
暗号化されていないキーを手に入れたので、今度は ZICNOTEDATA テーブルアップルは GCMモードのAES ロックされたノートの内容を保護するために、4つの重要なコンポーネントが必要だった:
🔑 解かれたAESキー
🔁 初期化ベクトル(IV) より
zcryptoinitializationvector🏷 GCM認証タグ より
ZCRYPTOTAG💾 暗号化されたBLOB より
ZDATA
📤 NoteStore.sqliteからのIVタグとGCMタグの抽出
を見つける。 点滴 そして GCMタグを開いた。 ZICNOTEDATA テーブルにバイナリ値として格納されます。これらのフィールドはバイナリ値として保存され ZICNOTEDATA または ziccloudsyncingobject テーブルに格納される。どちらも同じカラム名でデータを格納する。
点滴:
5c0c0bde9b6801747ddad1115a422d05GCMタグ:
b9087ba19e3c7deff2cb4b9b51e6aafa
暗号化されたBLOB自体も ZDATA 列。私は3つの値をすべて16進数でコピーし、最後の復号ステップに備えた。
🧪 サイバーシェフでノートを解読する
すべてを手にして、私はこう言った。 サイバーシェフ.このツールを使えば、すべてのパラメーターを組み合わせて、オリジナルのコンテンツを簡単に明らかにすることができた。私がやったことはこうだ:
を追加した。 「AES復号化 オペレーションを行う。
を貼り付けた。 アンラップドAESキー をキー・フィールドに入力する。
をセットした。 モードをGCMに.
を挿入した。 IVとGCMタグ それぞれの分野で。
最後に 暗号化BLOB を入力ウィンドウに入力する。
ファイナルノート(Apple Notesから復号化されたProtobuf)の解凍と解析
AESで暗号化されたBLOBを復号化した後、出力を以下のファイルに保存した。 decrypted_blob.bin をHxDで開いた。ファイルの署名 0x1F8B08 GZIPで圧縮されたファイルであることを確認した-アップルはprotobufデータを圧縮するためにこれを使用する。
平文を抽出するために、私はCyberChefを再び開き、以下のコマンドを追加した。 ガンジップ オペレーションをワークフローに追加した。すぐに、見慣れた文字列が出力に現れ始めた。
解凍した後、次のようにした。 プロトブフ・デコード をCyberChefに追加した。その結果、ロックされたアップル・ノートの内容を表すキーと値を持つ、JSONに似た構造化ビューが出来上がった。
また、読みやすくするために、Pythonスクリプトを使用しました。 バックボックスプロトブフ モジュールを使って、protobufファイルを解析し、人間が読めるきれいなフォーマットで出力を表示する。
これは、ユーザーがロックされたApple Noteに入力した内容と一致します。パスワードで保護された隠し入力から、実際の平文メッセージにたどり着いたのです。
まとめ
おめでとうございます🎉 - あなたは今、次のような完全なフォレンジックワークフローを完了したところです。 iOS 16でロックされたApple Notesを復号化する.SQLiteデータベースから暗号化パラメータを抽出し、パスワードをクラックした。 ハッシュキャットを使用してAESキーを導き出し、アンラップした。 パイソンでプロトバフを復号化し、パースする。 サイバーシェフ.その一歩一歩が、ノートの隠された内容を暴くことに近づいていく。
このハンズオン・ウォークスルーは、そのパワフルさを証明している。 オープンソースツール はデジタル・フォレンジックに役立ちます。このツールは、市販のツールでは見逃してしまうような暗号化されたApple Notesを、捜査官が発見するのに役立ちます。 iOS 16またはそれ以前.
🕵️ ボーナス:パスワードのヒント
ここでもうひとひねり。 パスワードヒント での ziccloudsyncingobject テーブル
クォーターパウンダー
そのデバイスは「ヴィンセント」という人物のものだったので、パスワードを推測するのは難しくなかった: ロイヤルウィズチーズ - うなずける パルプ・フィクション.実際のケースでは、このようなパスワードのヒントは、戦略的なクラッキング・プロセスと組み合わせることで、ワークフローを加速させることができる。
もうひとつ...iOS 17とiOS 18について
このガイドは、特に復号化する方法に適用されます。 iOS16以前のアップルノート.で始まる。 iOS 17Apple は Notes の暗号化プロセスに大きな変更を加えました。キー導出フィールドの欠落、異なる暗号構造、または同じ方法で復号化されなくなったノートが発生する可能性があります。
どのようにすればいいのか? iOS 17またはiOS 18でApple Notesを復号化するぜひ協力したい。一緒に新しい暗号を解読しましょう。






2件のフィードバック
Thank you very much for the research and for sharing it in this post. As a forensic investigator, having access to all this knowledge has been incredibly helpful.
I’m starting to look into what changes have been implemented in versions > iOS 16 and macOS 13, since, as you mentioned, there definitely are some changes.
I’d love it if we could share research findings or if you’ve already made some progress on this topic.