0day Wednesday – исследование новейшего вредоноса

Кто-то может назвать это безумие. Для меня это просто среда.

Она досталась мне вчера, и я разобрался с ней сегодня. Она пришла в нагрузку к java эксплойту от старого 2012 CVE (SecurityManager, я полагаю). Я называю её 0day[1], потому что её нету в базах VirusTotal / Malwr ни в каком виде — ни запакованном, ни распакованном.

Попытка анализа в IDA[2] завершается ошибкой:
image

Похоже, что тот засранец, который это делал, скорее всего знал, что некто вроде меня попытается провести анализ. В любом случае, существует не так уж много вариантов модификаций exe, которые сводят с ума дизассемблер, но при этом игнорируются Windows.

Исследуя exe-файл в CFF Explorer, мы видим ошибку в одном из NT-заголовков, а именно в «Data Directories» на значении Delay Import Directory RVA. CFF прекрасен тем, что сразу подсвечивает значение 0x00000040 как неверное. Зануляем его, чтобы исправить ошибку.
image

Сохраняем exe и заново открываем его в IDA — теперь ошибки нет и отрытие проходит без сучка и задоринки.

Беглый осмотр показывает, что это MFC[3]-приложение. Как я понял это? Об этом прямо сказано в столбце Library секции импорта.
image

Приложение, само собой, запаковано. Память запакована. Никаких модифицированных заголовков секций, банальная запакованная память.
image

Что ж, статический анализ — не вариант. Для дальнейшего исследования необходим динамический анализ. Шашки Immunity наголо!

Перед тем как погрузится в Immunity и виртуальную машину, стоит отметить пару небезынтересных вещей, которые не видны в IDA, однако были замечены в CFF Explorer. Для начала, есть пару файлов, которые, на радость Капитану Очевидности, скрыты в директории ресурсов.

Первый — это PNG файл:
image

Второй — HTML страница:
image

Странно. Загрузив PNG файл в IrfanView (лучший вьювер для изображений, между прочим) мы видим небольшой черный прямоугольник, что не совсем вяжется с его размером в 55 КБ. Наверняка что-то спрятано внутри. Стеганография?
image

Теперь посмотрим на HTML-страницу. Загрузив и почистив его в Notepad++, получаем что-то похожее на скрипт определения типа браузера.
image

Почему все это находится в секции ресурсов, да еще и в незапакованном виде — остается загадкой. К секции ресурсов мы еще вернемся. А пока продолжим распаковку.

Запускаем Immunity Debugger и Virtual Box и подгружаем анти-анти-отладочный python плагин.
image

После того, как процесс завершится, можно слить память и заняться её анализом:
image

Я заметил несколько областей памяти, помеченных как Read Write Execute (RWE). Одна из них по адресу 0x00910000, еще одна — 0x00930000, следующая — 0x00940000 и, наконец, последняя — по адресу 0x00970000. Дальнейший анализ показывает, что только 3 из 4 содержат программы. Однако, три программы прятать в одну? Неплохая пасхалка.
image

Теперь сдампим наши программы для дальнейшего анализа. Подгружаем OllyDumpEx и скармливаем наши 0090 области. Видно, что программы по адресам 0x00910000 и 0x00970000 совпадают с оригинальной, судя по их размеру, заголовкам секций и характеристикам. А область по адресу 0x00950000 отличается от них: другие заголовки секций, другие размеры. Должно быть, это то самое золотое яйцо (я оставил буквальный перевод, т.к. в дальнейшем автор использует golden egg в своих скриншотах — прим. перев.).
image

Сдампим наш exe используя Binary (Raw) режим вместо режима Rebuild, чтобы сохранить целостность дампа.
image

Два заголовка секций указывают на то, что программа запакована с помощью UPX[4]. Запуск upx утилиты подтверждает это. Значит, мы можем легко распаковать наше яйцо.
image

