martes, marzo 20, 2018

Amazon Dash Button: Un hack para enviar un SMS las noches de fiesta

Hace unas semanas decidí comprar un DashButton, uno de esos botones para el mundo IoT que comercializa Amazon y que, asociados a diferentes marcas, permiten al usuario poder comprar un producto que está asociado al botón sin necesidad más que la de pulsarlo. El botón está configurado para que el usuario pueda adquirir el producto sin introducir ningún dato durante el proceso. Muchos me pueden preguntar para qué compre eso, pero es fácil, quería darle una vuelta a esta tecnología tan sencilla y quería ver qué cosas podía hacer con él.

Figura 1: Amazon Dash Button: Un hack para enviar un SMS las noches de fiesta

Ojeando un poco por Internet vi que existen muchos usos, desde pedir pizza con el botón, usarlo de timbre en casa, solicitar un taxi, etcétera. Sin duda, el límite está en nuestra imaginación. Aprovechando que pasé por el TechFest de la URJC en la semana que dedicaban el congreso a sistemas robóticos y el mundo de IoT, decidí jugar con el DashButton. Aparte, mi compañero Álvaro Nuñez-Romero hizo una demo sobre MicroLatch muy recomendable, utilizando Latch en el ámbito de la domótica.

Requisitos para hacer tu proyecto con el DashButton

Lo primero, como es lógico, es tener un DashButton. Una de las posibilidades es manipular el DashButton para modificar su lógica a nivel de circuito, pero en esta ocasión lo haremos todo desde el punto de vista lógico. Estudiaremos cómo funciona el DashButton a nivel de peticiones para ello le “encerraremos” en una Wi-Fi con una Raspberry Pi. A la posible pregunta de, ¿por qué Nesquik? Soy más de Nesquik que de ColaCao ;-)

Figura 2: Mi DashButton de Nesquick

Para esto, tenemos que configurar el DashButton para que cuando se conecte a una Wi-Fi, ésta sea la de nuestra Raspberry Pi. Es importante que la Raspberry Pi no tenga salida a Internet, o al menos la interfaz Wi-Fi no reenvíe el tráfico a la interfaz de cable y las peticiones alcancen Internet.

¿Qué pretendemos?

Lo primero es poder identificar la dirección MAC de nuestro DashButton, ya que en la carcasa no viene. Con la dirección MAC podremos detectar cuando el DashButton está utilizando la red para intentar comprar algo, es decir, cuando el usuario ha pulsado el botón. Éste es nuestro plan para poder cambiar la funcionalidad al botón IoT:
1. El botón se encuentra conectado a una red Wi-Fi, la que crearemos en nuestra Raspberry Pi. 
2. La Raspberry Pi tiene instalado y configurado hostapd, esto nos permite convertir la interfaz Wi-Fi en un AP, Access Point. 
3. La interfaz de red cableada de la Raspberry Pi estará conectada a Internet, pero esto no es importante, lo importante es que la interfaz Wi-Fi y la de cable no tengan puente entre ambas. Es decir, cuando el tráfico del botón llegue por la interfaz Wi-Fi de la Raspberry Pi, ésta no lo reenvíe por la de cable que estará conectada a Internet. 
4. Conectar el DashButton a la Wi-Fi de la Raspberry Pi, tener un sniffer escuchando por la interfaz inalámbrica y poder capturar el tráfico que el botón genera cuando es pulsado.
Identificar cuando un usuario pulsa el botón es importante, ya que necesitamos esto para poder aplicar la lógica que nosotros queramos.

La captura de tráfico

El punto 4 es importante, gracias a este paso podremos descubrir la dirección MAC del botón, y podremos ver cuál es el comportamiento del dispositivo cuando es pulsado en lo que a peticiones de red se refiere.

Figura 3: Descubriendo la MAC del DashButton

Como se puede ver en la imagen, lo primero que hace el botón es obtener una dirección IP a través del protocolo DHCP, así como servidores DNS y puerta de enlace. Aunque no se vea en la captura, también hace uso del protocolo ARP para obtener la dirección física de la puerta de enlace.

