Руководство по взлому автомобиля

Руководство по взлому автомобиля

В этой статье мы разберем пошаговый взлом автомобиля. Это даст вам представление о том, как злоумышленник может использовать элементы управления ТС в злонамеренных целях.

Взлом системы автомобиля происходит в рамках кибератаки, и хакер получает некоторые преимущества из этого взлома. Это может быть разблокировка определенных функций в ТС, снятие программных ограничений и т.д.

Взлом ТС мы будем осуществлять с помощью центральной сети автомобиля под названием CAN-шина (CAN Bus). Для начала давайте выясним, что это такое.

Что такое CAN-шина (CAN Bus)?

CAN-шина (система цифровой связи и управления электронными устройствами) представляет собой центральную сеть, по которой ТС взаимодействует со своими компонентами.

Все дверные замки, спидометр, датчик газа, органы управления тормозами, элементы управления педалью газа и многие другие устройства взаимодействуют через эту сеть.

OBD-II (On-board diagnostics 2)

Разъем OBD-II (бортовая диагностика 2) представляет собой порт в автомобиле, который позволяет легко диагностировать неисправности в ТС. На СТО механик подключает устройство к этому порту, чтобы получить код ошибки в системе автомобиля и определить причину неисправности.

Обычно порт OBD-II находится под приборной панелью у педалей, за рулевой колонкой или даже под приборной панелью со стороны пассажира.

Точка доступа для связи по CAN-шине будет через порт OBD-II.

Основы сети CAN-шины

В локальной сети CAN-шины пакеты отправляются и принимаются также, как и в концентраторе, то есть пакеты данных видны всем устройствам. Концентратор отправляет пакеты всем получателям. Концентраторы считаются небезопасным сетевым устройством из-за возможности прослушивания этой сети.

Если мы нажмем кнопку блокировки на двери, электрический сигнал будет отправлен через CAN-шину на каждое устройство в сети, и двери интерпретируют пакет данных. В пакете данных будет команда: заблокировать или разблокировать. Двери, получив пакет данных, примут эту инструкцию и выполнят соответствующую команду.

Отправленные пакеты состоят из двух частей: идентификатора и данных. Идентификатор представляет собой устройство в автомобиле. Поле данных представляет собой инструкцию, которую необходимо выполнить с указанным устройством. Например,

120 # Ф289632003200320

В данном случае идентификатор равен 120. Оставшаяся часть пакета после # является полем данных.

Важно знать, что идентификатор не будет одинаковым для разных автомобилей по году, марке и модели. Идентификатор 120 может быть педалью газа в Honda Civic 2019 года, но окнами в Toyota Sienna 2022 года.

Кроме того, по сети CAN-шины отправляются пакеты постоянно, пока на ТС подается питание любого типа. Это означает, что двигатель даже не нужно включать, а сеть будет активна.

Взлом сети автомобиля

Взлом в данном случае представляет собой повторную атаку на сеть CAN-шины (атака с переустановкой ключа). Мы можем прослушивать пакеты, отправляемые по сети, вручную выполнять действие (запирание/отпирание дверей) и воспроизводить пакеты обратно в сеть, чтобы вызвать то же самое действие – несмотря на то, что кнопки блокировки/разблокировки не нажаты

Прежде чем мы приступим ко взлому, давайте настроим необходимые инструменты на виртуальной машине.

Настройка инструментов

Следующие шаги выполняются в Kali 2022.2 на VirtualBox. Также была запущена утилита «kali-tweaks», чтобы изменить двухстрочный вывод по умолчанию на однострочный. В этом процессе мы будем устанавливать три инструмента:

  • ICSim (симулятор кластера приборов);
  • Socketcand;
  • Kayak.

Установка необходимых пакетов в Kali:

Создание каталога «Car_Hacking» для работы:

Внутри только что созданного каталога клонируем Git-репозиторий «ICSim»:

С репозиторием ICSim войдем в каталог «ICSim» и скомпилируем код, чтобы создать необходимый двоичный файл:

Вернёмся в директорию Car_Hacking и также клонируем репозиторий «Socketcand»:

С клонированным репозиторием «Socketcand» давайте настроим, скомпилируем и установим пакет. Необходимый файл отсутствует, поэтому нам нужно начать с копирования этого файла в нужное место.

Имея заголовочный файл, мы настроим пакет, скомпилируем его и установим.

После установки «Socketcand» мы возвращаемся в каталог «Car_Hacking» и клонируем Git-репозиторий «Kayak»:

Теперь мы можем перейти в каталог «Kayak» и установить пакет с помощью «Maven»:

После установки «Kayak» мы готовы начать взлом.

Взлом

Для этого процесса нам нужно будет работать с несколькими вкладками терминала одновременно. Нам понадобится отдельная вкладка для каждой из этих функций:

  • Запуск симулятора;
  • Запуск элементов управления;
  • Захват и воспроизведение пакетов данных.

