Статья The Car Hacker's Handbook: A Guide For Penetration Testing - Глава 3, Часть 2

Установка дополнительных модулей ядра

Некоторые из более продвинутых и экспериментальных команд, например, основанных на ISO-TP, требуют установки дополнительных модулей ядра, таких как can-isotp, до их использования. На момент написания этой статьи эти дополнительные модули не были включены в стандартные ядра Linux, и вам, вероятно, придется их компилировать отдельно. Вы можете захватить дополнительные модули ядра CAN следующим образом:
Bash:
$  git clone https://gitorious.org/linux-can/can-modules.git
$  cd can-modules/net/can
$  sudo ./make_isotp.sh
После того, как закончите, он должен создать файл can-isotp.ko. Если вы запустите make в корневой папке репозитория, он попытается скомпилировать некоторые модули несинхронизации, поэтому лучше всего скомпилировать только тот модуль, который вам нужен в текущем каталоге. Чтобы загрузить недавно скомпилированный модуль can-isotp.ko, запустите insmod:
Bash:
#  sudo insmod ./can-isotp.ko
dmesg должен показать, что он загружен правильно:
Bash:
$  dmesg
[830053.381705] can: isotp protocol (rev 20141116 alpha)
Заметим: Как только драйвер ISO-TP оказался стабильным, он должен быть перенесен в стабильную ветвь ядра в Linux. В зависимости от того, когда вы читаете это, оно, возможно, уже было перемещено, поэтому обязательно проверьте, установлено ли это ранее, перед компиляцией собственных.

Модуль can-isotp.ko

Модуль can-isotp.ko представляет собой реализацию протокола CAN в сетевом слое Linux, для чего требуется, чтобы система загружала основной модуль can.ko. Модуль can.ko предоставляет инфраструктуру сетевого уровня для всех встроенных CAN-протоколов, таких как can_raw.ko, can_bcm.ko и can-gw.ko. Если он работает правильно, вы должны увидеть этот вывод в ответ на следующую команду:
Bash:
#  sudo insmod ./can-isotp.ko
[830053.374734] can: controller area network core (rev 20120528 abi 9)
[830053.374746] NET: Registered protocol family 29
[830053.376897] can: netlink gateway (rev 20130117) max_hops=1
Когда can.ko не загружен, вы получаете следующее:
Bash:
#  sudo insmod ./can-isotp.ko
insmod: ERROR: could not insert module ./can-isotp.ko: Unknown symbol in module
Если вы забыли подключить свое устройство CAN или загрузить модуль ядра CAN, это странное сообщение об ошибке, которое вы увидите. Если вы хотите ввести dmesg для получения дополнительной информации, вы увидите серию недостающих символов, на которые ссылаются сообщения об ошибках:
Bash:
$  dmesg
[830760.460054] can_isotp: Unknown symbol can_rx_unregister (err 0)
[830760.460134] can_isotp: Unknown symbol can_proto_register (err 0)
[830760.460186] can_isotp: Unknown symbol can_send (err 0)
[830760.460220] can_isotp: Unknown symbol can_ioctl (err 0)
[830760.460311] can_isotp: Unknown symbol can_proto_unregister (err 0)
[830760.460345] can_isotp: Unknown symbol can_rx_register (err 0)
Выход dmesg показывает много сообщений Неизвестного символа, особенно вокруг методов can_x. (Игнорировать сообщения (err 0).) Эти сообщения говорят нам, что модуль _isotop не может найти методы, связанные со стандартными функциями CAN. Эти сообщения указывают, что вам нужно загрузить модуль can.ko. После загрузки все должно работать нормально.


Кодинг приложений socketCan

В то время как can-utils очень надежный, вы обнаружите, что хотите написать специальные инструменты для выполнения определенных действий. (Если вы не разработчик, вы можете пропустить этот раздел.)

Подключение к гнезду CAN.
Чтобы написать собственные утилиты, вам сначала нужно подключиться к разъему CAN. Подключение к гнезду CAN в Linux аналогично подключению к любому сетевому сокету, который может быть известен из сетевого программирования TCP / IP. Ниже приведен код C, характерный для CAN, а также минимальный требуемый код для подключения к гнезду CAN. Этот фрагмент кода связывается с can0 как сырой разъем CAN.
C:
int s;
struct sockaddr_can addr;
struct ifreq ifr;

s = socket(PF_CAN, SOCK_RAW, CAN_RAW);

strcpy(ifr.ifr_name, "can0" );
ioctl(s, SIOCGIFINDEX, &ifr);

addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;

bind(s, (struct sockaddr *)&addr, sizeof(addr));
Давайте рассмотрим разделы, специфичные для CAN:
C:
s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
Эта строка указывает семейство протоколов, PF_CAN и определяет сокет как CAN_RAW. Вы также можете использовать CAN_BCM, если планируете создать службу широковещательного менеджера (BCM). Служба BCM представляет собой более сложную структуру, которая может отслеживать изменения байтов и очередь циклических CAN-пакетов. Эти две строки вызывают интерфейс:
C:
strcpy(ifr.ifr_name, "can0" );
ioctl(s, SIOCGIFINDEX, &ifr);
Эти строки настраивают семейство CAN для sockaddr, а затем привязывают к сокету, что позволяет вам считывать пакеты из сети:
C:
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;

Настройка CAN-кадра

Затем мы хотим настроить CAN-кадр и считывать байты с CAN-сети в нашу новую структуру:
C:
struct can_frame frame;
nbytes = read(s, &frame, sizeof(struct can_frame));
Can_frame определяется в linux / can.h как:
C:
struct can_frame {
        canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
        __u8 can_dlc; /* frame payload length in byte (0 .. 8) */
        __u8 data[8] __attribute__((aligned(8)));
};
Запись в сеть CAN аналогична команде чтения, но наоборот. Просто, а?


