Ontcijfer vergrendelde Apple notities op iOS 16.x: Een complete forensische workflow (SQLite, CyberChef, Python) met Hashcat

Inleiding

Tijdens het analyseren van een testapparaat met een populaire commerciële mobiele forensische tool, kwam ik iets intrigerends tegen - een vergrendelde Apple notitie die alleen als "verborgen" verscheen. Het programma toonde de samenvatting van de notitie (met het label "Lance"), maar de daadwerkelijke inhoud ontbrak. Ik had geen idee wat er onder het slot zat en bleef met een brandende vraag zitten: kon ik het geheim binnenin ontdekken? Ik had een workflow nodig om Apple Notes op iOS 16 te ontsleutelen.

Het apparaat draaide iOS 16.7.10en na wat graven in de NoteStore.sqlite database, realiseerde ik me dat alle encryptie-aanwijzingen daar lagen, wachtend om ontcijferd te worden. Met de hulp van open-source tools, ging ik op pad om het wachtwoord te achterhalen en de inhoud van de notitie te decoderen.            

Deze post leidt je door de complete forensische workflow over hoe Apple notities ontsleutelen op iOS 16:

  • 🔓 Hashcat voor het kraken van wachtwoorden
  • 🗄️ DB-browser voor SQLite om encryptieparameters te onderzoeken en te extraheren
  • 🐍 Python-scripts voor sleutelafleiding en unwrapping van AES-sleutels
  • 🔍 CyberChef om de uiteindelijke protobuf payload te decoderen, decomprimeren en parsen

⚠️ Belangrijke opmerking: Deze workflow is specifiek van toepassing op Apple Notes die zijn vergrendeld op iOS 16.x. Vanaf iOS 17 heeft Apple de manier waarop versleutelde notities worden opgeslagen veranderd en iOS 18 brengt nog meer veranderingen met zich mee.

Laten we erin duiken en de verborgen boodschap in die vergrendelde Apple Note onthullen.

In de NoteStore.sqlite graven

Op dit punt wist ik dat de inhoud van de versleutelde notitie was opgeslagen in NoteStore.sqlite, specifiek in de ZICNOTEDATA tabel. Apple gzips de protobuf gegevens van de notitie, maar in het geval van vergrendelde notities wordt eerst die hele BLOB versleuteld-wat betekent dat een directe decompressiepoging geen leesbare tekst oplevert. Je hebt de juiste ontcijferingssleutel voordat het uitpakken of het parsen van de protobuf kan plaatsvinden.
Apple notities iOS 16 decoderen met SQLite DB Browser
Gecodeerde BLOB in het veld ZDATA voor de vergrendelde notitie (DB Browser voor SQLite)

In de schermafbeelding zie je de ruwe hexadecimale waarden voor ZDATA. Deze gegevens zijn effectief vervormd door AES-coderingmet kritieke metadata, zoals zouten en iteratietellingen, opgeslagen in andere delen van de database. Van een forensisch onderzoeker Als je ziet dat de noot volledig versleuteld is, is dat het teken om dieper te graven in de ZICCLOUDSYNCINGOBJECT-tabel voor de parameters die nodig zijn om crack het wachtwoord en ontgrendelen de noot 🔓.

Waarom zijn vergrendelde Apple notities versleuteld in iOS 16?

Apple Notes beveiligt vergrendelde notities met een combinatie van PBKDF2 (sleutelafleiding) en AES (versleuteling). Wanneer een wachtwoord is ingeschakeld op een notitie, slaat Apple belangrijke cryptografische metagegevens op in de database, zoals:

  • ZCRYPTOITERATIONCOUNT
  • ZCRYPTOSALT
  • ZCRYPTOWRAPPEDKEY

Deze waarden zorgen ervoor dat alleen iemand met de juiste toegangscode de inhoud van de notitie kan ontsleutelen.

Forensische aanpak

Vanuit forensisch oogpunt omvatten je stappen meestal:

  1. Identificeer de relevante vergrendelde notitiegegevens in ZICNOTEDATA en ZICCLOUDSYNCINGOBJECT.
  2. Uittreksel de cryptografische details zoals iteratietelling, salt en de verpakte sleutel.
  3. Crack het wachtwoord van de gebruiker met Hashcat (of een ander wachtwoordherstelprogramma zoals John the Ripper of Passware).
  4. Afleiden de laatste toetsen in Python of CyberChef en ontcijferen de BLOB van de notitie.
  5. decomprimeren de ontgrendelde protobuf-gegevens (met CyberChef of Python) om de uiteindelijke platte tekst te onthullen.