Запустим симулятор на первой вкладке. Сначала нужно настроить интерфейс vcan (virtual CAN). Для этого мы перейдем в каталог ICSim и запустим скрипт установки.

После настройки vcan мы можем запустить виртуальный симулятор на созданном интерфейсе. Поскольку это первый созданный интерфейс vcan, он будет называться «vcan0».

Теперь откроем вторую вкладку в терминале и запустим элементы управления.

Переименуем вкладки сеанса терминала, чтобы отслеживать, какая вкладка перешла к какой функции. Вот так выглядит экран с открытым приложением ICSim:

Мы могли бы подключить контроллер к компьютеру и использовать его для управления командами автомобиля. В этой статье мы будем использовать клавиши клавиатуры для управления симулятором.

Давайте ознакомимся с органами управления и их влиянием на симулятор приборов. С панели управления CAN-шины мы можем управлять нашим виртуальным автомобилем.

Например, если мы удерживаем клавишу «влево», будут мигать левые указатели поворота. Если мы нажмем стрелку «вверх», скорость на спидометре увеличится, символизируя ускорение автомобиля. На изображении выше все двери заперты. Если мы нажмем «правый SHIFT+A|B|X|Y», одна дверь будет разблокирована. Клавиша «левый SHIFT» снова заблокирует двери при нажатии любой из кнопок двери. Если мы нажмем «левый SHIFT», а затем «правый SHIFT», все двери будут разблокированы. Сейчас мы нажмем «правый SHIFT», а затем «левый SHIFT», чтобы снова заблокировать двери. На изображениях ниже показано, как должен выглядеть экран.

Теперь мы запустим еще одну вкладку для работы с захватом и воспроизведением пакетов данных. Чтобы не загромождать нашу структуру каталогов, мы создадим каталог «Demo» для работы.

Теперь наобходимо запустить утилиту «Candump» на интерфейсе vcan с параметром «-l» для ведения журнала. Мы позволим утилите работать в течение 5 секунд и затем нажмем «CTRL-C», чтобы остановить прослушиватель.

Мы ничего не делали в течение 5 секунд и сосредоточились только на запуске и остановке прослушивателя, чтобы продемонстрировать, насколько громкой может быть сеть CAN-шины. Давайте запустим команду подсчета слов «wc» для подсчета строк и посмотрим, сколько пакетов было отправлено за 5 секунд, во время работы прослушивателя.

После подсчета мы видим, что в течение 5 секунд по сети было отправлено 13 757 пакетов.

Для взлома нам нужно определить, какой идентификатор отвечает за манипулирование дверьми. Для этого необходимо выполнить следующие шаги:

  1. Запустить «Candump» с ведением журнала в интерфейсе «vcan0»;
  2. Сделать окно «панели управления CAN-шины» активным;
  3. Открыть все двери;
  4. Закрыть все двери;
  5. Выбрать в окне терминала «Candump»;
  6. Нажать «CTRL-C», чтобы остановить захват сети.

Мы должны выполнить описанные выше шаги как можно быстрее, чтобы файл журнала был как можно меньше. Прежде чем начать, мы также удалим предыдущий журнал, чтобы не путать файлы.

Перечисленные выше шаги были выполнены, и вывод терминала показан выше. Выполним команду «wc», чтобы показать количество строк в созданном файле журнала:

Теперь у нас есть новый файл журнала с 9 293 пакетами, отправленными по сети.

Теперь мы воспользуемся утилитой «Canplayer», чтобы воспроизвести этот файл журнала обратно в сеть и наблюдать за окном IC Simulator. В этотм момент двери откроются, а затем снова закроются. Мы можем указать наш файл журнала с опцией «-I».

При выполнении этого действия воспроизведение файла журнала приводило к тому, что двери виртуального автомобиля снова открывались и закрывались.

Теперь мы убедились, что воспроизведение журнала выполняет необходимое действие, поэтому нам нужно изучить алгоритм определения того, какие пакеты отвечают за работу двери.

С проверенным файлом журнала, выполняющим желаемое действие, мы можем точно определить, где именно в файле происходит действие. Мы можем воспроизвести первую половину или последнюю половину файла.

Сейчас разрежем исходный файл пополам и воспроизведем его с помощью утилиты «Сanplayer». При воспроизведении нового файла мы будем отслеживать, происходит ли желаемое действие в окне IC Simulator. Если воспроизведенный файл вызывает эффект в симуляторе, мы снова разрезаем этот файл пополам и воспроизводим одну из половинок. Если это не вызывает эффекта в симуляторе, мы можем взять другую половину файла, воспроизвести ее и убедиться, что действие происходит в этой половине файла.

После определенного количества итераций этого алгоритма мы сможем изолировать CAN-пакет, отвечающий за отпирание дверей. Также в этом процессе деления пополам файла журнала нам нужно вручную использовать элементы управления в «панели управления CAN-Bus», чтобы заблокировать двери, прежде чем снова воспроизвести файл. Однако, IC Simulator не покажет изменения, если двери уже находятся в разблокированном состоянии.

