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

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:
- Identificeer de relevante vergrendelde notitiegegevens in ZICNOTEDATA en ZICCLOUDSYNCINGOBJECT.
- Uittreksel de cryptografische details zoals iteratietelling, salt en de verpakte sleutel.
- Crack het wachtwoord van de gebruiker met Hashcat (of een ander wachtwoordherstelprogramma zoals John the Ripper of Passware).
- Afleiden de laatste toetsen in Python of CyberChef en ontcijferen de BLOB van de notitie.
- 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.

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

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 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 = ;

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:

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;

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.

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

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 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:
Ik heb de "AES decoderen". werking.
Ik heb de Onverpakte AES-sleutel in het veld Sleutel.
Ik heb de modus naar ACM.
Ik heb de IV en GCM label in hun respectieve vakgebieden.
Tot slot heb ik de gecodeerde BLOB in het invoervenster.

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.

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.

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.

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.

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