Интерфейс Procfs

Модули сетевого уровня SocketCAN также реализуют интерфейс procfs. Доступ к информации в proc может упростить создание сценариев bash, а также обеспечить быстрый способ увидеть, что делает ядро. Вы найдете предоставленную информацию сетевого уровня в / proc / net / can / и / proc / net / can-bcm /. Вы можете увидеть список крючков в CAN-приемнике, выполнив поиск rcvlist_all file с cat:
Bash:
$ cat /proc/net/can/rcvlist_all
    receive list 'rx_all':
        (vcan3: no entry)
        (vcan2: no entry)
        (vcan1: no entry)
        device can_id can_mask function userdata matches ident
        vcan0 000 00000000 f88e6370 f6c6f400 0 raw
    (any: no entry)

Некоторые другие полезные файлы procfs включают следующее:
________________________________________________________________________
stats CAN network-layer
________________________________________________________________________
stats reset_stats Сбрасывает статистику (например, для измерений)
________________________________________________________________________
version SocketCAN версия
________________________________________________________________________

Вы можете ограничить максимальную длину передаваемых пакетов в proc:
$ echo 1000 > /sys/class/net/can0/tx_queue_len
Установите это значение в соответствии с тем, что, по вашему мнению, будет максимальной длиной пакета для вашего приложения. Обычно вам не нужно изменять это значение, но если вы обнаружите, что у вас проблемы с дросселированием, вы можете захотеть.


Демон socketcand

Socketcand предоставляет сетевой интерфейс в сети CAN. Хотя он не включает в себя can-utils, он все равно может быть очень полезен, особенно при разработке приложения на языке программирования, таком как Go, который не может установить параметры низкоуровневого сокета CAN, описанные в этой главе. Socketcand включает полный протокол для управления его взаимодействием с CAN-шиной. Например, вы можете отправить следующую строку в socketcand, чтобы открыть интерфейс loopback:
< can0 C listen_only loopback three_samples >
Протокол для socketcand по существу тот же, что и сервер BCM Яна-Никласа Мейера, упомянутый ранее; это фактически вилка сервера BCM. (Socketcand, однако, немного более устойчив, чем сервер BCM.)

kayak

, основанный на Java графический интерфейс для диагностики и мониторинга CAN (см. рис. 3-2),

Рисунок 3-2.jpg


Является одним из лучших инструментов для использования с socketcand. Каяк связывается с OpenStreetMaps для сопоставления и может обрабатывать определения CAN. Являясь Java-приложением, он независим от платформы, поэтому он опирается на socketcand для обработки связи с трансиверами CAN. Вы можете загрузить бинарный пакет для Kayak или скомпилировать его из источника. Чтобы скомпилировать Kayak, установите последнюю версию Apache Maven и клонируйте репозиторий git: (git: //github.com/dschanoeh/Kayak). Как только клон будет завершен, запустите следующее:
$ mvn clean package
Вы должны найти свой двоичный файл в папке Kayak/application/target/kayak/bin.Перед запуском Kayak запустите socketcand:
$ socketcand -i can0

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

Затем запустите Kayak и выполните следующие действия:

1. Создайте новый проект ctrl-N и дайте ему имя.
2. Щелкните правой кнопкой мыши проект и выберите Newbus; затем дайте вашей шине имя (см. Рисунок 3-3)

Рисунок 3-3.jpg


3. Перейдите на вкладку «Подключения» справа; ваш socketcand должен появиться в Auto Discovery (см. рис. 3-4)

Рисунок 3-4.jpg


4. Перетащите соединение socketcand в соединение шины. (Подключение к шине должно сказать «Соединение: нет, пока не настроено».) Чтобы увидеть шину, вам может потребоваться ее расширить, щелкнув стрелку раскрывающегося списка рядом с именем шины, как показано на рисунке 3-5.

Рисунок 3-5.jpg


5. Щелкните правой кнопкой мыши на шине и выберите «Открыть RAW-представление».
6. Нажмите кнопку воспроизведения (обведено на рисунке 3-6); вы должны начать видеть пакеты с CAN-шины.

Рисунок 3-6.jpg


7. Выберите «Раскрасить»(Colorize)на панели инструментов, чтобы упростить просмотр и чтение измененных пакетов.
Kayak может легко записывать и воспроизводить сеансы захвата пакетов и поддерживает определения CAN (хранится в открытом формате KDC). На момент написания этого документа GUI не поддерживает создание определений, но я покажу, как создавать определения позже. Kayak - отличный инструмент с открытым исходным кодом, который может работать на любой платформе. Кроме того, он имеет дружественный графический интерфейс с расширенными функциями, которые позволяют вам определять CAN-пакеты, которые вы видите, и просматривать их графически.


Резюме

В этой главе вы узнали, как использовать SocketCAN в качестве унифицированного интерфейса для CAN-устройств и как настроить устройство и применить соответствующую скорость передачи данных для вашей CAN-шины. Я просмотрел все утилиты CAN по умолчанию в пакете can-utils, которые поставляются с поддержкой SocketCAN, и я показал вам, как писать низкоуровневый код C, чтобы напрямую взаимодействовать с сокетами CAN. Наконец, вы узнали, как использовать socketcand для удаленного взаимодействия с вашими CAN-устройствами и настроить Kayak для работы с socketcand. Теперь, когда вы установили связь с вашим автомобилем, вы уже готовы попробовать некоторые атаки.
  • 4 глава В ней мы будем рассматривать диагностику и логирование. Будем читать коды,желательно знать немного пайтона, там есть один инструмент,написанный на питончике
 
  • Нравится
Реакции: Vertigo и Глюк
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!