Bad-Usb con Arduino

“Blancanieves mordió la manzana y se envenenó. Hasta que el príncipe azul no le dio un beso esta no despertó de su sueño y pudieron vivir felices.”

Introducción

Introducir un USB con un autorun permitía envenenar cualquier equipo, la bruja ofrecía un goloso USB o DVD con una belleza digna de la manzana del árbol del Eden.

El título podía incluir desde un “listados del último ERE”, “Próximos despidos” o algo tan banal y de baja catadura moral como un simple “Pr0N”. Esto servía para que muchas víctimas mordiesen la manzana y quedasen dormidas a la espera su príncipe azul.

Dicho príncipe normalmente hacía su aparición como persona del departamento de IT pero su beso permitirá volver a la vida y recuperar la dignidad e información perdida, al menos aquella que humanamente se pudiese y no hubiese pasado las fronteras del muro de Adriano.

Underc0de - Bad Usb Arduino Parte 1

Medidas como inhabilitar el autorun por defecto fueron el elixir del que se contagiaron todos los sistemas. Esto permitió que ahora los equipos estuviesen mejor protegidos contra ataques previstos de esta manera y ahora había que tentar a la suerte dejando alguna manzana en forma de archivo ejecutable que el usuario y la curiosidad de felino hiciesen abrir las puertas al gran caballo.

Normalmente la vía es un ejecutable escondido como un archivo o utilizando un fallo de ejecución de código del visor de documentos.

Para el atacante muchas veces era caminar a ciegas las versiones de los programas que disponía la empresa y esperar con cierta fé en sus dotes malignos de engaño, que el usuario aparte de conectar el USB eligiese el archivo y lo abriese con una versión explotable de un visor de documentos.

Del lado del castillo, la mayoría de los usuarios se sienten seguros cuando insertan un USB y simplemente lo formatean para utilizarlo.

La mayor parte de la gente con conocimientos en seguridad no suele privarse de la oportunidad de obtener unos megas adicionales de almacenamiento gratis a cambio de insertar el USB para simplemente darle formato nuevo o borrar los archivos que este contiene.

Todo es completamente limpio, nítido y estéril.

El usuario habituado a que nada se ejecute de forma automática cuando solamente introduce el dispositivo de almacenamiento,ha dejado, de alguna forma, de ser todo lo precavido que debiera al menos en dicha dirección.

Este usuario avispado, se permite el lujo de poder conectar lo que desee porque sabe de sobra que el sistema operativo no permitirá que se autoejecute nada.

Underc0de - Safe usb

Además, no va a caer en ejecutar o ver nada de dicho USB, simplemente lo formateará para poder utilizarlo para unos fines más nobles que los que tenía la malvada bruja que dejo a posta olvidado esa manzana en el parking o el baño.


Cambio de vista para un nuevo ataque.

El 2014 después de beber del elixir presentado por “Adrian Crenshaw” en el trabajo titulado “Programmable HID USB Keystroke Dongle: Using the Teensy as a Pen Testing Device” de la defcon 18, y tras un pequeño cambio de filosofía en la vía de acción apareció Psychson.

La idea original se basaba en que el USB a introducir era un teclado que mediante una combinación de teclas permita ejecutar una serie de órdenes sin necesidad de la intervención del usuario.

Entonces “Blancanieves” mordería la manzana solo con conectar el dispositivo al ordenador.

Psychson es la receta del veneno basado en esa idea utilizando los pendrives con un modelo específico (en concreto aquellos que tengan el chip 8K eD3 NAND flash).

Mediante su código, puedes reprogramar un pendrive con dicho chip de manera que a partir de ese momento el pendrive será un teclado.

Con esa premisa, trabajaremos para aprender a hacer una manzana similar.

Underc0de - Teclado virtual bad usb arduino

El concepto es muy sencillo, al conectar el pendrive estaremos en realidad conectando un teclado que enviará unas instrucciones preprogramadas que se teclearán en el ordenador.

Lo que podremos hacer desde teclado, se podrá hacer a través de este dispositivo.

Además, todos los comandos serán ejecutados con los privilegios del usuario que conecte el pendrive en el ordenador sin necesidad de hacer fuerza bruta o tener que obtener su password por otros medios.

Un método ideal y fácil para cualquiera que desee envenenar nuestro sistema, aprenderemos de él para poder testear nuestras empresas con idea de poder crear, identificar y evitar caer en manos de la malvada bruja.


El maravilloso mundo de los dispositivos democráticos

Por unas pocas monedas de oro cualquiera podía obtenerlos, y en concreto nos fijaremos en el conocido como Arduino.

Es de precio accesible, tamaño y la facilidad de uso hace que encontrar en cualquier lugar sea rápido, así que este será dispositivo a utilizar para generar una manzana envenenada.

Underc0de - Bad Usb Arduino

Entre los sabores en los que encotraremos, utilizaremos el modelo Leonardo (dispone el chip ATmega32u4).

Es posible utilizar cualquier otro modelo mientras realicemos un cambio de firmware o montemos un circuito en los pinouts de nuestro arduino mediante la libreria vusb.

Ahora mismo solo somos aprendices de artes mágicas, utilizaremos un Arduino Leonardo, se puede utilizar directamente la librería keyboard incluida en el propio entorno.


Empezando a crear nuestra pequeña manzana envenenada

El primer paso es obtener:

  • IDE de Arduino, para hacer el conjuro, solo un papiro servirá.
  • Es recomendable descargar el software aunque el IDE séa descargable a través de los repositorios de las distribuciones de Linux.
  • Esta recomendación viene que normalmente el IDE contenido en los repositorios suele ser notablemente más viejo que los que se encuentran en la página oficial.

Tras la descarga, debemos descomprimir el empaquetado y podremos empezar a trabajar con el IDE para implementar los conjuros y venenos que deseemos sobre la placa de Arduino.

Hay que dar un pequeño paso justo antes de ejecutar el IDE por primera vez.

Underc0de - Arduino Ide

Debemos incluir a nuestro usuario en el grupo dialout para tener permisos y poder programar la placa.

Para actualizar y que el usuario séa parte de dicho grupo, hay que volver a logear con el usuario.

Para arrancar el programa simplemente nos dirigimos al directorio donde hemos descomprimido el programa y ejecutaremos el comando:

El programa tiene una sencilla pantalla en la que se puede escribir código.

Para subir un programa a la placa, hay que pulsar el botón con la flecha señalando a la derecha, el segundo botón, y con eso se compilará el código y se subirá a la placa.

Antes de subir la placa hay que elegir la placa que vamos a utilizar desde el menú Tools->Board donde seleccionaremos la opción Leonardo.

Deberá seleccionar el device utilizado para usar la placa, con lo que:

  • Tools->Port
  • seleccionaremos /dev/ttyACM0
  • Debemos tener en cuenta que el último número puede cambiar según los pequeños gnomos que rigen el kernel decidan bautizar al programador.

Un programa muy utilizado para certificar que todo funciona correctamente es el siguiente:

Este pequeño programa hará que el led integrado a la placa, se encienda y se apague cada 3 segundos.

Si tras subir el programa a la placa, visualiza este funcionamiento podremos decir al viento “y se hizo la luz“.

Significa que tenemos todos los ingredientes necesarios para realizar nuestra pequeña manzana envenenada.


Nuestro primer hechizo.

La base de nuestro recetario de venenos será siempre:

Debemos incluir siempre la librería keyboard, es la que permite utilizar las funciones que configuran el Arduino como si fuese un teclado.

Para nuestra primera manzana envenenada simplemente, haremos que mágicamente se escriba una frase en la pantalla.

Para ello debemos llamar a la función que pone el Arduino en modo teclado Keyboard.begin(), luego escribir algo en pantalla mediante la función Keyboard.print() y volver a dejar al Arduino como un mero Arduino de nuevo mediante la orden keyboard.end().

La función print tiene como prámetro de entrada un string que se corresponde con lo que se desea escribir mediante el teclado.

Debemos conocer que desde que ponemos el Arduino en modo teclado hasta que el ordenador lo detecta como teclado pasa cierto tiempo, es bueno que dejemos un tiempo de espera en el Arduino.

Cuando el Arduino empiece a introducir pulsaciones de teclado el ordenador ya se habrá enterado de que tiene un teclado conectado a él. Para ello utilizaremos la función delay() que tiene como parámetro el número de milisegundos que se desea esperar.
La estructura de programa típica de los programas Arduino tiene una función de setup y una función de loop.

La función de loop está todo el rato repitiendose, cómo vamos a jugar con Arduino, insertaremos el código en la parte de setup para que se ejecute una vez y termine el programa.

O al menos la parte del programa que se encarga de teclear los comandos.

Al subir el programa aparecerá en la pantalla escrita la frase que hemos puesto dentro del print.

Como estamos en la ventana del IDE de arduino, será ahí donde se escriba la frase como si fuésemos nosotros los que la hubiésemos escrito desde teclado.

Cada vez que desconectamos y volvemos a conectar la placa Arduino en el equipo la frase se volverá a escribir en nuestra pantalla.

El único problema es que dependemos de que el usuario esté utilizando una aplicación en la que tenga sentido teclear lo que nosotros estamos introduciendo vía teclado automaticamente.

Si estamos en un editor de texto la frase podrá ser visualizada, si estamos en un editor de dibujo o en el mismo escritorio, dichas pulsaciones de teclado no realizarán ninguna acción (Al menos las que hemos puesto para este ejemplo).

Con esto hemos aprendido un poco lo más básico de como pasar algo por teclado utilizando la placa.


Conjuros de nivel básico

Bajo la misma dinámica, es posible hacer recetas de automatización de comandos para que al tener una terminal en Linux, sean ejecutados determinados comandos uno detrás de otro.

Si vamos agregando lineas a la orden keyboard.print() con órdenes de la terminal de Linux terminadas con el caracter de intro \n censeguimos ejecutar los comandos preparados de forma automática.

Por ejemplo, si deseamos automatizar un proceso que realiza un cat de un archivo específico, después descargar una pagina web de una IP especifica y hacer un cat de ésta pondríamos las siguientes lineas en el programa Arduino:

Al subir el programa deben ser introducidor por teclado los comandos que estamos especificando.

Podrá probar el programa conectando el Arduino tras haber dejado abierta una terminal. También observará los comandos que se van ejecutando secuencialmente tal y como fue preparado.

Con esto, ya estamos casi a disposición de poder hacer autentica magia utilizando nuestro pendrive falso.

Podríamos bajar cualquier ejecutable de una dirección de Internet que se le pueda indicar al ordenador y una vez bajado el archivo ejecutarlo.

La dirección de Internet puede ser cualquier archivo, por ejemplo; un archivo de control remoto que al ejecutar devuelva una shell en el ordenador donde ha sido introducido el pendrive.

Una forma sencilla de envenenar nuestra manzana podría ser; ejecutar un nc para tener el control de comandos en el pc remoto. Por ejemplo:

Permite conectarnos a un ordenador remoto al puerto 6565 y enviar instrucciones que terminarán por ser ejecutadas en el ordenador al que hayamos tecleado el comando.

Se puede hacer una prueba sencilla simplemente escribiendo el comando en un ordenador y observará que nos conectamos al puerto y la consola muestra la salida de lo que estamos ejecutando.

Resumiendo, mayormente si ejecutamos en otro ordenador:

A partir de alli podremos escribir comandos que serán ejecutados en el ordenador donde fue ejecutado el primer comando.

La salida por pantalla de estos se verá en este último equipo.

Bien, pero también queremos poder ver desde el ordenador remoto la salida del comando.

Lanzaremos un doble conjuro para hacer que la salida de un comando sea la entrada de otro nc en el puerto siguiente.

Podremos fácilmente conectarnos a los dos puertos y enviar comandos por una pantalla y recibirlos por otra.

Para hacer que la salida del primer comando vaya a otro comando y que abra otro puerto al que nos podamos conectar para ver dicha salida, simplemente modificaremos un poco más el primer comando escribiendo en una terminal:

Para controlar el ordenador donde hemos ejecutado el comando tenemos que conectarnos a su puerto 6565 para mandar comandos y al 6566 para recibir la salida de los comandos.

Podemos probar abriendo tres terminales en un ordenador, ejecutando el comando anterior en una de ellas y ejecutando una conexión a los puertos 6565 y 6566 en cada una de las restantes.

De modo que en la terminal número uno:

Terminal número dos:

Terminal número tres:

Donde será posible enviar comandos en la terminal número dos, por ejemplo un ls o un cat /etc/passwd para visualizar lo que devuelven la máquina remota (en este caso particular es la misma) por la terminal número tres.

Teniendo claro todo esto, podemos observar como una simple linea de comando permite tener el control remoto de un ordenador.

Y el programa de Arduino que conforma la malvada manzana envenenada.

Nos llevaremos una amarga sorpresa al subir el programa a la placa.

El resultado del tecleo es completamente erróneo, la salida de teclado (a no ser que tengamos configurado el teclado como americano) devolverá algunos caracteres cambiados que estropean todo nuestro maligno plan.

Antes de escribir nada, ejecutamos el comando que indica a Linux la distribución del teclado que es Americano para ejecutar las lineas de nuestro programa y otra vez devolver al teclado su configuración original.

Esto supone simplemente un comando antes del conjuro y otro después.

En mi caso, el teclado esta en español, cambiare el modo de teclado a estados unidos, ejecutaré las pulsaciones de teclado que deseo para después volver otra vez a Español.

El programa apenas cambia y tendría el siguiente formato:

Ahora podremos conectar nuestro Arduino con la terminal abierta y ver el resultado cuando alguien muerda nuestra pequeña manzana envenenada.

Podemos observar que hay incluido un pequeño delay de medio segundo entre el comando del cambio de formato de teclado y la ejecución.

Por precaución, no vaya a ser que el Arduino dispare el comando antes de que el sistema ejecute el cambio de teclado.

Entiendo que si esto llegara a pasar, podremos tener el buffer de entrada de teclado, que tambíen podría haber incorporado previamente teclas en formato erroneo y eso no es algo deseable.

No obstante, probablemente el programa funcione sin eso en la mayoría de equipos.

Como se vé, el limite reside en la utilización de nuestra imaginación para proponer comandos que permiten hacer lo que deseemos con las combinaciones pertinentes, quedan algunas cosas que aún podrmeos mejorar.

Hay que tener en cuenta que ahora mismo estaríamos en condiciones de bajar cualquier archivo de una web determinada donde hemos dejado un binario de control y ejecutarlo en la máquina que ha mordido nuestra manzana.


Conjuuros de nivel avanzado

Como último colofón a este pequeño libro sobre envenenamiento de manzanas especialmente ideado para brujas y hechiceros.

Trataremos de incorporar en nuestra manzana un binario.

La intención final es que ejecutar sin tener que bajar de un sitio remoto.

Una idea que podemos seguir es la de hacer un archivo mediante el comando printf.

Mediante el modificador \x en un printf se puede pasar dos números en hexadecimal que imprimirán por pantalla el byte al que representan.

Si eso en lugar de pasarlo por pantalla se redirecciona (mediante >) a un archivo, obtendremos la salida en un archivo.

Si los bytes que introducimos en dicho archivo corresponden con los de un archivo binario, entonces el archivo resultante, obviamente, será dicho archivo binario.

Debemos obtener los bytes necesarios para meter dentro del comando printf que serán ejecutados en la terminal gracias a la función keyboard.print, es la que funciona como teclado en Arduino.

El programa que subiremos al arduino tendrá el siguiente formato:

Los códigos exactos del binario se deben introducir dentro de las comillas precedidas por las contrabarras (\”\”).

Solo debemos obtener cada uno de los caracteres del binario a ejecutar precedidos de una contrabarra y una x para pegarlo a nuestro código Arduino.

Como en un editor hexadecimal, hacerlo a mano puede ser un trabajo bastante tedioso, podemos hacer uso de awk y hexdump para automatizarlo.

Hexdump nos muestra los bytes del archivo especificado en hexadecimal, deberá ejecutar con el argumento -v para que no se coma los bytes que se repitan dentro del archivo.

De manera que el siguiente comando:

Devolverá las direcciones y contenido de los bytes del archivo.

Nosotros solo queremos los bytes en hexadecimal debemos concatenar la salida de este con un awk para quedarnos con las 8 palabras de datos que nos interesan.

El comando completo sería el siguiente:

Como puede observar awk lee cada una de las lineas y saca por pantalla en diferentes lineas las palabras de la 2 a la 9.

Son las que se corresponden con los bytes del archivo en memoria.

Ahora debemos separar dichas palabras a tamaño byte, la salida devuelve 4 números hexadecimales y no solo 2.

Así que de nuevo usaremos awk para separar dichos números en grupos de dos.

Cada grupo de dos se le dará la vuelta por como son representados en los ordenadores a nivel interno y se añadirá \ y x antes de cada número para obtener la salida correcta que debemos meter en el printf.

Resumiendo todo esto:

La salida del comando serán los bytes del fichero binario dispuestos para ser impresos en un archivo que después pueda ser ejecutado.

Por tal motivo en el comando que se ejecuta en Arduino, hemos puesto una redirección a un archivo que se llama /tmp/myegg será el archivo destino en el ordenador que introduzca nuestro pendrive.

Al que después se le da el flag de ejecutable mediante la orden chmod y por último simplemente lo ejecutamos.

Se deberá tener en cuenta el tamaño máximo de archivos que permite la memoria del arduino que esta situado en 32KB, asi que solo caben binarios o ejecutables relativamente pequeños.

Como ejemplo y por temas de espacio utilizaremos el script en bash:

Obtendremos el siguiente resultado:

El resultado final del programa para subir a Arduino:

Somos capaces, como la bruja de blancanieves, hacer manzanas bastante suculentas.

Aún quedan dos pequeños flecos para que la manzana sea roja y bella del todo al estilo de la manzana de Adan.

Lo primero, hasta ahora debíamos abrir la consola de comandos a mano para que los comandos sean ejecutables en Arduino.

Utilizmos el atajo de teclado control + alt + t permite abrir una terminal en la mayoría de distribuciones Linux.

Para ello podemos utilizar las funciones Keyboard.press() y Keyboard.releaseAll().

La primera de ellas tendrá como entrada el código de tecla que deseemos pulsar, la segunda no tiene ningun argumento de entrada.

Antes de imprimir las lineas que deseamos ejecutar forzaremos a que el Arduino envíe el atajo de teclado de abrir una terminal.

El cambio al anterior programa es mínimo:

Todo el código se ejecutará en la terminal que se abre, tras conectar el pendrive.

Por último, añadiremos al programa las instrucciones que permiten eliminar el echo local para que no sea visible en la terminal, lo que está ejecutando el programa y se realizará un exit al final de la ejecución para que cierre la ventana.

Como es obvio, la idea final es ejecutar el comando en segundo plano por lo que se añadira un & cuando ejecuta el comando myegg con la intención de que quede en segundo plano ejecutándose (Si por ejemplo nuestra intención es ejecutar un servidor).

Con el programa que hemos propuesto de ejemplo, carecería de sentido hacerlo porque no es un servidor que quede a la escucha.

Al final el código que generaremos será el siguiente:


Despedida y cierre

Por el momento esto es todo.

En la siguiente entrega se realizará un modulo de metasploit.

La idea es aprender a hacer módulos de metasploit simples a la vez que integramos un módulo que automatice la generación de programas en Arduino que incorporen un payload genérico de matasploit que pueda elegir de la suite.


Agradecemos a AnimaNegra por compartir con nosotros su libro de hechizos de Arduino y Bad-Usb

 

Posts Relacionados

Comments

comments

Deja una respuesta

Tu email no será publicado. Los campos requeridos estan marcados con *
Puedes usar tags HTML y los atributos: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">