Este documento describe cómo se puede abusar del protocolo Call Relay de Apple para espiar llamadas de iPhone. Explica las diferentes fases del protocolo y cómo identificar los campos clave a través de análisis de tráfico y pruebas. También muestra cómo se pueden generar paquetes maliciosos para interrumpir llamadas de iPhone de forma remota.
12. Preguntas
• Ya esta hackeado?
• Como funciona?
• Como se comunica el iPhone
con los demás dispositivos?
• Es seguro y esta cifrado el
protocolo?
• Puedo Escuchar/Inyectar/
Modificar/DoS las llamadas?
22. Posible objetivo
• UDP no esta cifrado
• UDP es “connectionless”
• Multiples vectores de ataque
• DNS spoofing
• ARP Spoofing
• etc.
• Protocolo propietario?
27. Metodología
• Genera tráfico valido
• Captura el trafico generado por una llamada
• Filtra el ruido
• Observa solo el tráfico entre ambas máquinas
• Aprende…
29. Como se comunica el iPhone
con los demás dispositivos
• A través de LAN
• Usando UDP
• Puertos aleatorios con rango 48000 -
64000
• Protocolo propietario
• Facetime y Facetime audio usan
SIP/RTP
• SMS se manda a través de Push
Notifications
31. Metodología
• Observa como dos maquinas interactúan
• Mira que datos intercambian
• Identifica campos básicos
• Headers, checksums, counters
• Identifica estructuras básicas
• Header + counter + data
• Busca patrones
• Recoge varias muestras de tráfico generado por la misma acción para
comparar
• Haz varias llamadas telefónicas
• Repite los pasos anteriores y compara
32.
33. Recolecta y compara
• Identifica que ha cambiado entre llamadas bajo las mismas
condiciones
• Compara con llamadas hechas con un AppleID diferente
• Haz pruebas en versiones antiguas para encontrar cambios
realizados
34. Primer paquete mandado en 4
diferentes llamadas
• Inicio del payload, estático
• Posiblemente un header
• Dinámico, longitud poco común (12 bytes)
• Algún tipo de identificador? Dispositivo, usuario, llamada…
• Estático, separa dos campos dinámicos, longitud típica (4 bytes)
• Separador?
• Dinamico, 16 bits, cerca del final del payload
• Checksum?
• Estático, todo ceros, al final del payload
• Marcador de final de paquete
35. Produce casos inesperados
• Que sucede si…
• Añado delays?
• Dropeo paquetes específicos?
• Bloqueo cierto tráfico?
36. Bloqueo del primer paquete mandado
• Reintenta 10 veces cada
medio segundo
• Solo cambian dos bytes
• Parece incremental pero no
por una diferencia constante
0f:00:01:00:08:21:12:a4:42:ce:33:d7:51:28:f2:fe:08:5a:0d:9b:50:80:05:00:04:1b:bb:00:00
0f:00:01:00:08:21:12:a4:42:ce:33:d7:51:28:f2:fe:08:5a:0d:9b:50:80:05:00:04:1e:07:00:00
0f:00:01:00:08:21:12:a4:42:ce:33:d7:51:28:f2:fe:08:5a:0d:9b:50:80:05:00:04:20:3b:00:00
0f:00:01:00:08:21:12:a4:42:ce:33:d7:51:28:f2:fe:08:5a:0d:9b:50:80:05:00:04:22:3b:00:00
0f:00:01:00:08:21:12:a4:42:ce:33:d7:51:28:f2:fe:08:5a:0d:9b:50:80:05:00:04:24:84:00:00
0f:00:01:00:08:21:12:a4:42:ce:33:d7:51:28:f2:fe:08:5a:0d:9b:50:80:05:00:04:26:c6:00:00
0f:00:01:00:08:21:12:a4:42:ce:33:d7:51:28:f2:fe:08:5a:0d:9b:50:80:05:00:04:29:08:00:00
0f:00:01:00:08:21:12:a4:42:ce:33:d7:51:28:f2:fe:08:5a:0d:9b:50:80:05:00:04:2b:1b:00:00
37. • Huele a timestamp!
• 1.125111000 - 0.574930000 = 0.550181 milisegundos
• 0x203b - 0x1e07 = 0x0234 = 564 …milisegundos???
• 564 ~ 550 si tenemos en cuenta cierto margen de error
• Necesitamos confirmar nuestra teoría
0f:00:01:00:08:21:12:a4:42:ce:33:d7:51:28:f2:fe:08:5a:0d:9b:50:80:05:00:04:1b:bb:00:00
0f:00:01:00:08:21:12:a4:42:ce:33:d7:51:28:f2:fe:08:5a:0d:9b:50:80:05:00:04:1e:07:00:00
0f:00:01:00:08:21:12:a4:42:ce:33:d7:51:28:f2:fe:08:5a:0d:9b:50:80:05:00:04:20:3b:00:00
0f:00:01:00:08:21:12:a4:42:ce:33:d7:51:28:f2:fe:08:5a:0d:9b:50:80:05:00:04:22:3b:00:00
0f:00:01:00:08:21:12:a4:42:ce:33:d7:51:28:f2:fe:08:5a:0d:9b:50:80:05:00:04:24:84:00:00
0f:00:01:00:08:21:12:a4:42:ce:33:d7:51:28:f2:fe:08:5a:0d:9b:50:80:05:00:04:26:c6:00:00
0f:00:01:00:08:21:12:a4:42:ce:33:d7:51:28:f2:fe:08:5a:0d:9b:50:80:05:00:04:29:08:00:00
0f:00:01:00:08:21:12:a4:42:ce:33:d7:51:28:f2:fe:08:5a:0d:9b:50:80:05:00:04:2b:1b:00:00
38. 3 llamadas consecutivas bloqueadas
• 106.715 - 93.003 = 13712ms | 0x4e10 - 0x1736 = 14042ms
• Mismo margen de error las otras dos llamadas
• Hemos confirmado a timestamp de 2 bytes
39. Primer paquete mandado en 4
diferentes llamadas
• Dinamico, 16 bits, cerca del final del payload
• Checksum? TIMESTAMP representando cuando
se ha mandado el paquete.
• Solo 2 bytes -> 65535 milisegundos
• Se resetea cada ~65 segundos
44. Los dos primeros paquetes
de 5 llamadas diferentes
Netzob encuentra más patrones cuando opera sobre datos similares
45. • Mac -> Iphone / iPhone -> Mac
• Identificamos que solo cambia un byte
• Mac -> iPhone manda 0
• iPhone -> Mac manda 1
• Campo 5 es estático en la misma llamada pero cambia
entre llamadas
47. Siguientes 2 paquetes de 5 llamadas distintas
• Campo 1: Cambio de 0 ->1
• Campo 5: Cambio de 38 -> 10
• Campo 7: Mismos bytes que en el primer paquete
• Campo 9: Solo se manda de Mac a iPhone. Los bytes
tienen una propiedad…
48. Campo 9: Los bytes son “printables”
• Probablemente un identificador de llamada seguido de un ACK
• Tenemos la primera prueba de texto no cifrado!
49. 4. You there?
5. Yep
Local Network
Identification
ACK
Encontramos la “Identification phase”
50. Todos los paquetes con header 20040004
Demasiados datos. Centrémonos en lo interesante
51. • Lo típico: Header, campos estáticos, separadores, etc.
• Primer y segundo paquete (Mac -> iPhone | iPhone -> Mac)
• Campo 1: 4 bytes aleatorios | Campo 2: 4 null-bytes
• Simula el sequence number del protocolo TCP?
• Tercer paquete (Mac -> iPhone)
• Campo 1: Mismos 4 bytes mandados en el primer paquete | Campo 2: Los 4 bytes mandados en el campo 1 por el iPhone +1
• Campo 3: Cambia el segundo byte de 0 -> 1
52. 4. You there?
5. Yep
Local Network
Identification
ACK
Negotiate call
Encontramos el “Call negotiation phase”
53. Todos los paquetes con header e000
• 2 valores diferentes que incrementan en 1 (decimal) de manera constante
• Cada dispositivo tiene su propio contador para sincronización
• Contador de 2 bytes. Se resetea cada ~20 minutos en una llamada. Importante si se usa para cifrado!
• Valor estático. Diferente en cada dispositivo. Cambia cada llamada
• Audio Encodeado / Comprimido / Cifrado
• Confirmado mediante “bit flipping”
54. 4. You there?
5. Yep
Local Network
Identification
ACK
Negotiate call
Sound transmission
Ya tenemos todas las fases del protocolo
55. Ven a hablar conmigo si estas interesado y quieres mas detalles!
Muchos mas detalles que no hay tiempo para explicar :(
56. APNS
1. Incoming call
2. Mr. X is calling!
3. Mr. X call
iPhone’s internal IP:Port
4. You there?
5. Yep
6. Negotiate call
7. Sound transmission
GSM
Local Network
Internet
4. Identification
5. ACK
58. Metodología
• Implementa el lenguaje en base a lo que has
aprendido
• Reemplaza una de las máquinas
• Comunícate con la otra en su propio lenguaje.
Prueba, falla, corrige y repite
59. Visita mi repositorio github
https://www.github.com/martinvigo
• Usé scapy para implementar el protocolo
• Reemplace correctamente el iPhone y el Mac
• Aun no funciona 100%
• Me faltan algunos detalles del protocolo
• El timing es importante para testear y lo
complica mucho
61. Metodología
• Define tus objetivos
• Puedo escuchar llamadas de otros?
• Puedo hacer llamadas como si fuera la víctima?
• Puedo espiar a gente?
• etc.
• Smart fuzzing
• Fuzzea campos dinámicos
• Respeta las reglas y estructuras del protocolo
• Headers, counters, campos estáticos, etc.
• Genera casos inesperados
62. #Fails
• Escuchar llamadas ajenas
• Decodear/Descomprimir/Descifrar audio
• Replay attacks
• Redirigir/Duplicar audio en dispositivo atacante
• Hacer llamadas como si fuera la víctima
• Inyectar audio
63. #Wins
• DoS a llamadas
• Espiar víctimas dejándoles el micrófono abierto
• Hacerme pasar por un interlocutor en llamadas
multiparty
64. DoS a llamadas
• Que sucede si mando un paquete del “Call negotiation phase” durante una llamada?
• Necesito poder crear un paquete válido
• Queremos un paquete “joker” que funcione siempre sin tener que adivinar/bruteforcear
ningún byte
• Sin necesidad de MiTM
• Use scapy para fuzear el protocolo poniendo a null todos los bytes posibles
Magic DoS call packet payload
20040004000000000000000000b002000000000000000000000000000000000000000000000000000000000000
Scapy script: https://github.com/martinvigo
65. Espiando a víctimas
• No puedo escuchar llamadas ajenas
• No puedo inyectar audio
• No puedo hacer replay attacks de audio
• No puedo redirigir/duplicar audio en otro
dispositivo
• Uso de cifrado
68. Adi Shamir at RSA Conference
“In the future, cryptography won’t be broken,
it will be bypassed”
69. Que sucede cuando se cuelga
el teléfono?
• Absolutamente nada…
• Los paquetes de audio simplemente paran
• No hay diferencias en el audio payload
• Hay algo que se me esta escapando…
74. Malas prácticas de seguridad
• M8: Decisiones de seguridad en base a inputs no confiados
• Apple no sigue sus propias recomendaciones de seguridad
• “Push notifications are not guaranteed to be delivered”
• “Do not rely on Push Notifications for sensitive actions”
75. Como funciona el ataque
• No permitas que el mensaje “Cuelga” llegue al iPhone
1. ARP spoofing para MiTM
2. Llama a la víctima
3. Bloquea el tráfico saliente hacia 17.0.0.0/8 (APNS)
78. Reemplazando interlocutores
• Call Relay permite multiparty
• Que sucede cuando cambio
entre interlocutores?
• Lo mismo! El mensaje “Cambia
de llamada” se manda a través
de APNS
• Podemos evitar que se cambie
de llamada mientras la interfaz
muestra que sucedió
79. Combinando ambas
vulnerabilidades
• Podemos evitar que se cuelgue el teléfono
• Podemos evitar que se cambie de llamada
• Combinemos los dos!
1. El atacante llama a la víctima mientras esta hablando con otra persona
2. La víctima pone la llamada en espera y habla con el atacante
3. El atacante deja que la víctima cuelgue el teléfono
4. Bloquea ambos mensajes “Colgar” y “Cambiar de llamada”
• La interfaz muestra que solo hablas con la llamada legítima cuando
en realidad estas hablando con el atacante
83. Construyendo un Spy Program
a lo barato
1. Encuentra vulnerabilidades
2. Weaponizalas
3. Distribúyelas de manera masiva
4. Exploit
84. Encuentra vulnerabilidades
y weaponizalas
• Podemos interrumpir llamadas
• Podemos reemplazar a interlocutores
• Podemos obtener metadatos de las llamadas
• Podemos abrir micrófonos remotamente
85. Distribuye masivamente
• Objetivos
• Routers y dispositivos IoT
• Problemas
• Poco o nada de
almacenamiento
• Múltiples combinaciones de
hardware y software
• Pocas y limitadas herramientas
preinstaladas
86. Hackeando routers y IoT
• Easier than it seems
• Find them with Shodan
• Default credentials
• Off-the-shelf exploits
• Can be easily automated
87. Identificando dispositivos
Apple en redes comprometidas
• Los 3 primeros bytes de la
MAC indican el vendor
• IEEE Registration authority
tiene todas las asignaciones
registradas
• Mira la tabla ARP en el router
y busca en la Base de Datos
arp -a | awk '{print $4}' | while read mac; do echo $mac | grep -io [0-9A-F][0-9A-F]:[0-9A-F]
[0-9A-F]:[0-9A-F][0-9A-F] | head -n 1; done | while read splitmac ; do echo $splitmac | tr -d : ;
done
89. Bloquea tráfico APNS
• “APNs uses a persistent IP connection for implementing
remote notifications”
• Las reglas Firewall ignoran “ESTABLISHED connections”
• DNS poison APNS y rerouta el tráfico
• Simula el final de una conexión
• FIN-ACK-RST
• Resetea la conexión persistente al estado “NEW” para
que apliquen las reglas del Firewall
90. Reseteando una conexión persistente
• Objectivo: Resetear una conexión
externa hacia APNS manteniendo
activo el tráfico interno
• Routers tiene 2 interfaces de red
• Interna -> LAN
• Externa -> Internet
• Desactiva la interfaz de red externa
temporalmente
bridge
eth0
ifconfig eth0 down && sleep 2 && ifconfig eth0 up
91. Obteniendo números de teléfono
• War dialing
• Obtén el BSSID de los routers
• Usa wigle.net para obtener la
localización física del router
• War dialing en base al “area code”
• Detecta llamadas entrantes haciendo
“fingerprinting”
• Correlaciona números de teléfonos con
routers detectando llamadas entrantes
93. Timeline
iOS 8
Yosemite
iOS 9
El Capitan
Found
vulnerabilities
iOS 9.3.2
El Capitan 10.11.5
iOS 9.3.3
El Capitan 10.11.6
Spy vulnerability
fixed
iOS 9.3.5
Sierra beta 8
Found Regression
iOS 10
Sierra 10.12
DoS vulnerability
fixed
CVE-2016-4722CVE-2016-4635
iOS 10.1
Sierra 10.12.1
All issues
fixed
94. Oportunidades de
investigación
• Reversear FaceTime y daemons
• Criptoanálisis del protocolo
• Dar soporte en otros sistemas al protocolo Call Relay
• Inferir información del tráfico cifrado
• http://www.cs.unc.edu/~fabian/papers/tissec2010.pdf
• https://www.cs.jhu.edu/~cwright/voip-vbr.pdf