Хакване на смарт четка за зъби
Само си помислете: все по-често използваме умни хладилници, автомобили, контакти и крушки, умни часовници и високоговорители. Заобиколени сме от умни неща и умни хора. Но колко умни са те и дали тази „интелигентност“ е наистина необходима? Също така, колко лесно е да се хакнат тези неща? Един смарт часовник, например, не е труден за хакване. Нека разгледаме друг пример: смарт четка за зъби.
Преди време си купих смарт четката за зъби Philips Sonicare и по време на миенето забелязах, че тя реагира на поставянето на накрайника с мигането на своя светодиод. Едно бързо търсене в интернет ми показа, че накрайникът взаимодейства с дръжката на четката, за да може да напомни на потребителя, че е време да купи нова..
Реших, че ще бъде интересно да изуча как работи всичко това.
Реверсивно инженерство на моята интелигентна четка за зъби
В основата на накрайника се вижда антенка и малка черна кутийка, която вероятно е чип. В ръководството може да се намери следната подсказка: „Радиооборудването в този продукт работи на честота 13,56 MHz„. Това много прилича на NFC маркер и наистина, когато държа накрайника до смартфона си, се отваря линк към страницата на продукта.
С помощта на приложението NFC Tools можем да разберем много неща за този маркер:
Вижда се следното:
- Това е NTAG213
- Използва се NfcA
- Има защита с помощта на парола
- Има линк към страницата на Philips
Също с помощта на NFC Tools можем да прочетем данните за състоянието на паметта и достъпа до нея:
Address | Data | Type | Access |
---|---|---|---|
0x00 |
04:EC:FC:9C |
UID0-UID2/BCC0 |
Read-Only |
0x01 |
A2:94:10:90 |
UID3-UDI6 |
Read-Only |
0x02 |
B6:48:FF:FF |
BCC1/INT./LOCK0-LOCK1 |
Read-Only |
0x03 |
E1:10:12:00 |
OTP0-OTP3 |
Read-Only |
0x04 |
03:20:D1:01 |
DATA |
Read-Only |
0x05 |
1C:55:02:70 |
DATA |
Read-Only |
0x06 |
68:69:6C:69 |
DATA |
Read-Only |
0x07 |
70:73:2E:63 |
DATA |
Read-Only |
0x08 |
6F:6D:2F:6E |
DATA |
Read-Only |
0x09 |
66:63:62:72 |
DATA |
Read-Only |
0x0A |
75:73:68:68 |
DATA |
Read-Only |
0x0B |
65:61:64:74 |
DATA |
Read-Only |
0x0C |
61:70:FE:00 |
DATA |
Read-Only |
0x0D… |
00:00:00:00 |
DATA |
Read-Only |
0x1F |
00:01:07:00 |
DATA |
Readable, write protected by PW |
0x20 |
00:00:00:02 |
DATA |
Read-Only |
0x21 |
60:54:32:32 |
DATA |
Read-Only |
0x22 |
31:32:31:34 |
DATA |
Read-Only |
0x23 |
20:31:32:4B |
DATA |
Read-Only |
0x24 |
B3:02:02:00 |
DATA |
Readable,write protected by PW |
0x25 |
00:00:00:00 |
DATA |
Readable,write protected by PW |
0x26 |
00:00:00:00 |
DATA |
Readable,write protected by PW |
0x27 |
00:00:00:01 |
DATA |
Readable,write protected by PW |
0x28 |
00:03:30:BD |
LOCK2 – LOCK4 |
Readable,write protected by PW |
0x29 |
04:00:00:10 |
CFG 0 |
Read-Only |
0x2A |
43:00:00:00 |
CFG 1 |
Read-Only |
0x2B |
00:00:00:00 |
PWD0-PWD3 |
Write-Only |
0x2C |
00:00:00:00 |
PACK0-PACK1 |
Write-Only |
Повторих този процес за един черен и два бели накрайника модел W DiamondClean и разбрах следното:
-
-
- 0x00-0x02 – съдържа уникален идентификатор и контролна сума
- 0x04-0x0C – там се намира линка към магазина на Philips
- 0x22 – на това отместване са записани байтовете 31:32:31:34 за черните и 31:31:31:31 за белите накрайници
- 0x24 – тук е записано общото време на миенето
- Всички останали данни, които могат да бъдат прочетени са съвсем еднакви за всички накрайници
-
Декриптиране на записаното време
Нека да направим един експеримент и да разберем какви промени стават с NFC маркера при използването на тази смарт четка за зъби:
- Прочитане на NFC маркера
- при поставянето на нов накрайник, който още не е използван, данните на addr. 0×24 са съответно 00:00:02:00
- Ако просто поставим накрайника без да мием зъбите, нищо не се променя
- Миене
- Дадох на четката да работи в продължение на 5 секунди
- Отново прочетох данните от накрайника
- Данните на отместване 0×24 са се променили и сега там има 05:00:02:00
- По всичко личи, че на addr. 0x24 се записва боя секунди, в продължение на които е използван накрайникът на тази четка
Когато това използва не премине 255 секунди, таймерът започва да използва втория байт (02:01:02:00 -> 258s). Опитът да презапиша това записано време за съжаление бе неуспешен, понеже този адрес на паметта е защитен с парола. Даа.
Получаване на паролата
Опа, оказа се, че необходимата парола се подава с обикновен отворен и некриптиран текст! Тоест всичкото, което трябва на направя е да прихвана обмена на данните между четката за зъби и накрайника. След като си поиграх с моя специализиран приемник със софтуерна настройка HackRF, чрез метода на пробите и грешките съставих необходимия работещ алгоритъм.
Запис на радиосигнала
Стартираме програмата gqrx и избираме честота 17,736 MHz. Сега, когато поднасям четката за зъби близо до антената се вижда, че тя на няколко пъти в секундата се опитва да осъществи връзка с накрайника.
По време на миенето на зъбите NFC четецът прави кратка пауза и следващият пакет от байтове обновява брояча на времето.
Преобразуване на записаното
Преди този необработен I/O файл да бъде декодиран, той трябва да бъде конвертиран в малко по-различен формат, за да може декодерът да го прочете. Използвах честота на дискретизация 2 MHz. (Всичкият необходим софтуер и използваните скриптове са качени в сайта на автора (kuenzi.dev).
Декриптиране на записаното
Намерих перфектния инструмент за тази задача, наречен NFC-laboratory. След като отворите новосъздадения WAV файл, той трябва да изглежда като на изображението по-горе. В този случай записът ви позволява да видите само връзката, която преминава от хоста към маркера (зелената стрелка). Но за подбора на пароли това е идеално. Ако разгледате спецификацията на NTAG213, можете да разберете какво се случва:
- Редове #0-#6: прави се връзка към уникалния идентификатор на тага (маркера)
- Ред #7″ четката за зъби изпраща паролата (командата 0x1B = PWD_AUTH)
- Ред #9: броя на времето, в който новата информация се записва с помощта на командата 0xA2 = WRITE
И така паролата на моята смарт четка за зъби се оказа 67:B3:8B:98. В изображението тя се вижда много ясно.
С тази парола мога да използвам накрайника колкото си искам дълго. Разбира се, не възнамерявам да правя подобно нещо. Просто почти същият подход се използва в някои принтери, тонер касети и какво ли още не.
Запис на собствени данни в четката за зъби
С успешно получената парола можем са запишем в брояча на четката за зъби каквото си поискаме значение, като изпратим съответните байтове чрез NFC. Отново NFC Tools ни идва на помощ:
- От менюто преминете към Other -> Advanced NFC commands
- Изберете входно/изходния клас (I/O Class) на NfcA
- Подайте следната поредица от байтове: 1B:67:B3:8B:98,A2:24:00:00:02:00
- Наслаждавайте се на „новия“ накрайник на четката (нали разбирате, че става дума само за брояча на времето?)
Ето как изглежда последователността от команди на по-горната стъпка:
Команда | Действие |
---|---|
1B |
PWD_AUTH |
67:B3:8B:98 |
The password |
, |
Package delimiter |
A2 |
WRITE |
24 |
To address 0x24 |
00:00:02:00 |
Timer set to 0s |
И така, смарт четката е успешно хакната и сега можем да си играем с таймера както си поискаме.
Ето някои интересни наблюдения:
- Само първите два байта на адрес 0x24 се използват за отчитане на времето. След като броячът достигне FF:FF:02:00, той спира да се увеличава (18 часа непрекъснато миене на зъби)
- Когато запаметеното време надхвърли 0x5460, четката за зъби мига със светодиода, за да ви уведоми да смените главата. Това съответства на 21 600 s -> 180 x 2 min -> 3 месеца миене на зъбите два пъти дневно, което е точно в съответствие с препоръката на Philips за смяна на главите на четките на всеки 3 месеца
Заключение
Ако се вгледате внимателно в съдържанието на 0x2A – 43:00:00:00 и страница 18 от техническото описание, можете да видите, че маркерът е конфигуриран така, че да забрани трайно достъпа до запис след три неправилни опита за въвеждане на паролата (което и направих по време на експериментите си).
Това означава, че дори дръжката на четката за зъби няма да може да запише данни върху този накрайник.
Генериране на паролата
За съжаление паролата на всяка глава на тази четка е уникална и процесът на извличането ѝ с помощта на SDR е сложен и изисква специално оборудване. В долната част на страница 30 в информационния лист NXP препоръчва паролата да се генерира от 7-байтовия UID. По-долу са представени всички двойки UID – парола, които получих от моите три четки:
UID | Парола |
---|---|
04:79:CF:7A:89:10:90 |
FF:34:CE:4C |
04:EC:FC:A2:94:10:90 |
61:F0:A5:0F |
04:D7:29:0A:94:10:90 |
67:B3:8B:98 |
Всичките ми опити да отгатна каква е еднопосочната функция за генериране на паролите бяха неуспешни. В зависимост от това колко внимателно инженерите на Philips са се справили с тази функция, отгатването ѝ може да се окаже почти невъзможно