El botón realiza una petición DNS para resolver una dirección del NIST, en este caso, es el dominio de un servidor NTP. Como se puede ver en la imagen, posteriormente, hace uso del protocolo NTP para la sincronización horaria. Por último, realiza peticiones DNS para resolver una dirección de Amazon. El último paquete que envía es el inicio de conexión de protocolo TCP en la que apunta al puerto 443, con el objetivo de iniciar una conexión bajo HTTPS. Esta conexión daría lugar a la compra del artículo asociado al botón.

¿Qué podemos hacer? Es fácil, tenemos los elementos para detectar que el botón ha sido activado. Si observamos en la red tráfico cuya dirección física origen es la MAC del dispositivo y observamos un inicio de conexión TCP con el flag de SYN activo al puerto 443, esto quiere decir que el botón ha sido pulsado por el usuario. Estas dos circunstancias serán nuestros desencadenantes para llevar a cabo la ejecución de cualquier script, es decir, cualquier acción que queramos.

El código: Un par de scripts

En este caso, he preparado un script escrito en Ruby con el que, al detectar, mediante el uso de PacketFu, una librería similar a Scapy en Python, tráfico con dirección origen la del botón y un paquete TCP destino al puerto 443 se dispare otro script con el que se ejecutará lo que realmente queremos hacer.

Figura 4: 

El código del sniffer viene del esqueleto que PacketFu proporciona en su Github. Se puede observar como si el paquete recibido tiene trama Ethernet y su MAC origen es la del botón se pasa a evaluar si el paquete tiene capa TCP y si, además, se realiza una conexión al puerto destino 443. Si esto ocurre se invoca un segundo script.

Figura 5: PacketFu en GitHub

El segundo script implementa la conexión con un cliente de SMS a través de su API para poder enviar un mensaje vía SMS a cualquier dispositivo móvil. En este caso, está configurado el envío del mensaje:
“Hey Girl! Already at home! Im not so drunk… I drove myself home!!!”.
¿Cuando es útil esto? Llegas a casa después de una noche movida y no te apetece escribir, pulsas el botón, notificas que llegaste bien a casa y a dormir. En la siguiente imagen, se puede ver como es el mensaje que nos llega al móvil configurado.

Figura 6: El mensaje SMS enviado por el DashButton

Como se puede entender, esto es un ejemplo de uso, pero las posibilidades son infinitas, ya que una vez que controlamos cuando el botón es pulsado, el cual será nuestro trigger, podemos ejecutar la acción o acciones que queramos.

Figura 7: PoC de "Jugando con el DashButton de Nesquick"

Durante las pruebas realizadas, se nos han ocurrido usos más serios y potentes orientados a la seguridad, pero tendréis que esperar para poder ver algo de ello. ¿Quizá un Port-Knocking con el botón?

Autor: Pablo González Pérez (@pablogonzalezpe), escritor de los libros "Metasploit para Pentesters", "Hacking con Metasploit: Advance Pentesting" "Hacking Windows", "Ethical Hacking", "Got Root" y “Pentesting con Powershell”, Microsoft MVP en Seguridad y Security Researcher en ElevenPaths

4 comentarios:

  1. Por si interesa un proyecto Made in Spain usando Amazon Dash Button: https://github.com/Nekmo/amazon-dash/
    S2

    ResponderEliminar
  2. Te consideraba un investigador serio. Nesquik en vez de colacao que vergüenza. Deberías ser expulsado del país ;)

    ResponderEliminar
  3. Un programa que uso yo para generar eventos IFTTT es dashrunner

    ResponderEliminar
  4. Hola,
    Quiero juguetear con mi Dash Button, hay en la red un software llamado DashRunnersetup Por otro lado, según veo en AWS https://aws.amazon.com/es/iotbutton/ sería recomendable aprender con el software que indican ¿Qué opinión tenéis de él, me lo recomendáis o hay cosas más sencillas y de código abierto?
    También quiero preguntaros vuestra opinión para formarme autodidácticamente en programar IoT (Internet de las cosas)aplicado al PropTech, ¿Que software me recomendáis aprender, Node.js?
    Gracias

    ResponderEliminar