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>
<certificates src="system" />
<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) parahttps://{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:
}
]
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.