Kraak het wachtwoord van de vergrendelde Apple Note met Hashcat

Mijn doel was om een realistisch forensisch scenario te simuleren: ik had een vergrendelde Apple Note en moest het wachtwoord herstellen om de inhoud te ontsleutelen. Dat is waar Hashcat in het spel komt. Gebruikmakend van de Apple Secure Notes hashmodus (ID 16200) probeerde Hashcat systematisch wachtwoorden totdat het de juiste vond.

De vereiste kolommen uitpakken

Ik begon met het openen van NoteStore.sqlite in DB Browser en gericht op rijen met ZISPASSWORDPROTECTED = 1 in de tabel ZICCLOUDSYNCINGOBJECT. Vervolgens heb ik de volgende kolommen opgevraagd:

  • Z_PK - de unieke identifier van de biljet.
  • ZCRYPTOSALT - de zoutwaarde voor PBKDF2.
  • ZCRYPTOWRAPPEDKEY - de ingepakte sleutel die later wordt uitgepakt.
SQLite-query voor vereiste parameters voor Hashcat

Het Hashcat-invoerbestand is gegenereerd door een klein Python-script noten_naar_hashcat.pydie deze waarden formatteerde in een enkele regel die Hashcat kon ontleden, inclusief de iteratieteller (van ZCRYPTOITERATIONCOUNT).

notes_to_hashcat.py verzamelt de vereiste parameters om het wachtwoord voor vergrendelde Apple notities op iOS 16 te kraken
Uitvoer van notes_to_hashcat.py

Hashcat uitvoeren om het vergrendelde Apple Note-wachtwoord te decoderen

Met mijn Hashcat-invoerbestand klaar en een woordenboek bij de hand, voerde ik het volgende commando uit:

hashcat -m 16200 -a 0
Hier:
  • -m 16200 specificeert de modus Apple beveiligde notities.
  • -a 0 zet Hashcat in de Straight (woordenboek) aanvalsmodus.
  • Het woordenboek kan zoiets zijn als rockyou.txt of een aangepaste lijst afgeleid van apparaatartefacten.
Hashcat gebruiken om het wachtwoord van vergrendelde Apple Notes te decoderen
Hashcat onthult het gekraakte wachtwoord: royalewithcheese

Hashcat heeft met succes het juiste wachtwoord geïdentificeerd: royalewithcheese. In een echt onderzoek zou je woordenboek veel groter kunnen zijn, maar dit resultaat bevestigde dat Hashcat het zware werk aankon.

De coderingssleutel (KEK) afleiden om Apple Notes te ontsleutelen

Met het wachtwoord in de hand was de volgende stap het afleiden van de Encryptiesleutel (KEK)die wordt gebruikt om de uiteindelijke AES-sleutel in te pakken die de inhoud van de notitie versleutelt. Om de KEK af te leiden, had ik de volgende waarden nodig uit de ZICCLOUDSYNCINGOBJECT tabel:

  • Passphrase (het gekraakte wachtwoord)
  • Iteratietelling (ZCRYPTOITERATIONCOUNT)
  • Zout (ZCRYPTOSALT)

Met behulp van DB Browser heb ik bijvoorbeeld een query uitgevoerd:

SELECT ZCRYPTOITERATIONCOUNT, ZCRYPTOSALT FROM ZICCLOUDSYNCINGOBJECT WHERE Z_PK = ;
NoteStore.sqlite bevragen voor de Salt en Iteration count die nodig zijn om de KEK te verkrijgen die nodig is om vergrendelde Apple Notes te ontsleutelen
Iteratietelling: 20000 | Zout: d1afa96252a15d8d58827bcb21940de1

Vervolgens opende ik CyberChef-een favoriete tool van mij 🛠️-en sleepte de "Afleiden PBKDF2 sleutel" bewerking erin. De hashing-functie instellen op SHA-256 en het invoeren van het wachtwoord, de salt en het aantal iteraties, produceerde CyberChef de 16-byte KEK:

CyberChef gebruikt om KEK af te leiden van PBKDF2 parameters voor Apple Note ontcijfering.
KEK: a1dac1516302e1d3d73ad4fd4b6f8fef

Om dit proces te automatiseren, heb ik een Python-script gemaakt met de naam get_key.pydat het databasepad, notitie PK en wachtwoord als argumenten accepteert. Het uitvoeren geeft de KEK in hexadecimale vorm.

python get_kek.py NoteStore.sqlite

Resultaat:
Opmerking PK=16: KEK (hex) = a1dac1516302e1d3d73ad4fd4b6f8fef

