Antes de tocar nada
Se pierden las pruebas.
Para buscar ayuda y cambiar contraseñas, uno de confianza.
Con fecha y capturas. Si es serio, que lo sepa alguien de confianza.
¿Qué te pasa? Empieza por aquí
Voy a la huelga o a una maniQué hacer con el móvil antes, durante y después.
Me ha llegado un aviso de Apple, Google o WhatsAppCómo saber si es real y qué hacer.
Me he quedado sin línea, me llegan códigos o mis llamadas van rarasPrimero lo urgente. Luego, cinco minutos.
Alguien sabe lo que escribo por WhatsApp o por correoMira en qué aparatos está abierta tu cuenta.
Creo que me espían o me han metido algo en el móvil o el ordenadorQuince minutos. Pasos para iPhone, Android y ordenador.
¿Puede ser una intervención judicial?Qué se puede saber y qué dice la ley.
Vengo a montar el laboratorioZero Breach Toolkit, MVT y PiRogue.
Dónde ocurre cada pinchazo
¿Qué es exactamente cada cosa?Son cinco casos distintos, y uno no se ve desde el móvil.
| Qué es | ¿Lo puedes ver tú? |
|---|---|
| Desvío de llamadas o duplicado de SIM. Tus llamadas o SMS van a otro sitio. | Sí. Paso 1. |
| Cuenta abierta en otro sitio. WhatsApp Web, Telegram o Google en un aparato que no es tuyo. Es de lo más común. | Sí. Paso 2. |
| App espía (stalkerware). Alguien tuvo tu móvil en la mano y le instaló algo. | Muchas veces sí. Paso 2. |
| Spyware de pago (Pegasus, Predator, Graphite). Va contra periodistas, activistas y gente concreta. Puede entrar sin que toques nada. | A ojo, no. Hace falta laboratorio, y aun así puede no aparecer. Paso 3. |
| Intervención judicial. La hace la compañía por orden de un juzgado. | No. No deja rastro en el móvil y es secreta mientras dura. Al acabar, tienes derecho a saberlo. |
Huelga y manifestaciones
Antes
- Haz copia de seguridad.
- Pon un código largo y quita Face ID o huella.
- Acordad un punto de encuentro por si no hay red.
- Valora llevar un móvil con pocos datos, o ninguno.
- Repasa los dispositivos vinculados y activa la verificación en dos pasos.
- Si organizas algo, mira las antenas falsas.
Durante
- Si temes que te lo quiten, apágalo: el modo avión no basta.
- Haz las fotos desde la pantalla de bloqueo, sin desbloquear.
Después
- Difumina las caras antes de publicar.
- Si te han quitado el móvil, aunque sea un rato, revísalo: paso 2.
Basado en la guía de la EFF (se abre en otra pestaña), pensada para EE. UU., y en las de TeknoKasa (se abre en otra pestaña). No es asesoría legal: para saber qué hacer si te piden el móvil en España, habla con tu abogada o con una colectiva antirrepresiva.
Guías de TeknoKasa (Madrid): bloqueo del móvil y detención (se abre en otra pestaña) Guía de la EFF para ir a una protesta (se abre en otra pestaña)Aviso de Apple, Google o WhatsApp
- No toques enlaces ni des códigos. Apple nunca te pide en estos avisos pinchar enlaces, instalar nada ni dar contraseñas o códigos. Si te lo piden, es falso.
- Compruébalo sin usar el mensaje. En Apple, entra a mano en account.apple.com (se abre en otra pestaña): si es de verdad, sale un aviso arriba del todo. En Google o WhatsApp, abre tú la app o la web, no el enlace.
- Si es real: indica que lo han intentado, no que te hayan infectado. No borres, no restaures y no actualices.
- Pide ayuda: líneas de ayuda.
Llamadas y compañía
Vas a marcar unos códigos y a hacer una llamada.
Urgente. ¿Sin cobertura de golpe y con códigos o avisos que no has pedido? Puede ser un duplicado de SIM.
- Llama ya a tu compañía desde otro teléfono. Si el número corto no funciona desde otra línea, mira el largo en su web.
- Cambia las contraseñas del correo y del banco desde un aparato de confianza.
1.1 Mira si hay desvíos
Abre la app de Teléfono, marca el código como si fuera un número y pulsa llamar. Saca foto o captura del resultado antes de cambiar nada.
| Marca | Te dice si se desvían las llamadas… |
|---|---|
*#21# | todas, siempre. Este es el que más importa. |
*#61# | cuando no contestas. |
*#62# | cuando estás sin cobertura o apagado. |
*#67# | cuando estás comunicando. |
1.2 Qué significa
No hay desvío. Solo significa eso: no dice nada de apps espía ni de intervenciones.
- Suele ser tu buzón de voz: es normal.
- Pregunta a tu compañía si ese número es suyo.
- Si no lo es, quítalo con
##61#,##62#o##67#.
No significa nada malo: con llamadas por 4G (VoLTE) algunos códigos no funcionan. Míralo en la app de tu compañía o pregunta por teléfono.
Tus llamadas se están yendo a ese número. A ti ni te suena el móvil.
- Saca foto de la pantalla.
- Marca
##21#para quitarlo. - Marca
*#21#otra vez: debe poner "desactivado". - Llama a tu compañía y pregunta cuándo se activó.
- Cambia las contraseñas importantes desde otro aparato.
1.3 Quita los desvíos que no quieras
##21#,##61#,##62#,##67#quitan cada uno el suyo.##002#los quita todos de golpe. Ojo, también el del buzón de voz: si lo usas, igual tienes que volver a activarlo.
También lo puedes mirar en los ajustes:
- iPhone: Ajustes > Apps > Teléfono > Desvío de llamadas.
- Android: app de Teléfono, sus ajustes y Desvío de llamadas.
El bulo del *#06#. Circula que si marcas *#06# y no sale nada estás pinchada. Ese código solo enseña el IMEI, el número de serie del móvil. No detecta nada.
1.4 Llama a tu compañía
| Compañía | Teléfono | Horario |
|---|---|---|
| Movistar | 1004 | Todos los días, 9 a 22 |
| Vodafone | 22123 | 24 horas |
| Orange | 1470 | Lunes a sábado, 9 a 22 |
| Yoigo | 622 622 622 622 desde otra compañía | 24 horas |
| O2 | 1551 | Todos los días, 9 a 22 |
| Digi | 1200 | Todos los días, 7 a 24 |
Otra compañía o un número que no responde: míralo en tu factura o en su web. Si desconfías de tu línea, llama desde otro teléfono.
Pregunta esto, tal cual
- ¿Hay algún desvío activo en mi línea? ¿A qué número?
- ¿Se ha hecho hace poco un duplicado de SIM o un cambio a eSIM? ¿Cuándo y dónde?
- ¿Hay otras líneas a mi nombre, o alguna portabilidad o cambio de titular pedido?
- ¿Qué medidas tenéis contra duplicados de SIM? Quiero activarlas.
Aprovecha y cambia el PIN del buzón de voz si sigue siendo el de fábrica.
Y si es una intervención judicial
- Ni los códigos de desvío ni llamar a la compañía la destapan.
- Mientras dura, es secreta.
- Al acabar, tienes derecho a saberlo por el juzgado, con excepciones.
Qué dice la ley, punto por punto
- Con los códigos de desvío tampoco se ve. Esos códigos enseñan los desvíos normales de tu línea. Una intervención no desvía la llamada: la red saca una copia, y la norma técnica (3GPP TS 33.106) (se abre en otra pestaña) exige que no altere tus servicios ni dé ninguna señal.
- Llamando no te lo van a decir. La compañía tiene obligación legal de guardar secreto, y puede cometer desobediencia si no lo hace (LECrim, art. 588 ter e (se abre en otra pestaña)). Un "no vemos nada raro" no la descarta.
- Mientras dura, es secreta: se tramita en una pieza separada y secreta (art. 588 bis d (se abre en otra pestaña)).
- Cuando acaba, sí tienes derecho a saberlo. Quienes son parte reciben copia de las grabaciones y transcripciones. Y el juzgado debe notificarlo a quienes aparecen en las comunicaciones interceptadas, salvo que sea imposible, exija un esfuerzo desproporcionado o perjudique futuras investigaciones (art. 588 ter i (se abre en otra pestaña)).
- Si crees que hay una causa abierta contra ti, quien puede preguntar es tu abogada, en el juzgado.
- Datos en manos de la policía: puedes pedirlos, pero pueden denegártelo para no perjudicar una investigación. En ese caso puedes ejercer el derecho a través de la AEPD (LO 7/2021, arts. 24 y 25 (se abre en otra pestaña)).
Y si es un registro remoto del móvil (art. 588 septies)2,5 millones · Fortier Europe · fabricante sin publicar
En octubre de 2026 el BOE publicó (se abre en otra pestaña) que la Guardia Civil compró por 2.066.115,70 € (unos 2,5 millones con IVA) un sistema de "registros remotos" de móviles. Puede "alojar software" en Android e iOS para el "acceso transparente" a contenidos y comunicaciones.
Se adjudicó a Fortier Europe, de Boadilla del Monte, por procedimiento negociado sin publicidad y con una sola oferta, alegando la exclusividad del fabricante.
Lo que no se sabe: quién lo fabrica, cómo se instala y si es Pegasus. El anuncio no lo dice, y atribuirlo a un producto concreto hoy sería especular.
La ley (LECrim, art. 588 septies (se abre en otra pestaña)) exige autorización judicial y lo limita a ciertos delitos, durante un mes prorrogable hasta tres. Antes, Citizen Lab documentó (se abre en otra pestaña) al menos 65 personas del entorno independentista catalán atacadas con Pegasus y Candiru.
Tus datos de línea, por escrito
Lo que sí puedes pedir a la compañía son tus datos con el derecho de acceso (se abre en otra pestaña) del RGPD (art. 15). Tienen un mes para contestar y la AEPD tiene un formulario (se abre en otra pestaña).
¿Sigues con dudas? Revisa tu móvil ↓Revisa tu móvil, tu ordenador y tus cuentas
Vas a mirar qué hay abierto y qué hay instalado.
Si tienes una sospecha fuerte (alerta de spyware, o eres periodista o activista y ha pasado algo concreto):
- No restaures ni borres nada: se pierden las pruebas.
- No actualices y, si puedes, pregunta antes de reiniciar.
- Mirar los menús sí puedes.
- Ve al paso 3.
2.1 Empieza por tus cuentas
Es lo más rápido y lo que más veces da con el problema. Saca una captura y luego cierra lo que no reconozcas:
- WhatsApp: Ajustes > Dispositivos vinculados. Activa también Ajustes > Cuenta > Verificación en dos pasos.
- Signal: Ajustes > Dispositivos vinculados.
- Telegram: Ajustes > Dispositivos.
- Google: myaccount.google.com/device-activity (se abre en otra pestaña).
- Correo: busca en los ajustes reenvíos o filtros que no hayas puesto tú.
No escanees un QR para "verificar" nada si no empezaste tú la vinculación.
¿No hay nada raro y siguen sabiendo lo que escribes? Pide ayuda.
Después cambia las contraseñas desde un aparato de confianza, no desde el que sospechas.
2.2 Qué significa lo que notas
Batería, códigos que no pediste, enlaces raros, ruidos...
| Lo que notas | Lo que suele ser |
|---|---|
| Batería que dura poco, móvil caliente, gasta datos | Batería vieja o una app normal. Puede ser una app espía, pero por sí solo no prueba nada. Mira cuál gasta en los ajustes de batería. |
| Ruidos o eco en las llamadas | Mala cobertura. Una intervención moderna no suena. |
| Códigos de verificación que no has pedido | Alguien está intentando entrar en esa cuenta. Cambia la contraseña y activa la verificación en dos pasos. |
| Mensaje raro con un enlace, aunque sea de tu banco o de "una amiga" | Es un engaño (phishing). No lo abras. Si ya lo abriste, guárdalo y sigue leyendo. |
| Alguien sabe cosas que solo has dicho por el móvil | Mira primero las sesiones abiertas. Si no hay nada, ve al paso 3. |
| Alerta oficial de Apple, Google o WhatsApp sobre ataques de spyware | Esta sí es seria: indica que lo han intentado, no que te hayan infectado. Solo un análisis lo confirma. Paso 3. |
El spyware caro no da señales. Que el móvil vaya bien no lo descarta, y que vaya mal tampoco lo confirma.
Mitos y falsas alarmasIncluido el "truco" de apagar el móvil cinco minutos.
"Apagar el móvil cinco minutos al día lo protege." Lo contó Pedro Sánchez (se abre en otra pestaña) en octubre. Tiene parte de verdad: mucho spyware comercial no sobrevive a un reinicio, así que reiniciar a menudo ayuda. Pero no corrige el fallo (se abre en otra pestaña) por el que entró y pueden volver a entrar.
"Batería, calor o clics = pinchada." Por sí solos no prueban nada.
"Una app dice que estoy limpia, así que lo estoy." Solo significa que no encontró lo que ya se conoce. Da falsa seguridad.
"Aviso de Apple = infectada." Indica un intento (se abre en otra pestaña). La confirmación la da un análisis forense.
"Lo primero es formatear." Destruye las pruebas. Primero pide ayuda.
"Con Signal nadie me lee." El cifrado funciona, pero si te engañan para vincular otro aparato con un QR (se abre en otra pestaña), ese aparato recibe tus mensajes nuevos. No escanees un QR para "verificar" nada si no empezaste tú la vinculación.
"En modo avión soy invisible." Solo apagarlo (se abre en otra pestaña) da garantía.
"No tengo nada que ocultar." La vigilancia también afecta a quien hablas: fuentes, compañeras, familia.
2.3 Elige tu aparato y toca para abrir los pasos
iPhone, 7 pasos
- Mira si Apple te ha avisado. Las alertas de amenazas salen en la pantalla de bloqueo y en Ajustes, en un correo de
threat-notifications@y en un aviso arriba del todo en account.apple.com (se abre en otra pestaña). Apple nunca te pide en ellas pinchar enlaces, instalar nada ni dar contraseñas o códigos. Si te lo piden, es falsa. Si es de verdad, ve al paso 3.email.apple.com - Comprobación de seguridad: Ajustes > Privacidad y seguridad > Comprobación de seguridad > Gestionar accesos y datos compartidos. Enseña quién ve tu ubicación y tus cosas, y qué aparatos están en tu cuenta. "Restablecimiento de emergencia" corta todos los accesos de golpe.
- Perfiles: Ajustes > General > VPN y gestión de dispositivos. Si no aparece nada, no tienes ninguno instalado, que es lo normal en un móvil personal. Si hay un perfil que no reconoces, saca una foto y pregunta antes de borrarlo. Si el móvil es de la empresa o del centro de estudios, puede ser suyo.
- Face ID: Ajustes > Face ID y código. Si hay una "apariencia alternativa" que no es tuya, otra persona puede desbloquearlo. Cambia también el código si alguien lo conoce.
- Apps: baja hasta la Biblioteca de apps, escribe en el buscador y repasa la lista. Busca lo que no recuerdes haber instalado.
- Actualiza: Ajustes > General > Actualización de software. Si no hay sospecha fuerte, es de lo mejor que puedes hacer.
- Si corres riesgo alto: Ajustes > Privacidad y seguridad > Modo de aislamiento. Limita bastantes cosas del móvil, pero es la defensa más fuerte que tiene frente al spyware de pago.
Android, 7 pasos
Los menús cambian según la marca. Si no encuentras algo, usa el buscador de arriba en Ajustes.
- Play Protect: en Play Store, icono de tu perfil > Play Protect > Ajustes. Comprueba que sigue activado y lanza un análisis. Si está apagado y no lo apagaste tú, mala señal.
- Accesibilidad: Ajustes > Accesibilidad, en el apartado de apps instaladas o descargadas. Este permiso deja leer la pantalla y es el favorito de las apps espía. Si hay una que no conoces, ojo.
- Administradores: en Ajustes > Seguridad, busca "administración de dispositivos". En un móvil personal debería estar solo lo de Google o la marca.
- Permisos especiales: en Ajustes > Aplicaciones > Acceso especial, mira "Acceso a notificaciones" e "Instalar aplicaciones desconocidas".
- Apps: en Ajustes > Aplicaciones, muestra todas, también las del sistema. Desconfía de nombres vacíos o genéricos, como "Sync", "Service" o "System", sin icono y con permisos de micro, ubicación o SMS. Si dudas, búscala desde otro aparato.
- Depuración USB: si en Opciones de desarrollador está activada y no fuiste tú, es una señal.
- Si corres riesgo alto: en Ajustes > Seguridad y privacidad > Otros ajustes > Protección Avanzada, si tu móvil lo tiene (Android 16 o superior).
Ordenador, 5 pasos
- Control remoto: busca en tus programas TeamViewer, AnyDesk o parecidos que no hayas instalado tú. Son normales, pero con ellos se puede manejar tu ordenador desde fuera. Windows: Configuración > Aplicaciones > Aplicaciones instaladas. Mac: carpeta Aplicaciones.
- Lo que arranca solo: Windows: Administrador de tareas > Aplicaciones de arranque. Mac: Ajustes del Sistema > General, en los elementos de inicio. Busca lo que no reconozcas.
- Gestión remota en Mac: Ajustes del Sistema > General > Gestión de dispositivos. Si el Mac es personal, no debería aparecer nada.
- Análisis: en Windows, Seguridad de Windows > Protección contra virus y amenazas y lanza un examen completo. Mira en las extensiones del navegador si hay alguna que no pusiste tú.
- Actualiza el sistema y el navegador, salvo que tengas sospecha fuerte.
Si quieres ir un paso más allá, Zero Breach Toolkit busca trazas de spyware conocido en el ordenador y no sube nada a internet. Solo mira ese ordenador: no te dice si el móvil está infectado.
↑ Volver a elegir aparato2.4 Qué hacer con lo que has visto
No garantiza que estés limpia. Si no tienes motivos para pensar que van a por ti, actualiza, usa contraseñas distintas y verificación en dos pasos.
Saca capturas con fecha y cierra esa sesión. Si no te queda claro, ve a pedir ayuda.
Para ahí. No borres ni restaures nada y pide ayuda.
2.5 Déjalo más difícil para la próxima
Rutina de 10 minutosHazla de vez en cuando.
- Reinicia el móvil.
- Instala las actualizaciones pendientes, del sistema y de las apps.
- Repasa los dispositivos vinculados de WhatsApp, Signal, Telegram y Google.
- Usa un código de desbloqueo largo, no un patrón ni cuatro cifras.
- Borra las apps que ya no usas.
Blinda tus cuentasContraseñas, llaves y robo del móvil.
- Evita el SMS como segundo factor si tienes otra opción: es el más débil (se abre en otra pestaña). Mejor una passkey o una app de códigos.
- Llaves físicas si corres riesgo: registra dos, porque si pierdes la única te quedas fuera.
- iPhone robado: activa la Protección en caso de robo (se abre en otra pestaña) en Ajustes > Face ID y código.
- Antes de la huelga o de una mani, mira esta parte.
Pide ayuda
Puedes venir directa aquí, sin hacer lo anterior.
3.1 Líneas de ayuda
| Quién | Para qué |
|---|---|
| Access Now, Digital Security Helpline (se abre en otra pestaña) | Activistas, periodistas, defensoras de derechos humanos y colectivos. Gratis, 24 horas, también en castellano. Hacen una comprobación previa de quién eres. |
| Amnistía Internacional, Security Lab (se abre en otra pestaña) | Periodistas, activistas y organizaciones en riesgo por ataques dirigidos. |
| INCIBE (se abre en otra pestaña): 017 |
|
3.2 Guías para seguir, en castellano
- Kit de primeros auxilios digitales (se abre en otra pestaña): te guía según lo que te pase.
- Guías de autodefensa digital de TeknoKasa (se abre en otra pestaña), de Madrid: bloqueo del móvil, detención y más.
- Evalúa tus riesgos (se abre en otra pestaña), de la EFF: seis preguntas para hacer tu plan.
- Spyware mercenario (se abre en otra pestaña), de SocialTIC.
- Data Detox Kit (se abre en otra pestaña), de Tactical Tech.
- Autocuidado para quien pasa por esto (se abre en otra pestaña), del mismo kit.
3.3 Puntos de encuentro
Estamos preparando puntos para revisar móviles en persona. Los publicaremos aquí.
Si vas a un punto de encuentro
- Trae el móvil cargado, su cable, el código de desbloqueo en la cabeza y una lista de lo que te ha pasado, con fechas.
- Tienes derecho a ver todo lo que se hace y a decir que no.
- Nadie necesita tus contraseñas. Las pones tú.
- Pregunta qué datos se copian, dónde se guardan y cuándo se borran.
- Desconfía de quien te ofrezca por internet "limpiarte el móvil": es un timo clásico.
Cómo apuntar lo que pasaUna plantilla para no perder las pruebas.
Te sirve para ti y para quien te ayude. Copia esto en un papel o en un aparato de confianza, con una línea por cada cosa rara:
Fecha y hora: Aparato o cuenta: Qué ha pasado: Número, correo o enlace implicado: Captura guardada (dónde): A quién se lo he contado:
- Saca las capturas antes de bloquear o denunciar una cuenta: después puede desaparecer.
- No abras enlaces sospechosos para ver qué son. Copia el texto sin pulsarlo.
- Guarda una copia cifrada. Si te abruma, pide a alguien de confianza que lo lleve.
- Para denunciar en España, esta guía (se abre en otra pestaña) explica cómo presentar las pruebas.
Zona techie: el laboratorio
Para hacklabs y para quien quiera aprender.
Esta parte es para montar el laboratorio. Para revisar tu móvil no hace falta. Los comandos no arreglan nada por sí solos: un "limpio" no significa limpio y una coincidencia no significa infección.
Consentimiento.
- Solo con tu móvil o con el de alguien que te lo pide y está delante.
- Analizar el de otra persona sin permiso puede ser delito.
- La licencia de MVT lo prohíbe de forma expresa.
MVT + AndroidQF (se abre en otra pestaña)
PiRogue Tool Suite (se abre en otra pestaña)
Rayhunter (se abre en otra pestaña)Logos de sus respectivos proyectos, solo para identificarlos. Este hacklab no tiene relación con ellos.
Qué es cada herramienta
| Herramienta | Qué hace | Para quién |
|---|---|---|
| Zero Breach Toolkit | Busca trazas publicadas de spyware en ordenadores, en copias de iPhone y en lo recogido de Android. Tiene ventana y da el resultado en lenguaje normal. | Primer filtro, con poco nivel técnico. |
| MVT (Amnistía) | Análisis forense: extrae registros y los compara con listas de indicadores. | Terminal. El propio proyecto dice que no es para autodiagnóstico. |
| PiRogue (PTS) | Una Raspberry Pi hace de router y analiza el tráfico del móvil. No mira dentro del teléfono: mira con quién habla. | Para saber de redes. |
Se complementan: las dos primeras miran lo que queda guardado en el aparato y PiRogue lo que hace en la red mientras lo observas.
Cómo montar el puestoLo primero, antes de tocar ningún móvil.
- Un portátil de confianza con el disco cifrado, dedicado si puede ser. Si el ordenador está comprometido, lo está todo.
- Las copias contienen la vida entera de la persona: mensajes, fotos, historial. Se quedan en local y cifradas, y se borran cuando ella lo decida.
- Nada a la nube ni a servicios de análisis online sin que lo autorice.
- Actualiza los indicadores el mismo día. Con listas viejas, el resultado no vale.
- Ante un positivo creíble, deja de tocar y pasa el caso a Security Lab o a Access Now.
Triaje de un casoQué hacer y en qué orden.
╔════════════════════╗ ╔════════╗ ╔═══════════════════╗ ╔══════════╗ ╔═════════════╗ ╔══════════════╗ ║ CASO ║ ║ IOC ║ ║ ADQUIRIR ║ ║ HASH ║ ║ ANALIZAR ║ ║ ESCALAR ║ ╟────────────────────╢ ╟────────╢ móvil ╟───────────────────╢ ╟──────────╢ ╟─────────────╢ si hay duda ╟──────────────╢ ║ consentimiento ║─────▶║ al día ║──────────▶║ copia o AndroidQF ║─────▶║ custodia ║─────▶║ 1 cobertura ║────────────────▶║ Access Now ║ ║ hipótesis y fechas ║ ╚════════╝ ╚═══════════════════╝ ╚══════════╝ ║ 2 alertas ║ ║ Security Lab ║ ╚════════════════════╝ ╚═════════════╝ ╚══════════════╝
╔════════════════════╗
║ CASO ║
╟────────────────────╢
║ consentimiento ║
║ hipótesis y fechas ║
╚════════════════════╝
│
▼
╔════════╗
║ IOC ║
╟────────╢
║ al día ║
╚════════╝
│ móvil
▼
╔═══════════════════╗
║ ADQUIRIR ║
╟───────────────────╢
║ copia o AndroidQF ║
╚═══════════════════╝
│
▼
╔══════════╗
║ HASH ║
╟──────────╢
║ custodia ║
╚══════════╝
│
▼
╔═════════════╗
║ ANALIZAR ║
╟─────────────╢
║ 1 cobertura ║
║ 2 alertas ║
╚═════════════╝
│ si hay duda
▼
╔══════════════╗
║ ESCALAR ║
╟──────────────╢
║ Access Now ║
║ Security Lab ║
╚══════════════╝
Orden propuesto por este hacklab a partir de las fuentes. Ninguna fija un orden único.
- Antes de tocar nada. Consentimiento explícito, a quién teme y desde cuándo. Fechas: aviso de Apple, mensaje raro, detención, móvil retenido. Sin hipótesis ni fechas, la línea temporal no dice nada.
- Riesgo alto o aviso oficial. Pasa directamente a Access Now o a Security Lab. No hace falta analizar antes para pedir ayuda.
- No lo toques más de lo necesario. Criterio nuestro: ni restablecer, ni actualizar, ni desinstalar antes de adquirir. El historial de Safari dura pocos meses, y restablecer ajustes puede borrar trazas.
- Indicadores al día, en tu máquina y antes de conectar el móvil.
- Adquiere primero, analiza después. Lo adquirido se puede reanalizar cuando salgan indicadores nuevos. El móvil ya no estará igual.
- Calcula hashes nada más terminar.
- Analiza y mira primero la cobertura: qué no se ha podido leer. Luego las alertas.
- Red al final. PiRogue exige días de uso con solo wifi. Sirve si sospechas actividad presente, y una captura limpia no dice nada del pasado.
iPhone
pymobiledevice3 usbmux list pymobiledevice3 lockdown info mkdir -p ./caso/copia pymobiledevice3 backup2 backup --full ./caso/copia/
Cifrada siempre: sin cifrar faltan el historial y el estado de Safari, y las llamadas. Si sospechas acceso físico, una copia no basta porque no contiene esos registros: hace falta sysdiagnose o extracción, mejor en manos expertas. mvt-ios check-sysdiagnose sin plugins solo saca datos del aparato, y lo avisa.
Android
sha256sum -c --ignore-missing checksums.txt chmod +x androidqf_linux_amd64_1.8.3 ./androidqf_linux_amd64_1.8.3 -output ./caso
Respuestas razonables. Backup: Only SMS. Apps: Only non-system packages. Quitar firmadas con certificado de confianza: No. Hash en el móvil: No, porque es lento y puede parar el recolector. Intrusion Logs: Yes solo si estaban activados.
Intrusion Logs: DNS y conexiones por app, arranques de procesos, comandos ADB. Android 16 o superior, de momento en Pixel según Security Lab (mayo de 2026), con Protección Avanzada. No son retroactivos: hay que activarlos antes. Contienen historial de navegación.
Fuentes: MVT iOS (se abre en otra pestaña), MVT Android (se abre en otra pestaña), AndroidQF (se abre en otra pestaña), Security Lab (se abre en otra pestaña), Zero Breach (se abre en otra pestaña).
Cadena de custodia y hashesQuién tocó qué, cuándo y con qué.
Sirve para dos cosas: que otra analista pueda confiar en tu copia y, si el caso acaba en un juzgado, demostrar que no se ha alterado. Sobre su validez legal, pregunta a una abogada antes de empezar.
Registro
caso: 2026-001 persona: (seudónimo; la clave, aparte) consentimiento: fecha, alcance, quién lo recoge aparato: modelo, SO, parche, ¿desbloqueado por ella? cuándo quién rol acción hash 2026-11-06 ana analista recibe y hace copia - 2026-11-06 ana analista sha256 de la copia ab12... 2026-11-07 ana analista entrega a línea ayuda ab12...
Un identificador por aparato, una línea por cada persona que lo maneje, precinto si se queda contigo. Hora en UTC. Anota también las versiones de las herramientas.
iPhone
cd ./caso/copia/<UDID> find . -type f -print0 | sort -z | xargs -0 sha256sum > ../copia.sha256 sha256sum -c --quiet ../copia.sha256
decrypt-backup y check-backup aceptan --hashes: guarda el SHA-256 de cada fichero en info.json e imprime el hash de ese info.json. Anótalo.
Android
AndroidQF deja dentro del ZIP un hashes.csv (entrada y SHA-256 del contenido, sin cabecera) y acquisition.json con el estado de cada módulo.
sha256sum <UUID>.zip >> caso.sha256
unzip -q <UUID>.zip -d adq/ && cd adq/
python3 -c "
import csv,hashlib
for n,h in csv.reader(open('hashes.csv')):
if hashlib.sha256(open(n,'rb').read()).hexdigest()!=h: print('MAL',n)"
jq -r '.module_results[]|select(.status!="completed")|[.name,.status,.error]|@tsv' acquisition.json
Si la comprobación no imprime nada, todo coincide. hashes.csv va dentro del propio archivo y no protege contra quien rehaga el ZIP: por eso el hash externo, guardado en otro sitio. Un módulo partial o failed significa adquisición incompleta, y eso va al informe.
Cifrar desde el origen
age-keygen -o privada.txt # en otra máquina; no viaja contigo # la clave pública (age1...) va a key.txt, junto al binario ./androidqf_linux_amd64_1.8.3 -output ./caso age --decrypt -i privada.txt -o <UUID>.zip <UUID>.zip.age
Con key.txt, AndroidQF escribe <UUID>.zip.age y no deja ZIP en claro. Quien lleva el portátil no puede descifrar aunque la obliguen. Sin cifrado, un fallo puede dejar temporales en claro.
Compartir y borrar
- Pregunta a la línea de ayuda cómo quiere recibirlo.
- Marca con TLP hasta dónde se comparte y con PAP qué se puede hacer con ello. PAP:RED: nada detectable desde fuera.
- Firma separada para demostrar origen:
gpg --detach-sign caso.sha256. - Al borrar, PTS indica
shred -u. En SSD no te fíes de él: lo que protege es el disco cifrado.
Fuentes: PTS g6 (se abre en otra pestaña), PTS g4 (se abre en otra pestaña), Colander: custodia (se abre en otra pestaña), AndroidQF: archivos (se abre en otra pestaña).
Zero Breach ToolkitPrimer filtro. Tiene ventana.
Proyecto muy joven y anónimo. El repositorio se creó en octubre de 2026, su README dice que el proyecto es anónimo y no hemos encontrado ninguna auditoría independiente. Las versiones 2.0.0 a 2.0.2 podían dar en verde sin haber terminado de comprobar un móvil: repite con la última estable. Hay repositorios con nombres parecidos. Descarga solo de interplains/Zero-Breach-Toolkit (se abre en otra pestaña).
Instalación. Baja el programa de tu sistema (Windows, Mac o Linux) y ábrelo. Como aún no está firmado, el sistema y algunos antivirus avisarán. Comprueba antes su origen:
gh attestation verify <archivo> --repo interplains/Zero-Breach-Toolkit gpg --verify SHA256SUMS.txt.asc SHA256SUMS.txt sha256sum -c SHA256SUMS.txt
Actualiza las listas de indicadores antes de lanzar la comprobación. El análisis no sube nada a internet.
Ordenador. Cierra los navegadores y las apps de mensajería, elige la comprobación "Standard" (15 o 20 minutos) y pulsa "Start check".
iPhone. Se analiza una copia en el ordenador, nunca en el propio móvil. Conéctalo, pulsa Confiar y haz una copia marcando "Encriptar copia local" (Finder en Mac, Apple Devices en Windows). En el programa elige "A phone" y arrastra la carpeta de la copia, que está aquí:
Mac: ~/Library/Application Support/MobileSync/Backup Windows: %USERPROFILE%\Apple\MobileSync\Backup
Android. Activa las Opciones de desarrollador (pulsa siete veces en Número de compilación) y la Depuración USB. Conecta con un cable de datos y autoriza el ordenador. En el programa, "A phone" y la opción de recoger desde Android por USB. Mantén el móvil desbloqueado. Al terminar, apaga la Depuración USB.
La recogida guiada de Android es experimental. Responde: Backup, Only SMS; Apps, Only non-system; Remove trusted, No; el resto, No. Acepta "Back up my data" en el móvil.
Cómo leerlo
No aparece nada de las listas públicas en los sitios que ha podido leer. Revisa la lista de lo que no ha podido comprobar. El spyware sin trazas publicadas no sale.
Significa "mira más de cerca", no "estás infectada". No borres nada ni visites la dirección que indica. Guarda el informe y pásaselo a la línea de ayuda. Un dominio compartido puede dar coincidencias inocentes.
MVT (Mobile Verification Toolkit)Análisis forense por terminal.
Pide Python 3.11 o superior y Linux o Mac. En Windows, por WSL. Su licencia es propia y restringe el uso sin consentimiento, así que no es software libre en sentido estricto.
sudo apt install python3 python3-venv python3-pip sqlite3 libusb-1.0-0 pipx pipx ensurepath pipx install mvt mvt download-iocs
Tras pipx ensurepath, abre otra terminal. MVT pide Python 3.11, así que Ubuntu 22.04 no sirve de serie.
MVT sale a la red por defecto: sigue los enlaces acortados, lo que puede tocar la infraestructura del enlace recibido. Apágalo así:
export MVT_NETWORK_ACCESS_ALLOWED=false
iPhone
Con copia cifrada se ven más registros, como el historial de Safari. Puedes hacerla desde Finder o Apple Devices, o por terminal:
sudo apt install usbmuxd pipx install pymobiledevice3 pymobiledevice3 lockdown pair pymobiledevice3 backup2 encryption on 'CONTRASEÑA' pymobiledevice3 backup2 backup --full ./copia/
Si ya tenía contraseña de copia, usa esa. Restablecer ajustes, solo como último recurso: puede borrar trazas.
Esa contraseña se queda en el historial de la shell: bórrala después. Mantén el móvil desbloqueado. La copia aparece en una subcarpeta con el UDID del móvil. Para descifrarla y analizarla:
read -rs MVT_IOS_BACKUP_PASSWORD; export MVT_IOS_BACKUP_PASSWORD mvt-ios decrypt-backup -d ./descifrada ./copia/<UDID> unset MVT_IOS_BACKUP_PASSWORD mvt-ios check-backup --output ./salida ./descifrada
Android
MVT ya no analiza por ADB directamente. La recogida se hace con AndroidQF (se abre en otra pestaña): activa la Depuración USB, autoriza el ordenador, ejecuta el binario y responde a lo que pregunta. Luego:
unzip <UUID>.zip -d adq/ mvt-android check-androidqf --output ./salida ./adq
Extrae siempre el ZIP de AndroidQF y usa --output. En una prueba con datos sintéticos, pasar el ZIP directamente dio 0 alertas y sin aviso claro. No se ha confirmado con un móvil real.
La opción --virustotal está apagada por defecto. Envía hashes de las APK que no son de sistema, y requiere MVT_VT_API_KEY. Déjala apagada salvo que la persona lo acepte.
PiRogue Tool SuiteRaspberry Pi que analiza el tráfico.
Es una Raspberry Pi que crea una wifi. Conectas el móvil a ella y la Pi analiza en directo todo el tráfico con Suricata, usando reglas de ProofPoint ET Open y los indicadores de stalkerware de Echap.
Material: para tener alertas, Raspberry Pi 4 de 4 u 8 GB: la 3B, la 3B+ y la Pi 4 de 1 o 2 GB no ejecutan Suricata. Admite 2 o 3 móviles. La Pi 5 usa una imagen experimental aparte. También puede ser un PC o virtualizada. Fuente de alimentación, microSD de 32 GB (64 GB para capturas largas) y cable de red.
Instalación
Baja la imagen de PiRogue OS desde la guía oficial (se abre en otra pestaña), comprueba el hash y grábala con Balena Etcher. Conecta la Pi por cable y entra:
sha256sum PiRogue-OS-*.img.xz # contraseña inicial: raspberry, cámbiala al entrar ssh pi@pirogue.local sudo apt update sudo apt dist-upgrade -y sudo apt install pirogue-base -y sudo reboot
Durante la instalación responde No a guardar las reglas de cortafuegos IPv4 e IPv6, y Sí a la captura sin root. Luego saca la clave de la wifi y la del panel (en la versión 2.x son aleatorias; la 1.x es distinta, lo explica la guía):
pirogue-admin-client wifi get-configuration pirogue-admin-client dashboard get-configuration
El panel está en https://pirogue.local/, con certificado autofirmado. La telemetría viene activada de serie: envía a diario ID, ASN, país y sistema operativo. Apágala antes de meter el móvil de nadie:
sudo pirogue-telemetry config disable
Para MVT, sigue docs.mvt.re (se abre en otra pestaña): la guía g7 de PTS usa comandos ya eliminados.
Captura
Arranca la captura antes de encender la wifi del móvil, o perderás las primeras conexiones. En el móvil, modo avión, solo wifi y sin VPN. Los flujos aparecen en el panel a los 4 minutos, más o menos. Déjalo unos 3 días con uso normal. El panel guarda 5 días.
Para capturar a archivo y abrirlo luego en Wireshark:
sudo tcpdump -i wlan0 -w $(date +%Y%m%d%H%M)_captura.pcap scp pi@pirogue.local:~/*_captura.pcap .
Qué significa
- Alertas de seguridad: miras la hora, la gravedad, el tipo de amenaza, el nombre de la regla y las IP de origen y destino. Muchas son ruido, como publicidad o rastreadores. Lee la regla antes de sacar conclusiones.
- Lista de flujos y mapa: busca dominios raros, envíos grandes de datos a horas muertas o conexiones regulares con el móvil en reposo. Comprueba de quién es cada destino. La mayoría serán Apple, Google y las apps de siempre.
- Límites: casi todo va cifrado, así que ves a quién se conecta y cuánto, no el contenido. Suricata solo detecta lo ya conocido. Sin alertas no hay garantía de nada.
- Privacidad: la captura retrata la vida de la persona. Se trata como cualquier otra copia: en local, cifrada y borrada al acabar.
El propio proyecto recomienda que, en situaciones de riesgo, el análisis lo sigan profesionales. Guías de PTS (se abre en otra pestaña)
Indicadores: de dónde salen y cómo se usanSTIX2, actualización y límites.
╔════════════════════════╗ ╔═════════════════╗ ║ INVESTIGACIONES ║ STIX2 ║ mvt-indicators ║ ╔═══════════════════╗ ╔═════╗ ╟────────────────────────╢──────────▶╟─────────────────╢─────▶║ mvt download-iocs ║─────▶║ MVT ║ ║ Amnistía, Echap, otras ║ ║ indicators.yaml ║ ╚═══════════════════╝ ╚═════╝ ╚════════════════════════╝ ╚═════════════════╝
╔════════════════════════╗
║ INVESTIGACIONES ║
╟────────────────────────╢
║ Amnistía, Echap, otras ║
╚════════════════════════╝
│ STIX2
▼
╔═════════════════╗
║ mvt-indicators ║
╟─────────────────╢
║ indicators.yaml ║
╚═════════════════╝
│
▼
╔═══════════════════╗
║ mvt download-iocs ║
╚═══════════════════╝
│
▼
╔═════╗
║ MVT ║
╚═════╝╔═════════════════╗ a diario ╔════════════════╗ ╔══════════╗ ║ ET OPEN + ECHAP ║─────────────▶║ suricata.rules ║─────▶║ SURICATA ║ ╚═════════════════╝ ╚════════════════╝ ╚══════════╝
╔═════════════════╗
║ ET OPEN + ECHAP ║
╚═════════════════╝
│ a diario
▼
╔════════════════╗
║ suricata.rules ║
╚════════════════╝
│
▼
╔══════════╗
║ SURICATA ║
╚══════════╝
Un indicador es un dato concreto publicado tras una investigación: dominio, nombre de proceso, hash, ID de app. Que no aparezca solo significa que no aparece.
- mvt-indicators (se abre en otra pestaña): la lista que descarga MVT. Pegasus, Predator, RCS Lab, stalkerware y otras.
- AmnestyTech/investigations (se abre en otra pestaña): los de las investigaciones de Amnistía.
- Echap (se abre en otra pestaña): stalkerware. También alimenta las reglas de PiRogue.
mvt download-iocs # en Linux: ~/.local/share/mvt/indicators; se cargan solos mvt-ios check-backup --iocs caso.stix2 --output ./salida ./descifrada export MVT_STIX2="/ruta/uno.stix2:/ruta/dos.stix2" mvt-ios check-iocs --iocs nuevo.stix2 ./salida # sobre resultados ya extraídos
En Android, para aplicar indicadores nuevos, repite check-androidqf sobre la adquisición guardada.
Sin red. MVT resuelve enlaces acortados con una petición HEAD y comprueba versión e indicadores:
export MVT_NETWORK_ACCESS_ALLOWED=false mvt-ios --disable-update-check --disable-indicator-update-check check-backup ...
STIX2 propio
MVT implementa un subconjunto: un valor por patrón, sin expresiones booleanas. Tipos: domain-name:value, url:value, process:name, email-addr:value, file:name, file:path, file:hashes.md5/.sha1/.sha256, app:id, configuration-profile:id, android-property:name. Cada módulo solo usa los que le afectan.
{"type":"bundle","id":"bundle--11111111-1111-4111-8111-111111111111","objects":[
{"type":"malware","spec_version":"2.1","id":"malware--22222222-2222-4222-8222-222222222222",
"created":"2026-11-06T00:00:00.000Z","modified":"2026-11-06T00:00:00.000Z",
"name":"caso-prueba","is_family":false},
{"type":"indicator","spec_version":"2.1","id":"indicator--33333333-3333-4333-8333-333333333333",
"created":"2026-11-06T00:00:00.000Z","modified":"2026-11-06T00:00:00.000Z",
"pattern":"[app:id='com.ejemplo.sospechosa']","pattern_type":"stix",
"valid_from":"2026-11-06T00:00:00.000Z","indicator_types":["malicious-activity"]},
{"type":"relationship","spec_version":"2.1","id":"relationship--44444444-4444-4444-8444-444444444444",
"created":"2026-11-06T00:00:00.000Z","modified":"2026-11-06T00:00:00.000Z",
"relationship_type":"indicates",
"source_ref":"indicator--33333333-3333-4333-8333-333333333333",
"target_ref":"malware--22222222-2222-4222-8222-222222222222"}
]}
La colección toma el nombre del objeto malware y sale en la alerta. Colander también puede exportar un feed STIX2.
Fuentes: MVT: IOCs (se abre en otra pestaña), PTS g7 (solo la parte de Colander) (se abre en otra pestaña).
Cómo leer la salida de MVTFicheros reales y qué significa cada módulo.
╔═════════════════╗
╔═══════════════╗ ╔════════════════╗ ╔═══════════════╗ ║ SALIDA ║
╔════════╗ ║ COPIA CIFRADA ║ ║ DESCIFRAR ║ ║ CHECK-BACKUP ║ ╟─────────────────╢
║ IPHONE ║ USB ╟───────────────╢ ╟────────────────╢ ╟───────────────╢ ║ alerts.json ║
╚════════╝────────▶║ backup2 ║─────▶║ decrypt-backup ║─────▶║ + indicadores ║─────▶║ timeline.csv ║
║ <UDID>/ ║ ╚════════════════╝ ╚═══════════════╝ ║ *_detected.json ║
╚═══════════════╝ ║ command.log ║
╚═════════════════╝ ╔════════╗
║ IPHONE ║
╚════════╝
│ USB
▼
╔═══════════════╗
║ COPIA CIFRADA ║
╟───────────────╢
║ backup2 ║
║ <UDID>/ ║
╚═══════════════╝
│
▼
╔════════════════╗
║ DESCIFRAR ║
╟────────────────╢
║ decrypt-backup ║
╚════════════════╝
│
▼
╔═══════════════╗
║ CHECK-BACKUP ║
╟───────────────╢
║ + indicadores ║
╚═══════════════╝
│
▼
╔═════════════════╗
║ SALIDA ║
╟─────────────────╢
║ alerts.json ║
║ timeline.csv ║
║ *_detected.json ║
║ command.log ║
╚═════════════════╝
╔════════════════╗ ╔═════════════╗ ╔══════════════════╗ ╔══════════════════╗ ╔═════════════╗
║ ANDROID ║ ║ ANDROIDQF ║ ║ <UUID>.zip[.age] ║ ║ CHECK-ANDROIDQF ║ ║ SALIDA ║
╟────────────────╢ adb ╟─────────────╢ ╟──────────────────╢ extraer ╟──────────────────╢ ╟─────────────╢
║ depuración USB ║────────▶║ recolector ║─────▶║ hashes.csv ║────────────▶║ carpeta extraída ║─────▶║ alerts.json ║
╚════════════════╝ ║ en el móvil ║ ║ acquisition.json ║ ║ + indicadores ║ ║ command.log ║
╚═════════════╝ ╚══════════════════╝ ╚══════════════════╝ ╚═════════════╝ ╔════════════════╗
║ ANDROID ║
╟────────────────╢
║ depuración USB ║
╚════════════════╝
│ adb
▼
╔═════════════╗
║ ANDROIDQF ║
╟─────────────╢
║ recolector ║
║ en el móvil ║
╚═════════════╝
│
▼
╔══════════════════╗
║ <UUID>.zip[.age] ║
╟──────────────────╢
║ hashes.csv ║
║ acquisition.json ║
╚══════════════════╝
│ extraer
▼
╔══════════════════╗
║ CHECK-ANDROIDQF ║
╟──────────────────╢
║ carpeta extraída ║
║ + indicadores ║
╚══════════════════╝
│
▼
╔═════════════╗
║ SALIDA ║
╟─────────────╢
║ alerts.json ║
║ command.log ║
╚═════════════╝
Primero: ¿ha leído algo?
grep -E 'not found|ERROR|WARNING' salida/command.log jq -r '.[]|select(.missing==true)|.relative_path' salida/manifest.json | head
Un módulo que no encuentra su fichero termina diciendo no detections, igual que uno limpio. En iPhone, "missing": true marca lo que la copia no adquirió. Con AndroidQF, extrae el ZIP y pasa la carpeta: en nuestra prueba con un ZIP sintético, pasarlo directamente dio 0 alertas.
Los ficheros
alerts.json: todas las alertas. Empieza aquí. Solo existe si hubo alguna.alerts_timeline.csv: las alertas por fecha. Sustituye al antiguotimeline_detected.csv.timeline.csv: todo, por fecha. Aquí se entiende una alerta: qué pasó antes y después. iOS en UTC; Android, hora local.<módulo>.jsony<módulo>_detected.json: lo extraído y lo que coincide.urls.json: enlaces de SMS, iMessage y WhatsApp, con su destino si se resolvió.info.json: versión de MVT, fecha, indicadores usados y, con--hashes, hashes.command.log: registro completo. Va con el informe.
Niveles
CRITICAL es, en general, coincidencia con un indicador: mira matched_indicator. HIGH: por ejemplo, VirusTotal. MEDIUM suele ser heurística: una app instalada por ADB, una redirección rápida, un ajuste. INFO y LOW son contexto. MVT lo dice en su salida: solo la revisión experta confirma, y que falten alertas no es un certificado de salud.
jq -r '.[]|[.level,.module,.event_time,.message]|@tsv' salida/alerts.json | sort jq '.[]|select(.level=="CRITICAL")|.matched_indicator' salida/alerts.json
iPhone: módulos que importan
datausage: procesos con actividad de red, enDataUsage.sqlite. No registra tráfico wifi. Está en la copia.netusagesolo en sistema de archivos.os_analytics_ad_daily: uso de datos por proceso, otra fuente para fechar ejecuciones.safari_history,safari_browser_state: solo con copia cifrada. Avisa de redirecciones HTTP a otro dominio en menos de un segundo.webkit_session_resource_log,webkit_resource_load_statistics: dominios cargados, incluidos intermedios.sms,sms_attachments,whatsapp: enlaces y adjuntos.id_status_cache: cuentas de iMessage y FaceTime consultadas. Vacío o ausente desde iOS 14.7.configuration_profiles,profile_events,applications,tcc: perfiles, apps de fuera de la App Store, permisos.global_preferences: si el Modo de aislamiento está activo.backup_info: modelo y versión.manifest: índice de la copia, con rutas y fechas.- Solo con sistema de archivos:
shutdown_log,cache_files,analytics,safari_favicon,webkit_indexeddb,webkit_local_storage.
Android: módulos que importan
aqf_packages: compara nombre, hash y certificado. Avisa de apps instaladas por navegador o ADB, paquetes de root y seguridad desactivada.aqf_settings: Play Protect apagado, accesibilidad, informes desactivados. Cuando Android lo registra, dice quién cambió cada ajuste.aqf_get_prop: parche de seguridad.root_binaries,mounts: rastros de root.aqf_processes: leeps.txt, pero AndroidQF 1.8.3 escribeprocesses.json. Hasta aclararlo, revisa ese fichero a mano.dns_event,connect_event,security_event: Intrusion Logs, si los hay. DNS y conexiones llevanpackage_name.
Fuentes: MVT: registros iOS (se abre en otra pestaña), Intrusion Logs (se abre en otra pestaña), código de MVT (se abre en otra pestaña).
Trazas de Pegasus según AmnistíaLo documentado hasta 2021. Para entender, no para diagnosticar.
Léelo como historia documentada. El informe es de 2021 y las trazas cambian. Buscar estos nombres a mano no es un método: para eso están los indicadores. Lo útil es la lógica: varias trazas independientes que encajan en el tiempo con la historia de la persona.
Procesos
iOS guarda procesos con actividad de red en DataUsage.sqlite (está en la copia) y netusage.sqlite (no está). Solo aparecen los que usaron la red. Amnistía encontró un proceso bh justo después de visitas a dominios de instalación de Pegasus, y comprobó que no había binarios legítimos con ese nombre en las versiones recientes de iOS de entonces.
La mayoría imita a servicios reales: fmld por fmfd, aggregatenotd por aggregated, launchafd por launchd, nehelprd por nehelper, roleaccountd por xpcroleaccountd. Por eso importa la grafía exacta.
jq -r '.[]|select(.bundle_id==null or .bundle_id=="")|[.first_isodate,.isodate,.proc_name]|@tsv' salida/datausage.json | sort -u
Según MVT, los procesos sin bundle_id válido pueden merecer atención. Es un listado para cruzar, no un resultado.
Registros borrados a medias
Pegasus borró nombres de ZPROCESS sin borrar las filas de ZLIVEUSAGE: quedan filas de uso que apuntan a un proceso que no existe. Amnistía lo vio siempre junto a otros indicadores, y nunca en los iPhones limpios que analizó. Sirve para fechar. No es prueba por sí solo.
jq -r '.[]|select(.proc_name==null or .proc_name=="")|[.live_isodate,.live_proc_id,.wwan_in,.wwan_out]|@tsv' salida/datausage.json # directo sobre la copia descifrada; fichero 0d/0d609c54856a9bb2d56729df1d68f2958a88426b SELECT l.Z_PK, l.ZHASPROCESS, datetime(l.ZTIMESTAMP+978307200,'unixepoch') FROM ZLIVEUSAGE l LEFT JOIN ZPROCESS p ON l.ZHASPROCESS=p.Z_PK WHERE p.Z_PK IS NULL;
Redirecciones de Safari
En la inyección de red, la persona pedía una web normal y el navegador acababa en otra: una visita a Yahoo saltó a bun54l2b67.get1tn0w.free247downloads[.]com:30495/szev4hz. Llamaba la atención por el subdominio de cuarto nivel, el puerto alto y la ruta aleatoria.
- El historial de Safari dura pocos meses y puede haberse purgado. Amnistía halló los mismos dominios en
Favicon.db, que MVT solo lee en sistema de archivos. - Safari no parece guardar la cadena completa: los dominios intermedios aparecen en los Session Resource logs (
webkit_session_resource_log). - También pasa fuera del navegador: un caso ocurrió al previsualizar un enlace dentro de la app de Twitter.
Otras pistas del informe
Library/Preferences/com.apple.CrashReporter.plistenRootDomain: aparece junto a infecciones, según Amnistía probablemente para cortar informes de fallos a Apple. Pista, no indicador.- Consultas a cuentas de iMessage desconocidas, en
idstatuscache, poco antes de los procesos. Vacío o ausente desde iOS 14.7. - Según Amnistía, Pegasus parecía haber dejado de ser persistente: el binario no se recupera del disco.
jq -r '.[]|select(.relative_path|test("CrashReporter"))|[.domain,.relative_path,.modified]|@tsv' salida/manifest.json
Android: Amnistía dice que hay bastantes menos trazas accesibles que en iOS, así que la ausencia de rastro pesa menos todavía.
Fuente: Amnistía: Forensic Methodology Report (se abre en otra pestaña).
Capturas y reglas SuricataDel panel al pcap.
╔═════════╗ ╔══════════════╗ ╔══════════╗ ╔═════════╗ ║ TRÁFICO ║ ║ NFSTREAM ║ ║ INFLUXDB ║ ║ GRAFANA ║ ╟─────────╢─────▶╟──────────────╢─────▶╟──────────╢─────▶╟─────────╢ ║ wlan0 ║ ║ flujos, nDPI ║ ║ 5 días ║ ║ panel ║ ╚═════════╝ ╚══════════════╝ ╚══════════╝ ╚═════════╝
╔═════════╗
║ TRÁFICO ║
╟─────────╢
║ wlan0 ║
╚═════════╝
│
▼
╔══════════════╗
║ NFSTREAM ║
╟──────────────╢
║ flujos, nDPI ║
╚══════════════╝
│
▼
╔══════════╗
║ INFLUXDB ║
╟──────────╢
║ 5 días ║
╚══════════╝
│
▼
╔═════════╗
║ GRAFANA ║
╟─────────╢
║ panel ║
╚═════════╝╔═════════╗ ╔════════════════╗ ╔══════════╗ ╔═════════╗ ║ TRÁFICO ║ ║ SURICATA ║ ║ INFLUXDB ║ ║ GRAFANA ║ ╟─────────╢─────▶╟────────────────╢─────▶╟──────────╢─────▶╟─────────╢ ║ wlan0 ║ ║ ET Open, Echap ║ ║ 5 días ║ ║ panel ║ ╚═════════╝ ╚════════════════╝ ╚══════════╝ ╚═════════╝
╔═════════╗
║ TRÁFICO ║
╟─────────╢
║ wlan0 ║
╚═════════╝
│
▼
╔════════════════╗
║ SURICATA ║
╟────────────────╢
║ ET Open, Echap ║
╚════════════════╝
│
▼
╔══════════╗
║ INFLUXDB ║
╟──────────╢
║ 5 días ║
╚══════════╝
│
▼
╔═════════╗
║ GRAFANA ║
╟─────────╢
║ panel ║
╚═════════╝╔═════════╗ ╔════════╗ ║ TRÁFICO ║ ╔═════════╗ ║ .pcap ║ ╟─────────╢─────▶║ TCPDUMP ║─────▶╟────────╢ ║ wlan0 ║ ╚═════════╝ ║ aparte ║ ╚═════════╝ ╚════════╝
╔═════════╗
║ TRÁFICO ║
╟─────────╢
║ wlan0 ║
╚═════════╝
│
▼
╔═════════╗
║ TCPDUMP ║
╚═════════╝
│
▼
╔════════╗
║ .pcap ║
╟────────╢
║ aparte ║
╚════════╝
NFStream agrega paquetes en flujos y clasifica con nDPI. Suricata alerta con reglas. Los dos escriben en InfluxDB y Grafana lo enseña. El panel borra a los 5 días: exporta antes.
Captura
tmux # que no muera con el SSH sudo tcpdump -i wlan0 -w $(date +%Y%m%d%H%M)_captura.pcap # ahora, wifi del móvil. Unos 3 días de uso normal. Ctrl+C para parar. sha256sum *_captura.pcap
Exportar alertas y flujos
influx -database 'suricata' -execute 'SELECT * FROM "suricata"."suricata_5d"."alert"' -format 'csv' > alertas.csv influx -database 'flows' -execute 'SELECT * FROM "flows"."flows_5d"."flow"' -format 'csv' > flujos.csv
Flujos: requested_server_name, dst_ip, application_name, src2dst_bytes, dst2src_bytes, community_id. Alertas: alert_signature, alert_signature_id, alert_severity, community_id. Ambas tablas tienen community_id: úsalo para cruzar una alerta con su flujo.
Mirar el pcap sin ir paquete a paquete
tshark -r c.pcap -Y 'dns.flags.response==0' -T fields -e frame.time_epoch -e dns.qry.name tshark -r c.pcap -Y 'tls.handshake.type==1' -T fields -e frame.time_epoch -e ip.dst -e tls.handshake.extensions_server_name tshark -r c.pcap -q -z conv,ip
- Saca dominios únicos y quita lo que reconoces: Apple, Google, las apps de la persona. Mira lo que queda.
- Busca regularidad con el móvil quieto y envíos desproporcionados:
src2dst_bytesalto. - El país del servidor no decide nada por sí solo. PTS lo plantea en relación con la persona y su modelo de amenaza.
- Con DNS cifrado verás menos nombres. Una IP en la nube tampoco dice de quién es.
Reglas
Están en /var/lib/suricata/rules/suricata.rules y se actualizan a diario: ET Open y las de PTS (se abre en otra pestaña) a partir de Echap. Suricata corre en modo IDS: avisa, no bloquea. Ante una alerta, busca su regla y léela:
grep -F 'sid:1000001;' /var/lib/suricata/rules/suricata.rules alert dns $HOME_NET any -> any any (msg:"PTS STALKERWARE TheTruthSpy (copy9[.]com)"; metadata: type stalkerware; dns.query; content:"copy9.com"; depth:9; nocase; endswith; fast_pattern; reference:url,github.com/AssoEchap/stalkerware-indicators; classtype:targeted-activity; sid:1000001; rev:1;)
Es una coincidencia de nombre en una consulta DNS, y solo eso. reference dice de dónde sale y classtype cómo se clasifica.
Para añadir reglas, no edites el fichero, que se sobrescribe. Publícalas en una URL:
sudo suricata-update add-source MIAS https://ejemplo.org/mias.rules sudo suricata-update sudo suricatasc -c reload-rules
Para reanalizar un pcap con reglas actuales:
mkdir -p suri/ sudo suricata -r c.pcap -S /var/lib/suricata/rules/suricata.rules -l suri/
Fuentes: arquitectura (se abre en otra pestaña), análisis de tráfico (se abre en otra pestaña), exportar (se abre en otra pestaña), reglas propias (se abre en otra pestaña), g2 (se abre en otra pestaña).
Descifrar el TLS de una app sospechosaEn un móvil de laboratorio. Nunca en el de la persona.
╔══════════════════╗ ╔═════════════════════════╗ ╔════════════════╗ ║ ANDROID ROOTEADO ║ ║ PIROGUE ║ ║ .pcap + CLAVES ║ ╟──────────────────╢ USB y wifi ╟─────────────────────────╢ ╟────────────────╢ ║ Frida ║───────────────▶║ pirogue-intercept-gated ║─────▶║ traffic.pcap ║ ║ solo laboratorio ║ ╚═════════════════════════╝ ║ sslkeylog.txt ║ ╚══════════════════╝ ╚════════════════╝
╔══════════════════╗
║ ANDROID ROOTEADO ║
╟──────────────────╢
║ Frida ║
║ solo laboratorio ║
╚══════════════════╝
│ USB y wifi
▼
╔═════════════════════════╗
║ PIROGUE ║
╟─────────────────────────╢
║ pirogue-intercept-gated ║
╚═════════════════════════╝
│
▼
╔════════════════╗
║ .pcap + CLAVES ║
╟────────────────╢
║ traffic.pcap ║
║ sslkeylog.txt ║
╚════════════════╝╔══════════════════╗ tshark ╔══════════════╗ ╔══════════════════╗ ║ decrypted.pcapng ║───────────▶║ traffic.json ║─────▶║ pirogue-view-tls ║ ╚══════════════════╝ ╚══════════════╝ ╚══════════════════╝
╔══════════════════╗
║ decrypted.pcapng ║
╚══════════════════╝
│ tshark
▼
╔══════════════╗
║ traffic.json ║
╚══════════════╝
│
▼
╔══════════════════╗
║ pirogue-view-tls ║
╚══════════════════╝
Esto no se hace con el móvil de la persona. Exige un Android rooteado dedicado a análisis, y sirve para estudiar una app concreta. Lo que sale incluye claves, texto en claro e identificadores del aparato: trátalo como evidencia.
PiRogue instala Frida en el móvil de pruebas y saca las claves TLS de memoria mientras captura el tráfico. No todas las bibliotecas TLS están soportadas, así que puede quedar tráfico sin descifrar. Conecta el móvil a la PiRogue por USB y por su wifi, instala la app y no la abras.
adb devices pirogue-intercept-gated -o $(date +%Y%m%d%H%M)_salida # "Waiting for data": abre la app, úsala. Ctrl+C para parar. cd <salida> editcap --inject-secrets tls,sslkeylog.txt traffic.pcap decrypted.pcapng tshark -2 -T ek --enable-protocol communityid -Ndmn -r decrypted.pcapng > traffic.json pirogue-view-tls -i traffic.json -t socket_trace.json
Si lo lanzaste con sudo, antes: sudo chown -R pi:pi <salida>. También puedes abrir el pcap en Wireshark e indicar sslkeylog.txt en Settings, Protocols, TLS.
traffic.pcap: la captura.sslkeylog.txt: claves en formato NSS.socket_trace.json: pila de llamadas de cada operación de socket.aes_info.json: operaciones AES y RSA, con texto en claro y cifrado.device.json,ad_ids.txt,experiment.json,screen.mp4: aparato, IDs de publicidad, tiempos, vídeo.
Fuente: PTS g8 (se abre en otra pestaña).
Falsos positivos y cuándo escalarAntes de decirle nada a nadie.
Lo que suele ser ruido
- Tu propia adquisición: deja rastro de depuración USB y shell de ADB. Coloca tu actividad en la línea temporal antes de leerla.
- Apps de fuera de Play Store: una tienda alternativa es INFO; por navegador o ADB, MEDIUM. MVT no sabe si eso es normal para ella.
- Perfiles y MDM: normales en un móvil de trabajo o de centro educativo, o un filtro DNS que puso ella.
- Ajustes: accesibilidad activada o informes desactivados pueden ser decisión suya. Mira quién y cuándo.
- Parche antiguo: habla de riesgo, no de infección.
- Redirección rápida (MEDIUM): de HTTP a otro dominio en menos de un segundo. Criterio nuestro: la publicidad y los acortadores también lo hacen.
- Una página guardada que menciona la dirección suele ser una noticia sobre el spyware. Un dominio compartido también puede dar coincidencias inocentes.
- Procesos sin
bundle_id: por sí solos no prueban nada. - Reglas Suricata: muchas son ruido, como publicidad o rastreadores. Lee la regla.
- Rayhunter: falsas alarmas al aterrizar un avión, cifrado nulo por mala configuración de la red y heurísticas que varían entre EE. UU. y Europa.
Antes de decirle nada
Criterio nuestro. Para cada coincidencia:
- ¿Qué indicador exacto, de qué colección, y qué valor del móvil ha coincidido? Lee la fuente del indicador.
- ¿La fecha encaja con su historia y con la campaña?
- ¿Qué hay antes y después en
timeline.csv? ¿Hay una segunda traza independiente? - Que lo revise otra persona. Comunica "hay algo que requiere revisión", no "estás infectada", y no uses ese móvil para hablar del caso.
Cuándo escalar
- Cualquier coincidencia CRITICAL que sobreviva a lo anterior.
- Aviso oficial de Apple o de otra plataforma, aunque no salga nada.
- Periodistas, activistas o defensoras en riesgo, aunque salga limpio: los indicadores públicos no bastan, y un soporte fiable requiere indicadores no públicos.
- Sospecha de acceso físico: móvil retenido o herramientas de extracción.
- Una traza que no entiendes. Eso también vale.
Para. No reinstales, no restablezcas, no borres nada y no visites las direcciones. Guarda adquisición, hashes y command.log, y pregunta cómo quieren recibirlos. No lo subas a ningún sitio.
- Access Now Digital Security Helpline (se abre en otra pestaña): sociedad civil, activistas, medios, defensoras. Gratuita, 24/7, 10 idiomas, también castellano. Dicen responder en dos horas. Comprueban que el caso entre en su mandato.
help@accessnow.org, con PGP (se abre en otra pestaña). - Amnesty Security Lab (se abre en otra pestaña): periodistas, activistas y organizaciones en riesgo de ataques dirigidos.
Fuentes: MVT (se abre en otra pestaña), PTS g2 (se abre en otra pestaña), Rayhunter (se abre en otra pestaña), Zero Breach (se abre en otra pestaña).
Antenas falsas: 2G y RayhunterPara organizadoras de un evento o una acción.
Un IMSI catcher es una antena falsa que identifica los móviles que tiene cerca. A diferencia del spyware, no toca el teléfono, y hay que estar en la zona.
- Apaga el 2G: la Protección Avanzada de Android (se abre en otra pestaña) lo evita en móviles compatibles, y en iPhone el Modo de aislamiento (se abre en otra pestaña) desactiva 2G y 3G. Te puedes quedar sin red donde solo haya esas.
- Rayhunter (se abre en otra pestaña) (EFF) busca señales de antenas falsas con un router móvil barato. En Europa recomiendan (se abre en otra pestaña) el TP-Link M7350, pero no compres la versión de hardware 10.0 (se abre en otra pestaña): es la que se vende nueva y no funciona. Búscalo de segunda mano y confirma la versión antes de pagar. Lleva SIM de una operadora local, aunque no tenga plan activo, y tarjeta SD en FAT.
./installer tplink # panel en http://192.168.0.1:8080 rayhunter-check -p captura.qmdl # reanalizar en el ordenador
Desactiva el ahorro de energía en el panel de TP-Link o dejará de grabar. Las heurísticas (se abre en otra pestaña) miran peticiones de IMSI sin autenticación, bajadas a 2G, cifrado nulo y SIB incompletos. Una alerta no prueba que haya una antena falsa. La captura puede contener tu IMSI y las antenas cercanas, lo que puede revelar dónde estabas. La EFF aconseja consultar a una abogada fuera de EE. UU.
Cómo entra el spyware de pago
Son las tres vías que documentan las investigaciones de Amnistía Internacional. Saber por dónde entra ayuda a saber qué buscar.
Esquemas de elaboración propia a partir de Forensic Methodology Report: How to catch NSO Group's Pegasus (se abre en otra pestaña) (2021) y Predator Files: Technical deep-dive (se abre en otra pestaña) (2023), de Amnistía Internacional. Este hacklab no tiene relación con Amnistía Internacional.
Recupera el resto de tu vida digital
En resetea.net.
Sobre esta guía
La mantiene Hacklab la Raíz. Lo que afirma sale de las fuentes enlazadas abajo. No sustituye a un análisis forense ni a una abogada. Si ves un error o un menú que ha cambiado, escribe a hacklab-laraiz@riseup.net.
Fuentes
Revisado en noviembre de 2026. Los menús y los teléfonos cambian: si algo no coincide, fíate de la fuente oficial.
- Amnistía Internacional: metodología forense de Pegasus (se abre en otra pestaña) y Predator Files (se abre en otra pestaña)
- BOE-B-2026-33966: contrato de la Guardia Civil (se abre en otra pestaña)
- Digital First Aid Kit (se abre en otra pestaña), EFF: Surveillance Self-Defense (se abre en otra pestaña), Coalition Against Stalkerware (se abre en otra pestaña) y Tactical Tech: Holistic Security (se abre en otra pestaña)
- Apple: notificaciones de amenazas (se abre en otra pestaña), modo de aislamiento (se abre en otra pestaña) y Comprobación de seguridad (se abre en otra pestaña)
- Google: Play Protect (se abre en otra pestaña) y Protección Avanzada (se abre en otra pestaña)
- Vodafone: desvío de llamadas (se abre en otra pestaña) y O2: contacto (se abre en otra pestaña)
- Selectra: códigos de desvío 2026 (se abre en otra pestaña)
- Zero Breach Toolkit (se abre en otra pestaña), MVT (se abre en otra pestaña), AndroidQF (se abre en otra pestaña) y PiRogue Tool Suite (se abre en otra pestaña)