Intercomunicador inteligente sim-sim abierto o de ingeniería inversa

Después de leer el post KrupnikasHubo una idea para lidiar con mitmproxy y ver cómo se organiza el backend de las aplicaciones móviles de uso diario. La elección recayó en la aplicación de intercomunicación. Después de la autorización, le permite abrir puertas y responder videollamadas. Lo que salió de esto y qué agujeros logré encontrar lo contaré debajo del corte.



Configuración de proxy


Para analizar el tráfico, a menudo se usa un enfoque llamado un hombre en el medio. Consiste en el hecho de que cuando se conecta a una red local, el tráfico del dispositivo analizado primero va a la computadora en la que se descifra y analiza, y luego se vuelve a cifrar y se envía al servidor. Para descifrar el tráfico, el más popular es el programa mitmproxy. Instalar mitmproxy no fue un gran problema.

Para ver el tráfico desde un dispositivo móvil, debe conectarse al wifi de su hogar desde su teléfono y computadora. Instale mitmproxy en la computadora y ejecútelo. En el teléfono en la configuración wifi, configure la dirección local y el puerto de la computadora como un servidor proxy. Luego, vaya a mitm.it desde el teléfono e instale un certificado que le permita descifrar las solicitudes https. Después de estos pasos, las solicitudes del navegador se hicieron visibles. ¡Hurra! Sin embargo, el siguiente paso fue la decepción:


Una búsqueda en Google condujo a un problema abierto en el github . Resultó que, comenzando con el nivel 24 de API, las aplicaciones ya no confían en los certificados de usuario. Afortunadamente, puede solucionar esto descomprimiendo apk y agregando la siguiente configuración a AndroidManifest.xml:

<network-security-config>  
     <debug-overrides>  
          <trust-anchors>  
               <!-- Trust preinstalled CAs -->  
               <certificates src="system" />  
               <!-- Additionally trust user added CAs -->  
               <certificates src="user" />  
          </trust-anchors>  
     </debug-overrides>  
</network-security-config>

Además, hay un script listo para usar en el github que hace esto automáticamente. Por lo tanto, descargue apk, script de parche, configure el comando de instalación adb y listo, todo funciona.

Análisis de tráfico


Vemos que las solicitudes se hacen a las direcciones del formulario:

https://{intercom-company-url}/api/

Se pasan dos parámetros en el encabezado:
'api-version': '2',
'authorization''Bearer your.jwt.token’

El primer parámetro es la versión api, y el segundo es el token de autorización. Para la autorización, se utiliza un token web json, que consta de tres partes: el encabezado, la carga útil y la firma.
Descifrarlo con el comando:

pyjwt decode --no-verify your.jwt.token

ver que la carga útil contiene account_id y exp. El campo exp corresponde a la hora en que se creó el token, lo que le permite generar tokens para diferentes dispositivos desde una cuenta.

Lo más interesante para nosotros son las solicitudes de una lista de intercomunicadores disponibles y puertas abiertas. Al enviar una solicitud (utilicé python y la biblioteca de solicitudes) a

https://{intercom-company-url}/api/customers/properties/{account_id}/intercoms 

Obtenemos json que contiene una lista de interfonos con campos:

[
    {
        'id': ID,
        'mode': MODE, 
        'sip_account': {'ex_user': USER_ID, 'proxy': PROXY,  'password': PSWD}, 
        'video': [{'quality': 'low', 'source': 'rtsp://LINK }]
    }
]

En json id - identificador de interfono, modo - qué puerta se puede abrir (los valores posibles son one_door, left_door, right_door), cuenta de sorbo y un enlace a la transmisión de video. ¡Guauu!

Usando el protocolo de inicio de sesión (sip), las llamadas de video se realizan a través del intercomunicador. En el campo sip_account recibimos id'shniki y contraseñas para los intercomunicadores a los que nuestra cuenta tiene acceso. Llamarlos de todos modos no funciona, ya que están en la red interna. Pero el campo de video es interesante. Contiene un enlace externo para transmitir video desde la cámara. Es suficiente para abrir vlc, copiar el enlace y puede mirar alrededor del reloj en la cámara del portero automático. ¡No es bueno dispersar tales enlaces!

A continuación, descubriremos cómo abrir la puerta. Cuando hace clic en el botón de abrir puerta, la aplicación envía una solicitud de obtención:

https://{intercom-company-url}/api/customers/intercoms/{intercom_id}/unlock?door=left_door&id={intercom_id}

Resultó que la presencia o ausencia del parámetro id no afecta nada, pero la puerta permite, en el caso de un teléfono con dos puertas, abrir no solo la suya, sino también la siguiente puerta de su elección.

Sim-sim abierto!


Habiendo descubierto la API, decidí hacer algo útil. El resultado es una aplicación de Android que reconoce comandos de voz, y cuando reconoce comandos predefinidos como "sim-sim open", envía una solicitud para abrir la puerta correspondiente.

recomendaciones


Un intercomunicador inteligente es bueno, pero un intercomunicador seguro e inteligente es aún mejor.

All Articles