iOS 16.xでロックされたApple Notesの復号化:Hashcatを使用した完全なフォレンジックワークフロー(SQLite、CyberChef、Python

はじめに

人気のある市販のモバイル・フォレンジック・ツールでテスト・デバイスを分析していたとき、私は興味深いものに出くわした。ツールはノートの概要(「ランス」と表示)を表示したが、実際の内容は消えていた。鍵の下に何が隠されているのか手がかりはなく、私には燃えるような疑問が残った。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の解析が行われる前に。
SQLite DBブラウザを使ってApple Notes iOS 16を復号化する
ロックされたノートのZDATAフィールドの暗号化されたBLOB(SQLite用DBブラウザ)

スクリーンショットでは、ZDATAの生の16進数値を見ることができる。このデータは AES暗号化塩分や反復回数のような重要なメタデータは、データベースの他の部分に保存される。データベースから 科学捜査官の の観点からは、ノートが完全に暗号化されていることを認識することが、ZICCLOUDSYNCINGOBJECTテーブルをより深く掘り下げ、以下のことを行うために必要なパラメータを探す合図となります。 クラック パスコードと アンロック ノート🔓。

なぜiOS 16ではロックされたApple Notesが暗号化されるのか?

Apple Notesは、ロックされたメモを以下の組み合わせで保護します。 PBKDF2 (鍵の導出)と AES (暗号化)。ノートのパスワードが有効になっている場合、Appleは重要な暗号化メタデータをデータベースに保存します:

  • zcryptoiterationcount
  • ZCRYPTOSALT
  • zcryptowrappedkey

これらの値は、正しいパスコードを持つ人だけがノートの内容を解読できることを保証する。

法医学的アプローチ

科学捜査の観点からは、通常、以下のような手順を踏む:

  1. 特定する ZICNOTEDATAおよびZICCLOUDSYNCINGOBJECTの関連するロックされたノート・エントリ。
  2. 抜粋 暗号の詳細、例えば反復回数、ソルト、ラップキーなど。
  3. クラック ユーザーのパスワードを ハッシュキャット (またはJohn the RipperやPasswareのようなパスワード回復ツール)。
  4. 導き出す の最後のキーである。 パイソンまたはサイバーシェフ そして デクリプト ノートのBLOB。
  5. 減圧 アンロックされたプロトブ サイバーシェフまたはPython)を使って最終的な平文を明らかにする。

ロックされたアップル・ノートのパスワードをHashcatで解読する

私の目標は、現実的なフォレンジック・シナリオをシミュレートすることだった。ロックされたアップル・ノートを持っていて、コンテンツを復号化するためにパスコードを回復する必要があった。そこで ハッシュキャット が登場する。Apple Secure Notesのハッシュ・モード(ID 16200)、Hashcatは正しいパスワードを見つけるまで、システマティックにパスワードを試行する。

必要な列の抽出

私はまず NoteStore.sqlite DBブラウザでZICCLOUDSYNCINGOBJECTテーブルのZISPASSWORDPROTECTED = 1の行をターゲットにしました。そして、以下のカラムを照会しました:

  • Z_PK - ノート固有の識別子。
  • ZCRYPTOSALT - PBKDF2の塩の値。
  • ZCRYPTOWRAPPEDKEY - 後でラップが解除されるラップされたキー。
Hashcatに必要なパラメータのSQLiteクエリ

Hashcat入力ファイルは、小さなPythonスクリプトによって生成された。 notes_to_hashcat.pyこれは、これらの値をHashcatが解析できる1行にフォーマットしたもので、反復回数(ZCRYPTOITERATIONCOUNTより)も含まれている。

notes_to_hashcat.pyは、iOS 16でロックされたApple Noteのパスワードを解読するために必要なパラメータを収集します。
notes_to_hashcat.pyからの出力

ロックされた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を使ってロックされたApple Notesのパスワードを解読する
ハッシュキャット、クラックされたパスワードを公開:ロイヤルウィズチーズ

Hashcatは正しいパスワードの特定に成功した:royalewithcheese。実際の調査では、辞書はもっと大きなものになるかもしれないが、この結果によって、ハッシュキャットが重い仕事を処理できることが確認された。

Apple Notes を復号するための暗号化キー(KEK)の導出

パスワードが手に入ったので、次のステップは 暗号化キー(KEK)これは、ノートのコンテンツを暗号化する最終的なAESキーをラップするために使用されます。KEKを導き出すには、ZICCLOUDSYNCINGOBJECTテーブルから以下の値が必要だった:

  • パスフレーズ (クラックされたパスワード)
  • 反復回数 (zcryptoiterationcount)。
  • (ズクリプトサルト)

例えば、DBブラウザーを使ってクエリーを実行した:

SELECT ZCRYPTOITERATIONCOUNT, ZCRYPTOSALT FROM ZICCLOUDSYNCINGOBJECT WHERE Z_PK = ;
NoteStore.sqliteに、ロックされたApple Notesの復号化に必要なKEKを取得するために必要なソルトとイテレーションカウントを問い合わせる
反復回数20000|ソルト:d1afa96252a15d8d58827bcb21940de1

