Frappe clavier USB

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Si vous disposez d’un pcap contenant la communication via USB d’un clavier comme celui-ci :

Les claviers USB utilisent gĂ©nĂ©ralement le protocole HID boot protocol, donc chaque transfert d’interruption vers l’hĂŽte ne fait que 8 octets : un octet de bits de modificateur (Ctrl/Shift/Alt/Super), un octet rĂ©servĂ©, et jusqu’à six keycodes par rapport. DĂ©coder ces octets suffit Ă  reconstruire tout ce qui a Ă©tĂ© tapĂ©.

USB HID report basics

Le rapport IN typique ressemble Ă  :

ByteMeaning
0Modifier bitmap (0x02 = Left Shift, 0x20 = Right Alt, etc.). Plusieurs bits peuvent ĂȘtre dĂ©finis simultanĂ©ment.
1Réservé/padding mais souvent réutilisé par les claviers gaming pour des données vendor.
2-7Jusqu’à six keycodes simultanĂ©s au format USB usage ID (0x04 = a, 0x1E = 1). 0x00 signifie “pas de touche”.

Les claviers sans NKRO envoient gĂ©nĂ©ralement 0x01 dans l’octet 2 lorsque plus de six touches sont pressĂ©es pour signaler un “rollover”. Comprendre cette disposition aide lorsque vous n’avez que les octets bruts usb.capdata.

Extracting HID data from a PCAP

Wireshark workflow

  1. Isoler le pĂ©riphĂ©rique : filtrer le trafic IN d’interruption provenant du clavier, par ex. usb.transfer_type == 0x01 && usb.endpoint_address.direction == "IN" && usb.device_address == 3.
  2. Ajouter des colonnes utiles : clic droit sur le champ Leftover Capture Data (usb.capdata) et vos champs usbhid.* préférés (p. ex. usbhid.boot_report.keyboard.keycode_1) pour suivre les saisies sans ouvrir chaque trame.
  3. Masquer les rapports vides : appliquer !(usb.capdata == 00:00:00:00:00:00:00:00) pour supprimer les trames inactives.
  4. Exporter pour post-traitement : File -> Export Packet Dissections -> As CSV, inclure frame.number, usb.src, usb.capdata, et usbhid.modifiers pour automatiser la reconstruction ensuite.

Command-line workflow

ctf-usb-keyboard-parser already automates the classic tshark + sed pipeline:

tshark -r ./usb.pcap -Y 'usb.capdata && usb.data_len == 8' -T fields -e usb.capdata | sed 's/../:&/g2' > keystrokes.txt
python3 usbkeyboard.py ./keystrokes.txt

Sur les captures récentes, vous pouvez conserver à la fois usb.capdata et le champ plus riche usbhid.data en regroupant par périphérique :

tshark -r usb.pcapng -Y "usb.capdata || usbhid.data" -T fields -e usb.src -e usb.capdata -e usbhid.data | \
sort -s -k1,1 | \
awk '{ printf "%s", (NR==1 ? $1 : pre!=$1 ? "\n" $1 : "") " " $2; pre=$1 }' | \
awk '{ for (i=2; i<=NF; i++) print $i > "usbdata-" $1 ".txt" }'

Ces fichiers par pĂ©riphĂ©rique s’insĂšrent directement dans n’importe quel dĂ©codeur. Si la capture provient de claviers BLE tunnelisĂ©s sur GATT, filtrez sur btatt.value && frame.len == 20 et dump the hex payloads avant le dĂ©codage.

Automatiser le décodage

  • ctf-usb-keyboard-parser reste utile pour les challenges CTF rapides et est dĂ©jĂ  fourni dans le dĂ©pĂŽt.
  • CTF-Usb_Keyboard_Parser (main.py) analyse nativement les fichiers pcap et pcapng, comprend LinkTypeUsbLinuxMmapped/LinkTypeUsbPcap, et ne nĂ©cessite pas tshark, ce qui le rend pratique dans des sandboxes isolĂ©s.
  • USB-HID-decoders ajoute des visualiseurs pour keyboard, mouse et tablet. Vous pouvez soit exĂ©cuter l’helper extract_hid_data.sh (tshark backend) ou extract_hid_data.py (scapy backend) puis fournir le fichier texte rĂ©sultant aux modules de dĂ©codage ou de replay pour voir les keystrokes se dĂ©rouler.

Décodeur Python rapide

#!/usr/bin/env python3
import sys
HID = {0x04:'a',0x05:'b',0x06:'c',0x07:'d',0x08:'e',0x09:'f',0x0a:'g',0x1c:'y',0x1d:'z',0x28:'\n'}
for raw in sys.stdin:
raw = raw.strip().replace(':', '')
if len(raw) != 16:
continue
keycode = int(raw[4:6], 16)
modifier = int(raw[0:2], 16)
if keycode:
char = HID.get(keycode, '?')
if modifier & 0x02:
char = char.upper()
sys.stdout.write(char)

Alimentez-le avec les lignes hex brutes extraites prĂ©cĂ©demment pour obtenir une reconstitution approximative instantanĂ©e sans intĂ©grer un parser complet dans l’environnement.

Conseils de dépannage

  • Si Wireshark ne remplit pas les champs usbhid.*, le HID report descriptor n’a probablement pas Ă©tĂ© capturĂ©. Rebranchez le clavier pendant la capture ou revenez aux donnĂ©es brutes usb.capdata.
  • Les captures Windows nĂ©cessitent l’interface extcap USBPcap ; assurez-vous qu’elle a survĂ©cu aux mises Ă  jour de Wireshark, car l’absence d’extcaps vous laissera avec des listes de pĂ©riphĂ©riques vides.
  • CorrĂ©lez toujours usb.bus_id:device:interface (par exemple 1.9.1) avant de dĂ©coder quoi que ce soit — mĂ©langer plusieurs claviers ou pĂ©riphĂ©riques de stockage entraĂźne des frappes incohĂ©rentes.

Références

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks