
Cliente TP-Link WiFi SmartPlug e Dissector Wireshark
Para a história completa, consulte Reverse Engineering the TP-Link HS110
Um cliente Python para o protocolo proprietário TP-Link Smart Home para controlar tomadas inteligentes WiFi TP-Link HS100, HS110 e KP115. O protocolo SmartHome roda na porta TCP 9999 e usa uma criptografia XOR autokey trivial que não fornece segurança.
Não há mecanismo de autenticação e os comandos são aceitos independentemente do estado do dispositivo (configurado/não configurado).
Os comandos são formatados usando JSON, por exemplo:
{"system":{"get_sysinfo":null}}
Em vez de null também podemos escrever {}. Os comandos podem ser aninhados, por exemplo:
{"system":{"get_sysinfo":null},"time":{"get_time":null}}
Uma lista completa de comandos é fornecida em tplink-smarthome-commands.txt.
./tplink_smartplug.py -t <ip> [-c <cmd> || -j <json>]
Forneça o IP de destino usando -t e um comando para enviar usando -c ou
-j. Comandos para a opção -c:
Comandos mais avançados, como criar ou editar regras, podem ser emitidos usando a
opção -j, fornecendo a string JSON completa para o comando. Consulte
tplink-smarthome-commands.txt para uma
lista abrangente de comandos.
[!TIP] Para exibir a resposta de forma organizada, use o parâmetro quiet (-q) e canalize a saída pelo
jq. Por exemplo:./tplink_smartplug.py -t 192.168.178.49 -c info -q | jq
Dissector do Wireshark para descriptografar pacotes do protocolo TP-Link Smart Home (porta TCP 9999).

[!NOTE]
Se você tiver Wireshark > 3.5.0, poderá usar o dissector integrado.
Copie tplink-smarthome.lua para:
| SO | Caminho de Instalação |
|---|---|
| Windows | %APPDATA%\Wireshark\plugins |
| Linux/MacOS | $HOME/.local/lib/wireshark/plugins |
Um cliente Python de prova de conceito para falar com um dispositivo TP-Link usando o TP-Link Device Debug Protocol (TDDP).
O TDDP é implementado em uma ampla gama de dispositivos TP-Link, incluindo roteadores, pontos de acesso, câmeras e smart plugs. O TDDP pode ler e gravar a configuração de um dispositivo e emitir comandos especiais. A porta UDP 1040 é usada para enviar comandos; as respostas retornam na porta UDP 61000. Este cliente foi testado com um roteador sem fio TP-Link Archer C9 e uma tomada inteligente WiFi TP-Link HS-110.
O TDDP é um protocolo binário documentado na patente CN102096654A.
Os comandos são emitidos definindo os valores apropriados nos campos de cabeçalho Type e SubType Os dados são retornados criptografados com DES e exigem o nome de usuário e a senha do dispositivo para serem descriptografados. Da mesma forma, os dados de configuração a serem gravados no dispositivo precisam ser enviados criptografados. A chave DES é construída obtendo-se o hash MD5 do nome de usuário e da senha concatenados e, em seguida, pegando os primeiros 8 bytes do hash MD5.
./tddp-client.py -t <ip> -u username -p password -c 0A
Forneça o IP de destino usando -t. Você pode fornecer um nome de usuário e senha; caso contrário, admin/admin é usado como padrão. Eles são necessários para descriptografar os dados retornados.
Forneça o comando como uma string hexadecimal de dois caracteres, ex.: -c 0A. O tipo de dados que um comando pode ler será diferente para vários dispositivos TP-Link.
A leitura do status do link WAN em um Archer C9 na configuração padrão mostra que o link está inativo (0):
./tddp-client.py -t 192.168.0.1 -c 0E
Request Data: Version 02 Type 03 Status 00 Length 00000000 ID 0001 Subtype 0e
Reply Data: Version 02 Type 03 Status 00 Length 00000018 ID 0001 Subtype 0e
Decrypted: wan_ph_link 1 0
| Comando | Descrição |
|---|
| antitheft | Lista regras de antifurto configuradas |
| cloudinfo | Retorna informações de conectividade na nuvem |
| countdown | Lista regras de contagem regressiva configuradas |
| energy | Retorna tensão/corrente/potência em tempo real |
| energy_reset | Redefine os medidores de energia |
| info | Retorna informações do dispositivo |
| ledoff | Desliga o indicador LED |
| ledon | Liga o indicador LED |
| off | Desliga a tomada |
| on | Liga a tomada |
| reboot | Reinicia o dispositivo |
| reset | Restaura o dispositivo para as configurações de fábrica |
| runtime_reset | Apaga as estatísticas de tempo de execução |
| schedule | Lista regras de agendamento configuradas |
| time | Retorna a hora do sistema |
| wlanscan | Procura por pontos de acesso próximos |