次に、私のお気に入りのツールであるCyberChef(🛠️)を開き、「PBKDF2キーの導出」操作をドラッグした。ハッシュ関数を SHA-256 パスワード、ソルト、反復回数を入力すると、CyberChefは次のように表示した。 16バイトKEK:

CyberChefは、Apple Noteの復号化のために、PBKDF2パラメータからKEKを導出するために使用される。
KEK: a1dac1516302e1d3d73ad4fd4b6f8fef

このプロセスを自動化するために、私は以下の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;
iOS16のアプリノートの復号化に必要なunwrapped.keyのSQLiteクエリ
ラップされたキー78c2b79c3e357117c95feb882009e14be9e5f88598ea6db0

包装解除オプション

オプション1:CyberChefでiOS 16のロックされたApple Notesを復号化するためのAESキーを解除する

以前の操作を無効にして、"AES Key Unwrap "を検索し、レシピ・ウィンドウにドラッグした。KEKとラップされたキーを貼り付けると、CyberChefはアンラップされたAESキーを出力した。

CyberChefがiOS 16のApple Notes復号化でKEKの導出とAESキーのアンラップに使われる
解凍キー4b1f0c718aa05a0d097d7bf4865c89d1

オプション2:unwrap.pyを使ったAES鍵のアンラップの自動化

というPythonスクリプトも開発した。 unwrap.py このスクリプトはデータベースパスとKEK(16進数)を引数に取る。このスクリプトを実行すると、キーがアンラップされ、16進数で表示される。私の場合、アンラップされたキーは以下の通りだった:

python unwrap.py NoteStore.sqlite
Pythonスクリプトunwrap.pyがロックされたApple Notesの暗号化解除されたAESキーを表示します。
解凍キー4b1f0c718aa05a0d097d7bf4865c89d1

これは、ロックされたアップル・ノートのコンテンツを復号化するために使用される最終的な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進数でコピーし、最後の復号ステップに備えた。

初期化ベクター5c0c0bde9b6801747ddad1115a422d05
AES-GCM復号化に使用されたGCMタグを示すDBブラウザ
GCMタグ: b9087ba19e3c7deff2cb4b9b51e6aafa
暗号化されたアップルノートBLOBデータが強調表示されたDBブラウザ
暗号化されたBLOB

🧪 サイバーシェフでノートを解読する

すべてを手にして、私はこう言った。 サイバーシェフ.このツールを使えば、すべてのパラメーターを組み合わせて、オリジナルのコンテンツを簡単に明らかにすることができた。私がやったことはこうだ:

  1. を追加した。 「AES復号化 オペレーションを行う。

  2. を貼り付けた。 アンラップドAESキー をキー・フィールドに入力する。

  3. をセットした。 モードをGCMに.

  4. を挿入した。 IVとGCMタグ それぞれの分野で。

  5. 最後に 暗号化BLOB を入力ウィンドウに入力する。

一度だけ 焼くCyberChefはBLOBの暗号化を解除し、圧縮されたファイルを見せた。これで暗号化レイヤーは完全に取り除かれ、データの解凍に移ることができた。
AES-GCMモードでApple Notes BLOBを復号化するCyberChefレシピ
復号化されたGZIPファイル

ファイナルノート(Apple Notesから復号化されたProtobuf)の解凍と解析

AESで暗号化されたBLOBを復号化した後、出力を以下のファイルに保存した。 decrypted_blob.bin をHxDで開いた。ファイルの署名 0x1F8B08 GZIPで圧縮されたファイルであることを確認した-アップルはprotobufデータを圧縮するためにこれを使用する。

平文を抽出するために、私はCyberChefを再び開き、以下のコマンドを追加した。 ガンジップ オペレーションをワークフローに追加した。すぐに、見慣れた文字列が出力に現れ始めた。

GZIP解凍後のApple Notes protobufデータを表示するCyberChef
CyberChefで展開されたprotobuf

解凍した後、次のようにした。 プロトブフ・デコード をCyberChefに追加した。その結果、ロックされたアップル・ノートの内容を表すキーと値を持つ、JSONに似た構造化ビューが出来上がった。

JSONライクなフォーマットでデコードされたApple Notes protobuf構造のCyberChefビュー
サイバーシェフにおけるプロトブフの解読

また、読みやすくするために、Pythonスクリプトを使用しました。 バックボックスプロトブフ モジュールを使って、protobufファイルを解析し、人間が読めるきれいなフォーマットで出力を表示する。

Backboxprotobuf Pythonスクリプトを使用して解析されたApple Noteのコンテンツを示すコマンドプロンプト
きれいにフォーマットされた結果が画面に印刷される

これは、ユーザーがロックされたApple Noteに入力した内容と一致します。パスワードで保護された隠し入力から、実際の平文メッセージにたどり着いたのです。

ロックされたアップル・ノートの内容のUFADEを使ったスクリーンショット

まとめ

おめでとうございます🎉 - あなたは今、次のような完全なフォレンジックワークフローを完了したところです。 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を復号化するぜひ協力したい。一緒に新しい暗号を解読しましょう。

ご愛読ありがとうございました!ご質問やご意見がおありですか?以下のコメント欄にご記入いただくか、直接ご連絡ください。フォレンジック・ディスカバリーの限界に挑戦し続けましょう。🔍

フェイスブック
ツイッター
電子メール
プリント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です