De AES-sleutel ontcijferen om vergrendelde Apple notities in iOS 16 te ontsleutelen

De volgende stap was de sleutel uitpakken gebruikt om de inhoud van de notitie te versleutelen. De ingepakte sleutel wordt opgeslagen in de kolom ZCRYPTOWRAPPEDKEY van ZICCLOUDSYNCINGOBJECT. Ik heb bijvoorbeeld gevraagd::

SELECTEER ZCRYPTOWRAPPEDKEY UIT ZICCLOUDSYNCINGOBJECT WAAR Z_PK = 16;
SQLite-query voor de unwrapped.key die nodig is voor het decoderen van appe-notities op iOS16
Verpakte sleutel: 78c2b79c3e357117c95feb882009e14be9e5f88598ea6db0

Opties voor uitpakken

Optie 1: De AES-sleutel uitpakken om vergrendelde Apple notities op iOS 16 te decoderen met CyberChef

Ik schakelde alle eerdere bewerkingen uit, zocht naar "AES Key Unwrap" en sleepte het naar het receptvenster. Door de KEK en de ingepakte sleutel in het recept te plakken, voerde CyberChef de uitgepakte AES-sleutel uit.

CyberChef gebruikt om KEK af te leiden en AES-sleutel uit te pakken voor ontcijfering van Apple Notes op iOS 16
Onverpakte sleutel: 4b1f0c718aa05a0d097d7bf4865c89d1

Optie 2: AES-sleutel uitpakken automatiseren met unwrap.py

Ik heb ook een Python-script ontwikkeld met de naam unwrap.py dat het databasepad en KEK (in hex) als argumenten neemt. Door dit script uit te voeren, werd de sleutel uitgepakt en in hexadecimaal formaat afgedrukt. In mijn geval was de uitgepakte sleutel:

python unwrap.py NoteStore.sqlite
Python-script unwrap.py toont ontcijferde AES-sleutel voor vergrendelde Apple Notes
Onverpakte sleutel: 4b1f0c718aa05a0d097d7bf4865c89d1

Dit is de uiteindelijke AES-sleutel die zal worden gebruikt om de inhoud van de vergrendelde Apple notitie te ontsleutelen.

Apple Notes BLOB's ontsleutelen met AES-GCM op iOS 16

Nu ik de uitgepakte sleutel had, was het tijd om de Apple Notes BLOB die opgeslagen was in de ZICNOTEDATA tabel. Apple gebruikt AES in ACM-modus om de inhoud van vergrendelde notities te beschermen, wat betekent dat ik vier essentiële onderdelen nodig had om verder te gaan:

  • 🔑 Onverpakte AES-sleutel

  • 🔁 Initialisatievector (IV) van ZCRYPTOINITIALISATIEVECTOR

  • 🏷 GCM-authenticatietag van ZCRYPTOTAG

  • 💾 Gecodeerde BLOB van ZDATA

De IV- en GCM-tag uit NoteStore.sqlite halen

De IV en GCM-tagIk opende de ZICNOTEDATA tabel in DB Browser voor SQLite. Deze velden worden opgeslagen als binaire waarden en kunnen worden gevonden in de ZICNOTEDATA of ZICCLOUDSYNCINGOBJECT tabellen. Beide slaan de gegevens op onder dezelfde kolomnamen.

  • IV: 5c0c0bde9b6801747ddad1115a422d05

  • GCM label: b9087ba19e3c7deff2cb4b9b51e6aafa

De versleutelde BLOB zelf was ook zichtbaar in de ZDATA kolom. Ik heb alle drie de waarden gekopieerd in hexadecimaal formaat, ter voorbereiding op de laatste ontcijferingsstap.

De initialisatievector: 5c0c0bde9b6801747ddad1115a422d05
DB-browser met de GCM-tag die wordt gebruikt voor AES-GCM-decodering
De GCM-tag: b9087ba19e3c7deff2cb4b9b51e6aafa
DB Browser met gecodeerde Apple Note BLOB-gegevens gemarkeerd
De gecodeerde BLOB

De notitie ontcijferen met CyberChef

Met alles in de hand ging ik naar CyberChef. Met deze tool was het eenvoudig om alle parameters te combineren en de originele inhoud te onthullen. Dit is wat ik deed:

  1. Ik heb de "AES decoderen". werking.

  2. Ik heb de Onverpakte AES-sleutel in het veld Sleutel.

  3. Ik heb de modus naar ACM.

  4. Ik heb de IV en GCM label in hun respectieve vakgebieden.

  5. Tot slot heb ik de gecodeerde BLOB in het invoervenster.

