Ломаем зашифрованный диск для собеседования от RedBalloonSecurity. Part 0x00

По мотивам
Часть 0x00
Часть 0x01
Часть 0x02

Темная сторона

В нашей жизни существуют моменты, когда все тихо. Все переменные соблюдены и выровнены, а существование давно не преподносит перемен: все люди, которые рядом уже давно стали друзьями, или близкими знакомыми. Со мной так и произошло, и я этому чертовски счастлив - это стоит невероятно дорого. Но осознание того, что наша жизнь конечна, порой заставляет задуматься "а что если?". Что если, все-таки, возможно выйти из привычного способа жизни и занять себя чем-то иным. Скажем так, прожить еще одну жизнь в рамках одной. Здесь и начинается наше приключение.

Контакт

Сидя в уютном офисе, меня посетила мысль пошерстить реддит (вот так вот просто - задумался о смысле жизни, и полез на реддит, с кем не бывает). Внезапно нашелся топик, на котором была уйма вакансий связанных с инфосеком, но все они требовали знаний стандартов, подходов к пентестингу, и прочей документо-связной лабуды. Но, одна из них мне приглянулась. Это была вакансия на security research интерна. Давая себе отчет, что я всего-навсего смотрел видосики в интернете о buffer-overflow'ах, меня посетила мысль, что на интерна я то уж точно сгожусь. Отправив простенькое рекомендательное письмо на публичный e-mail адрес компании, я получил ссылку на 2 картинки. На этих картинках был массив из 16-разрядых чисел. Собрав эти числа в hex-редакторе, я получил новый, уже не публичный e-mail адрес. Отправив еще одно письмо туда, ребята запросили мой адрес проживания. Светить свое место жительства с кем-то из интернета считается плохим тоном, но судьба распорядилась так, что в тот момент, место, где я жил было временным. Я, все-таки, решил рискнуть, и отправил ребятам страну, город и адрес. Через неделю со мной связался человек из UPS и сообщил, что для меня есть посылка.

Что в коробке?

Открыв заводской картон от UPS, меня ждала специальная коробка, которая защищала все, что внутри от статики и прочих наводок. Открыв ее я обнаружил кучу конфет, переходник SATA-USB3, распечатки инструкций и, самое главное, брендированный 3,5" HDD диск в зиплоке.

Инструкции

Тыц

Детально изучив документацию, я сложил у себя в голове следующую картину:

  1. Эта задачка является довольно таки успешным залогом того, что компания сильно обратит на тебя внимание

  2. По решению всех задач, откроются публичный и приватный ключи для биткоин кошелька с 0.1337 BTC

  3. Мало того, что нужно будет разобрать диск, так еще и кривизна рук должна быть соответственной, чтоб держать в руках паяльник

  4. Утилита для прошивки диска нестабильна. Нужно выждать минуту перед тем как его обесточивать после прошивки

  5. У меня есть 1 "звонок другу".

  6. В процессе загрузки диска участвуют 3 составляющие - главный IC, прошивка внутри Winbond Flash Chip, и данные на пластинах внутри жесткого диска

  7. У диска, помимо 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 <grenier@cgsecurity.org>
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 W25X40BLS02. Найдя 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        
 @<H
|XY?W
??kFK
?B?>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.

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

Подисываемся на инсту @o.tkachuk

