Обходим Windows Defender дешево и сердито: обфускация Mimikatz

    image

    Всем привет. Сегодня рассмотрим вариант запуска mimikatz на Windows 10. Mimikatz — инструмент, реализующий функционал Windows Credentials Editor и позволяющий извлечь аутентификационные данные залогинившегося в системе пользователя в открытом виде.

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

    Замечу, что этот способ подходит и для других антивирусных продуктов (Virustotal ДО и ПОСЛЕ тоже так считает), которые проводят статичный анализ бинарников по сигнатурам.
    Так что хоть и данный способ вряд ли поможет вам против EDR решений, но легко поможет обойти Windows Defender.

    Раньше его можно было обойти изменением слов в файле с mimikatz на mimidogz, удалением пары строк в метаданных и баннеров. Сейчас же это стало сложнее, но все же возможно.

    За идею всего этого действа выражаю благодарность человеку с ником ippsec.

    В данной статье мы будем использовать:

    • Windows 10 с включенным Windows Defender (с обновленными базами)
    • Mimikatz
    • Visual Studio
    • HxD (hex редактор)

    Копируя mimikatz на компьютер жертвы, мы ожидаемо видим такой алерт.

    image


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

    Первым делом, найдем и заменим слова mimikatz. Заменим mimikatz например на thunt (заменить можно на что угодно), а MIMIKATZ на THUNT. Выглядит это примерно вот так.

    image

    Следом отредактируем в Visual Studio файл mimikatz\mimikatz\mimikatz.rc (который после нашей замены теперь thunt.rc), заменяя mimikatz и gentilkiwi на что угодно, также не забудем заменить mimikatz.ico на любую другую иконку. Жмем «пересобрать решение» (или rebuild solution) и получаем нашу обновленную версию mimikatz. Скопируем на компьютер жертвы, иии…алерт. Давайте узнаем, на что срабатывает Defender. Самый простой способ это копировать бинарник с разным размером до первого срабатывания антивируса.

    Для начала скопируем половину и скопируем на машину с Windows 10.

    head –c 600000 mimikatz.exe > hunt.exe

    Defender молчит, уже неплохо. Экспериментируя, найдем первое срабатывание. У меня это выглядело так:

    head -c 900000 mimikatz.exe > hunt.exe – не сработал
    head -c 950000 mimikatz.exe > hunt.exe –  сработал 
    head -c 920000 mimikatz.exe > hunt.exe – не сработал
    head -c 930000 mimikatz.exe > hunt.exe – не сработал
    head -c 940000 mimikatz.exe > hunt.exe –  сработал 
    head -c 935000 mimikatz.exe > hunt.exe – не сработал
    head -c 937000 mimikatz.exe > hunt.exe –  сработал
    head -c 936000 mimikatz.exe > hunt.exe – не сработал
    head -c 936500 mimikatz.exe > hunt.exe –  сработал
    head -c 936400 mimikatz.exe > hunt.exe –  сработал
    head -c 936300 mimikatz.exe > hunt.exe –  сработал 
    head -c 936200 mimikatz.exe > hunt.exe – не сработал

    Откроем hunt.exe в hex редакторе и смотрим, на что может сработать Defender. Глаз уцепился за строку KiwiAndRegistryTools.

    image

    Поиграемся со случайным капсом — стало KiWIAnDReGiSTrYToOlS, сохраним и скопируем. Тишина, а это значит, что мы угадали. Теперь найдем все вхождения этих строк в коде, заменим и пересоберем наш проект. Для проверки выполним head -c 936300 mimikatz.exe > hunt.exe. В прошлый раз Defender сработал, сейчас нет. Движемся дальше.

    image

    Таким не хитрым способом, добавляя все больше строк в наш hunt.exe, были обнаружены слова-триггеры — wdigest.dll, isBase64InterceptOutput, isBase64InterceptInput, multirdp, logonPasswords, credman. Меняя их случайным капсом, я добивался того, что Defender перестал на них ругаться.
    Но не может же быть все так легко, подумал Defender и сработал на функции, которые импортируются и чувствительны к регистру. Это функции, которые вызываются из библиотеки netapi32.dll.

    • I_NetServerAuthenticate2
    • I_NetServerReqChallenge
    • I_NetServerTrustPasswordsGet

    Если мы взглянем на netapi32.dll (C:\windows\system32\netapi32.dll), то мы увидим, что каждой функции присвоен номер.

    image

    Изменим вызов функции с вида
    windows.netapi32.I_NetServerTrustPasswordsGet(args)
    на
    windows.netapi32[62](args)
    Для этого нам надо заменить mimikatz\lib\x64\netapi32.min.lib. Создадим файл netapi32.def и запишем туда следующие строки:

    LIBRARY netapi32.dll
    EXPORTS
      I_NetServerAuthenticate2 @ 59
      I_NetServerReqChallenge @ 65
      I_NetServerTrustPasswordsGet @ 62

    Сохраняем и выполним команду (не забудьте на всякий случай сделать бэкап оригинала netapi32.min.lib)

    lib /DEF:netapi32.def /OUT:netapi32.min.lib

    В очередной раз пересоберем проект и скопируем то, что у нас получилось. Defender молчит. Запустим получившейся mimikatz с правами администратора.

    image

    Успех. Таким образом mimikatz запущен и Windows Defender не сработал, чего мы и добивались. Пароли, явки и хеши выданы.

    Подводные камни

    Ожидание:

    * Username : thunt
    * Domain : DESKTOP-JJRBJJA
    * Password : Xp3#2!^&qrizc

    Реальность:

    * Username : thunt
    * Domain : DESKTOP-JJRBJJA
    * Password : (null)

    Ситуация в жизни несколько отличается от лабораторных условий. Возможно, для просмотра пароля вам придется поработать с реестром. Например, включить или создать ключ UseLogonCredential (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest). Но и с этим могут возникнуть проблемы, т.к. при перезагрузке ключи могут выставляться обратно.

    Может быть и ещё хуже, если в случае запуска на одной из последних версии Windows 10, вместо пароля в plain-text вы увидите вот такое:

    * Password : _TBAL_{68EDDCF5-0AEB-4C28-A770-AF5302ECA3C9}

    Все дело в механизме TBAL, который является наследником Automatic Restart Sign-On (ARSO). Теперь, когда запрашивается TBAL, lsasrv проверяет является ли аккаунт локальным или MS аккаунтом, и исходя из этого, использует msv1_0 или cloudAP, чтобы сохранить все необходимое для возобновления сессии пользователя. После чего механизму autologon выставляется захардкоженный пароль _TBAL_{68EDDCF5-0AEB-4C28-A770-AF5302ECA3C9}.

    Тем не менее в лабораторных условиях мы получили пароль пользователя, а в боевой обстановке как минимум можем получить хеши.
    T.Hunter
    Атакующая безопасность

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

      0

      А как на счёт других аверов (kis, sep, mcafee)?

        +4
        Боюсь такие АВ как касперкий, дрвеб, симантек и макафи потребуют чуть больше затрат для эвейда =)
        с Defender проще в том плане, что мы можем сделать декомпрес его БД и посмотреть сигнатуры.
          0
          сделать декомпрес его БД .

          Это как?
            +1
            Если вас смутило слово декомпрес, то может распаковка будет более удачным.
            Если интересен сам процесс, то файлы дефендера лежат в disk:\ProgramData\Microsoft\Windows Defender\Definition Updates\{.*}. Глянуть можно файлы mpasbase.vdm и mpavbase.vdm. В файле mpasdlta.vdm можно увидеть что изменилось с прошлого обновления. Для этого вам скорей всего понадобится скрипт ExpandDefenderSig.ps1
        0
        Вызов по ординалу вроде не будет кросс-платформенным, т.к. версия библиотеки может меняться даже в пределах 1 версии той же десятки. Но, это так, мелочь. Я понимаю, что статья просто пример.

        Вопрос в другом — на последней десятке оно не работает, а возвращает хеш. Что с ним можно делать, кроме как брутить? Есть какая-то практическая польза с этой инфы?
          +1
          Pass-the-hash?
            +4
            Мы можем авторизоваться используя ntlm хеш. Приятно будет если это хеш доменного админа.
            Используя sha-1 можно попробовать задекриптить DPAPI's masterkey. Он вроде бы один на всех (его используют гугл хром, дропбокс, скайп и т.д.), используя его можно много чего цепануть =)
            +1
            … идет 2019 год, антивирусы все так же ищут вирусы по ключевым фразам в файлах

            Люди! Вот это вот и есть «современные продвинутые алгоритмы» защиты от вирусов??? Я вот помню в 90х, например, песочницы были, проверка поведения вирусов в эмуляторах и т.п. Что, больше это всё не нужно?
              0
              Из статьи, как минимум, понятно, что антивирус смотрит на вызов определенных API функций. Чем Вам не проверка поведения?
                +1
                Начнем с того, что про возможность вызова функции по ее номеру в dll известно со времен win 95 как минимум (может было и раньше, но в то время меня использование .dll в моих программах еще не волновало). Как в 2019 году можно не проверять это — я не представляю. И у меня, как у программиста, сразу начинают возникать вопросы — а что еще базовое они так же не проверяют?

                Во-вторых, если эти функции позволяют попасть туда, куда можно попадать только при наличии соответствующих прав, то где, собственно, система защиты самой ОС?

                Ну и в-третьих, меня всё еще волнует вопрос, почему антивирусы полностью игнорируют поведенческие факторы программ? Ну как бы эпидемия блокировщиков, эпидемия шифровальщиков — ну должны они были показать, что надо учитывать какая программа и куда лезет? Ну если программа хочет всего и странного — ну надо бы хотя бы у пользователя спросить, не?

                Третье тысячелетие на дворе, ау! Антивирусы всё еще соревнуются, кто быстрее достанет хеши из базы и сравнит с файлом…
                  +1
                  Что-то мне подсказывает, что вы очень не обрадуетесь производительности компа с таким правильным антивирусом.
                    0
                    Третье тысячелетие на дворе, ау! Антивирусы всё еще соревнуются, кто быстрее достанет хеши из базы и сравнит с файлом…

                    XXI век, а кто-то до сих пор использует файловые антивирусы…
                      0
                      Что-то вы совсем не разбираетесь в современных антивирусах. У доктора веба например есть «превентивная защита» — она запрещает выполняться процессам, которые пытаются получить доступ к системной памяти, изменить ассоциации файлов или загрузить dll из интернета. Или записать что-то в реестр. У Касперского в endpoint security тоже такое есть.
                      Но если весь этот функционал включать, то больше будет ложных срабатываний, чем настоящих.
                        0
                        Я смотрю — против эпидемии шифровальщиков это всё им очень сильно помогло, ага. Особенно касперскому.

                        Я хотел бы напомнить, что во времена WinXP блокировщики писали студенты на Delphi — с соответствующим уровнем кода в них. И антивирусам до сих пор пофик. Вы можете прямо сейчас написать такого же типа блокировщик и я практически уверен, что 99% антивирусов его пропустит, потому что его нет у них в базе хешей.

                        Аналогично и ситуация с шифровальщиками — после первых пары десятков версий любой антивирус уже должен просто сразу в стойку вставать на попытку последовательных переборов файлов в режиме Чение-ЗаписьОбратно (понятно, что речь идет даже не о десятке таких файлов, но уже после первой-второй сотни...). Т.е. банально — приостанавливать работу подозрительного процесса и уточнять у пользователя. Но нет, им пофик и в итоге шифровальщик написанный на .bat-файлах с использованием вполне легальной pgp спокойно работает.

                        И вот это всё и говорит о том, что антивирусы только создают иллюзию, что они от чего-то там защищают. И как замечательно показывает вот эта вот статья — при необходимости, обойти эту псевдо-защиту вообще не представляет проблем.

                        И да, я тут вот сейчас вспомнил еще замечательное… Значит, есть у нас самая-популярная-ОС и у нее есть механизм обновлений, который берет данные с точно известного источника, сами данные подписаны-заверены лично Microsoft'ом, скачиваются и устанавливаются при помощи доверенного процесса операционной системы, так же подписанного Microsoft'ом. Вопрос: почему антивирусы проверяют эти обновления в момент запуска и в течении всего процесса установки (притом, что внутри исталляторов опять-таки лежат файлы, подписанные лично Microsoft'ом)? Особенно замечательно наблюдать всё это — на каком-нибудь планшете с Atom'ом. Прям душа радуется…
                          0
                          Если бы все было так просто. На алгоритме Чение-ЗаписьОбратно мы ляжем на первом же оптимизаторе, архиваторе
                            0
                            Неа, не ляжем. Ни один архиватор не модифицирует архивы напрямую, обычно они все операции делают в новый файл, а потом удаляют старый. Возможно, если файл будет очень большим… Но в любом случае, это не сотни модифицируемых подряд файлов — и соответственно мое условие проверки на шифровальщик не сработает. Да даже если и сработает — процесс приостанавливается, антивирус спрашивает у клиента — «продолжаем?» и в случае разрешения вносит процесс архиватора в доверенные, которым такие действия разрешены.

                            Это, конечно, тоже потенциальная уязвимость — но, извините, сколько тех архиваторов в мире?? Я вот не понимаю, почему те же антивирусы спустя 30 лет существования всё еще не ведут базу гарантированно безопасных программ и проверяют их при каждом запуске? Так сложно один раз посчитать хеш-сумму для каждой версии таких программ и потом просто ее проверить? Да и большинство нормальных программ сейчас имеют цифровую подпись, которую (в общем случае) невозможно подделать, можно только заменить (на свою).

                            Не, я прекрасно понимаю, что пойдут еще разные нюансы… Но суть в том, что сейчас никакой защиты по факту нет вообще. А лучше плохая защита, чем никакой.

                            P.S.: а еще можно вспомнить как, если я правильно помню, аваст удалял .dll в папке windows. Ибо хеши сошлись, да. При том, что те самые dll были подписаны Microsoft'ом. Это вот — как? Т.е. цифровым подписям доверия нет, да? Зачем тогда они вообще применяются в мире??? А всё проще — тяп-ляп и пофик на оптимизации и логику, компьютеры клиентов мощные, справятся!
                              0
                              Ведут такую базу. У Касперских с мохнатого года. Но там в чем засада. Неизвестные вирусы. Какой троян может быть обнаружен и через полгода после заражения. Поэтому не проверять можно только между обновлениями. А по приходу такового нужно проверить во избежание. Поэтому получается двойная проверка — и проверка контрольной суммы и антивирусная проверка. Ну и плюс это еще одна база данных и поиск по ней. Время конечно невелико, но тоже задержка. И плюс большие файлы. Полностью считать контрольную сумму — долго, а проверять часть — будут вирье прятать в конце. В из случае антивирусная проверка может им быстрее будет. Не все просто увы

                              А насчет простого метода обнаружения шифровальщиков — действительно не работает. Аналитики так говорили, а я им верю
                                0
                                Ну я и пишу о том, что большинство нормальных программ имеют цифровую подпись. Т.е. можно считать, что если у программы нет подписи — она не нормальная и потенциальный вирус. Далее — для каждой подписанной программы/файла иметь единую базу на все антивирусы. Т.е., грубо говоря, каждый разработчик сам, добровольно, каждый апдейт регистрирует в этой единой базе (и геморроя в этом не будет слишком много, т.к. они и так уже тратит ресурсы на то, чтобы подписать каждый файл — просто еще одно действие добавится). И всё, эти программы уже не надо проверять на наличие вирусов вообще! Достаточно убедиться в ненарушении целостности подписи.

                                И в случае нахождения вируса в такой программе, конкретную версию/хеш/подпись просто помечают как «плохую» и опять-таки антивирус не тратит ресурсы на проверку, а сразу считает файл плохим.

                                По шифровальщикам: после сотен модификаций одного и того же алгоритма их работы уже можно было бы по-умолчанию считать любой процесс активно перебирающий файлы — плохим. Просто вообще без условий, даже если это условно-хорошая программа, типа pgp. Причем мы сразу упираемся в ту же самую проверку «на хорошесть» программ по единой базе, которая для pgp пройдет. Но для такого класса программ просто надо сразу требовать подтверждения от пользователя, что он понимает что делает. На самом-то деле классов программ, массово работающих с файлами не так и много, вести их базу вполне реально, никакие космические технологии тут не требуются.
                  +1
                  Мне кажется, что в статье нет как таковой обфускации. Только замена ключевых слов.
                    –3
                    )))) это можно сделать на много легче, раз уж речь об нубстве пошла, поиграем вы говорите что доступ к машине есть, так в чем проблема грузануть ее и все тут, я отхожу от своих стериотипов, это реально велосипед. евсли я криптану учетку а учетка не на длкалке будет хранится, ну зайдете, доспут вы не получите к файлам они тоже будут обфуксены в хеше это я не говорю когда я нубас конченый и поделил ос на части и вынес LSA хрен с ним даже его на внешную за пределы доступа, она в гранд рояль, не буду назывыать, придумаю имя не хочу полить, кстати сразу говрорю мне пофитг на граматику я пишу как хочу и мне пофиг. Есть шняга конечно, это для имбицилов пишется или для днарей не пойму, чел убдет под учеткой админа работать? У чела будет включен в лучшем случаи гость и он врятле с нее будет грузиться он обфустит в траст по сети и все тут. Ржу не могу… Нафиг вам обычные компы ломать. Все и так в шаре, кто первый потом уже нубство. Кончиные уроды и критины. Модерация коментов, это мой второй комент.

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

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