Analizando un filtro para WhatsApp
Fecha: 7 y 8 de agosto
del 2023
Escenario
Hace unas semanas volviendo de un viaje, en el avión ofrecían WiFi de cortesía
que sólo estaba limitado
al envío de mensajes de WhatsApp, sólo de texto,
y bloqueaba el envío de fotos, audios, etc…
Obviamente para poder ahorrar el limitado ancho
de banda entre el avión e internet.
Lo primero que pensé fue “es una firma pre armada
en un Forti, un Palo Alto, o un Checkpoint” , aunque luego
medité “pero que hace realmente esa firma ?” debo
replicarla de alguna manera en un lab.
Este escenario no analiza cómo funciona WhatsApp,
sino que intenta reproducir el filtro para lograr tal limitación.
Se armó una maqueta con un AP y un switch con
port mirroring para enviar todo a Wireshark y poder analizar
qué sucede en cada tipo de conexión, con mensajes
de texto o multimedia.
Como el tráfico de WhatsApp esta encriptado de
extremo a extremo, descarto cualquier análisis en el payload.
Detalle del mail de confirmaci n del servicio.
1.- Prueba inicial con
texto:
La primer captura que nos interesa es la resolución
DNS.
Frame 1: 74 bytes on wire (592 bits), 74 bytes captured
(592 bits) on interface
Ethernet II, Src: Routerbo_a4:2e:22
(d4:ca:6d:a4:2e:22), Dst: Shenzhen_2c:ea:50 (30:df:8d:2c:ea:50)
Internet Protocol Version 4, Src:
192.168.1.117, Dst: 8.8.8.8
User Datagram Protocol, Src Port: 33336, Dst
Port: 53
Domain Name System (query)
Transaction ID: 0x5ff8
Flags: 0x0100 Standard query
Questions: 1
Answer RRs: 0
Authority RRs: 0
Additional RRs: 0
Queries
g.whatsapp.net: type A, class IN
[Response In: 2]
Frame 2: 113 bytes on wire (904 bits), 113 bytes
captured (904 bits) on interface
Ethernet II, Src: Shenzhen_2c:ea:50
(30:df:8d:2c:ea:50), Dst: Routerbo_a4:2e:22 (d4:ca:6d:a4:2e:22)
Internet Protocol Version 4, Src: 8.8.8.8,
Dst: 192.168.1.117
User Datagram Protocol, Src Port: 53, Dst
Port: 33336
Domain Name System (response)
Transaction ID: 0x5ff8
Flags: 0x8180 Standard query response, No
error
Questions: 1
Answer RRs: 2
Authority RRs: 0
Additional RRs: 0
Queries
g.whatsapp.net: type A, class IN
Answers
g.whatsapp.net: type CNAME, class IN, cname chat.cdn.whatsapp.net
chat.cdn.whatsapp.net: type A, class IN, addr 31.13.94.54
[Request In: 1]
[Time: 0.039853000 seconds]
Ahora sabemos con cual IP podr amos llegar a
lidiar.
2.- Prueba con env o de una
foto:
Primero vemos que en la captura aparece otro
actor con la IP 31.13.94.52 (la IP del DNS server en esta prueba es el router
de internet que hace de relay DNS, otras pruebas
las hicimos con el de Google).
2.1.- Detalle de la resolución
de nombres de servidor de contenidos multimedia (MMX):
.
Frame 1: 79 bytes on wire (632 bits), 79 bytes
captured (632 bits)
Ethernet II, Src: 6e:07:fe:09:9c:cc
(6e:07:fe:09:9c:cc), Dst: 30:df:8d:2c:ea:50 (30:df:8d:2c:ea:50)
Internet Protocol Version 4, Src:
192.168.1.117, Dst: 192.168.1.254
User Datagram Protocol, Src Port: 64137, Dst
Port: 53
Domain Name System (query)
Transaction ID: 0xa353
Flags: 0x0100 Standard query
Questions: 1
Answer RRs: 0
Authority RRs: 0
Additional RRs: 0
Queries
static.whatsapp.net: type A, class IN
[Response In: 2]
Frame 2: 120 bytes on wire (960 bits), 120 bytes
captured (960 bits)
Ethernet II, Src: 30:df:8d :2c:ea:50
(30:df:8d:2c:ea:50), Dst: 6e:07:fe:09:9c:cc (6e:07:fe:09:9c:cc)
Internet Protocol Version 4, Src:
192.168.1.254, Dst: 192.168.1.117
User Datagram Protocol, Src Port: 53, Dst
Port: 64137
Domain Name System (response)
Transaction ID: 0xa353
Flags: 0x8180 Standard query response, No
error
Questions: 1
Answer RRs: 2
Authority RRs: 0
Additional RRs: 0
Queries
static.whatsapp.net: type A, class IN
Answers
static.whatsapp.net: type CNAME, class IN,
cname mmx-ds.cdn.whatsapp.net
mmx-ds.cdn.whatsapp.net: type A, class IN,
addr 31.13.94.52
[Request In: 1]
[Time: 0.009001000 seconds]
2.2.- Detalle del flujo de
las comunicaciones para el envío de una foto:
Por la cantidad/vol men de tr fico de la nueva
sesi n TCP a la IP 31.13.94.52 estimo (sin analizar
demasiado) que es sólo la apertura de un canal de
señalización para luego transferir por la IP
original 31.13.94.54 vía el port TCP 5222.
---resumido/omitido---
3.- Probamos bloqueando la
IP 31.13.94.52:
Para este fin creamos una ACL bastante básica y
la aplicamos al port físico Fa0/1 que es donde se conecta el AP.
Switch#conf t
Enter configuration commands, one per line.
End with CNTL/Z.
Switch(config)#ip access-list extended FILTRO
Switch(config-acl)#deny ip 192.168.1.0
0.0.0.255 host 31.13.94.52 (bloqueamos
acceso a mmx-ds.cdn.whatsapp.net)
Switch(config-acl)#permit ip 192.168.1.0
0.0.0.255 host 31.13.94.54 (permitimos
acceso a chat.cdn.whatsapp.net)
Switch(config-acl)#permit udp 192.168.1.0
0.0.0.255 host 8.8.8.8 eq domain (permitimos consultas DNS)
Switch(config-acl)#exit (por default se bloquea el resto)
Switch(config)#
Switch(config)#int fa0/1
Switch(config-if)#ip access-group FILTRO in (la asociamos la ACL al port (PACL))
Switch(config-if)#end
Switch#
Switch#sh access-lists FILTRO
Extended IP access list FILTRO
10 deny ip 192.168.1.0 0.0.0.255 host 31.13.94.52
(no vemos matches por otros
motivos, pero bloquea)
20 permit ip 192.168.1.0 0.0.0.255 host
31.13.94.54
30 permit udp 192.168.1.0 0.0.0.255 host
8.8.8.8 eq domain
Switch#
3.1- Pruebas con un audio:
Podemos ver que intenta y al rato queda en modo
reenviar.
3.2.- Pruebas con una foto:
3.3.- Retiramos la ACL:
Switch#conf t
Enter configuration commands, one per line.
End with CNTL/Z.
Switch(config)#ip access-list extended FILTRO
Switch(config)#int fa0/1
Switch(config-if)#no ip access-group FILTRO in
Switch(config-if)#
Podemos ver que el audio y la foto finalmente se
envían.
4.- Resumen:
Se pudo lograr el objetivo del laboratorio, que
era emular una posible firma o regla fix de un firewall, sin entrar en detalles
de cómo funciona realmente WhatsApp, ni como
evitar este tipo de restricciones en los hotspots, etc…
Básicamente se bloquea una IP que es el posible
gateway que negocia los envíos y recepciones multimedia.
(2023) Things to meditate on a (lysergic) flight
Rosario, Argentina