Мы можем использовать «head» или «tail» с опцией «-n» и воспроизвести примерно половину файла. Снизу изображен вывод команды для получения идентификации CAN-пакета разблокировки двери:

Последняя часть воспроизведения сетевого трафика занимала последние 2 из 5 строк, а затем первые 2 из 5 строк. Если ни один из разделенных файлов не работает, то середина этого файла — это пакет, который управляет отпиранием дверей. Мы скопируем эту строку в отдельный файл с именем «doorsUnlock» и воспроизведем его, чтобы наблюдать за изменениями.

Двери в симуляторе IC открываются с помощью этого пакета CAN. Содержимое этого пакета:

(1654550641.304018) VCAN0 19B # 000000000000

Первый раздел пакета — это идентификатор. Двери идентифицируются маркером устройства с шестнадцатеричным кодом «19B». Вторая часть пакета — это данные. В этом случае все данные установлены на «0», поэтому нет смысла отправлять команду двери.

Именно по этой причине мы заперли дверь в начале процесса взлома. Зная идентификатор двери, мы можем найти исходный захват пакета для этого идентификатора, чтобы увидеть все варианты части данных пакета. Давайте выполним команду «grep» для исходного файла для «19B».

Мы можем игнорировать последнюю строку, поскольку идентификатор не соответствует тому, что мы ищем. Давайте возьмем строку с буквой «F» в разделе данных и создадим новый файл с именем «doorsLock». Затем мы запустим код и проследим за окном IC Simulator, чтобы определить, закроет ли этот пакет все двери.

Теперь двери заперты с помощью одного пакета данных.

Дальнейший анализ данных

Мы успешно выполнили отпирание и запирание всех дверей автомобиля через CAN-шину. Мы можем дополнительно проанализировать данные и посмотреть, сможем ли мы контролировать каждую дверь по-отдельности. Давайте снова рассмотрим два пакета CAN:

(1654550641.304018) VCAN0 19B # 000000000000

(1654550642.133853) VCAN0 19B # 00000 F 000000

Данные изменяются на втором полубайте третьего байта. Если мы разложим этот кусок на его двоичный формат, мы можем представить его следующим образом:

Пакет, открывающий все двери, представляет этот кусочек как «0». Пакет, который запирает все двери, представляет полубайт как шестнадцатеричное «F». Разбивая это на двоичные файлы, мы получаем 16 возможных комбинаций дверей. Вместо того, чтобы тестировать все 16 вариантов, мы попробуем вручную определить, какой бит какой дверью управляет. Для этого мы создадим еще 4 файла со следующей организацией:

Теперь мы можем создать и воспроизвести 4 отдельных файла, чтобы определить, какой бит управляет какой дверью. Новые пакеты данных будут выглядеть так, где каждый будет в своем файле:


(1654550641.304018) VCAN0 19B # 00000 8 000000

(1654550642.133853) VCAN0 19B # 00000 4 000000

(1654550641.304018) VCAN0 19B # 00000 2 000000

(1654550642.133853) VCAN0 19B # 00000 1 000000

Воспроизведение каждого из этих файлов «door#» приводит к следующим выводам:

Если мы рассмотрим действие каждой двери, «1» — это действие по запиранию двери, а «0» — это отпирание двери. Таким образом, идентифицированная дверь получила указание «закрыть дверь», а остальные получили указание «открыть». Теперь мы можем сделать любую вариацию данных для блокировки или разблокировки дверей в автомобиле.

Если мы хотим запереть обе задние двери автомобиля и разблокировать передние двери, мы можем изменить двоичный файл в CAN-пакете следующим образом:

Если бит разблокировки равен «0», то мы можем заполнить передние двери значением «0». Значение «1» приведет к блокировке дверей, поэтому результат будет таким:

Двоичный результат будет 1(8) + 1(4) + 0(2) + 0(1) = 8+4+0+0 = 12. 12 в шестнадцатеричном формате – «C». Это изменяет наш CAN-пакет на:

(1654550641.304018) VCAN0 19B # 00000 C 000000

Создадим еще один файл с этим пакетом и назовем его «unlockFront». Мы можем протестировать этот пакет, воспроизведя его в сети.

Теперь мы можем контролировать каждую дверь и совершать любую комбинацию открытия/закрытия дверей.

Вывод

В этой статье мы смогли определить, что такое CAN-шина и как она играет роль в автомобильных коммуникациях, а также смогли настроить инструменты, необходимые для проведения взлома.

Взлом автомобиля может быть рискованным, поэтому мы рекомендуем применять эти знания в смоделированной среде. Существуют также непреднамеренные действия, которые могут привести к отправке ошибочного идентификатора, например, срабатывание подушек безопасности. Если вы решите взломать реальный автомобиль, обязательно учитывайте все возможные варианты и делайте это на свой страх и риск.


Ньютон уронил яблоко. Мы роняем челюсти!

Гравитация научных фактов сильнее, чем вы думаете

Подпишитесь и испытайте интеллектуальное падение