Комментарии 27

    +3
    Плюс поставить не могу, но очень интересно!
      +3
      Нереальная круть! Вот это я понимаю тестовое задание! Супер антуражненько, по-шпионски немного и вообще! Контора крутая.
        +4

        Ребята из RBS будут не против, что Вы публикуете решение задачи?


        PS Очень интересно, но плюс не могу поставить к сожалению.

          0
          Эта мысль мучила меня несколько месяцев, но в конце концов я пришел к выводу, что, раз уж они высылают эти задачки любому желающему… должны быть готовы к подобному исходу.

          … не бывает плохого пиара
            +2
            Там же вроде прямо в инструкции сразу написано: we ask that you not publish the details of your solution.
              0
              Да, так и есть. Ребята просили не шарить решения. И в этой ситуации не прав я.
              Но, как по мне, для того чтоб пробоваться на какую-то вакансию, нужно понимать, что на обмане особо не выедешь. И, так или иначе, даже если кто-то найдет эту статью, и использует ее для собеседования, пользы компании от такого человека будет мало и долго он там не протянет. К тому же, мне кажется, что им была интересна не столько моя персона, сколько мои подходы ко взлому. Если здесь решение было плюс минус очевидным (оно было чуть ли не единственным), то на следующих левелах я делал ошибки… много ошибок. И, первое что меня спросили после решения всех задачек, это статью. Статью о том, что я делал, что получалось, а что нет (что не получалось было даже важнее того, что получилось). В любом случае, собеседование покажет кто есть кто.
            0
            Да ладно, уверен, что ребята придумают что-нибудь новое и не менее увлекательное пока мы восхищаемся этим ТЗ)
              0
              Там указано в тексте что они против.
              0
              С юмором компания.
              На сайте вакансии у них тоже в глаза не бросаются.

              еще один единорог
              image
                +2

                Я бы бэкапился посекторно на каждом этапе и сливал прошивку, потом лазил по дампам. А то одно неловкое движение и всё.

                  0
                  я так понял, flashrom после записи делает чтение и сверку данных (что записал, то и должен считать). контрольная сумма после чтения дает чуть ли не 100% уверенность, что все считалось правильно. данные не могут считатся дважды с одинаковой ошибкой в одном и том же месте. а что значит посекторно? типа задать во flashrom конкретные оффсеты и количество считываемых байт?
                    –1

                    Не только прошивку, но и блины.
                    Не dd, а чем-то, что клонирует весь диск байт в байт, потому что dd не может в незнакомые файловые системы и не клонирует таблицу разделов, на сколько помню

                      0
                      Я понял о чем ты. Тупо слить весь диск чисто чтоб случайно что-то не грохнуть.
                      Но я это вижу немного иначе. На сколько я понял, вот эти .lod файлы — через SCSI льются в winbond, а может и не толко. По сути это официальный канал для прошивки диска. Но бэкапом всего диска спасти все не получится. Данные на флеш чипе регулируют данные от блочного устройства, и то, как блочное устройство отвечает линуксу. поэтому я ничего не бэкапил — не было смысла. хотя, в основном старался на разделы диска ничего не писать. мало ли). А эти ребята когда писали .lod файл нарошно направили исполнение кода внутри платы на бесконечный цикл с выводом сообщения в серийник. Думаю, если разобрать в дисассемблере те данные, которые я патчил, там будет B, BL, BX или BLX куда-то там (за пределы цикла).
                        +1
                        А какое дело dd до файловой системы, если сделать dd if=/dev/sdX of=/path/to/file?
                        Можно ddrescue использовать на всякий случай.
                          0
                          dd понятия ничего не имеет про файловые системы и может копировать всё, включая таблицу разделов конечно же.
                            0
                            Линуксовый — может быть (заменял мне когда-то акронис), а виндовый сильно обломал в свое время, была мысль сделать программатор и считыватель прошивок, с USB-Mass Storage мостом. Считывать и шить чипы датафлэша с помощью dd, но виндовый смог только в известные файловые системы
                      0
                      тут должен быть апвоут за такую статью, но новеньких немного ограничивают
                      с нетерпением жду продолжения
                        0
                        Было достаточно интересно прочесть данную статью.
                        Яб с этим заданием не справился.
                        Лайк поставил.
                          0
                          Слету понял половину статьи, а если быть честным то и того меньше, но все равно очень интересно. Продолжайте. У людей такие интересные увлечения бывают. Молодец.
                            0
                            Сложно поверить, что это первая статья автора на Хабре.
                            Первый блин НЕ комом. Так держать
                              +1
                              Хотелось написать что-то стоящее. Ну, тоесть, РЕАЛЬНО стоящее. А не статью ради статьи. Дело в том, что наше понимание технологий теряется со временем. Мы всегда создаем что-то «новое» на базе чего-то «старого». Люди, которые создавали старые вещи уходят, а новые приходят, и создают на базе старого что-то новое. И когда, например, человек устраивается на работу программистом\сисадмином\девопсом, он начинает жить в мире условностей. «Эта функция делает вот такую штуку, а другая другую штуку». И на этом понимание заканчивается. Тем не менее, это круто — кому-то польза с этого есть, деньги платятся. Все счастливы. Я, когда писал этот материал, хотел вложить в него больше… «правды», чтоли. Поэтому получилось так клево. От простых вещей к сложным. Постепенно. Спасибо за теплый комментарий)
                              +1
                              Если это задание для интерна, чем же там сеньоры занимаются…
                                +3

                                Пишут задания для интернов.

                                0

                                это очень интересно! ждём продолжения!

                                  0

                                  Нереально интересно! Очень хочется увидеть продолжение!

                                    0

                                    Автор, очень интересная статья.
                                    Продолжение правда открыть не могу, пишет что страница удалена или перемещена.

                                      0
                                      Привет. Спасибо за интерес!
                                      Продолжение статьи будет опубликовано завтра утром (~8:30 GMT+3)
                                      Ссылка в шапке начнет работать в то же время.

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

                                    Самое читаемое