Introducción
Mientras analizaba un dispositivo de prueba con una conocida herramienta forense comercial para móviles, me encontré con algo intrigante: una nota de Apple bloqueada que sólo aparecía como "oculta". La herramienta mostraba el resumen de la nota (etiquetado como "Lance"), pero faltaba el contenido real. No había ninguna pista de lo que había bajo el candado, lo que me dejó con una pregunta candente: ¿podría descubrir el secreto que había dentro? Necesitaba un flujo de trabajo que me ayudara a descifrar las Notas de Apple en iOS 16.
El dispositivo funcionaba iOS 16.7.10y después de indagar en la base de datos NoteStore.sqlite, me di cuenta de que todas las pistas de cifrado estaban ahí, esperando a ser descifradas. Con la ayuda de herramientas de código abierto, me dispuse a recuperar la contraseña y descifrar el contenido de la nota.
Este artículo le guiará por flujo de trabajo forense completo sobre cómo descifrar Notas de Apple en iOS 16:
- 🔓 Hashcat para descifrar contraseñas
- 🗄️ Navegador DB para SQLite para explorar y extraer parámetros de cifrado
- 🐍 Scripts de Python para la derivación de claves y el desenvolvimiento de claves AES
- 🔍 CiberChef para descifrar, descomprimir y analizar la carga útil final del protobuf.
⚠️ Nota importante: Este flujo de trabajo se aplica específicamente a las Notas de Apple bloqueadas en iOS 16.x. A partir de iOS 17, Apple cambió la forma en que se almacenan las notas cifradas, y iOS 18 trae aún más cambios.
Vamos a sumergirnos y revelar el mensaje oculto dentro de ese Apple Note bloqueado.
Profundizando en NoteStore.sqlite
En este punto, sabía que el contenido de la nota cifrada se almacenaba en NoteStore.sqlite, concretamente en la tabla ZICNOTEDATA. Apple suele gzips los datos del protobuf de la nota, pero en el caso de las notas bloqueadas, ese BLOB entero es primero encriptado-lo que significa que un intento de descompresión directa no producirá texto legible. Necesitarás el clave de descifrado correcta antes de que se produzca cualquier tipo de descompresión o análisis del protobuf.
En la captura de pantalla, puede ver los valores hexadecimales sin procesar de ZDATA. Estos datos están codificados por Cifrado AESLos metadatos críticos, como las sales y los recuentos de iteraciones, se guardan en otras partes de la base de datos. A partir de un del examinador forense reconocer que la nota está totalmente encriptada es la clave para profundizar en la tabla ZICCLOUDSYNCINGOBJECT en busca de los parámetros necesarios para grieta el código de acceso y desbloquear la nota 🔓.
Por qué las notas de Apple bloqueadas están encriptadas en iOS 16?
Apple Notes protege las notas bloqueadas mediante una combinación de PBKDF2 (derivación de claves) y AES (cifrado). Cuando se activa una contraseña en una nota, Apple almacena metadatos criptográficos clave en la base de datos, como:
- ZCRYPTOITERATIONCOUNT
- ZCRYPTOSALT
- ZCRYPTOWRAPPEDKEY
Estos valores garantizan que sólo alguien con la clave correcta pueda descifrar el contenido de la nota.
Enfoque forense
Desde un punto de vista forense, sus pasos suelen incluir:
- Identifique las entradas de notas bloqueadas pertinentes en ZICNOTEDATA y ZICCLOUDSYNCINGOBJECT.
- Extracto los detalles criptográficos, como el recuento de iteraciones, la sal y la clave envuelta.
- Crack la contraseña del usuario con Hashcat (u otra herramienta de recuperación de contraseñas como John the Ripper o Passware).
- Derive las teclas finales en Python o CyberChef y descifrar el BLOB de la nota.
- Descomprimir los datos protobuf desbloqueados (con CyberChef o Python) para revelar el texto plano final.
Cómo descifrar la contraseña del Apple Note bloqueado con Hashcat
Mi objetivo era simular un escenario forense realista: tenía un Apple Note bloqueado y necesitaba recuperar su código de acceso para descifrar el contenido. Ahí es donde Hashcat entra en juego. Aprovechando su modo hash Apple Secure Notes (ID 16200), Hashcat intentaba sistemáticamente las contraseñas hasta encontrar la correcta.
Extracción de las columnas necesarias
Empecé abriendo NoteStore.sqlite en DB Browser y apuntando a filas con ZISPASSWORDPROTECTED = 1 en la tabla ZICCLOUDSYNCINGOBJECT. A continuación, he consultado las siguientes columnas:
- Z_PK - identificador único de la nota.
- ZCRYPTOSALT - el valor de la sal para PBKDF2.
- ZCRYPTOWRAPPEDKEY - la clave envuelta que luego será desenvuelta.
El archivo de entrada Hashcat se generó mediante un pequeño script de Python notas_a_hashcat.pyque formatea estos valores en una sola línea que Hashcat puede analizar, incluyendo el recuento de iteraciones (de ZCRYPTOITERATIONCOUNT).
Ejecutar Hashcat para descifrar la contraseña bloqueada de Apple Note
Con mi archivo de entrada Hashcat listo y un diccionario a mano, ejecuté el siguiente comando:
hashcat -m 16200 -a 0
Toma:
- -m 16200 especifica el modo Apple Secure Notes.
- -a 0 establece Hashcat en modo de ataque directo (diccionario).
- El diccionario puede ser algo como rockyou.txt o una lista personalizada derivada de artefactos del dispositivo.
Hashcat identificó con éxito la contraseña correcta: royalewithcheese. En una investigación real, tu diccionario podría ser mucho mayor, pero este resultado confirmó que Hashcat podía encargarse del trabajo pesado.
Obtención de la clave de cifrado (KEK) para descifrar Apple Notes
Con la contraseña en la mano, el siguiente paso era deducir la Clave de cifrado (KEK)que se utiliza para envolver la clave AES final que cifra el contenido de la nota. Para derivar la KEK, necesitaba los siguientes valores de la tabla ZICCLOUDSYNCINGOBJECT:
- Frase de contraseña (la contraseña descifrada)
- Recuento de iteraciones (ZCRYPTOITERATIONCOUNT)
- Sal (ZCRYPTOSALT)
Por ejemplo, utilizando DB Browser, hice una consulta:
SELECT ZCRYPTOITERATIONCOUNT, ZCRYPTOSALT FROM ZICCLOUDSYNCINGOBJECT WHERE Z_PK = ;
A continuación, abrí CyberChef -una de mis herramientas favoritas 🛠️- y arrastré la operación "Derive PBKDF2 key". Configuré la función hash como SHA-256 e introduciendo la contraseña, la sal y el recuento de iteraciones, CyberChef produjo el KEK de 16 bytes:
Para automatizar este proceso, he creado un script en Python llamado get_key.pyque acepta como argumentos la ruta de la base de datos, la nota PK y la contraseña. Su ejecución devuelve el KEK en hexadecimal.
python get_kek.py NoteStore.sqlite
Resultado:
Nota PK=16: KEK (hex) = a1dac1516302e1d3d73ad4fd4b6f8fef
Cómo descifrar la clave AES para desencriptar notas de Apple bloqueadas en iOS 16
El siguiente paso fue desenvolver la llave utilizada para cifrar el contenido de la nota. La clave encriptada se almacena en la columna ZCRYPTOWRAPPEDKEY de ZICCLOUDSYNCINGOBJECT. Por ejemplo, he consultado::
SELECT ZCRYPTOWRAPPEDKEY FROM ZICCLOUDSYNCINGOBJECT WHERE Z_PK = 16;
Opciones de desembalaje
Opción 1: Descifrar la clave AES para descifrar notas de Apple bloqueadas en iOS 16 con CyberChef
Desactivé cualquier operación anterior, busqué "AES Key Unwrap" y la arrastré a la ventana de la receta. Al pegar la KEK y la clave envuelta, CyberChef generó la clave AES desenvuelta.
Opción 2: Automatización del descifrado de claves AES con unwrap.py
También desarrollé un script en Python llamado unwrap.py que toma la ruta de la base de datos y la KEK (en hexadecimal) como argumentos. La ejecución de este script desenvolvió la clave y la imprimió en formato hexadecimal. En mi caso, la clave desenvuelta era:
python unwrap.py NoteStore.sqlite
Esta es la clave AES final que se utilizará para descifrar el contenido de la nota de Apple bloqueada.
Desencriptar BLOBs de Notas de Apple usando AES-GCM en iOS 16
Ahora que tenía la clave desenvuelta, era el momento de descifrar el BLOB de Apple Notes almacenado en el archivo ZICNOTEDATA mesa. Apple utiliza AES en modo GCM para proteger el contenido de las notas bloqueadas, lo que significa que necesitaba cuatro componentes esenciales para proceder:
🔑 Clave AES desenvuelta
🔁 Vector de inicialización (IV) de
ZCRYPTOINITIALIZATIONVECTOR🏷 Etiqueta de autenticación GCM de
ZCRYPTOTAG💾 BLOB cifrado de
ZDATA
📤 Extracción de la etiqueta IV y GCM de NoteStore.sqlite
Para localizar el IV y Etiqueta GCMAbrí el ZICNOTEDATA en DB Browser for SQLite. Estos campos se almacenan como valores binarios y se pueden encontrar en los campos ZICNOTEDATA o ZICCLOUDSYNCINGOBJECT tablas. Ambas almacenan los datos con los mismos nombres de columna.
IV:
5c0c0bde9b6801747ddad1115a422d05Etiqueta GCM:
b9087ba19e3c7deff2cb4b9b51e6aafa
El propio BLOB encriptado también era visible en el ZDATA columna. Copié los tres valores en formato hexadecimal, preparándome para el paso final de descifrado.
🧪 Descifrar la nota con CyberChef
Con todo en la mano, me dirigí a CiberChef. Esta herramienta facilitó la combinación de todos los parámetros y reveló el contenido original. Esto es lo que hice:
He añadido el "Descifrar AES" operación.
He pegado el clave AES desenvuelta en el campo Clave.
Puse el modo a GCM.
He insertado el IV y GCM Tag en sus respectivos campos.
Por último, copié el BLOB encriptado en la ventana de entrada.
Descomprimir y analizar la nota final (Protobuf descifrado de Apple Notes)
Después de descifrar el BLOB cifrado con AES, guardé el resultado en un archivo llamado descifrado_blob.bin y lo he abierto en HxD. La firma del archivo 0x1F8B08 confirmó que era un archivo comprimido con GZIP, que Apple utiliza para comprimir datos protobuf.
Para extraer el texto sin formato, volví a abrir CyberChef y añadí el archivo Gunzip al flujo de trabajo. Inmediatamente, empezaron a aparecer cadenas familiares en la salida.
Una vez descomprimido, apliqué Decodificación Protobuf en CyberChef. El resultado fue una vista estructurada parecida a JSON, con claves y valores que representaban el contenido del Apple Note bloqueado.
Para facilitar la lectura, también utilicé un script de Python que aprovechaba el archivo backboxprotobuf para analizar el archivo protobuf e imprimir la salida en un formato limpio y legible.
Esto coincide con lo que el usuario escribió en su Apple Note bloqueada. Se ha pasado de una entrada oculta y protegida por contraseña al mensaje real en texto sin formato, un hallazgo de valor incalculable en cualquier caso forense.
🔚 Para terminar
Enhorabuena 🎉 - acabas de completar un flujo de trabajo forense completo para descifrar bloqueado Notas de Apple en iOS 16. Ha extraído los parámetros de cifrado de la base de datos SQLite, ha descifrado la contraseña con Hashcatderivó y desenvolvió la clave AES utilizando Pythony finalmente descifrar y analizar el protobuf con CiberChef. Cada paso te acercaba más a descubrir el contenido oculto de la nota.
Este tutorial práctico demuestra lo potente que es herramientas de código abierto en la investigación forense digital. Ayudan a los investigadores a descubrir Notas de Apple cifradas que las herramientas comerciales podrían pasar por alto, especialmente en dispositivos que ejecutan iOS 16 o anterior.
🕵️ Bonus: La pista de la contraseña
Aquí hay un giro extra - He encontrado un pista de contraseña en el ZICCLOUDSYNCINGOBJECT mesa:
Cuarto de libra
Como el dispositivo pertenecía a alguien llamado "Vincent", no fue difícil adivinar la contraseña: royalewithcheese - un guiño a Pulp Fiction. En casos reales, este tipo de pistas sobre contraseñas pueden acelerar el flujo de trabajo si se combinan con un proceso estratégico de descifrado.
📱 Una cosa más... sobre iOS 17 y iOS 18
Esta guía se aplica específicamente a cómo desencriptar Notas de Apple en iOS 16 y versiones anteriores. A partir de iOS 17Apple ha introducido cambios significativos en el proceso de cifrado de Notes. Es posible que falten campos de derivación de claves, que las estructuras criptográficas sean diferentes o que las notas ya no se descifren con los mismos métodos.
Si está estudiando cómo descifrar Notas de Apple en iOS 17 o iOS 18Me encantaría colaborar. Comparte tus descubrimientos: analicemos juntos el nuevo cifrado.






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