Pensando sobre dicho concepto me acordé de uno de los homólogos de Wireshark, cuya compatibilidad con éste es bastante alta con la diferencia de que es mucho menos visual e intuitivo que la archiconocida herramienta: Tcpdump. Esta herramienta, cuya utilidad es incalculable en entornos sin interfaz gráfica, es un sniffer con la capacidad de capturar el tráfico tal y como hace Wireshark; si bien tiene como pega que la lectura de los datos capturados no es tan intuitiva como en su "hermano". Aún así no deja de ser una gran herramienta, y además los datos capturados aquí pueden ser leídos por Wireshark, así que los problemas de lectura que tiene la herramienta se puede considerar como un mal menor. Supongamos que, hemos seguido los mismos pasos que en el anterior artículo, a excepción de que, obviamente, en este caso no habremos ejecutado Wireshark. La captura del tráfico generado por el USB se podría realizar mediante este simple comando:
sudo tcpdump -i usbmon1 -w/tmp/usb.cap
Con esto ya estaríamos capturando todo aquello que entrase por usbmon1, sin importar si hay un USB conectado o no. En este caso lo hemos hecho en la propia terminal y estaríamos viendo la captura en pantalla; captura que se estaría volcando en /tmp/usb.cap, pero que en cualquier momento puede cancelarse enviándole la señal de parado de proceso mediante ctrl + C. Obviamente esto es fácilmente modificable y podemos darle una pequeña vuelta de tuerca para que no solo el proceso se ejecute en segundo plano, sino que además el proceso no se cierre ni siquiera al cerrar la sesión activa; es decir que no se cierre hasta que reiniciemos el equipo.
Por otro lado, también podemos hacer que se ejecute como script de arranque. Ambos casos quedarían representados de la siguiente forma:
Para ejecutarlo en segundo plano y que no se detenga a menos que reiniciemos el equipo:
sudonohup tcpdump -i usbmon1 -w/tmp/usb.cap &
En caso de querer hacer que se ejecute en cada arranque, simplemente tendríamos que añadir un script en /etc/init.d/ con el siguiente contenido:
- #! /bin/bash
- #
- # usbsniff init.d script
- ### BEGIN INIT INFO
- # Provides: usbsniff
- # Required-Start: $local_fs $remote_fs $time
- # Required-Stop: $local_fs $remote_fs $time
- # Default-Start: 2 3 4 5
- # Default-Stop: 0 1 6
- # Short-Description: tcpdump para USB
- # Description: Sniffer del trafico USB
- ### END INIT INFO
- tcpdump -i usbmon1 -w /tmp/usb.cap &
Después habría que hacer que el script se iniciase en el arranque; cosa que, si por ejemplo el script se llamase usbsniff.sh, haríamos tal que así:
insserv usbsniff.sh
Esto resultad interesante a nivel didáctico, pero al mismo tiempo resulta peligroso, pues el tráfico capturado se estaría guardando en un fichero que podría leerse con tranquilidad en un futuro sin que nosotros tuviésemos consciencia alguna sobre ello... ¿Eso significa que debemos temer por la "intimidad" del tráfico de nuestro USB en caso de conectarlo a un equipo con Linux? En mi opinión personal sí y no. Es cierto que el método existe y qué puede suponer una "fuga" de información, pero también es verdad que la captura de dicho tráfico no es excesivamente común, con lo que es bueno ser precavidos sin caer dentro de una actitud obsesiva.
Ahora la pregunta obvia sería ¿Hay alguna forma de mitigarlo o evitarlo? En parte sí, si bien nuestra maniobrabilidad dependería de los permisos de nuestro usuario. En caso de ser un usuario sin ningún tipo de privilegios, la mejor forma de saber si podemos estar si nuestro USB está siendo monitorizado sería mediante el uso de los comandos ps y lsmod.
- ps -e |grep tcpdump
- lsmod |grep usbmon
En caso de que los dos comandos mostrasen algún resultado, lo aconsejable sería desconectar inmediatamente el USB, pues habrían unas altas posibilidades de que nuestro USB estuviese siendo "espiado". Desgraciadamente, al ser un usuario "normal", no tendríamos la capacidad de hacer nada más, pues cualquier tipo de acción que implicase detener el proceso tcpdump y el módulo usbmon, requeriría privilegios de administrador.
En caso de tener privilegios de administrador, en vez de optar por desconectar el USB, podemos detener el "espionaje" al que está sometido el USB. Para ello, lo único que habría que hacer sería escribir el comando killall con el que detendríamos el proceso tcpdump:
sudokillall-9 tcpdump
Con el proceso detenido, con el fin de asegurarnos de que usbmon no seguirá presente (al menos durante la sesión actual) podemos deshabilitar el módulo en cuestión. Es importante detener el proceso tcpdump primero, pues en caso contrario nos dirá que el módulo está en uso y que no es posible deshabilitarlo.
sudo modprobe -r usbmon
Con esto ya podríamos consultar el contenido del USB con tranquilidad, sin temor a que su tráfico esté siendo monitorizado.
Como podéis ver el sniffeado del tráfico de un USB sin que el usuario final se percate de ello, se puede realizar con mucha facilidad; afortunadamente las contramedidas que se pueden tomar contra esta acción son sencillas y efectivas.
Espero que os haya resultado útil.
Saludos.