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を復号化するぜひ協力したい。一緒に新しい暗号を解読しましょう。

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

2件のフィードバック

  1. 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.

コメントを残す

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