Взлом пароля на Mac с Arduino и OpenCV

    О том, как взламывали запароленный мак с помощью Arduino и OpenCV. По мотивам статьи Брутфорсим EFI с Arduino.



    История


    Началось всё как обычно — у моего друга заблокировали Mac Air, уведя аккаунт. И если iPhone можно восстановить, то Mac заблокировался с концами. Обращение в техподдержку ни к чему не привело, в сервисном центре предложили разблокировать за 1000 рублей и 1 день. Правда, обнаружили брак материнской платы, который не позволил им это сделать.

    Прочитав статью Брутфорсим EFI с Arduino, решили повторить опыт. Правда, не было дисплея, зато было две ардуины — Uno и Mega2560. И ноутбук, который не очень жалко на ~33 часа оставить перебирать пароль. Решили сделать перебор с преферансом и поэтессами — пусть автоматика следит за перебором, а мы пьем чай.

    Описание проблемы


    Для начала — коротко о том, что мы вообще решали. Этот раздел для тех, кто не хочет внимательно читать статью, на которую я ссылался.

    Если у Вас угнали аккаунт Apple, взломщик может заблокировать Ваш Mac удаленно, поставив четырехзначный числовой пароль по своему выбору. После этого невозможно включить мак, не введя этот пароль, причем этот пароль можно вводить в двух различных местах — перед входом в учетку свою (там отображаются 4 пустых односимволных поля для ввода, закрываемых звездочками) и при попытке войти в UEFI (в этом случае отображается поле для ввода любого количества символов, тоже закрытых звездочками). Если вводить много раз неправильный пароль в 4 поля, то ввод блокируется сначала на 5 минут, потом на 10, и так до часа. Для перебора не очень подходит. В случае UEFI повторять ввод можно примерно каждые 12 секунд (чуть меньше, на самом деле). Если посчитать максимальное время перебора, получим 33,(3) часа перебора, без учета времени на ввод символов и «ввода». Не смертельно, в принципе. Кажется, Apple есть о чем задуматься в плане безопасности.

    Нам, однако, такая халатность в выборе сложности пароля (или задержки между вводами) только на руку.
    Отмечу, что при вводе правильного пароля ввод не блокируется вообще, то есть, эти ~12 секунд — не время на проверку пароля, а искусственная задержка. Похоже, что можно влезть куда-то за этой задержкой и перебирать гораздо быстрее. Мы так не делали, но идея интересная.

    Disclaimer

    Всё происходящее в этой статье было законно (ибо производилось со своим маком), направлено на борьбу с мошенниками, контактная информация которых уже ушла куда следует. Использование материалов этой статьи для неправомерных (а равно и правомерных) действий ни при каких обстоятельствах не является ответственностью автора или сайта. Всё, что Вы делаете, Вы делаете на свой страх и риск. Автор или сайт не несут ответственности ни за какой ущерб, прямой или косвенный, причиненный материалами статьи. Короче, кто не спрятался, я не виноват.

    Как перебирать?

    Автор статьи «Брутфорсим EFI с Arduino» предложил замечательный способ подбора пароля — Ардуино прикидывается USB-клавиатурой и последовательно перебирает пароли. Я не буду повторять все тонкости подхода, ссылка на статью выше. Я опишу, что мы решили сделать по-другому и почему

    1. Использовать компьютер постоянно. У нас не было дисплея, поэтому писать лог того, что было введено, было не по чему. Поэтому компьютер будет помнить, что вводилось
    2. Распознавать изображение на мониторе мака. Нам показалось относительно несложным проверять, не взломан ли мак до сих пор, и вводить пароли только если не взломан. Всё равно компьютер используется.
    3. Проверять, что введено именно четыре символа. Это было самым неожиданным изменением для нас. Обнаружилось, что иногда связка компьютер — ардуино — ардуино — мак вводила не все символы. Иногда пропускался ввод, и это было не очень страшно (можно добавить 3-4 ввода после пароля, они не мешают). Но иногда пропускались символы пароля. Почему — загадка. Решили смотреть на картинку и убеждаться, что все символы введены. Если нет — повторять ввод.
    4. Перебирать пароли в произвольном порядке. Пароли в статье перебирались от 0000 до 9999, нам это не понравилось. Всего скорее, злоумышленник выбрал пароль, далекий и от 0000, и от 9999, чтобы подбирающий помучался. Поэтому решили сделать рандомизированный перебор. Какую злую шутку это с нами сыграло, читайте дальше.


    Давайте же к сути!


    Перебираем по такой схеме:
    1. Компьютер формирует список паролей для перебора
    2. Компьютер проверяет, что мак всё еще заблокирован
    3. Компьютер отпарвляет очередной пароль ардуине Uno, которая, фактически, используется как USB<->SERIAL переходник и имеет простейшую программу, которая ничего не делает
    4. С Uno данные читает Mega по Serial1. Именно поэтому использовали порядок Uno -> Mega, а не наоборот
    5. Mega вводит данные в мак, считая себя клавиатурой.
    6. Компьютер проверяет, что введено 4 символа на экране. Если нет, пароль помечается как невведенный
    7. По той же схеме нажимается ввод
    8. Пока поле для ввода пароля не пусто, ничего не делаем
    9. Как только поле для ввода опустело, переходим на второй шаг.


    Передача данных

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

    Распознавание замка

    Пока мак заблокирован, рисуется замочек. Вот такой:



    Давайте его искать с помощью OpenCV! Это же такое подходящее использование для микроскопа (на самом деле нет).
    На удивление, OpenCV под .NET завелся с полпинка и двух NuGet пакетов (OpenCV.NET, OpenCV). Дальше немного кода.

    lck = CV.LoadImage("D:\\mac-unlock\\lock.png", LoadImageFlags.Unchanged); //Load lock image file
    Capture camera = Capture.CreateCameraCapture(-1); //Create camera object to capture image. Don't care about device index as the notebook has 1 camera device
    var img = camera.RetrieveFrame(); //get camera image
    IplImage res = new IplImage(new OpenCV.Net.Size(img.Width - tpl.Width + 1, img.Height - tpl.Height + 1), IplDepth.F32, 1); //Create image for matching results
    OpenCV.Net.CV.MatchTemplate(img, lck, res, TemplateMatchingMethod.CorrelationCoefficientNormed); //Find lock image in camera image
    double min, max;
    OpenCV.Net.Point minloc;
    OpenCV.Net.Point maxloc;
    CV.MinMaxLoc(res, out min, out max, out minloc, out maxloc);
    if (max < 0.88) //No lock image on the screen! Wow!
    ...
    

    Этот простой код ищет изображение замка на экране. Находит отлично:



    Зеленый прямоугольник — найденный замок. Никаких сложностей этот раздел не вызвал. OpenCV очень удивил и обрадовал.

    Поле для ввода пароля

    Если мы нашли замок на экране, можно поискать под ним поле для ввода пароля. Это делается относительно несложно при помощи обычной манипуляции пикселями изображения. Или делалось бы, если бы не камера. Есть две проблемы. Во-первых, разрешение камеры было 640*480, что ужасно для анализа. Во-вторых, при непостоянном освещении камера вела себя совершенно непредсказуемо. То что-то засвечивалось, то что-то пропадало. Вторую проблему решили стабильными условиями освещения, первую — привязкой к размерам в пикселях и фильтрами.

    Итак, замок есть, можно найти его центр и пойти вниз, пока не встретим два пика яркости.



    На рисунке — яркости пикселов под замком.
    Найдя два максимума на достаточном расстоянии, можно взять центр между ними и идти влево (считаем, что поле ввода пароля горизонтально). Когда нашли яркий пиксел, либо закончилось поле ввода, либо наткнулись на звездочку.



    Поле ввода. Зеленый — рамка замочка. Белый — линия вниз, по которой ищем два максимума. Красный — найденные максимумы и первый яркий пиксел слева по центру.

    Теперь, если первый яркий пиксел слева достаточно «слева», то поле ввода пустое. Если достаточно «справа», то введены 4 символа. Калибровка нужна, однако.

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

    На этом заканчивается часть по работе с изображением, да и вообще пора переходить к результатам.

    Результаты




    Замочек не найден! После 33 часов работы пароль был подобран. Несмотря на рандомизацию, правильным оказался пароль под номером 35 с конца. Значением пароля было 2605. Вероятность этого события составила 0.35%.

    image

    Литература, оборудование и код


    В статье использованы:
    Apple Mac Air
    Lenovo Thinkpad T510
    Arduino Uno (compatible)
    Arduino Mega 2560 (compatible)

    Литература:

    Брутфорсим EFI с Arduino — отсюда взято всё о работе с Ардуино как с клавиатурой и о принципе блокировки мака. Спасибо автору!
    Оф. сайт Arduino
    Оф. сайт OpenCV

    Код. Внимание, код ужасен. Он написан ad hoc и содержит следы экспериментов. Кроме того, он привязан к размерам моей камеры, поэтому может потребоваться модификация.

    Вы можете делать с кодом всё, что угодно, если это не запрещено законом.
    Поделиться публикацией
    Комментарии 34
    • НЛО прилетело и опубликовало эту надпись здесь
        +1
        Arduino Mega 2560

        Значением пароля было 2605

        Это судьба.

        ЗЫ 2605 похоже не дату.
        +17
        в сервисном центре предложили разблокировать за 1000 рублей и 1 день

        После 33 часов работы пароль был подобран


        В сервисном центре такая же ардуина и OpenCV, а оценка срока в сутки — средняя (ну не всем же будет так не везти, как автору).
        :)
          +2
          Один из авторизованных Apple сервис центров предлагает разблокировку за 4 т.р. и около двух недель. Судя по всему, собираются перепрошивать память efi.
            +3
            У меня знакомый обращался с подобной проблемой, в итоге запороли бук — и не возместили ущерб.,
            — сказали что сотрудник принимающий этот заказ на оказание подобной услуги, был уволен, и вся подобная лабуда…
            Так что у этого способа есть линия жизни.
              0
              за 4 недели они скорее всего ручным перебором собирались искать :)
              +2
              Есть информация, что другим методом тоже можно. Хотя подозреваю, что ардуинкой действительно проще.
              +1
              Подскажите, пожалуйста, как войти в UEFI на Mac?
                0
                Подозреваю, что речь идет про recovery mode (cmd+r).
                  0
                  Да, всё верно. Правда, нажимали Cmd-R-P, для уверенности.
                    0
                    cmd+r+p — это же сброс настроек и инфы об оборудовании вроде?
                    UPD: да, точно.
                +1
                Раньше можно было заблокировать Мак 6-и значным цифровым кодом (через веб-интерфейс icloud.com, если блокировать через приложение для айфона, то только 4 цифры). Сейчас проверил — похоже Apple пошла по пути унификации и уменьшения секьюрности, оставив только 4 цифры для блокировки :( Еще и уязвимость в thunderbolt, позволяющая переписать UEFI, получив физический доступ к машине хоть на пару минут совсем не радует (правда ее частично пофиксили в 10.10.2).
                  0
                  А не проще обратиться в Apple c Proof of Purchase и разблокировать официально?
                    0
                    Не бесплатно и только через офф. сервис
                    +1
                    В таких случаях идеальный вариант, как мне кажется, перебирать пароли ходом от центра, равномерно влево и вправо.
                      +2
                      У нас не было никакой статистики о том, какие пароли ставят злоумышленники. Поэтому, строго говоря, все стратегии равнозначны. Однако, в предположении о том, что злоумышленники стараются сделать трудноподбираемый пароль, рандомизация позволяет обойти это и сделать мат. ожидание времени поиска пароля ровно половиной общего количества паролей.
                        0
                        Однако, в предположении о том, что злоумышленники стараются сделать трудноподбираемый пароль, рандомизация позволяет обойти это

                        Ничего вы не обходите. Это было ни к чему.
                        0
                        > перебирать пароли ходом от центра
                        Обоснуйте. Я, например, полагаю, что большинство используемых четырёхзначных цифровых кодов находится в области до 3131 )
                          0
                          Если код ставит человек — то тут уже другие алгоритмы лучше использовать, основываясь на частоте использования цифр в целевой группе. Если ставит машина — то вариант с рандомизацией — самое то.
                            0
                            Нужно только помнить, что злоумышленник, залочивший ваш комп — это не тот же человек, который ставит себе простой для запоминания пин. Т.е. например золотое правило про «20% пинов начинаются на 19**» тут не сработает, скорее всего.
                              0
                              Если ставит машина — то вариант с рандомизацией — самое то.

                              Если код ставит машина (т.е. он рандомный), то любой порядок перебора будет давать эквивалентную стратегию. Рандомизация тут ни к чему.
                                0
                                Я несколько лет назад читал некую работу (название за давностью лет уже не припомню, к сожалению), и там рассматривалась подобная ситуация. Вывод был таков, что при рандомной выборке вероятность «попадания» чуть выше, чем при последовательной.
                                Хотя «интуитивная» логика подсказывает мне, что вы, вероятно, правы.
                                Призываю в тред спецов-математиков.
                            • НЛО прилетело и опубликовало эту надпись здесь
                              +1
                              Я бы предположил в первую очередь что цифры в пине не повторяются. Т.е. перебирал бы сочетания без повторений.
                              0
                              есть идеи как увели аккаунт?
                                +1
                                Фишинг, троян, утечки из Яндекса. У злоумышленника был пароль от учетки Яндекс в открытом виде, они сбросили пароль на учетку Apple через почту на Яндексе.
                                –6
                                У меня дежа вю или такая же статья была уже опубликована?
                                Ах да, точно! habrahabr.ru/post/240291/
                                  +6
                                  Пожалуйста, прочитайте первую строку этой (моей) статьи.
                                  0
                                  Вопрос к автору:… И если iPhone можно восстановить…

                                  Откуда такая информация?
                                    0
                                    Я сам нашел ответ на свой вопрос. Вы имели ввиду, что iphone можно разблокировать с помощью учетной записи icloud, а mac book нет.
                                    Из ваших первых двух предложений в статье это не понятно.
                                      0
                                      iPhone не блокируется на железном уровне (как macbook, например, с его паролем efi).
                                      Все, что нужно знать для разблокировки — данные учетной записи, с которой была произведена блокировка.
                                      Поддержка apple удостоверяется в том, что именно Вы хозяин учетной записи, находит ее и перевязывает обратно на Вас.
                                      После этого Вы имеете возможность восстановить аппарат самостоятельно. Правда, все данные с него будут стерты.
                                        0
                                        Да, я по вашей ссылке на второй пост нашел ответ. Только не сразу понятно из вашего описания, что именно через iCloud можно снять разблокировку. Я это понял так, что ее можно снять и без iCloud.
                                      0
                                      > «Кажется, Apple есть о чем задуматься в плане безопасности.»©
                                      Улыбнуло. Почему-то вспомнился способ восстановления пароля на Виндовс 7/8.
                                        0
                                        — промахнулся веткой

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

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