
Cliente de TP-Link WiFi SmartPlug y disector de Wireshark
Para conocer la historia completa, consulta Ingeniería inversa del TP-Link HS110
Un cliente Python para el protocolo propietario Smart Home de TP-Link que permite controlar los enchufes inteligentes WiFi TP-Link HS100, HS110 y KP115. El protocolo SmartHome se ejecuta en el puerto TCP 9999 y utiliza un cifrado trivial XOR autoclave que no proporciona ninguna seguridad.
No existe ningún mecanismo de autenticación y los comandos se aceptan independientemente del estado del dispositivo (configurado/no configurado).
Los comandos tienen formato JSON, por ejemplo:
{"system":{"get_sysinfo":null}}
En lugar de null también podemos escribir {}. Los comandos se pueden anidar, por ejemplo:
{"system":{"get_sysinfo":null},"time":{"get_time":null}}
En tplink-smarthome-commands.txt se proporciona una lista completa de comandos.
./tplink_smartplug.py -t <ip> [-c <cmd> || -j <json>]
Proporciona la IP de destino usando -t y un comando para enviar mediante -c o
-j. Comandos para la opción -c:
Los comandos más avanzados, como crear o editar reglas, se pueden enviar usando la opción -j proporcionando la cadena JSON completa del comando. Consulta tplink-smarthome-commands.txt para obtener una lista completa de comandos.
[!TIP] Para imprimir la respuesta de forma legible, usa el parámetro silencioso (-q) y canaliza la salida mediante
jq. Por ejemplo:./tplink_smartplug.py -t 192.168.178.49 -c info -q | jq
Disector de Wireshark para descifrar los paquetes del protocolo Smart Home de TP-Link (puerto TCP 9999).

[!NOTE]
Si tienes Wireshark > 3.5.0, puedes usar el disector integrado.
Copia tplink-smarthome.lua en:
| SO | Ruta de instalación |
|---|---|
| Windows | %APPDATA%\Wireshark\plugins |
| Linux/MacOS | $HOME/.local/lib/wireshark/plugins |
Un cliente Python de prueba de concepto para comunicarse con un dispositivo TP-Link mediante el Protocolo de depuración de dispositivos TP-Link (TDDP).
TDDP está implementado en una amplia gama de dispositivos TP-Link, incluidos routers, puntos de acceso, cámaras y enchufes inteligentes. TDDP puede leer y escribir la configuración de un dispositivo y emitir comandos especiales. El puerto UDP 1040 se usa para enviar comandos; las respuestas llegan por el puerto UDP 61000. Este cliente se ha probado con un router inalámbrico TP-Link Archer C9 y un enchufe inteligente WiFi TP-Link HS-110.
TDDP es un protocolo binario documentado en la patente CN102096654A.
Los comandos se emiten estableciendo los valores adecuados en los campos de cabecera Type y SubType. Los datos se devuelven cifrados con DES y requieren el nombre de usuario y la contraseña del dispositivo para descifrarse. Asimismo, los datos de configuración que se van a escribir en el dispositivo deben enviarse cifrados. La clave DES se construye tomando el hash MD5 del nombre de usuario y la contraseña concatenados y luego tomando los primeros 8 bytes de ese hash MD5.
./tddp-client.py -t <ip> -u username -p password -c 0A
Proporciona la IP de destino usando -t. Puedes proporcionar un nombre de usuario y una contraseña; de lo contrario, se usa admin/admin como valor predeterminado. Son necesarios para descifrar los datos devueltos.
Proporciona el comando como una cadena hexadecimal de dos caracteres, p. ej. -c 0A. El tipo de datos que puede leer un comando variará según los distintos dispositivos TP-Link.
Leyendo el estado del enlace WAN en un Archer C9 en la configuración predeterminada se muestra que el enlace está caído (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 | Lista las reglas de antitheft configuradas |
| cloudinfo | Devuelve información de conectividad a la nube |
| countdown | Lista las reglas de cuenta atrás configuradas |
| energy | Devuelve voltaje/corriente/potencia en tiempo real |
| energy_reset | Reinicia los medidores de energía |
| info | Devuelve información del dispositivo |
| ledoff | Apaga el indicador LED |
| ledon | Enciende el indicador LED |
| off | Apaga el enchufe |
| on | Enciende el enchufe |
| reboot | Reinicia el dispositivo |
| reset | Restablece el dispositivo a los ajustes de fábrica |
| runtime_reset | Borra las estadísticas de ejecución |
| schedule | Lista las reglas de programación configuradas |
| time | Devuelve la hora del sistema |
| wlanscan | Escanea los puntos de acceso cercanos |