
В ходе этого практического занятия мы извлечём прошивку из зарядной станции для электромобилей, разберёмся в ней и в итоге эмулируем её, чтобы мы могли взаимодействовать с сервисами в реальном времени.
Присоединяйтесь к нам на этом практическом демо Unblob — гибкого экстрактора прошивки. В ходе этого воркшопа мы извлечём прошивку из зарядной станции для электромобилей, разберём её внутреннее устройство и в итоге эмулируем её, чтобы иметь возможность взаимодействовать с сервисами в реальном времени. Unblob работает как с аппаратными, так и с загружаемыми версиями прошивки, так что у нас богатая среда для работы. Предварительный опыт не требуется, сессия подходит для любого уровня подготовки, и мы с нетерпением ждём встречи с вами.
Наша цель — контроллер зарядной станции для электромобилей от Phoenix Contact. Подробнее о нём можно узнать здесь.
CHARX control modular, AC-контроллер заряда, со встроенной системой Linux, IEC 61851-1, режим работы: автономный, клиент, сервер,
Интерфейсы:
- Ethernet (2x)
- Сотовая связь (4G/2G)
- Системная шина CHARX control modular
- MICRO-USB type C
Протоколы связи:
- OCPP 1.6J
- Modbus/TCP
- MQTT
Подключаемые периферийные устройства:
- Счётчик электроэнергии
- RFID
- Контроль остаточного тока постоянного тока
- Крепление на DIN-рейку
Для этого воркшопа нам понадобится несколько инструментов. Вы можете установить их,
запустив скрипт install-prerequisites следующим образом:```sh
./install-prerequisites
## Получение прошивки
Прошивку можно получить с сайта производителя. В этом репозитории есть скрипт
`download-firmware`, который позволяет скачать прошивку
без необходимости открывать браузер.
Сегодня мы сосредоточимся на прошивке, предоставленной производителем, поскольку в ней есть всё,
что нам нужно. Но аналогичный подход можно применить и к дампу памяти, извлечённому
с работающего устройства. Интересно здесь то, что мы можем извлекать, исследовать и
эмулировать, даже не имея реального устройства.
## Извлечение с помощью Unblob
Начнём с проверки наличия всех зависимостей:```
unblob --show-external-dependencies
The following executables found installed, which are needed by unblob:
7z ✓
debugfs ✓
jefferson ✓
lz4 ✓
lziprecover ✓
lzop ✓
sasquatch ✓
sasquatch-v4be ✓
simg2img ✓
ubireader_extract_files ✓
ubireader_extract_images ✓
unar ✓
zstd ✓
Теперь мы можем извлечь прошивку с помощью unblob:``` unblob CHARXSEC3XXXSoftwareBundleV190.raucb
Извлечение занимает около 3 минут на нормальном ноутбуке. Вы должны увидеть индикатор выполнения:

После завершения извлечения должна появиться директория с именем
`CHARXSEC3XXXSoftwareBundleV190.raucb_extract`. Можно зайти
в неё и просмотреть содержимое.
### Чанки, Неизвестные чанки
Unblob работает путём определения чанков данных внутри файлов. Если чанк — это
сжатый поток, он распаковывается. Если это файловая система или архив — он
извлекается. Если извлечение или распаковка прошли успешно, чанк,
вырезанный на диск, удаляется для освобождения места.
Здесь чанк SquashFS версии 4 little-endian был вырезан на диск, извлечён
и удалён. Файлы (а следовательно, и директории извлечения) именуются
по схеме `{start_offset}-{end_offset}.{type}`.
Мы видим, что после файловой системы squashfs появляется 11 КБ «неизвестного» чанка.```
./0-132173824.squashfs_v4_le_extract
./132173824-132184833.unknown
Вы можете запустить binwalk на нём, чтобы увидеть, что он содержит:```
binwalk 132173824-132184833.unknown
0 0x0 Object signature in DER format (PKCS header length: 4, sequence length: 10997 58 0x3A Certificate in DER format (x509 v3), header length: 4, sequence length: 4372 4434 0x1152 Certificate in DER format (x509 v3), header length: 4, sequence length: 4387
Вы можете проверить сертификаты с помощью openssl:```
dd if=132173824-132184833.unknown bs=1 skip=58 | openssl x509 -in /dev/stdin -inform der -noout -text
dd if=132173824-132184833.unknown bs=1 skip=4434 | openssl x509 -in /dev/stdin -inform der -noout -text
Это означает, что прошивки, скорее всего, подписаны закрытым ключом вендора, чтобы устройства могли убедиться в их подлинности.
Это одно из преимуществ unblob: превращение неизвестных неизвестных в известные неизвестные, которые можно исследовать.
Посмотрим на содержимое нашей файловой системы squashfs:``` ls -al 0-132173824.squashfs_v4_le_extract total 460532 drwxrwxr-x 4 kali kali 4096 dec 5 09:51 . drwxrwxr-x 3 kali kali 4096 dec 5 09:51 .. -rw-rw-r-- 1 kali kali 20971520 sep 8 09:59 bootimg.vfat drwxrwxr-x 3 kali kali 4096 dec 5 09:51 bootimg.vfat_extract -rwxrwxr-x 1 kali kali 2654 sep 19 2022 hook -rw-rw-r-- 1 kali kali 442 sep 8 09:59 manifest.raucm -rw-rw-r-- 1 kali kali 450584576 sep 8 09:59 root.ext4 drwxrwxr-x 22 kali kali 4096 sep 8 09:57 root.ext4_extract
Мы можем видеть манифест в открытом виде, shell-скрипт, одну MBR и файловую систему EXT4:```
find -maxdepth 1 -type f -exec file {} \;
./manifest.raucm: ASCII text
./hook: a /usr/bin/env sh script, ASCII text executable
./bootimg.vfat: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID "mkfs.fat", sectors/cluster 4, reserved sectors 4, root entries 512, sectors 40960 (volumes <=32 MB), Media descriptor 0xf8, sectors/FAT 40, sectors/track 63, heads 255, hidden sectors 163158016, reserved 0x1, serial number 0xd09aad9c, label: "KERNEL ", FAT (16 bit)
./root.ext4: Linux rev 1.0 ext4 filesystem data, UUID=8ed19606-02c4-42e7-9cfb-1a2839f93ec4 (extents) (large files) (huge files)
Оба bootimg.vfat и root.ext4 были обработаны и извлечены с помощью unblob. Раздел
VFAT содержит всё, что связано с загрузкой и ОС (ядро Linux, DTB,
TEE):```
oftree: Device Tree Blob version 17, size=27469, boot CPU=0, string block size=1657, DT structure block size=25756
tee.bin: data
zImage: Linux kernel ARM boot executable zImage (little-endian)
zImage-imx6ul-ksp0632.dtb: Device Tree Blob version 17, size=27469, boot CPU=0, string block size=1657, DT structure block size=25756
Вы увидите, что unblob немного жадный и извлечёт ELF-файл и CPIO-архив
из ядра Linux (`zImage`), они соответствуют минимальному ядру и ramdisk.