
TP-Link WiFi SmartPlug-Client und Wireshark-Dissector
Die vollständige Geschichte finden Sie unter Reverse Engineering der TP-Link HS110
Ein Python-Client für das proprietäre TP-Link-Smart-Home-Protokoll zur Steuerung der TP-Link-WLAN-Smartplugs HS100, HS110 und KP115. Das SmartHome-Protokoll läuft über TCP-Port 9999 und verwendet eine triviale XOR-Autokey-Verschlüsselung, die keine Sicherheit bietet.
Es gibt keinen Authentifizierungsmechanismus, und Befehle werden unabhängig vom Gerätezustand (konfiguriert/nicht konfiguriert) akzeptiert.
Befehle werden im JSON-Format übergeben, zum Beispiel:
{"system":{"get_sysinfo":null}}
Statt null können wir auch {} schreiben. Befehle können verschachtelt sein, zum Beispiel:
{"system":{"get_sysinfo":null},"time":{"get_time":null}}
Eine vollständige Liste der Befehle finden Sie in tplink-smarthome-commands.txt.
./tplink_smartplug.py -t <ip> [-c <cmd> || -j <json>]
Geben Sie die Ziel-IP mit -t und einen zu sendenden Befehl entweder mit -c oder
-j an. Befehle für das Flag -c:
Erweiterte Befehle wie das Erstellen oder Bearbeiten von Regeln können über das
Flag -j ausgegeben werden, indem die vollständige JSON-Zeichenfolge für den Befehl angegeben wird. Bitte
konsultieren Sie tplink-smarthome-commands.txt für eine
umfassende Liste der Befehle.
[!TIP] Verwenden Sie für eine hübsch formatierte Ausgabe den Parameter -q und leiten Sie die Ausgabe durch
jqweiter. Zum Beispiel:./tplink_smartplug.py -t 192.168.178.49 -c info -q | jq
Wireshark-Dissector zum Entschlüsseln von TP-Link-Smart-Home-Protokollpaketen (TCP-Port 9999).

[!NOTE]
Wenn Sie Wireshark > 3.5.0 haben, können Sie den integrierten Dissector verwenden.
Kopieren Sie tplink-smarthome.lua nach:
| Betriebssystem | Installationspfad |
|---|---|
| Windows | %APPDATA%\Wireshark\plugins |
| Linux/MacOS | $HOME/.local/lib/wireshark/plugins |
Ein Proof-of-Concept-Python-Client zur Kommunikation mit einem TP-Link-Gerät über das TP-Link Device Debug Protocol (TDDP).
TDDP ist über eine ganze Reihe von TP-Link-Geräten implementiert, darunter Router, Zugangspunkte, Kameras und Smartplugs. TDDP kann die Konfiguration eines Geräts lesen und schreiben sowie spezielle Befehle ausgeben. Zum Senden von Befehlen wird UDP-Port 1040 verwendet; Antworten kommen über UDP-Port 61000 zurück. Dieser Client wurde mit einem TP-Link-Archer-C9-WLAN-Router und einem TP-Link-HS-110-WLAN-Smartplug getestet.
TDDP ist ein binäres Protokoll, das im Patent CN102096654A dokumentiert ist.
Befehle werden ausgegeben, indem die entsprechenden Werte in den Kopfzeilenfeldern Type und SubType gesetzt werden. Die Daten werden DES-verschlüsselt zurückgegeben und erfordern den Benutzernamen und das Passwort des Geräts zum Entschlüsseln. Ebenso müssen Konfigurationsdaten, die auf das Gerät geschrieben werden sollen, verschlüsselt gesendet werden. Der DES-Schlüssel wird konstruiert, indem der MD5-Hash aus aneinandergereihtem Benutzernamen und Passwort berechnet und dann die ersten 8 Bytes des MD5-Hashs verwendet werden.
./tddp-client.py -t <ip> -u username -p password -c 0A
Geben Sie die Ziel-IP mit -t an. Sie können einen Benutzernamen und ein Passwort angeben, andernfalls wird standardmäßig admin/admin verwendet. Diese sind erforderlich, um die zurückgegebenen Daten zu entschlüsseln.
Geben Sie den Befehl als zweistelligen Hex-String an, z. B. -c 0A. Welche Art von Daten ein Befehl auslesen kann, ist je nach TP-Link-Gerät unterschiedlich.
Das Auslesen des WAN-Verbindungsstatus auf einem Archer C9 in der Standardkonfiguration zeigt, dass die Verbindung getrennt ist (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
| Befehl | Beschreibung |
|---|
| antitheft | Listet konfigurierte Antitheftregeln auf |
| cloudinfo | Gibt Informationen zur Cloud-Verbindung zurück |
| countdown | Listet konfigurierte Countdownregeln auf |
| energy | Gibt Echtzeit-Spannung/Strom/Leistung zurück |
| energy_reset | Setzt die Energiemesswerte zurück |
| info | Gibt Geräteinformationen zurück |
| ledoff | Schaltet die LED-Anzeige aus |
| ledon | Schaltet die LED-Anzeige ein |
| off | Schaltet die Steckdose aus |
| on | Schaltet die Steckdose ein |
| reboot | Startet das Gerät neu |
| reset | Setzt das Gerät auf die Werkseinstellungen zurück |
| runtime_reset | Löscht die Laufzeitstatistiken |
| schedule | Listet konfigurierte Zeitplanregeln auf |
| time | Gibt die Systemzeit zurück |
| wlanscan | Sucht nach nahegelegenen Zugangspunkten |