
Клиент умных розеток TP-Link WiFi и диссектор Wireshark
Полную историю см. в Реверс-инжиниринг TP-Link HS110
Python-клиент для проприетарного протокола TP-Link Smart Home для управления WiFi-розетками TP-Link HS100, HS110 и KP115. Протокол 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] Для форматированного вывода ответа используйте параметр тихого режима (-q) и направьте вывод через
jq. Например:./tplink_smartplug.py -t 192.168.178.49 -c info -q | jq
Диссектор Wireshark для расшифровки пакетов протокола TP-Link Smart Home (TCP-порт 9999).

[!NOTE]
Если у вас Wireshark > 3.5.0, можно использовать встроенный диссектор.
Скопируйте tplink-smarthome.lua в:
| OS | Installation Path |
|---|---|
| Windows | %APPDATA%\Wireshark\plugins |
| Linux/MacOS | $HOME/.local/lib/wireshark/plugins |
Python-клиент уровня proof-of-concept для взаимодействия с устройством TP-Link с использованием TP-Link Device Debug Protocol (TDDP).
TDDP реализован в широком спектре устройств TP-Link, включая маршрутизаторы, точки доступа, камеры и умные розетки. TDDP может читать и записывать конфигурацию устройства и отправлять специальные команды. Для отправки команд используется UDP-порт 1040, ответы приходят на UDP-порт 61000. Этот клиент был протестирован с беспроводным маршрутизатором TP-Link Archer C9 и WiFi-розеткой TP-Link HS-110.
TDDP — это бинарный протокол, описанный в патенте CN102096654A.
Команды отправляются путём задания соответствующих значений в полях Type и SubType заголовка. Возвращаемые данные зашифрованы DES, и для их расшифровки требуются имя пользователя и пароль устройства. Аналогично, данные конфигурации для записи в устройство должны отправляться в зашифрованном виде. Ключ DES формируется путём вычисления MD5-хеша от объединённых имени пользователя и пароля, а затем берутся первые 8 байт этого MD5-хеша.
./tddp-client.py -t <ip> -u username -p password -c 0A
Укажите целевой IP-адрес с помощью -t. Вы можете указать имя пользователя и пароль,
в противном случае по умолчанию используются admin/admin. Они необходимы для расшифровки
возвращаемых данных.
Укажите команду в виде двухсимвольной шестнадцатеричной строки, например -c 0A. Тип данных,
которые команда может считать, будет различаться для разных устройств TP-Link.
Считывание статуса WAN-подключения на Archer C9 с конфигурацией по умолчанию показывает, что соединение опущено (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 | Выключает светодиодный индикатор |
| ledon | Включает светодиодный индикатор |
| off | Выключает розетку |
| on | Включает розетку |
| reboot | Перезагружает устройство |
| reset | Сбрасывает устройство к заводским настройкам |
| runtime_reset | стирает статистику времени работы |
| schedule | Выводит настроенные правила расписания |
| time | Возвращает системное время |
| wlanscan | Сканирует ближайшие точки доступа |