はじめに
人気のある市販のモバイル・フォレンジック・ツールでテスト・デバイスを分析していたとき、私は興味深いものに出くわした。ツールはノートの概要(「ランス」と表示)を表示したが、実際の内容は消えていた。鍵の下に何が隠されているのか手がかりはなく、私には燃えるような疑問が残った。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を掘り下げる

スクリーンショットでは、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
テーブルに格納される。どちらも同じカラム名でデータを格納する。
点滴:
5c0c0bde9b6801747ddad1115a422d05
GCMタグ:
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を復号化するぜひ協力したい。一緒に新しい暗号を解読しましょう。
ご愛読ありがとうございました!ご質問やご意見がおありですか?以下のコメント欄にご記入いただくか、直接ご連絡ください。フォレンジック・ディスカバリーの限界に挑戦し続けましょう。🔍