Análisis de un dispositivo USB con Wireshark – Parte 1

Introducción

¿Cuantas veces hemos conectado y desconectado un dispositivo USB de un ordenador? ¿Te has preguntado alguna vez qué ocurre en nuestro equipo cuando conectamos un pendrive, webcam o teclado USB? En este nuevo artículo vamos a hacer un análisis de un dispositivo USB con Wireshark, la herramienta por excelencia para la captura y análisis de tráfico.

¿Cuál es la motivación? Quizás la postura más cómoda sería obviar y asumir como simple magia el hecho de que conectemos un pendrive, y el sistema automáticamente lo reconozca, sepa el fabricante, producto, protocolo de comunicación, particiones que tiene y la capacidad de éstas. Pero los hackers van más allá, les gusta saber cómo funcionan las cosas. Además creemos firmemente en esta filosofía; Learn, Hack and Share. Aprende, hackea y comparte.

Nota: Si a estas alturas cuando decimos «hackea» lo entiendes como «comete un delito», definitivamente, este no es tu blog.

Entorno de trabajo – Herramienta y comandos

¿Por qué Wireshark? ¿Por qué un sniffer? Porque precisamente vamos a analizar el tráfico que se genera entre nuestro dispositivo USB y el host, es decir, nuestro ordenador.  ¿Cómo sabe el host de qué tipo de USB se trata? ¿Trata igual a un pendrive que a un dispositivo HID (Human Interface Device)? Estas y otras cuestiones intentaremos resolverlas en este post y futuros posts.

Como sistema operativo, utilizaremos Linux. Y la razón es muy sencilla, este SO nos aporta muchísima más información a la hora de conectar o desconectar un USB, que por ejemplo Windows. Y aunque recientemente se ha publicado USBPcap para realizar esto mismo en Windows, Linux lleva ya años haciéndolo, por lo tanto nos centraremos en este SO.

Antes de empezar, una breve reseña histórica a las versiones y velocidades en USB, conceptos que nos vendrán bien más adelante durante nuestro análisis:

1996 – USB 1.0 – Velocidad 1,5 Mbps (Low Speed) y 12 Mbps (Full Speed)
1998 – USB 1.1 – Sin cambio en velocidades
2000 – USB 2.0 – Se añade velocidad 480 Mbps (High Speed)
2008 – USB 3.0 – Se añade velocidad 5 Gbps (Super Speed)

Es importante tener esto en cuenta a la hora de ver los controladores USB que tenemos en nuestro equipo, ya que por ejemplo, un controlador USB 3.0 incluye a su vez uno de 2.0, de ahí que pueda llevar a confusión por la duplicidad de buses de conexión. Esta información la podemos extraer en Linux con dos comando básicos del SO; lspci y lsusb.

lspci | grep USB

USB Forensic - lspci

En este caso podemos ver que tengo dos controladores, generados por VMWare (estoy trabajando con máquina virtual), uno de la versión 1.1 y otro de la versión 2.0. La abreviatura que aparece a continuación indica también el tipo de controlador:

UHCI – Universal Hub Controller Interface (1.0 / 1.1)
EHCI – Enhanced Hub Controller Interface (2.0)
XHCI – Extensible Hub Controller Interface (3.0)

El otro comando, más específico para dispositivos USB, es lsusb.

USB Forensic - lsusb

Con lsusb podemos ver los dispositivos USB conectados en este momento en el equipo, incluidos los propios «root hub» del sistema, ambos como dispositivo 001 en los buses 001 y 002 respectivamente.

El dispositivo que está marcado en amarillo, es un pendrive que tengo actualmente conectado al equipo. Podéis observar que está conectado en el bus 001 como dispositivo 002. Este detalle es importante a la hora de poder analizarlo en Wireshark, ya que necesitaremos aplicar filtros para sólo ver el tráfico que nos interesa.

Antes de abrir Wireshark, tendremos que habilitar un módulo que nos permita depurar / capturar tráfico de tipo USB. El módulo en cuestión es usbmon. Lo habilitamos de la siguiente forma:

modprobe usbmon

Analizando el dispositivo USB con Wireshark

Ahora ya si podemos abrir nuestro Wireshark y podremos ver que en nuestra lista de interfaces aparece nuevas del tipo usbmon, que nos permitirán capturar tráfico USB.

USB Forensic - Wireshark usbmonEn la imagen anterior aparecen dos interfaces usbmon, una por cada bus (recordad que tenemos dos, 001 y 002). En este caso seleccionamos usbmon1 porque el dispositivo USB que queremos analizar se encuentra conectado al bus 001 según vimos con lsusb. Y comenzamos la captura.

Lo que vamos a hacer en este momento, es desconectar y conectar nuevamente el dispositivo, para que podamos capturar precisamente el tráfico que se genera cuando conectamos el USB. Así que paramos la captura de Wireshark, desconectamos USB, comenzamos nueva captura y conectamos nuevamente el USB.

En mi caso, el host ha asignado una nueva dirección (número de dispositivo), ahora es el número 003, en lugar del 002 que tenía anteriormente. Ojo, no confundir conceptos BUS y DEVICE. Observad la salida de lsusb.

Veamos qué ha pasado en Wireshark cuando hemos conectado nuestro USB. Para poder visualizar mejor los paquetes podéis aplicar un filtro para sólo mostrar tráfico del dispositivo en cuestión, tomando como criterio su address:

usb.device_address==3

USB Forensic - Wireshark

Pues bien, nuestro host reconoce que se ha conectado un dispositivo nuevo, que no tiene dirección todavía (0.0) y le solicita que se ponga una dirección, en este caso 3.0. El dispositivo se configura la dirección 3 y a partir de ese momento host y dispositivo se pueden comunicar sin problema.

USB Forensic - Set Address

En el contenido del paquete donde el host hace el «Request» se puede ver cómo le solicita al dispositivo que establezca como dirección (SET ADDRESS) el número 3 (Device: 3).

Si observáis el resto de paquetes en la captura de Wireshark, veréis que muchos de los comandos usados son del tipo GET y SET, para solicitar información y establecer parámetros respectivamente. En próximos artículos veremos más detalle sobre estos comandos.

Aunque parezca algo trivial, han sucedido tareas complejas durante ese intercambio de paquetes, que pueden quedar resumidas de la siguiente forma:

  1. El dispositivo se conecta al equipo
  2. El controlador hub lo reconoce
  3. El host (PC) es informado de que hay un nuevo dispositivo
  4. El controlador hub determina la velocidad
  5. El controlador hub resetea el dispositivo
  6. El host determina si es compatible con High Speed (mediante el envío de señales chirps)
  7. El host solicita información en forma de descriptores (veremos más detalle en siguientes artículos)
  8. El host asigna una dirección al dispositivo
  9. El host se informa de las características del dispositivo
  10. El host asigna y carga un controlador apropiado
  11. El controlador selecciona una configuración apropiada

Hasta aquí esta primera parte de esta serie de artículos orientados al análisis de dispositivos USB. En siguientes artículos veremos qué son los descriptores, qué tipos hay, qué son interfaces y qué son los USB endpoints (no confundir con las soluciones de seguridad ;-).

Como siempre, espero que os resulte útil.

¡Hasta la próxima!

Miguel Ángel Arroyo
@miguel_arroyo76