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

En la primera parte de esta serie de artículos sobre análisis de dispositivos USB con Wireshark, que podéis encontrar aquí, hicimos una primera aproximación a la investigación acerca del funcionamiento de un dispositivo USB. Si no recordáis cómo hacer una captura de tráfico con Wireshark de un USB, os recomiendo leer la primera parte de esta serie.

El primer artículo terminaba con una referencia a los conceptos que vamos a tratar aquí; clases, descriptores, interfaces, endpoints… Estos conceptos son fundamentales tenerlos claros para poder analizar y conocer cómo funcionan, y para ello seguiremos con nuestro análisis USB con Wireshark, cuando conectamos un dispositivo de este tipo a nuestro equipo.

En primer lugar tenemos que tener claro que existen muchos tipos de clases de USB, no solo aquellos con los que estamos más acostumbrados a trabajar, como pueden ser los dispositivos de almacenamiento, o los dispositivos de interfaz humana (HID, Human Interface Device).

Class: Una clase nos permite definer funcionalidades del dispositivo USB. Algunos ejemplos son:

  • Class 1 – Audio
  • Class 3 – HID (Human Interface Device)
  • Class 6 – Image
  • Class 7 – Printers
  • Class 8 – Mass Storage

Los pendrives que utilizamos para almacenar y transportar nuestros ficheros pertenecen a la clase 8 (Mass Storage), mientras que los ratones o teclados USB, pertenecen a la clase 3 (HID).

En las primeras capturas que realizamos con Wireshark ya pudimos observar en algunos de los paquetes cómo los dispositivos y el host utilizaban descriptores para solicitar e intercambiar información. Esta información, como su nombre indica, sirve para describir características y funcionalidades del dispositivo.

Wireshark - Descriptores USB

En la imagen anterior podemos observar en la columna Info que enter el host y el dispositivo (con dirección 7) se intercambian una serie de solicitudes y respuestas. El host solicita información que le describa el dispositivo, la configuración y otras cadenas con información de interés para que el host pueda proponer la configuración más idónea.

En la siguiente imagen podemos ver un ejemplo de solicitud y respuesta de un descriptor del dispositivo conectado.

Wireshark - Descriptores USB

En la imagen anterior podemos ver la respuesta a una solicitud de descriptor (de tipo dispositivo) y la respuesta del dispositivo. Versión USB (0x0200, 2), tamaño máximo de paquetes en las comunicaciones (64 bytes), identificador del vendedor (Silicon Motion) y el número de configuraciones (1).

En la siguiente imagen el host solicita un nuevo descriptor, en este caso de tipo configuración.

Wireshark - Descriptores de dispositivos USB

En la respuesta del dispositivo a la consulta del descriptor de configuración, el dispositivo informa que dispone de una sola interfaz (bNumInterfaces), la potencia máxima (500mA) y por ejemplo que no se alimenta por si mismo (NOT SELF-POWERED).

Un dispositivo puede tener varias configuraciones, y una configuración a su vez varias interfaces, como puede ocurrir por ejemplo con una Webcam USB, ya que dispone de interfaz para la funcionalidad de cámara y otra interfaz de tipo Mass Storage para almacenar las fotografías o vídeos.

Wireshark - Descriptores de dispositivos USB

En la imagen anterior podemos observar que en este caso es un descriptor de tipo interfaz el que facilita más información al host. Se confirma que se trata de un Mass Storage, y que además su subclase es el 6 (0x06) y el protocolo el 50 (0x50), que suele ser lo habitual en los pendrives / thumbdrives / flashdrives. Otro dato a tener en cuenta es que dispone de 2 endpoints. Los endpoints son los canales de comunicación del dispositivo, que pueden ser de entrada (IN) o de salida (OUT).

Wireshark - Descriptores de dispositivos USB

Al tratarse de un dispositivo de clase Mass Storage, el host solicita más información como puede ser por ejemplo el número de particiones que tiene el disco, y lo hace a través del comando GET MAX LUN. La respuesta del dispositivo es que su Max LUN es el 0, es decir, tiene solo una partición ya que 0 se corresponde al índice de un vector de particiones.

Wireshark - Descriptores de un dispositivo USB

Una vez que el host ya ha solicitado toda la información al dispositivo a través de sus descriptores, ya puede empezar a trabajar con él. Al tratarse un dispositivo de almacenamiento USB, el host utiliza comandos SCSI para interactuar con éste. En la imagen anterior el dispositivo informa a través de un comando SCSI del estado de la funcionalidad de extraer de forma segura el dispositivo (Prevent/Allow Medium Removal).

Hasta aquí esta segunda parte de análisis de USB con Wireshark, que como siempre, espero os haya gustado y sea de vuestro interés, y sobre todo os pueda resultar útil.

¡Hasta la próxima!

Miguel Ángel Arroyo
@miguel_arroyo76