Intercomunicador inteligente de engenharia aberta ou reversa Sim-sim

Depois de ler o post KrupnikasHavia uma idéia para lidar com o mitmproxy e ver como é organizado o back-end de aplicativos móveis usados ​​diariamente. A escolha recaiu sobre o aplicativo de intercomunicação. Após a autorização, permite abrir portas e atender chamadas de vídeo. O que aconteceu com isso e quais os buracos que consegui encontrar, vou contar por baixo do corte.



Configurações de proxy


Para analisar o tráfego, é freqüentemente usada uma abordagem chamada homem no meio. Consiste no fato de que, quando conectado a uma rede local, o tráfego do dispositivo analisado primeiro vai para o computador no qual é descriptografado e analisado e, em seguida, é criptografado novamente e enviado ao servidor. Para descriptografar o tráfego, o mais popular é o programa mitmproxy. Instalar mitmproxy não era grande coisa.

Para visualizar o tráfego de um dispositivo móvel, é necessário conectar-se à sua rede doméstica a partir do telefone e do computador. Instale o mitmproxy no computador e execute. No telefone, nas configurações de wifi, defina o endereço local e a porta do computador como um servidor proxy. Em seguida, acesse mitm.it no telefone e instale um certificado que permita descriptografar solicitações https. Após essas etapas, as solicitações do navegador tornaram-se visíveis. Viva! No entanto, o próximo passo foi decepção:


Uma pesquisa no Google levou a um problema em aberto no github . Aconteceu que, começando com o nível 24 da API, os aplicativos não confiam mais nos certificados de usuário. Felizmente, você pode contornar isso descompactando o apk e adicionando a seguinte configuração ao 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>

Além disso, existe um script pronto no github que faz isso automaticamente. Então, faça o download do apk, script de correção, defina o comando adb install e pronto tudo funciona.

Análise de tráfego


Vimos que são feitas solicitações para endereços do formulário:

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

Dois parâmetros são passados ​​no cabeçalho:
'api-version': '2',
'authorization''Bearer your.jwt.token’

O primeiro parâmetro é a versão da API e o segundo é o token de autorização. Para autorização, é usado um token json da web, que consiste em três partes: cabeçalho, carga útil e assinatura.
Decodifique-o com o comando:

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

veja que a carga contém account_id e exp. O campo exp corresponde à hora em que o token foi criado, o que permite gerar tokens para dispositivos diferentes a partir de uma conta.

O mais interessante para nós são pedidos de uma lista de interfones disponíveis e portas de abertura. Ao enviar uma solicitação (usei python e a biblioteca de solicitações) para

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

Temos json contendo uma lista de interfones com campos:

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

No json id - identificador do interfone, mode - qual porta pode ser aberta (os valores possíveis são one_door, left_door, right_door), sip account e link para a transmissão de vídeo. Uau!

Usando o protocolo de iniciação de sessão (SIP), as chamadas de vídeo são feitas pelo interfone. No campo sip_account, recebemos id'shniki e senhas para interfones aos quais nossa conta tem acesso. Ligar para todos da mesma forma não funciona, pois eles estão na rede interna. Mas o campo de vídeo é interessante. Ele contém um link externo para transmitir vídeo da câmera. Basta abrir o vlc, copiar o link e você pode olhar o tempo todo na câmera do interfone. Não é bom espalhar esses links!

A seguir, descobriremos como abrir a porta. Quando você clica no botão de porta aberta, o aplicativo envia uma solicitação de obtenção:

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

Verificou-se que a presença ou ausência do parâmetro id não afeta nada, mas a porta permite que um interfone com duas portas abra não apenas a sua, mas também a próxima porta de sua escolha.

Sim-sim aberto!


Tendo descoberto a API, decidi fazer algo útil. O resultado é um aplicativo Android que reconhece comandos de voz e, quando reconhece comandos predefinidos como "sim-sim open", envia uma solicitação para abrir a porta correspondente.

achados


Um interfone inteligente é bom, mas um interfone seguro e inteligente é ainda melhor.

All Articles