Новый exe примерно на 40 КБ больше и распакован корректно, так что теперь мы наконец можем скормить его IDA. Взглянув на строки, видим интересные вещи.
image

Это же HTTP запрос. Похоже, эта штука отсылается домой мамочке, используя POST запрос.

Вы можете спросить — а как же C&C сервер? Не похоже, чтобы он содержался в программе в plain text виде. Помните, я просил вас не забывать про секцию ресурсов? Заглянем в секцию ресурсов нашего golden_egg.exe
image

Вуаля. http://31.207.6.161. Это прекрасно — предоставить нам адрес в открытом виде. Security through obscurity наносит очередной ответный удар.

Наверное вам интересно, что же происходит, когда выполняется основное приложение. Давайте посмотрим:

Во время загрузки, оно автоматически закрывает мой Process Explorer и на любые попытки загрузить диспетчер задач отвечает сообщением «диспетчер задач был отключен администратором» перед тем как почти мгновенно закрыться. Я хотел было сделать скриншот, но оказалось, что я не настолько быстр. Обратившись к Immunity, мы видим, что оригинальная программа «golden_egg.exe» уже завершилась. Взамен — какая-то другая программа с именем «zpNvNKSi.exe», запущенная из темповой директории. Сравниваем хэши — и, похоже, они одинаковы:
image

(Понравился мой хэшер? Скачать можно тут без регистрации и смс)

Рекламная пауза окончена, теперь понятно что делает программа — отключается диспетчер задач, убивает «неугодные» приложения и запускается из темповой директории. Проверка msconfig показывает 2 новых записи в автозагрузке:
image

Я проверил оба файла и они байт в байт совпали с оригинальной программой.

Аттачимся к программе с помощью Immunity, смотрим на память и количество потоков (нажатием клавиши «t») — видим, что программа многопоточная. Я насчитал 12 потоков.
image

Предполагаю, что каждый поток следит, не убит ли один из других потоков. Однако, приостановив выполнение процесса, мы можем заглянуть в его память, используя Process Explorer. Анализ показывает, что существуют строки, которые не были показаны в IDA:
image

Внезапно. Я думаю, что программа проверяет эти утилиты и принудительно закрывает их, если они запущены. Это объясняет то, почему я не мог воспользоваться Process Explorer'ом, пока была запущена программа. Вполне себе способ усложнить запуск любой из этих утилит, моментально убивая их. В списке можно найти regedit, LordPE, Wireshark, regmon, filemon, procmon, tcpview, taskmgr и даже Windows Defender. Сурово. Правда, я не вижу двоюродного брата Process Explorer'a — Process Hacker.

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

Выполнив поиск по памяти одной из строк в Unicode кодировке, мы видим, что строка «taskmgr» находится в секции .data. Неужели IDA соврала насчет строк? Не совсем. Пробуем еще раз, используя медленный Binary search (Alt+B) — и находим больше строк. Видимо, IDA не показывает Unicode строки при поиске по умолчанию. Можно поменять параметры поиска в IDA, нажав Alt+A и выбрав пункт Unicode.
image

Анализ новых строк раскрывает перед нами больше функциональности вредоносной программы.
image

Интересно.

Учитывая то, что наши попытки запустить Wireshark будут блокированы программой, необходимо найти функцию, отвечающую за принудительное завершение программ, и пропатчить её. Как это сделать? Поищем вызов api TerminateProcess().

Используя IDA, это не так уж сложно. В секции импорта находим ссылку на TerminateProcess.
image

Похоже на некий цикл, который просматривает имена процессов с помощью вызова CreateToolhelp32Snapshot и, если они удовлетворяют некому условию, завершает их. Похоже, что список имен процессов, который мы видели ранее, используется именно тут.

Итак, что же мы можем предпринять? Мы можем изменить логику программы так, что вместо вызова TerminateProcess будет происходить… а ничего не будет происходить. Проверив подпрограммы Xref-ом (eXternal REFerences), мы видим, что функция вызывается из подпрограммы 0x00401D2A. В ней находится инструкция jnz, осуществляющая условный переход на подпрограмму, просматривающую процессы и завершающую их. Если мы сможем так пропатчить программу, что эта подпрограмма не будет вызываться, мы сможем запускать любые утилиты из черного списка.
image

Засучим рукава. Я предпочитаю патчить с помощью Immunity — это довольно просто, да и знаком я этим получше. Начнем с поиска подпрограммы в нашем exe. Инструкция с условным переходом находится по адресу 0x00401D4E. Нопаем всю область — таким образом, мы сразу переходим к выполнению ret вместо перехода по адресу 0x00401D2C, где происходило завершение неугодных процессов.
image

Возобновляем выполнение программы и пробуем запустить одну из запрещенных программ. Похоже на то, что все работает, раз regedit запустился, а Process Explorer не был принудительно завершен.
image
image

Наконец, можно провести детальный анализ сетевой активности, используя Wireshark, а также активности в файловой системе и реестре, используя procmon, да и вообще поиграться с работающей программой в Process Explorer.

Process Explorer показывает, что был отправлен SYN[5] пакет к нашему C&C серверу (да, тому самому, адрес которого мы вытащили из секции ресурсов) на 80й порт.
image

Wireshark дает немного больше информации. Тут мы видим не только SYN пакеты, отправляемые нашему HTTP C&C серверу, но еще и большое количество DNS запросов для получения информации о странных доменах. Что дальше?
image

Сервер продолжит стучаться домой, но мне это не нужно. Я мог бы модифицировать секцию ресурсов в нашем «golden_egg.exe» так, чтобы завернуть его на мой собственный HTTP сервер и исследовать его функциональность, но это довольно трудозатратно. У нас уже есть довольно многое: C&C сервер, распакованная программа, её HTTP сигнатура, а также мы знаем о её поведении. Дело закрыто. Еще одна 0day среда пришла и ушла.

Если вам хочется скачать вредонос и повозиться с ним, то можете взять его тут. Пароль «infected».

Надеюсь, это небольшое исследование окажется вам полезным. Удачного крякинга!

Автор Joe Giron

Оригинал статьи

1. 0day (англ. zero day) — термин, обозначающий вредоносные программы, против которых еще не разработаны защитные механизмы или уязвимости, которые не устранены.
2. IDA Pro Disassembler (англ. Interactive DisAssembler) — интерактивный дизассемблер, который широко используется для реверс-инжиниринга.
3. Пакет Microsoft Foundation Classes (MFC) — библиотека на языке C++, разработанная Microsoft и призванная облегчить разработку GUI-приложений для Microsoft Windows путем использования богатого набора библиотечных классов.
4. UPX (the Ultimate Packer for eXecutables) — упаковщик исполняемых файлов, поддерживающий несколько различных платформ и форматов файлов.
5. SYN — пакет, отправляемый клиентом серверу для установки соединения.
Share post

