
TP-Link WiFi SmartPlug クライアントと Wireshark ディセクタ
詳しい話は、Reverse Engineering the TP-Link HS110 を参照してください。
TP-Link HS100、HS110、KP115 WiFi スマートプラグを制御するための、プロプライエタリな TP-Link Smart Home プロトコル用 Python クライアントです。SmartHome プロトコルは TCP ポート 9999 で動作し、セキュリティを提供しない単純な XOR オートキー暗号化を使用します。
認証メカニズムはなく、コマンドはデバイスの状態(設定済み/未設定)に関係なく受け入れられます。
コマンドは JSON でフォーマットされます。例:
{"system":{"get_sysinfo":null}}
null の代わりに {} と書くこともできます。コマンドはネストできます。例:
{"system":{"get_sysinfo":null},"time":{"get_time":null}}
コマンドの完全なリストは tplink-smarthome-commands.txt にあります。
./tplink_smartplug.py -t <ip> [-c <cmd> || -j <json>]
ターゲット IP は -t で指定し、送信するコマンドは -c または -j で指定します。-c フラグで使用できるコマンド:
ルールの作成や編集など、より高度なコマンドは、-j フラグでコマンドの完全な JSON 文字列を指定して発行できます。コマンドの包括的なリストについては、tplink-smarthome-commands.txt を参照してください。
[!TIP] 応答をプリティプリントするには、quiet パラメータ(-q)を使用して、出力を
jqにパイプします。例:./tplink_smartplug.py -t 192.168.178.49 -c info -q | jq
TP-Link Smart Home プロトコルのパケット(TCP ポート 9999)を復号するための Wireshark ディセクタです。

[!NOTE]
Wireshark > 3.5.0 をお持ちの場合は、組み込みのディセクタを使用できます。
tplink-smarthome.lua を次の場所にコピーします:
| OS | Installation Path |
|---|---|
| Windows | %APPDATA%\Wireshark\plugins |
| Linux/MacOS | $HOME/.local/lib/wireshark/plugins |
TP-Link Device Debug Protocol (TDDP) を使用して TP-Link デバイスと通信するための概念実証(proof-of-concept)Python クライアントです。
TDDP は、ルーター、アクセスポイント、カメラ、スマートプラグなど、幅広い TP-Link デバイスに実装されています。TDDP はデバイスの設定を読み書きし、特別なコマンドを発行できます。コマンドの送信には UDP ポート 1040 が使用され、応答は UDP ポート 61000 で返されます。このクライアントは、TP-Link Archer C9 ワイヤレスルーターと TP-Link HS-110 WiFi スマートプラグでテストされています。
TDDP は、特許 CN102096654A に記載されているバイナリプロトコルです。
コマンドは、Type および SubType ヘッダーフィールドに適切な値を設定して発行します。返されるデータは DES 暗号化されており、復号にはデバイスのユーザー名とパスワードが必要です。同様に、デバイスに書き込む設定データは暗号化して送信する必要があります。DES キーは、ユーザー名とパスワードを連結した MD5 ハッシュを取得し、その MD5 ハッシュの最初の 8 バイトを取ることで構築されます。
./tddp-client.py -t <ip> -u username -p password -c 0A
ターゲット IP は -t で指定します。ユーザー名とパスワードを指定できます。指定しない場合、デフォルトとして admin/admin が使用されます。これらは、返されるデータを復号するために必要です。
コマンドは 2 文字の 16 進文字列、例: -c 0A で指定します。コマンドが読み出すデータの種類は、TP-Link デバイスによって異なります。
デフォルト設定の Archer C9 で WAN リンクステータスを読み取ると、リンクがダウン(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
| Command | Description |
|---|
| antitheft | 設定されている盗難防止ルールを一覧表示します |
| cloudinfo | クラウド接続情報を返します |
| countdown | 設定されているカウントダウンルールを一覧表示します |
| energy | リアルタイムの電圧/電流/電力を返します |
| energy_reset | エネルギー メーターをリセットします |
| info | デバイス情報を返します |
| ledoff | LED インジケータをオフにします |
| ledon | LED インジケータをオンにします |
| off | プラグをオフにします |
| on | プラグをオンにします |
| reboot | デバイスを再起動します |
| reset | デバイスを工場出荷時設定にリセットします |
| runtime_reset | 稼働時間の統計情報を消去します |
| schedule | 設定されているスケジュールルールを一覧表示します |
| time | システム時刻を返します |
| wlanscan | 近くのアクセスポイントをスキャンします |