Взлом Bluetooth-устройств на практике Bluetooth – чрезвычайно удобная штука. В самом деле: переслать картинку, телефонный контакт, мелодию? Без проблем! Поиграть вдвоем в игрушку на лекции? Что может быть приятнее! Однако не лишним тебе будет знать, что каждый раз, когда ты пользуешься этим протоколом, ты в опасности. Любой человек в радиусе десяти метров запросто может утащить секретный номер из твоей телефонной книги, почитать sms-сообщения, посмотреть фотографии и даже присвоить себе деньги на твоем счету. Неожиданный поворот событий, не правда ли? Да, приятель, ты все верно понял. Сейчас я расскажу тебе о том, каким образом мобильные хакеры могут атаковать устройства, оснащенные bluetooth-модулями. Но прежде, чем переходить к самому сладкому, советую тебе прочесть статью про внутреннее устройство протокола Bluetooth, которую ты найдешь в этом же номере (Анатомия синего зуба). Это позволит тебе лучше понимать, о чем я говорю. Станок для опытов Прежде, чем приступать к нашим изысканиям, необходимо определиться со средой, в которой мы будем работать. На самом деле, толкового bluetooth-софта под Windows практически нет, вернее, у меня сложилось такое ощущение, что его нет в принципе. Поэтому я буду использовать в своих опытах Unix, конкретнее – FreeBSD 5.3, которая стоит на моем ноутбуке. Что касается bluetooth-девайса, то я заюзал обычный десятидолларовый адаптер, втыкаемый в USB и сейчас расскажу, как такую железку подцепить под фряхой. Bluetooth-стэк во FreeBSD реализовал наш соотечественник Максим Евменкин в виде модуля ng_ubt. В пятой фряхе этот модуль присутствует по умолчанию, для более старых версий его необходимо собрать отдельно — сорцы можно получить на нашем диске, а так же на сайте www.geocities.com/m_evmenkin. Чтобы поднять девайс, нужно подгрузить модуль следующей командой: kldload ng_ubt. Затем необходимо подключить адаптер к USB-порту и выполнить сценарий, активизирующий интерфейс: /etc/rc.bluetooth start ubt0. В консоли появится информация об устройстве, его адрес и т.д. Теперь уже можно начинать работу. Вместе с модулем поставляется несколько утилит, которые сыграют ключевую роль в наших экспериментах. Я опишу самые главные программы и покажу, что с их помощью можно делать. Стандартный софт Первым делом следует упомянуть утилиту hccontrol, которая выполняет все операции, связанные с интерфейсом HCI. Пользоваться этой программой чрезвычайно просто: $ hccontrol –n имя_hci_узла команда Тут следует заметить, что имя узла – это не тоже самое, что и имя интерфейса: так, например, интерфейсу ubt0 соответствует имя ubt0hci. В качестве команды может быть указано несколько десятков допустимых HCI-операций, среди которых мне имеет смысл выделить лишь несколько. Первая из них осуществляет поиск в окрестностях активных discoverable-устройств и называется «Inquiry». Пользуются ей следующим образом: $ hccontrol –n ubt0hci Inquiry В качестве результата работы утилита выведет информацию о найденных устройствах – нас, прежде всего, интересуют их адреса. Следующая команда «Remote_Name_Request» получает имя устройства по известному адресу и используется таким образом: $ hccontrol -n ubt0hci Remote_Name_Request 00:0a:d9:7f:88:0d После выполнения запроса на экране появится символическое имя устройства с указанным адресом. Полный список доступных команд можно получить, набрав в консоли man hccontrol, либо обратившись к документации на диске. А мы идем дальше. Bluetooth пинг-понг В bluetooth-стэке есть протокол L2CAP (Logical Link Control and Adaptation Protocol), позволяющий интерфейсам более высокого уровня передавать и получать пакеты данных длиной до 64 Кбайт. L2CAP использует концепцию так называемых каналов, каждый из которых представляет собой ни что иное, как отдельное логическое соединение поверх радиолинка. Каждый такой канал привязан к некоторому протоколу (один протокол может занимать несколько каналов, но не наоборот), таким образом, что каждый пакет L2CAP, получаемый каналом, перенаправляется к соответствующему протоколу более высокого уровня. Есть две утилиты, предоставляющих доступ к этому протоколу, первая из которых носит символическое название l2ping. Как несложно догадаться, эта тулза предназначена для проверки связи между устройствами и с виду работает так же, как и icmp ping: # l2ping –a 00:0a:d9:7f:88:0d 0 bytes from 00:0a:d9:7f:88:0d seq_no=0 time=37.823 ms result=0 ... Но это, конечно, только с виду. Обрати внимание, что многие устройства возвращают в ответ на L2CAP echo request пустые пакеты, так что 0 bytes – это в порядке вещей. Помимо тестирования связи, у этой утилиты есть еще одно интересное применение – DoS-атаки на синезубые устройства. Подобно icmp-флуду, существует гипотетическая возможность завалить с головой любой bluetooth-девайс L2CAP пакетами с целью прервать активные пользовательские соединения. Как я уже отмечал выше, максимальный размер пакета составляет 65 килобайт и, в общем-то, понятно, что для достижения цели необходимо использовать несколько устройств в режиме максимальной производительности. Так же есть возможность вести “обстрел” в несколько потоков с каждого из доступных устройств. При этом нужно экспериментально определить оптимальную длину пакетов и количество тредов – в своих опытах я пришел к тому, что оптимальнее всего работать в 3-4 потока, именно в этом случае достигается максимум используемой мощности канала. Крадем записные книги Теперь расскажу об одной из самых сладких вещей в этой статье – о краже пользовательской информации из телефонов по bluetooth, так называемом BlueSnarfing’е. Предположим, в людном месте (например, в кафе в центре города), я насканил несколько доступных девайсов. С большой долей вероятности у меня получится украсть пользовательские данные по bluetooth так, что этого не заметят их владельцы. Виной тому – кривая поддержка интерфейса OBEX в ряде телефонов (в том числе, например, в мегапопулярных SonyEricsson t68, t610, t630 и Nokia 6310i). Однако, прежде, чем начинать бизонить, не лишним будет разобраться, что такое OBEX и как осуществлена его поддержка во FreeBSD. Протокол Object Exchange – популярная фишка, используемая для простой передачи файлов между портативными устройствами. Например, если нужно без геморроя передать с одного телефона на другой несколько контактов, или ежедневник – то всегда юзают OBEX, это очень удобно. Сервер и OBEX-клиент реализованы во FreeBSD в виде пакета obexapp, который наколбасил уже знакомый нам Макс и его даже включили в список портов — comms/obexapp. Устанавливать тулзу проще всего именно оттуда, если не хочется геморроя со всеми зависимостями и прочей ботвой. Если же ты не ищешь легких путей – забирай с диска сорцы и собирай руками, а мы пока научимся пользоваться тулзой. Делается это просто: obexapp –a 00:0a:d9:7f:88:0d –C 10 Здесь флаг –a указывает на адрес устройства, в то время как –C определяет RFCOMM канал, OBEX висит на десятом. После того, как произведено подключение к удаленному устройству, можно выполнять некоторые команды, самые главные и интересные для нас называются get и put. Первая, понятное дело, позволяет скачивать файлы, а вторая – заливать их на телефон. У тебя, наверное, появился вопрос – какие файлы, о чем я? Дело в том, что вся информация предоставляется OBEX’ом в виде логической файловой системы. Причем от телефона к телефону не меняется ни одна из описанных в протоколе вещей и структура каталогов в целом одинаковая. Так, например, телефонная книжка доступна по адресу telecom/pb.vcf, а календарь с напоминаниями лежит в файле telecom/cal.vcs. Все это замечательно, прекрасно и очень удобно. Впечатление портит только один факт: огромная куча популярнейших телефонов позволяет неавторизованным устройствам получать доступ к OBEX’у. У меня без проблем получилось украсть телефонные книжки со своего старого SonyEricsson T68i, пали под натиском и абсолютно все T610, которые мне попались под руку. Так же уязвим целый ряд телефонов Nokia и Siemens – проблема, как видишь, очень серьезная. Но довольно философии, расскажу лучше, как я крал собственную телефонную книжку по bluetooth . Подключившись к OBEX’у, я набрал команду get и в ответ на запрос имени скачиваемого файла ввел telecom/pb.vcf. Затем obexapp попросила указать локальное имя, под которым следует сохранить телефонную книгу и задумалась на несколько секунд – это время требовалось для передачи данных. После этого в текущей директории и в самом деле оказался файл, внутри которого я не без удивления обнаружил знакомые имена и телефоны . Мобильник, пока я крал контакты, даже и не подал виду, что происходит такая подстава. Телефонная книга представляет собой обычный текстовый файл с записями в формате vCard, это специальный стандарт для представления электронных визитных карточек (на нашем диске ты найдешь полную спецификацию этого формата). Чтобы тебе было проще разобраться, приведу пример vCard-контакта: Пример контакта в формате vCard BEGIN:VCARD VERSION:2.1 N:Bezdrishenko;Akakij TEL;HOME:+70957777777 TEL;CELL:+79036666666 TEL;WORK:+79052222222 TEL;FAX: +70954444444 END:VCARD Абсолютно аналогичным образом можно украсть электронный дневник telecom/cal.vcs, который выглядит примерно так: Формат календаря с напоминаниями BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT DTSTART:20041026T235000Z DTEND:20041027T005000Z SUMMARY:Ne zabyt’ kupit’ pivka AALARM:20041026T235000Z CATEGORIES:MISCELLANEOUS END:VEVENT END:VCALENDAR Синие жуки крадут деньги Не менее интересно другое направление взлома – так называемый BlueBugging, удаленное управление телефоном по bluetooth при помощи AT-команд и протокола RFCOMM. Что это позволяет делать? На самом деле, очень многое! Например, можно запросто читать чужие SMS-сообщения по bluetooth, можно заставить телефон позвонить по определенному номеру и даже отправить текстовое сообщение. Благодаря этому возможно даже банально красть деньги с телефонных счетов. Как? К сожалению, очень просто . Электронный вор вполне может анонимно зарегистрировать специальный номер, звонки и смс-сообщения на который будут стоить хороших денег. А заставить уязвимую мобилу позвонить по определенному номеру – это пара секунд. Расскажу, как это работает. Существует утилита rfcomm_sppd, которая осуществляет эмуляцию последовательного порта на bluetooth-устройствах. В качестве виртуального последовательного порта используется псевдотерминал. Сейчас я покажу, как можно подключиться к сервису Serial Port на удаленном девайсе: # rfcomm_sppd -a 00:0a:d9:7f:88:0d -t /dev/ttyp4 Для работы с псевдотерминалом можно использовать программу cu: # cu -l ttyp4 –s 9600 После этого уже можно общаться с устройством при помощи AT-команд. Обрати внимание, что для rfcomm_sppd не обязательно указывать явно канал, к которому следует подключаться. Утилита сама умеет его определять при помощи протокола SDP. Нужно отметить тот факт, что с моим подопытным t68 эта атака не прошла: для подключения к нужному порту требовалась аутентификация устройства. Однако, насколько мне известно, целый ряд телефонов Nokia подвержен этой атаке (сообщения об этом есть даже на официальном сайте Nokia). Что касается использования AT-команд, то тут все просто. Стоит только обратиться к официальной документации, которую ты найдешь на диске, и все вопросы отпадут сами собой. Обнаружение невидимок Обнаружение в эфире устройств, которые находятся в режиме non-descoverable, довольно интересная задача. Ведь устройство откликается только лишь на запросы, адресованные лично ему, а для этого необходимо знать адрес устройства. Со схожей проблемой можно столкнуться и в обычных компьютерных сетях – там все решается сканированием всего интересующего адресного диапазона. В случае же с Bluetooth решить задачу на бумаге помогает этот же подход, однако, практическая реализация – не такая уж и тривиальная. Все дело в том, что в адресном пространстве одного производителя BT-устройств находится 256*256*256=16.7 миллионов возможных адресов. И получается, что для того, чтобы найти конкретный активный адрес, надо просканировать существенную часть этого диапазона. Однако на практике для этого нужно довольно много времени. Для решения этой задачи есть специальная утилита от @stake с красочным названием RedFang. По неизвестной мне причине она больше не доступна на официальном сайте компании, поэтому на нашем диске ты можешь найти эксклюзивную копию . К сожалению, собрать эту софтину под фряхой мне не удалось. Зато она на ура собирается под Linux с BT-стэком BlueZ – ведь создавалась именно под эту систему. Пользоваться ей чрезвычайно просто: ./redfang -n 4 -r start-finish -t timeout Здесь start – начальный адрес, finish – конечный, timeout – таймаут запросов, по истечении которого хост считается несуществующим. Авторы RedFang утверждают, что полный перебор диапазона для одного производителя занимает полтора часа. Врут, наверное . На самом деле, в определенный момент у меня возникла идея написать свой простенький скрипт, который, используя стандартные утилиты вроде l2ping или hccontrol, будет сканировать адресные диапазоны, отыскивая устройства-невидимки. Самый быстрый вариант, который у меня получился, использовал именно l2ping. Причем я заметил, что если работать в несколько потоков, скорость заметно увеличивается. Минимальный отклик от работающего устройства составляет примерно 0.02 секунды. При этом я заметил, что он в целом мало различается. С ростом количества потоков (n) время проверки одного адреса растет примерно как 0.02+(n-1)*(1+0.1*n). При этом производительность зависит от n так: n/(0.02+(n-1)*(1+0.1*n)). Если вычислить максимум этой функции, то окажется, что оптимальнее всего использовать 3-4 потока одновременно. Однако при этом, увы, до приемлемой скорости работы еще далековато . (c) Никита кислицин