Comments 31

    +12
    Читается на одном дыхании, как детектив. Автору и переводчику огромное спасибо.
      +3
      Могу посоветовать xylibox.com, француз постоянно пишет о компьютерном криминале, и не просто пишет, а расследует, крякает и все такое.
        0
        Спасибо вам за ценный ресурс
      +1
      Наконец, можно провести детальный анализ сетевой активности, используя Wireshark, а также активности в файловой системе и реестре, используя procmon, да и вообще поиграться с работающей программой в Process Explorer.

      А просто переименовать и запустить нужную программу нельзя?
      // а, ой, это перевод
        0
        Можно. но это сработает только в довольно простых случаях (как этот). Более «продвинутые» техники предусматривают анализ процесса по сигнатурам. Встречал протекторы, которые еще проверяли, не установлен ли драйвер мониторинга (емнип, то ли procmon, то ли process explorer ставит такой драйвер при первом своем запуске после перезагрузки; выгрузка драйвера происходит только после перезагрузки системы).
          0
          В винде нельзя запустить программу от пользователя, а считать память от администратора?
            0
            Я такое пишу всегда в своем протекторе. Но этот метод тоже далек от идеала, любая перекомпиляция программы к примеру ProcessExplorer это по сути новая сигнатура или взять вместо новой более старую, уже могут сигнатуры отвалиться. Так что по строкам более надежней способ, хотя их надо не в открытом виде а в виде хэшей хранить
            0
            Я не понял другого — раз вирус в виртуалке, кто мешает запустить wireshark на хосте?

            upd: кажется, я как минимум третий об этом спрашиваю…
              0
              В данном случае ничего не мешает. Хотя аналитику может быть интересна ещё и сетевая активность внутри виртуалки, которая наружу не попадает.
            +12
            Эх, на самом же интересном месте закончилось. Какие команды может получать вредонос, какую информацию сливает, что умеет делать — было очень бы любопытно узнать. Но читается и правда на одном дыхании, спасибо.
              0
              Ссылка ж приложена — поднять виртуалку да помониторить живой обмен никто не мешает :)
                +3
                Как никто не мешает? А лень? :)
              +3
              Я обычно запускаю сниффер с хостовой ОС. А то встречал однажды тоже детект, зловред менял логику и ничего не слал по сети.
                +1
                А не логичнее ли запускать опасный код в виртуалке, а wireshark на основной системе?
                  +1
                  Имхо виртуалка детектится без проблем.
                    0
                    А разработчики Windows и не знали.
                      +1
                      Справедливости ради — они просто на эту тему не переживают.

                      А так детектится по набору и названию оборудования, драйверам для общения с хостом (guest additions), по несколько необычному поведению команд и структур процессора; и как мне кажется, с временными характеристиками можно поиграть. Кстати, давно не видел актуальной статьи на эту тему.
                        0
                        Да, было бы интересно почитать.
                          0
                          Вот очень годная статья на тему: www.xakep.ru/post/58104/. Правда всё равно немного давнишняя.
                        0
                        Ну у автора статьи к примеру Process Explorer не запускался, но он же не был этим смущен и просто запатчил нужное место. Точно также можно поступить и с местами детекта виртуалок, благо способов определить виртуалку не так много(я имею ввиду топ пополулярных способов)
                      0
                      Большое спасибо за набор инструментов, спасибо за перевод.
                        0
                        А вот интересно, у него «левые копии» байт в байт совпадают. Неужели нельзя было добавить хотя бы примитивнейший полиморфизм. Ну там, хотя бы nop'ов добавить. Я уж не говорю про, например, реордеринг кода.
                          0
                          Как уже заметили выше, тут «защиту» можно обойти, переименовав файл запускаемой утилиты, если его дефолтное имя находится в черном списке. А вы про полиморфы тут)
                            0
                            Ну, я не спец в кибербезопасности.

                            Мне казалось, что запутать свой код проще, чем искать паттерны в чужом, для написания сигнатур.
                          +1
                          Никто не разгадал случаем, что находится в PNG?
                            0
                            Бэкграунд для вложенной рядом html? :)
                              0
                              может фоточку меняет в контактике жертвы? )
                              эх вспоминаю как в открытую демонстрировали себя вирусы.
                              fishki.net/1212151-kompjuternye-virusy-jepohi-ms-dos.html
                              +1
                              Мда, MFC-вирусы… печалька. Малварщики уже не те.
                                0
                                А это и не вирус.
                                +2
                                поковырялся. обычный винлокер. прибивает антивирусы, меняет политики в реестре, перегружает винду. шифрует файлы, прибивает оригиналы. требует бабло.
                                mfc не используется. разве что пару функций ATL динамически — чтобы создать окно с кнопками на основе HTML
                                а так, вполне безобидный зверек :)
                                  0
                                  Черт возьми — исследование — ТОРТ! Респект!

                                  Only users with full accounts can post comments. Log in, please.