
TP-Link WiFi SmartPlug Client and Wireshark Dissector
Per la storia completa, vedi Reverse Engineering the TP-Link HS110
Un client Python per il protocollo proprietario TP-Link Smart Home per controllare le prese intelligenti WiFi TP-Link HS100, HS110 e KP115. Il protocollo SmartHome gira sulla porta TCP 9999 e utilizza una banale crittografia XOR autokey che non fornisce alcuna sicurezza.
Non esiste alcun meccanismo di autenticazione e i comandi sono accettati indipendentemente dallo stato del dispositivo (configurato/non configurato).
I comandi vengono formattati usando JSON, ad esempio:
{"system":{"get_sysinfo":null}}
Invece di null possiamo anche scrivere {}. I comandi possono essere annidati, ad esempio:
{"system":{"get_sysinfo":null},"time":{"get_time":null}}
Un elenco completo dei comandi è fornito in tplink-smarthome-commands.txt.
./tplink_smartplug.py -t <ip> [-c <cmd> || -j <json>]
Fornisci l'IP di destinazione usando -t e un comando da inviare usando -c o
-j. Comandi per il flag -c:
Comandi più avanzati come la creazione o la modifica di regole possono essere emessi usando il
flag -j fornendo la stringa JSON completa per il comando. Si prega di consultare
tplink-smarthome-commands.txt per un
elenco completo dei comandi.
[!TIP] Per una stampa ordinata della risposta, usa il parametro quiet (-q) e passa l'output attraverso
jq. Ad esempio:./tplink_smartplug.py -t 192.168.178.49 -c info -q | jq
Dissector Wireshark per decrittare i pacchetti del protocollo TP-Link Smart Home (porta TCP 9999).

[!NOTE]
Se hai Wireshark > 3.5.0 puoi usare il dissector integrato.
Copia tplink-smarthome.lua in:
| OS | Percorso di installazione |
|---|---|
| Windows | %APPDATA%\Wireshark\plugins |
| Linux/MacOS | $HOME/.local/lib/wireshark/plugins |
Un client Python proof-of-concept per comunicare con un dispositivo TP-Link usando il TP-Link Device Debug Protocol (TDDP).
TDDP è implementato su un'ampia gamma di dispositivi TP-Link inclusi router, punti di accesso, telecamere e smart plug. TDDP può leggere e scrivere la configurazione di un dispositivo e inviare comandi speciali. La porta UDP 1040 viene utilizzata per inviare comandi, le risposte arrivano sulla porta UDP 61000. Questo client è stato testato con un router wireless TP-Link Archer C9 e una presa intelligente WiFi TP-Link HS-110.
TDDP è un protocollo binario documentato nel brevetto CN102096654A.
I comandi vengono emessi impostando i valori appropriati nei campi di intestazione Type e SubType. I dati vengono restituiti crittografati con DES e richiedono il nome utente e la password del dispositivo per decrittarli. Allo stesso modo, i dati di configurazione da scrivere sul dispositivo devono essere inviati crittografati. La chiave DES viene costruita prendendo l'hash MD5 di nome utente e password concatenati, e poi prendendo i primi 8 byte dell'hash MD5.
./tddp-client.py -t <ip> -u username -p password -c 0A
Fornisci l'IP di destinazione usando -t. Puoi fornire un nome utente e una password, altrimenti viene usato admin/admin come default. Sono necessari per decrittare i dati che vengono restituiti.
Fornisci il comando come stringa esadecimale di due caratteri, ad esempio -c 0A. Il tipo di dati che un comando potrebbe leggere sarà diverso per vari dispositivi TP-Link.
La lettura dello stato del collegamento WAN su un Archer C9 nella configurazione predefinita mostra che il collegamento è giù (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 | Descrizione |
|---|
| antitheft | Elenca le regole antifurto configurate |
| cloudinfo | Restituisce informazioni di connettività cloud |
| countdown | Elenca le regole di conto alla rovescia configurate |
| energy | Restituisce tensione/corrente/potenza in tempo reale |
| energy_reset | Resetta i contatori energetici |
| info | Restituisce informazioni sul dispositivo |
| ledoff | Spegni l'indicatore LED |
| ledon | Accendi l'indicatore LED |
| off | Spegni la presa |
| on | Accendi la presa |
| reboot | Riavvia il dispositivo |
| reset | Resetta il dispositivo alle impostazioni di fabbrica |
| runtime_reset | Cancella le statistiche di runtime |
| schedule | Elenca le regole di pianificazione configurate |
| time | Restituisce l'ora di sistema |
| wlanscan | Scansiona i punti di accesso vicini |