Toen ik eenmaal BakCyberChef decodeerde de BLOB en onthulde een gecomprimeerd bestand - precies wat ik verwachtte. Dit betekende dat de encryptielaag nu volledig verwijderd was en ik verder kon gaan met het decomprimeren van de gegevens.
CyberChef-recept voor het decoderen van Apple Notes BLOB met AES-GCM-modus
GZIP-bestand ontcijferd

De uiteindelijke notitie uitpakken en parseren (gedecodeerde Protobuf van Apple Notes)

Na het decoderen van de met AES gecodeerde BLOB, heb ik de uitvoer opgeslagen in een bestand met de naam gedecodeerde_blob.bin en opende het in HxD. De handtekening van het bestand 0x1F8B08 bevestigde dat het een GZIP-gecomprimeerd bestand was - Apple gebruikt dit om protobuf-gegevens te comprimeren.

Om de platte tekst te extraheren, heropende ik CyberChef en voegde de Gunzip bewerking aan de workflow. Onmiddellijk verschenen er bekende tekenreeksen in de uitvoer.

CyberChef toont gedecomprimeerde Apple Notes protobuf gegevens na GZIP extractie
Gedecomprimeerde protobuf in CyberChef

Eenmaal gedecomprimeerd, heb ik Protobuf decoderen in CyberChef. Het resultaat was een gestructureerde weergave die leek op JSON, met sleutels en waarden die de inhoud van de vergrendelde Apple notitie vertegenwoordigden.

CyberChef weergave van Apple Notes protobuf gedecodeerde structuur met JSON-achtige indeling
Ontcijferde Protbuf in CyberChef

Om het lezen te vergemakkelijken, heb ik ook een Python-script gebruikt dat gebruikmaakt van de backboxprotobuf module om het protobuf bestand te ontleden en de uitvoer af te drukken in een schoon, menselijk leesbaar formaat.

Opdrachtprompt toont inhoud van Apple notities met behulp van backboxprotobuf Python-script
Mooi opgemaakte resultaten afgedrukt op het scherm

Dit komt overeen met wat de gebruiker in zijn vergrendelde Apple Note heeft getypt. Je bent van een verborgen, met een wachtwoord beveiligde invoer naar het echte, onbewerkte bericht gegaan - een waardevolle vondst in elke forensische zaak.

Screenshot met UFADE van de inhoud van de vergrendelde Apple Note

Afsluiten

Gefeliciteerd 🎉 - je hebt zojuist een volledige forensische workflow voltooid om Vergrendelde Apple notities ontsleutelen op iOS 16. Je hebt encryptieparameters uit de SQLite database gehaald, het wachtwoord gekraakt met Hashcatde AES-sleutel afgeleid en uitgepakt met Pythonen tenslotte de protobuf gedecodeerd en geparseerd met CyberChef. Elke stap bracht je dichter bij het blootleggen van de verborgen inhoud van het briefje.

Deze praktische oplossing bewijst hoe krachtig open-source tools kan zijn in digitaal forensisch onderzoek. Ze helpen onderzoekers om versleutelde Apple Notes te ontdekken die commerciële tools mogelijk missen, vooral op apparaten met iOS 16 of hoger.

🕵️ Bonus: De wachtwoordhint

Hier is een extra twist - ik vond een wachtwoord hint in de ZICCLOUDSYNCINGOBJECT tafel:

Quarter Pounder

Omdat het apparaat van iemand met de naam "Vincent" was, was het niet moeilijk om het wachtwoord te raden: royalewithcheese - een knipoog naar Pulp Fiction. In echte gevallen kunnen wachtwoordhints als deze de workflow versnellen als ze worden gecombineerd met een strategisch kraakproces.

Nog één ding... over iOS 17 en iOS 18

Deze handleiding is specifiek van toepassing op het decoderen van Apple notities op iOS 16 en ouder. Beginnend met iOS 17Apple heeft belangrijke wijzigingen aangebracht in het versleutelingsproces van Notes. Je kunt te maken krijgen met ontbrekende sleutelafleidingsvelden, andere cryptografische structuren of notities die niet meer met dezelfde methoden ontsleutelen.

Als je onderzoekt hoe je Apple notities decoderen op iOS 17 of iOS 18Ik zou graag samenwerken. Deel je bevindingen - laten we samen de nieuwe codering analyseren.

Bedankt voor het lezen! Heb je vragen of inzichten? Stel ze hieronder in de comments of neem direct contact met ons op. Laten we de grenzen van forensische ontdekking blijven verleggen. 🔍

Facebook
Twitter
E-mail
Afdrukken

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *