¿Es posible inyectar binarios usando una USB Rubber Ducky? El dispositivo creado hace años por Hack5 tiene la posibilidad de ingresar a un equipo una gran cantidad de teclas en corto tiempo, ¿pero es posible ingresar desde el teclado archivos binarios?
Sí es posible, aquí les cuento cómo.
Introducción
Ya alguna vez publiqué algo sobre seguridad relacionada con los teclados, pero esta vez es diferente. El propósito de este post es explicar cómo se pueden inyectar archivos binarios en un Windows 10 utilizando el emulador de teclado “USB Rubber Ducky“. Si bien existen varios proyectos alternativos, para simular las teclas del teclado en este proyecto se utilizó la USB Rubber Ducky original de Hack5.
En la imagen de arriba se ve cómo Angela de Mr. Robot usa la USB Rubber Ducky porque cuenta con acceso físico al equipo a vulnerar, pero sólo disponiendo de 15 segundos para interactuar. Ese es el principal uso para el que fue diseñada la USB Rubber Ducky. El de inyectar miles de teclas en pocos segundos o minutos como si se tipeara a super velocidad. ¿Y por qué es posible? Normalmente porque es muy poco probable que se deshabilite o blacklistee en los equipos la interfaz de teclado. Y al conectarla Ducky así se presenta ante el sistema, como un teclado.
El objetivo fue probar si además de tipear comandos o scripts, también se podian inyectar binarios a través de la Ducky. Googleando sólo se encontraron algunos post comentando que sería factible inyectar binarios, pero que sería muy difícil… No pude encontrar ninguna publicación de alguien que lo hubiera hecho.
Lo que se desarrolló entonces, fue un procedimiento que permite inyectar cualquier archivo binario arbitrario, en este caso, en una máquina con Windows 10 simplemente usando la emulación de teclado de la Ducky.
DISCLAIMER
Toda la información incluida en esta publicación se hace únicamente con carácter educativo. El autor o sus colaboradores no se hacen responsables por cualquier acción ilícita que se pueda realizar a partir de dicha información.
USB Rubber Ducky
Como afirma el vendedor, “La USB Rubber Ducky inyecta teclas a velocidades sobrehumanas, violando la confianza inherente que las computdoras tienen en los humanos al hacerse pasar por un teclado.“
Fig. 1. USB Rubber Ducky
El dispositivo parece un pendrive USB. Sin embargo, es en realidad un emulador de teclado. Esto significa que lee los códigos de las teclas de una memoria micro SD y los envía al equipo como si fuera un humano escribiendo. Hay mucha información en Internet de cómo usar el Ducky y también hay muchos scripts publicados. Para utilizar el dispositivo se deben que seguir los siguientes pasos:
- Descargar cualquier codificador de inyección de USB Rubber Ducky.
Hay varios, pero para este caso se utilizó el Duck Toolkit porque tiene la codificación del lenguaje que se necesitaba.
- Crear el script apropiado en lenguaje USB Rubber Ducky
El lenguaje USB Rubber Ducky es bastante sencillo, y le indica al procesador lo que debe hacer en forma secuencial. Este es un ejemplo sencillo de un script:
REM Las siguientes tres líneas ejecutan un prompt de comando en Windows
GUI r
DELAY 100
STRING cmd
ENTER
En este ejemplo, los comandos utilizados se comportan de la siguiente manera:
REM: es una línea de comentario, no se hará nada
GUI: es la tecla de Windows que se mantendrá apretada con la siguiente tecla indicada. En este ejemplo ‘GUI r’ significa, WindowsKey+r (hará aparecer el prompt de Windows Run…)
DELAY: el sistema esperará las decenas de milisegundos siguientes. En este ejemplo, ‘DELAY 100’ significa retrasar 1000 milisegundos, es decir, 1 segundo.
STRING: significa que el string que sigue se escribirá tal cual; en este caso escribirá ‘cmd’
ENTER: se pulsará la tecla Enter
Hay más comandos en este lenguaje, sin embargo, para el propósito de este post, sólo se utilizarán los indicados. Este script de inyección se puede salvar en un archivo de texto, por ejemplo: “test.inject.txt“
- Codificar el script con el codificador
Una vez creado el archivo de script, se necesita codificarlo para que la Ducky lo entienda. Es muy importante tener en cuenta el lenguaje del teclado que tiene configurado el Windows de destino. También conviene hacer pruebas ya que puede ser que el mapa de teclas no coincida exáctamente con la codificación que envía la Ducky. Una vez determinada la codificación, se ejecuta un comando como este:
$ducktools.py -e test.inject.txt -l us test.inject.txt.bin
- Quitar la micro SD de la USB Rubber Ducky y conectarla a una máquina auxiliar (en este caso, la máquina auxiliar tenía Linux).
- Copiar el archivo .bin de la máquina auxiliar a la micro SD
$cp test.inject.txt.bin /media/.../inject.bin
- Retirar la micro SD de la máquina auxiliar y conectarla de nuevo en la USB Rubber Ducky
- Insertar la USB Rubber Ducky en el conector USB de la máquina de destino.
- La Ducky comenzará a escribir…
Archivos binarios Powershell
Hay varias formas de crear archivos binarios a partir de un string de enteros en powershell. Después de hacer varias pruebas, se decidió utilizar la siguiente opción:
[io.file]::WriteAllBytes('<archivo binario>',$bytecode)
En esta línea, se crea un archivo de nomnre ‘<archivo binario>’ basado en la secuencia de bytecodes contenida en la variable $bytecode.
Por lo tanto, previamente se debe crear y llenar con la secuencia de bytecodes del archivo de origen, la variable de tipo Byte $bytecode. La variable se puede crear simplemente con el siguiente comando de powershell:
$bytecode = <byte 1>,<byte 2>,<byte 3>,...,<último byte>
La secuencia de bytes del archivo original se puede extraer (por ejemplo) en una máquina Linux con el siguiente comando:
$od -An -tu1 -w1 -v test.exe > test.exe.txt
Pero en este caso, para facilitar el proceso, se desarrolló un script en python.
Creación del archivo de inyección
Para leer todos los bytes del archivo binario original, y crear el archivo de inyección para la USB Rubber Ducky, se creó un pequeño script en python: bin2duck. El mismo se puede descargar aquí.
En la siguiente sección, se describe el tutorial del proceso completo para inyectar un archivo binario a un Windows 10 con Powershell habilitado a través de la USB Rubber Ducky.
Tutorial
El objetivo principal de esta técnica es el de inyectar archivos binarios (como por ejemplo ejecutables) a una máquina con Windows 10.
Para el proceso completo, además de la Ducky, también se necesita una segunda máquina. Seguramente el procedimiento se podrá ejecutar en un Windows con python, pero en este caso se utilizó Linux.
El inventario completo es:
- La máquina de destino (con Windows 10).
- Una máquina auxiliar (con Linux).
- La USB Rubber Ducky.
Para el ejemplo de este tutorial, se utilizó un ejecutable legítimo de Windows 10 extraido desde otra máquina con la misma versión de Windows que la máquina destino.
Estos son los pasos:
- Buscar el binario que se quiere inyectar, por ejemplo el ejecutable: hostname.exe
C:\Windows\System32\hostname.exe
Para la primera prueba conviene que el ejecutable sea uno extraído de la misma versión de Windows de la máquina de destino.
- Copiar el ejecutable a un equipo Linux
Por red, USB, etc.
- En la máquina Linux, ejecutar el script de python que lee el binario y crea el archivo script en el lenguaje de la USB Rubber Ducky:
$bin2duck.py -i hostname.exe -m 2
se creará un archivo de texto llamado ‘inj.hostname.exe‘ con un formato similar a éste:
DELAY 2000
STRING # Reading xxx bytes
ENTER
STRING $start=date
ENTER
STRING # Progress: 0%, 0 bytes
ENTER
STRING $bytecodetemp = $bytecodetemp + 77,90,144,0,....
ENTER
DELAY 200
STRING # Progress: 3%, 512 bytes
ENTER
STRING $bytecodetemp = $bytecodetemp + 128,18,0,0,....
ENTER
.
.
.
STRING # Progress: 100%, xxx bytes
ENTER
STRING $end=date
ENTER
STRING $start
ENTER
STRING $end
ENTER
STRING [byte[]] $bytecode = $bytecodetemp
ENTER
DELAY 200
STRING [io.file]::WriteAllBytes('inj.hostname.exe',$bytecode)
ENTER
- Codificar el archivo creado y generar el archivo de inyección USB Rubber Ducky
$ducktools.py -e inj.hostname.exe -l mx inj.hostname.exe.bin
- Insertar la micro SD de la USB Rubber Ducky en la máquina auxiliar
- Copiar el archivo de inyección en la micro SD
$cp inj.hostname.exe.bin /media/.../inject.bin
Nota: El nombre del archivo de destino DEBE ser ‘inject.bin’.
- Desmontar la micro SD
$umount /dev/sdX1
- Retirar la micro SD e insertarla en la USB Rubber Ducky
- Ir al sistema de destino
- Iniciar una ventana de comandos de Windows (Win+r, Inicio > Ejecutar > cmd.exe, etc.)
- Con el cursor en la ventana de comandos, insertar la USB Rubber Ducky en el sistema Windows 10 de destino. La USB Rubber Ducky comenzará a ‘tipear’ de acuerdo a lo indicado en el inject.bin:
Fig. 2. Ejecución del inject.bin.
- Esperar a que el proceso termine y se cree el archivo, en este caso: hostname.exe.
Este proceso tardará varios minutos dependiendo del tamaño del archivo. Según las pruebas realizadas, la velocidad es de entre 30 y 60 bytes/segundo. Eso significa que inyectar un archivo de 1MB, demoraría, con esta técnica, entre 5 y 10 horas… Pero si no hay otra forma de hacerlo y se dispone del equipo por más de 5 horas, vale la pena…
Nota: Durante el proceso NO se puede tocar ni mouse ni teclado, ya que si se cambia el foco, la Ducky sequirá tipeando donde esté el foco y puede arruinar el proceso de generación de la variable (además de escribir cualquier cosa en otra aplicación). Se debe recordar que el dispositivo está emulando a una persona tipeando.
Fig. 3. Creación del binario en la máquina de destino.
- Ejecutar el archivo binario recién creado. En este caso se probaron los 2: el comando original hostname, y el archivo inyectado: inj.hostname.exe.
Fig. 4. Ejecución del binario de destino.
Si el archivo es demasiado grande se puede comprimir (por ejemplo, como archivo.zip), enviar el archivo.zip como binario a través de la USB Rubber Ducky y luego descomprimirlo en la máquina de destino.
Resumen
Los ataques a las máquinas aisladas o air-gapped son muy difíciles de lograr. Estas restricciones son aún mayores si la máquina tiene tanto los dispositivos de almacenamiento USB y de booteo externo desactivados. Por lo tanto, la única forma de llevar adelante un ataque en estos equipos es a través del teclado.
Se creó un procedimiento y un script para inyectar archivos binarios en una máquina Windows 10 a través del emulador de teclado USB Rubber Ducky. Se inyectaron con éxito en dicha máquina diferentes archivos binarios, por ejemplo, archivos .exe y .zip. Los archivos ejecutables inyectados fueron ejecutados con éxito.
Agradecimientos
Me gustaría agradecer al equipo técnico de Platinum Ciber que participó en esta iniciativa. Ellos son: Alejandro Diaschi, Facundo Keller, Santiago Sarchetti y quiero mencionar especialmente a Maykel Camargo quien me dio la idea de usar la USB Rubber Ducky para inyectar “cosas” dentro de una máquina por medios no convencionales.
Espero que les sirva.
Nota por Carlos Benitez