Implementación real
Con este artículo llegamos a la continuación de la parte 2, un caso de uso real. Quiero dominar mi dispositivo, que para eso lo he comprado y lo he pagado.
Hemos visto que dependiendo del tipo de dispositivo que adquirimos, tiene un tipo de controlador u otro, llegando a cargar un sistema operativo completo como ocurre en un router moderno.
Todo es adaptable, y por eso estos dispositivos traen un proceso de actualización (como los routers) para evitar posibles "escándalos" por temas de seguridad, algo muy controvertido en este momento.
También hemos visto que si conocemos un poco la arquitectura podemos acceder muy fácilmente al dispositivo mediante acceso al hardware a través del puerto UART, pero por simplicidad nos interesa explotar el software que viene dentro.
Uno de estos puntos es conocer rápidamente cómo funciona, la app oficial que controla estos dispositivos dispone de un método para ello, y explotar de la misma manera el software que gestiona el hardware. Todos los dispositivos IoT comerciales disponen de este tipo de "vulnerabilidad" por diseño. No entraré en la parte de cómo obtener la información aquí expuesta para
obtener los payloads, ya que ese conocimiento se da por hecho que el lector lo tiene.
Cómo hemos visto antes, generalmente podemos acceder mediante red a estos dispositivos desde dos ámbitos:
- Red local
- Internet (IoT)
El acceso por red local generalmente es sencillo y obligatorio, ya que estos dispositivos aunque tengan conexiones "seguras" tienen que ser configurados y para ello generan un AP. El tráfico de esta red puede ser monitorizadas (tú eres el dueño de la red). Con este tipo de comunicaciones podemos llegar al resultado expuesto en la anterior parte y hacer un script sencillo para comprobar el resultado:
Esta información es básica y sin manipular, ya que siempre puedes cambiar los valores y los parámetros. Este pequeño script genera un POST que obtiene una respuesta con el token de autenticación que el dispositivo considera válido, para poder explotar la API interna y poder configurarse. Sencillo ¿verdad?
Una vez que conoces cómo obtener el token de autenticación, ya puedes acceder a los servicios a la API que gestionan el hardware. Este proceso es extrapolable a cualquier API basada en autenticación por token de seguridad, es decir, todos y cada uno de los dispositivos IoT que puedas encontrar en una tienda convencional.
Evidentemente, el fabricante quiere ocultarnos esta información básica porque prefiere que uses su APP oficial y las limitaciones que quiera imponer al producto. Esto te va a llevar a una situación en la que nadie va a proporcionar una documentación detallada para explotar estos servicios, aunque existen maneras de acelerar el proceso.
En el repositorio he creado un script bash con simples verbos capturados que ofrecen la información básica a explotar, e incluso una captura de la cámara en formato jpg
El uso de este tipo de contenidos por bash está muy bien, para aprender y lanzar comandos es muy correcto y podemos completar y complicar el script todo lo que queramos, pero la finalidad perseguida es explotar esto desde un programa sencillo al alcance de todos o un entorno productivo. Lo que se pretende es controlar el hardware adquirido de manera útil y aumentar las funcionalidades que ofrece de serie el fabricante.
Para ello he programado una prueba de concepto en python, capaz de autenticar y extraer información dentro de tu red.
Bien, la prueba de concepto es prácticamente un success, con su implementación de métodos que nos permite utilizar de manera sencilla un par de requests para obtener el token y un verbo para consumir la API con sus parámetros funcionales.
Podemos seguir implementando todos los verbos que queramos, de hecho quedan pendientes algunos que he incluído en el bash script, pero seguimos sin acercarnos a nuestro objetivo real, controlar el dispositivo remotamente, ya que así sólo podemos explotar en nuestra red local el dispositivo y necesitaríamos acceder a ella. Este dispositivo (no hace falta decir que todos los IoT están incluídos en este grupo) se controlan a través de Internet, por lo que necesito una "adaptación" al uso cotidiano.
Ahí es donde entra la implementación de la clase Tapo:
Me extendería detalladamente en argumentar e implementar todas los métodos, e incluso en completar (si el tiempo lo concede) un numero mayor de verbos y funcionalidades, pero básicamente esta clase proporciona un cliente en formato librería para autenticar y consumir una API que maneja y controla el dispositivo, al igual que lo hace la app, sólo que permite una integración en sistemas más complejos.
El funcionamiento depende del verbo que se quiera lanzar, ya que hay varios tipos de implementación (no conocemos la documentación oficial):
- Autenticación básica y consumo tradicional de la API
- Funcionalidades con peticiones síncronas, que nos permiten controlar, obtener información y enviar comandos (como mover la cámara)
- Funcionalidades de obtención de información en vivo. Son aquellas que nos permiten extraer eventos en vivo e incluso el video en directo manteniendo una conexión abierta.
He subido el código fuente en este repositorio de github para que cualquiera pueda aprender y usarlo respetando al autor, pero sobretodo para que se entienda cómo siendo constructivos podemos dominar esta electrónica Made in China.
En la siguiente entrada relacionada con la temática enseñaré como implementar otro tipo de dispositivos y a integrar esta librería python en un ejemplo real en una tarea de automatización bastante útil.