
Client SmartPlug WiFi TP-Link et dissecteur Wireshark
Pour l'histoire complète, voir Rétro-ingénierie de la TP-Link HS110
Un client Python pour le protocole propriétaire TP-Link Smart Home afin de contrôler les prises intelligentes WiFi TP-Link HS100, HS110 et KP115. Le protocole SmartHome fonctionne sur le port TCP 9999 et utilise un chiffrement XOR à auto-clé trivial qui n'offre aucune sécurité.
Il n'existe aucun mécanisme d'authentification et les commandes sont acceptées indépendamment de l'état de l'appareil (configuré/non configuré).
Les commandes sont formatées en JSON, par exemple :
{"system":{"get_sysinfo":null}}
Au lieu de null, on peut aussi écrire {}. Les commandes peuvent être imbriquées, par exemple :
{"system":{"get_sysinfo":null},"time":{"get_time":null}}
Une liste complète des commandes est fournie dans tplink-smarthome-commands.txt.
./tplink_smartplug.py -t <ip> [-c <cmd> || -j <json>]
Fournissez l'adresse IP cible avec -t et une commande à envoyer à l'aide de -c ou de -j. Commandes pour l'option -c :
| Commande | Description |
|---|---|
| antitheft | Liste les règles antivol configurées |
| cloudinfo | Renvoie les informations de connectivité cloud |
| countdown | Liste les règles de compte à rebours configurées |
| energy | Renvoie tension/courant/puissance en temps réel |
| energy_reset | Réinitialise les compteurs d'énergie |
| info | Renvoie les informations de l'appareil |
| ledoff | Éteint le voyant LED |
| ledon | Allume le voyant LED |
| off | Éteint la prise |
| on | Allume la prise |
| reboot | Redémarre l'appareil |
| reset | Réinitialise l'appareil aux paramètres d'usine |
| runtime_reset | Efface les statistiques d'exécution |
| schedule | Liste les règles de programmation configurées |
| time | Renvoie l'heure système |
| wlanscan | Recherche les points d'accès à proximité |
Des commandes plus avancées, comme la création ou la modification de règles, peuvent être envoyées à l'aide de l'option -j en fournissant la chaîne JSON complète de la commande. Veuillez consulter tplink-smarthome-commands.txt pour une liste complète des commandes.
[!TIP] Pour un affichage formaté, utilisez le paramètre silencieux (-q) et passez la sortie dans
jq. Par exemple :./tplink_smartplug.py -t 192.168.178.49 -c info -q | jq
Dissecteur Wireshark pour déchiffrer les paquets du protocole TP-Link Smart Home (port TCP 9999).

[!NOTE]
Si vous avez Wireshark > 3.5.0, vous pouvez utiliser le dissecteur intégré.
Copiez tplink-smarthome.lua dans :
| OS | Chemin d'installation |
|---|---|
| Windows | %APPDATA%\Wireshark\plugins |
| Linux/MacOS | $HOME/.local/lib/wireshark/plugins |
Un client Python de preuve de concept pour communiquer avec un appareil TP-Link à l'aide du TP-Link Device Debug Protocol (TDDP).
TDDP est implémenté sur toute une gamme d'appareils TP-Link, notamment les routeurs, les points d'accès, les caméras et les prises intelligentes. TDDP peut lire et écrire la configuration d'un appareil et émettre des commandes spéciales. Le port UDP 1040 est utilisé pour envoyer les commandes, les réponses arrivent sur le port UDP 61000. Ce client a été testé avec un routeur sans fil TP-Link Archer C9 et une prise intelligente WiFi TP-Link HS-110.
TDDP est un protocole binaire documenté dans le brevet CN102096654A.
Les commandes sont émises en définissant les valeurs appropriées dans les champs d'en-tête Type et SubType. Les données renvoyées sont chiffrées en DES et nécessitent le nom d'utilisateur et le mot de passe de l'appareil pour être déchiffrées. De même, les données de configuration à écrire sur l'appareil doivent être envoyées chiffrées. La clé DES est construite en prenant le hachage MD5 du nom d'utilisateur et du mot de passe concaténés, puis en prenant les 8 premiers octets du hachage MD5.
./tddp-client.py -t <ip> -u username -p password -c 0A
Fournissez l'adresse IP cible avec -t. Vous pouvez fournir un nom d'utilisateur et un mot de passe ; sinon admin/admin est utilisé par défaut. Ils sont nécessaires pour déchiffrer les données renvoyées.
Fournissez la commande sous forme de chaîne hexadécimale de deux caractères, p. ex. -c 0A. Le type de données qu'une commande peut lire varie selon les appareils TP-Link.
La lecture de l'état du lien WAN sur un Archer C9 en configuration par défaut indique que le lien est inactif (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