
Herramienta simple de inyección de pulsaciones de teclas para Windows y Linux que extrae datos WiFi almacenados (SSID y contraseña).

¿Alguna vez has visto una película donde un hacker enchufa una unidad USB aparentemente normal a una computadora y al instante roba datos? Hoy construirás un dispositivo que hace exactamente eso.
⚠️ Aviso legal:
Todo el contenido de este proyecto está destinado únicamente a fines de investigación en seguridad.
En el verano de 2022, me propuse construir un dispositivo capaz de extraer datos de una computadora objetivo. Pero, ¿cómo se implementa realmente un malware y se exfiltra información? En las siguientes secciones, explicaré los pasos esenciales, los conceptos subyacentes y los matices técnicos involucrados en la creación de una herramienta de inyección de teclas personalizada. Si bien este proyecto se centra específicamente en las credenciales WiFi, el payload puede modificarse fácilmente para fines más avanzados o maliciosos; los únicos límites reales son tu creatividad y experiencia técnica.
Con el tiempo, el proyecto ha crecido hasta incluir una gran variedad de scripts y herramientas. Originalmente fue creado para demostrar las capacidades de un Rubber Ducky, específicamente una versión económica usando la Raspberry Pi Pico (RPi Pico). Actualmente, los dos componentes principales del proyecto son:
Acceso físico a la computadora desbloqueada de la víctima.
La computadora debe tener acceso a Internet para poder enviar los datos robados usando SMTP para la exfiltración a través de un medio de red.
Conocimiento de la contraseña de la computadora de la víctima para el exploit en Linux.
Después de crear un pico-ducky, solo necesitas copiar el payload modificado (ajustado con tus datos de SMTP para el exploit en Windows y/o ajustado con la contraseña de Linux y el nombre de la unidad USB) a la RPi Pico.
[!NOTE]
Es posible construir esta herramienta usando el Rubber Ducky, pero ten en cuenta que la RPi Pico cuesta aproximadamente $4.00 y el Rubber Ducky cuesta $80.00.
Sin embargo, aunque pico-ducky es una solución buena y económica, el Rubber Ducky ofrece ventajas como el sigilo y el uso de la última versión de DuckyScript.
Para usar Ducky Script y escribir el payload en tu RPi Pico, primero debes convertirla en un pico-ducky. Sigue estos sencillos pasos para crear un pico-ducky.
Una herramienta de inyección de teclas, una vez conectada a una máquina host, ejecuta comandos maliciosos imitando las pulsaciones de teclas ingresadas por un usuario. Aunque parece una unidad USB, actúa como un teclado que escribe un payload preprogramado. Herramientas como Rubber Ducky pueden escribir más de 1000 palabras por minuto. Una vez creado, cualquier persona con acceso físico puede implementar este payload con facilidad.
El payload usa el comando STRING para procesar las teclas de inyección. Acepta uno o más caracteres alfanuméricos/de puntuación y escribirá el resto de la línea exactamente como está en la máquina objetivo. ENTER/SPACE simularán la pulsación de teclas del teclado.
Usamos el comando DELAY para pausar temporalmente la ejecución del payload. Esto es útil cuando un payload necesita esperar a que un elemento, como una línea de comandos, se cargue. El retardo es útil al principio, cuando se conecta un nuevo dispositivo USB a una computadora objetivo. Inicialmente, la computadora debe completar una serie de acciones antes de poder comenzar a aceptar comandos de entrada. En el caso de los HID, el tiempo de configuración es muy corto. En la mayoría de los casos, toma una fracción de segundo porque los controladores están integrados. Sin embargo, en algunos casos, una PC más lenta puede tardar más en reconocer el pico-ducky. El consejo general es ajustar el tiempo de retardo según tu objetivo.
La exfiltración de datos es la transferencia no autorizada de datos desde una computadora/dispositivo. Una vez que los datos se recopilan, un adversario puede empaquetarlos para evitar la detección mientras los envía a través de la red usando cifrado o compresión. Las dos formas más comunes de exfiltración son:
Este enfoque se utilizó para el exploit en Windows. El payload completo se puede ver aquí.
Este enfoque se utilizó para el exploit en Linux. El payload completo se puede ver aquí.
Para usar el payload de Windows (payload1.dd), no necesitas conectar ningún cable puente entre los pines.
Una vez que las contraseñas se hayan exportado al archivo .txt, el payload enviará los datos al correo electrónico designado usando Yahoo SMTP. Para obtener instrucciones más detalladas, visita el siguiente enlace. Además, la plantilla del payload debe actualizarse con tu información SMTP, lo que significa que debes actualizar RECEIVER_EMAIL, SENDER_EMAIL y tu PASSWORD de correo electrónico. También podrías actualizar el cuerpo y el asunto del correo.
[!NOTE]
Después de enviar los datos por correo electrónico, el archivo
.txtse elimina.También puedes usar un SMTP de otro proveedor de correo, pero debes tener en cuenta el servidor SMTP y los números de puerto que escribirás en el payload.
Ten en cuenta que algunas redes podrían bloquear el uso de un SMTP desconocido en el firewall.
Para usar el payload de Linux (payload2.dd) necesitas conectar un cable puente entre GND y GPIO5 para cumplir con el código en code.py de tu RPi Pico. Para obtener más información sobre cómo configurar múltiples payloads en tu RPi Pico, visita este enlace.
Fig. 1: Exploit en Linux
Una vez que las contraseñas se hayan exportado de la computadora, los datos se guardarán en la unidad flash USB designada. Para que este payload funcione correctamente, debe actualizarse con el nombre correcto de tu unidad USB, lo que significa que deberás reemplazar USBSTICK con el nombre de tu unidad USB en dos lugares.
Además, también deberás actualizar la PASSWORD de Linux en el payload en tres lugares. Como se mencionó anteriormente, para que este exploit tenga éxito, necesitarás conocer la contraseña de la máquina Linux de la víctima, lo que hace que este ataque sea menos plausible.
Para ejecutar el script wifi_passwords_print.sh deberás actualizar el script con el nombre correcto de tu unidad USB, después de lo cual podrás escribir el siguiente comando en tu terminal:
echo PASSWORD | sudo -S sh wifi_passwords_print.sh USBSTICK
donde PASSWORD es la contraseña de tu cuenta y USBSTICK es el nombre de tu dispositivo USB.
NetworkManager se basa en el concepto de perfiles de conexión y utiliza complementos para leer/escribir datos. Usa el formato de archivo clave de tipo .ini y almacena perfiles de configuración de red. keyfile es un complemento que admite todos los tipos de conexión y capacidades que tiene NetworkManager. Los archivos se encuentran en /etc/NetworkManager/system-connections/. Basado en el formato keyfile, el payload utiliza el comando grep con expresiones regulares para extraer los datos de interés. Para el filtrado de archivos, se utilizó una aserción de búsqueda hacia atrás positiva modificada ((?<=keyword)). Mientras que la aserción de búsqueda hacia atrás positiva coincidirá en una posición determinada en la cadena, sc. en una posición justo después de la palabra clave sin hacer que ese texto forme parte de la coincidencia, la expresión regular (?<=keyword).* coincidirá con cualquier texto después de la palabra clave. Esto permite que el payload coincida con los valores después de las palabras clave SSID y psk (clave precompartida).
Para obtener más información sobre NetworkManager, aquí hay algunos enlaces útiles:
A continuación se muestra un ejemplo de los datos exfiltrados y formateados de una máquina víctima en un archivo .txt.
Una de las ventajas del Rubber Ducky sobre la RPi Pico es que no se muestra como un dispositivo de almacenamiento masivo USB cuando se conecta. Una vez conectada a la computadora, la máquina solo la ve como un teclado USB. Este no es el comportamiento predeterminado de la RPi Pico. Si deseas evitar que tu RPi Pico se muestre como un dispositivo de almacenamiento masivo USB cuando esté conectada, debes conectar un cable puente entre el pin 18 (GND) y el pin 20 (GPIO15). Para obtener más detalles, visita este enlace.
💡 Consejo:
- Carga tu payload en la RPi Pico antes de conectar los pines.
- No sueltes los pines porque probablemente querrás cambiar/actualizar el payload en algún momento.
Al crear un archivo de payload funcional, puedes usar el script writer.py, o puedes cambiar manualmente el archivo de plantilla. Para ejecutar el script correctamente, deberás pasar, además del nombre del archivo del script, un nombre del SO (windows o linux) y el nombre del archivo de payload (por ejemplo, payload1.dd). A continuación, puedes encontrar un ejemplo de cómo ejecutar el script writer al crear un payload para Windows.
python3 writer.py windows payload1.dd
Con algunas modificaciones menores, los scripts utilizados anteriormente también se pueden adaptar para ejecutarse en el Bash Bunny. El Bash Bunny funciona emulando un dispositivo USB de confianza [1]. Para este proyecto, lo configuraremos para que emule un dispositivo de almacenamiento flash usando el siguiente comando [1, 2]:
ATTACKMODE HID STORAGE
Usando el comando ATTACKMODE de DuckyScript, podemos definir qué tipo de dispositivo debe emular el Bash Bunny [1]. Cada modo de ataque se registra en el sistema con un ID de proveedor USB (VID) y un ID de producto (PID) únicos [1]. También es posible combinar varios modos de ataque encadenándolos.
Fig. 2: Bash Bunny Mark I conectado a una PC
El Bash Bunny admite los comandos originales de DuckyScript, por lo que pude reutilizar el script de la sección del Rubber Ducky. Para usar estos comandos en línea, debemos anteponerles el comando QUACK [1]. Por ejemplo, en lugar de escribir WINDOWS r, escribimos Q WINDOWS r.
Para cargar payloads en el Bash Bunny, el dispositivo debe estar en modo armado (posición del interruptor 3, la más cercana al conector USB) [1]. Una vez conectado, copia payload.txt y exfil.txt a payloads\switch1. Los payloads deben llamarse payload.txt [1,2], mientras que los archivos de soporte a los que hace referencia el payload pueden nombrarse libremente.
Para referencia, la estructura de directorios de almacenamiento masivo del Bash Bunny es la siguiente [2]:
BashBunny/
├── loot/
│ └── (los datos exfiltrados de los payloads se guardarán aquí)
└── payloads/
├── library/
│ └── (scripts o módulos reutilizables)
├── switch1/
│ ├── payload.txt
│ └── (archivos opcionales, por ejemplo, exfil.txt, scripts, etc.)
└── switch2/
├── payload.txt
└── (archivos opcionales)
Fig. 3: Estructura de directorios de almacenamiento masivo del Bash Bunny
Una vez que el script haya terminado de ejecutarse, los resultados se guardarán en loot\wifi_pass.txt. Si la computadora objetivo no tiene contraseñas WiFi guardadas, el archivo estará vacío.
[!NOTE]
Dado que el ataque con Bash Bunny depende de un script de PowerShell (
exfil.txt), solo se puede usar en sistemas Windows. Para usar un enfoque similar en Linux, deberás modificar el payload y reemplazar el script de PowerShell por el script Bash al que se hace referencia en la sección de Linux anterior.
Este pico-ducky actualmente solo funciona en Windows OS.
Este ataque requiere acceso físico a un dispositivo desbloqueado para implementarse con éxito.
El exploit en Linux es mucho menos probable que tenga éxito, porque para lograrlo no solo necesitas acceso físico a un dispositivo desbloqueado, sino que también necesitas conocer la contraseña del administrador de la máquina Linux.
El firewall de la máquina o de la red puede evitar que los datos robados se envíen a través del medio de red.
Los retardos del payload podrían ser inadecuados debido a las diferentes velocidades de las distintas computadoras utilizadas para implementar un ataque.
El dispositivo pico-ducky no es realmente sigiloso; de hecho, es todo lo contrario, es bastante voluminoso, especialmente si sueldas los pines.
Además, el dispositivo pico-ducky es notablemente más lento en comparación con el Rubber Ducky ejecutando el mismo script.
Si Caps Lock está activado, parte del código del payload no se ejecutará y el exploit fallará.
Si la computadora tiene un entorno de idioma no inglés configurado, este exploit no tendrá éxito.
Actualmente, pico-ducky no es compatible con DuckyScript 3.0, solo se puede usar DuckyScript 1.0. Si necesitas la versión 3.0, deberás usar el Rubber Ducky. ¡Para este exploit no se necesita la versión 3.0!