Ломаем зашифрованный диск для собеседования от RedBalloonSecurity. Part 0
По мотивам
Темная сторона
В нашей жизни существуют моменты, когда все тихо. Все переменные соблюдены и выровнены, а существование давно не преподносит перемен: все люди, которые рядом уже давно стали друзьями, или близкими знакомыми. Со мной так и произошло, и я этому чертовски счастлив — это стоит невероятно дорого. Но осознание того, что наша жизнь конечна, порой заставляет задуматься «а что если?». Что если, все-таки, возможно выйти из привычного способа жизни и занять себя чем-то иным. Скажем так, прожить еще одну жизнь в рамках одной. Здесь и начинается наше приключение.
Контакт
Сидя в уютном офисе, меня посетила мысль пошерстить реддит (вот так вот просто — задумался о смысле жизни, и полез на реддит, с кем не бывает). Внезапно нашелся топик, на котором была уйма вакансий связанных с инфосеком, но все они требовали знаний стандартов, подходов к пентестингу, и прочей документо-связной лабуды. Но, одна из них мне приглянулась. Это была вакансия на security research интерна. Давая себе отчет, что я всего-навсего смотрел видосики в интернете о buffer-overflow’ах, меня посетила мысль, что на интерна я то уж точно сгожусь. Отправив простенькое рекомендательное письмо на публичный e-mail адрес компании, я получил ссылку на 2 картинки. На этих картинках был массив из 16-разрядых чисел. Собрав эти числа в hex-редакторе, я получил новый, уже не публичный e-mail адрес. Отправив еще одно письмо туда, ребята запросили мой адрес проживания. Светить свое место жительства с кем-то из интернета считается плохим тоном, но судьба распорядилась так, что в тот момент, место, где я жил было временным. Я, все-таки, решил рискнуть, и отправил ребятам страну, город и адрес. Через неделю со мной связался человек из UPS и сообщил, что для меня есть посылка.
Что в коробке?
Открыв заводской картон от UPS, меня ждала специальная коробка, которая защищала все, что внутри от статики и прочих наводок. Открыв ее я обнаружил кучу конфет, переходник SATA-USB3, распечатки инструкций и, самое главное, брендированный 3,5» HDD диск в зиплоке.
Инструкции
ТыцДетально изучив документацию, я сложил у себя в голове следующую картину:
Эта задачка является довольно таки успешным залогом того, что компания сильно обратит на тебя внимание
По решению всех задач, откроются публичный и приватный ключи для биткоин кошелька с 0.1337 BTC
Мало того, что нужно будет разобрать диск, так еще и кривизна рук должна быть соответственной, чтоб держать в руках паяльник
Утилита для прошивки диска нестабильна. Нужно выждать минуту перед тем как его обесточивать после прошивки
У меня есть 1 «звонок другу».
В процессе загрузки диска участвуют 3 составляющие — главный IC, прошивка внутри Winbond Flash Chip, и данные на пластинах внутри жесткого диска
У диска, помимо SATA power & SATA data, есть еще 4 pina
Содержимое
Подключив диск к своему Debian-неттопу, и глянув лог ядра я заметил, что диск разбит на 4 раздела. 1й был рабочим, и его можно было примаунтить, а вот 3 остальных имели смещенный адрес начала раздела. Таким образом ребята разбили челлендж на 4 уровня. Решая предыдущий, ты получаешь доступ к новому разделу, подсказкам и файлу прошивки, который и делает новый раздел доступным для монтирования.
root@ubuntu:~# dmesg
...
[ 4718.927084] sdb: sdb1 sdb2 sdb3 sdb4
[ 4718.927140] sdb: p2 start 20480000 is beyond EOD, truncated
[ 4718.927140] sdb: p3 start 40960000 is beyond EOD, truncated
[ 4718.927140] sdb: p4 start 81920000 is beyond EOD, truncated
[ 4718.928123] sd 3:0:0:0: [sdb] Attached SCSI disk
...
LEVEL0
Содержимое раздела:
root@ubuntu:/media/user/LEVEL0# file *
level0_instructions.txt: UTF-8 Unicode text
level1.md5: ASCII text
seaflashlin_rbs: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, stripped
root@ubuntu:/media/user/LEVEL0# cat level0_instructions.txt
Here’s where the challenge starts.
1. Flash level_1.lod using the seaflash tool.
2. Maybe a serial console to the drive would be useful?
root@ubuntu:/media/user/LEVEL0# cat level1.md5
cbf06ad97efb847d040d178ae953715c ../2020-10-13-lods//1//level_1.lod
В общем, меня ждала контрольная сумма для файла прошивки от первого уровня, утилита для прошивки, и инструкция что делать. Утилита прошивки имеет окончание rbs — это значит, ребята ее пропатчили чтоб она могла прошивать диск измененной прошивкой. Предварительно проверив ее на virustotal.com я пришел в замешательство. Файла прошивки нету!
Одна из инструкций говорила о поврежденных файлах. Файловая система на диске оказалась FAT32. Я нашел программу testdisk, один из функционалов которой включает в себя поиск поврежденных данных. Направив ее на /dev/sdb1, файл прошивки нашелся.
TestDisk 7.0, Data Recovery Utility, April 2015
Christophe GRENIER
http://www.cgsecurity.org
P FAT32 0 0 1 1337 63 31 2740223 [LEVEL0]
Directory /
>-rwxr-xr-x 0 0 139 21-Oct-2020 00:35 level0_instructions.txt
-rwxr-xr-x 0 0 104280 21-Oct-2020 00:35 seaflashlin_rbs
-rwxr-xr-x 0 0 1014784 21-Oct-2020 00:42 level_1_makesureitsnotcorrupted.lod
-rwxr-xr-x 0 0 1014784 21-Oct-2020 00:42 level_1_thankyoumd5.lod
-rwxr-xr-x 0 0 69 21-Oct-2020 00:42 level1.md5
Сверив контрольную сумму level_1_makesureitsnotcorrupted.lod с содержимым level1.md5 я понял, что это оно. Восстановив файл, я подготовился прошивать диск. При включении подобного рода дисков, ядро не только делает доступным блочное устройство, но и создает устройство SCSI. Наша утилита seaflashlin_rbs видит это устройство как /dev/sg1. Предварительно скопировав утилиту и файл прошивки куда-то за пределы диска я начал переход на следующий уровень.
root@ubuntu:/home/user/Desktop# ./seaflashlin_rbs -i
================================================================================
Seagate Firmware Download Utility v0.4.6 Build Date: Oct 26 2015
Copyright (c) 2014 Seagate Technology LLC, All Rights Reserved
Tue Mar 23 20:49:37 2021
================================================================================
ATA /dev/sg0 MN: APPLE SSD SM0256F SN: S1K4NYBF685537 FW: JA1Q
ST325031 /dev/sg1 MN: 2AS SN: 2F6112500220 FW: 0
StoreJet /dev/sg2 MN: Transcend SN: C3C3P79A1HXW FW: 0
APPLE /dev/sg3 MN: SD Card Reader SN: 00000000 FW: 3.00
root@ubuntu:/home/user/Desktop# ./seaflashlin_rbs -f level_1_makesureitsnotcorrupted.lod -d /dev/sg1
================================================================================
Seagate Firmware Download Utility v0.4.6 Build Date: Oct 26 2015
Copyright (c) 2014 Seagate Technology LLC, All Rights Reserved
Tue Mar 23 19:25:42 2021
================================================================================
Flashing microcode file level_1_makesureitsnotcorrupted.lod to /dev/sg1
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : !
Microcode Download to /dev/sg1 SUCCESSFUL
Диск прекратил свое вращение, и буквально через 10 секунд включился снова. Выждав минуту, я его обесточил, и подал питание снова. При подключении ядро перестало опознавать диск! В логах я видел лишь записи по поводу USB-to-SATA переходника, но ни блочного, ни SCSI устройства не было. Я был полностью отрезан от устройства.
LEVEL1
Для выхода из сложившейся ситуации существовал лишь 1 вариант — разобратся с тем, что это за 4 pina, фотка которых есть в подсказках. Подобное нагуглить легко. И вуаля, GND, TX, RX.
На неттопе не оказалось UART интерфейса (нафиг там не нужен). Но, ситуация сложилась так, что у меня под рукой была Raspberry Pi 3b+. Поискав описание GPIO пинов, я все таки нашел на нем порты для UART.
Итого, нам необходимо сконтачить: RPI TX (pin #10) -> HDD RX
RPI RX (pin #08) -> HDD TX
RPI GND (pin #06) -> HDD GND
Я использовал обыкновенные Female-Female провода. То, что нужно было воткнуть в диск я успешно заизолировал скотчем. Последний не изолировал поскольку в этом не было необходимости, да и находился он уж слишком близко к порту SATA data, и когда я подключал питание к диску, всетаки приходилось немного его ужимать.
Стоит упомянуть, что UART интерфейс должен быть включен, но возможность логинится через него должна быть отключена. Иначе, в консольник диска посыпятся данные от Login Prompt Raspbian. Для отключения, делаем следующее:
1. Запускаем raspi-config
2. Выбираем Interface Options
3. Выбираем Serial Port
4. Отвечаем "нет" на Would you like a login shell to be accessible over serial?
5. Отвечаем "да" на Would you like the serial port hardware to be enabled?
6. Перезагружаем Raspberry Pi
Далее, нам понадобится minicom для работы с Serial портом. Методом подбора, мне удалось выяснить скорость, парность и прочие параметры для серийника (хотя, их можно было и найти в интернете). Подключаемся к Serial порту:
root@rpi ~ # minicom -b 38400 -D /dev/ttyS0
И здесь я увидел тонны сообщений о том, что мне необходимо что-то пропатчить.
Welcome to minicom 2.7.1
OPTIONS: I18n
Compiled on Aug 13 2017, 15:25:34.
Port /dev/ttyS0, 21:05:41
Press CTRL-A Z for help on special keys
RBS Challenge! Human, patch me you must!
RBS Challenge! Human, patch me you must!
RBS Challenge! Human, patch me you must!
RBS Challenge! Human, patch me you must!
RBS Challenge! Human, patch me you must!
RBS Challenge! Human, patch me you must!
RBS Challenge! Human, patch me you must!
RBS Challenge! Human, patch me you must!
RBS Challenge! Human, patch me you must!
RBS Challenge! Human, patch me you must!
RBS Challenge! Human, patch me you must!
RBS Challenge! Human, patch me you must!
RBS Challenge! Human, patch me you must!
RBS Challenge! Human, patch me you must!
RBS Challenge! Human, patch me you must!
RBS Challenge! Human, patch me you must!
CTRL-A Z for help | 38400 8N1 | NOR | Minicom 2.7.1 | VT102 | Offline | ttyS0
Здесь ко мне дошло, что решение этой задачи очевидно хардварное. В подсказках была последняя страничка, на которой было видно 5 контактов. Сняв плату с диска я посмотрел на эти контакты и обратил внимание на то, куда они ведут. Все они шли на Winbond W25×40BLS02. Найдя datasheet по этому чипу, у меня получилось определить какая ножка чипа за что отвечает.
Решение для задачи нашлось супер быстро. Прогнав strings по level_1_makesureitsnotcorrupted.lod, я нашел информацию что и как патчить. ASCII единорога заценил.
O$H
Q9H)
\%6Q
M[h+
r4m:
4i,XJ
CPRS
\.
\\ .
\\ _,.+;)_
.\\;~%:88%%.
(( a `)9,8;%.
/` _) ' `9%%%?
(' .-' j '8%%'
`"+ | .88%)+._____..,,_ ,+%$%.
:. d%9` `-%*'"'~%$.
___( (%C `. 68%%9
." \7 ; C8%%)`
: ."-.__,'.____________..,` L. \86' ,
: L : : ` .'\. '. %$9%)
; -. : | \ \ "-._ `. `~"
`. ! : | ) > ". ?
`' : | .' .' : |
; ! .' .' : |
,' ; ' .' ; (
. ( j ( ` \
"""' ""' `"" mh Congratulations! To solve this challenge patch those values: Address: 0x00c, data:0b1b Address: 0xbce, data:002149f249f800219fa049f245f89e48
@y1
Ykb!=
l.y^ZV:
VKwF
Тем временем, я нашел уйму информации о том как эти чипы считывать и записывать. К моему счастью, на Raspberry Pi нашелся SPI интерфейс для работы с flash чипами. К сожалению, под рукой не имелось Male-Female проводов, но имея Male-Male и Female-Female можно смело добится желаемого. На фото с бумажкой под Raspberry Pi, слева вверху видно плюс минус схематическое расположение контактов flash чипа, а также их цвета дабы не запутаться. Единственным моментом, который меня оочень смущал, был размер отверствий. Я подобное никогда не припаивал, и, дабы не сломать ничего, мне пришлось обрезать 1 конец Male-Male провода, отогнуть 4 из 8 жил (больше в отверствие банально не пролезет), и отогнуть их немного с другого конца. Таким образом мы получили невероятно нестабильное соединение с платой. Но и вероятность что-то сломать в таком случае крайне мала. Как видите, GND шнур не подсоединен никуда. Это из-за того, что плата мне не знакома, и я не стал рисковать контачить его туда, где я думаю есть заземление. Этот контакт я подсоединил пальцами напрямую к Winbond чипу — этого хватит на время считывания и заливки прошивки.
Прошивка чипаСам по себе процесс прошивки делается через flashrom c указанием девайса SPI, скорости, и файлов куда\от-куда. Из-за нестабильного соединения, Raspberry Pi иногда не видела чип. А даже когда и видела, мне приходилось считывать дважды дабы не было ошибок. Проверка контрольной суммы в таком случае обязательна!
Flashrom прошивкаДетально описывать процесс изменения прошивки не буду. Скажу лишь, что нам надо открыть файл прошивки (ff или ff2: D) hex-редактором, изменить там несколько байт в соответствии с решением из level_1_makesureitsnotcorrupted.lod, и залить обратно с помощью того же flashrom.
После проделанных изменений, я прикрутил плату обратно к диску, подключил его, и меня ждал открытый раздел LEVEL2.
Друзья, если вам интересен подобный материал, ставьте плюсики. Весь процесс, так или иначе, в один пост не поместится.