На прошлой неделе Minerva Labs обнаружили несколько новых образцов, похожих друг на друга и загруженных на VirusTotal (VT) в виде файлов .dll, .gif или .jpg. Все они были помечены VT как 'spreader' и 'detect-debug-environment' и привлекли наше внимание, потому что они, казалось, сбрасывали файлы, но эти файлы не могли быть извлечены из VT.
Когда Minerva Labs изучили этот образец, мы заметили использование значительного количества методов уклонения. Создавалось впечатление, что авторы этой вредоносной программы пытались реализовать как можно больше антиотладочных и анти-VM (anti-sandbox) техник. Одна из таких техник включала задержку выполнения с помощью функции API Beep, отсюда и название вредоносной программы.
Beep Malware
Усилия новой вредоносной программы Beep по уклонению от обнаружения отличают ее от других вредоносных программ. Нечасто можно встретить такое количество методов уклонения, которые он применяет, чтобы избежать песочниц, виртуальных машин и других методов отладки. После успешного проникновения в систему эта вредоносная программа может легко загружать и распространять широкий спектр дополнительных вредоносных инструментов, включая ransomware, что делает ее чрезвычайно опасной.3
Вредоносная программа Beep реализует несколько техник уклонения, которые она использует многократно в процессе выполнения. Эти техники включают в себя:
Динамическая деобфускация строк - техника, широко используемая субъектами угроз для предотвращения легкого восстановления важных строк. В основном используется для скрытия импорта, Beep копирует в память жестко закодированные обфусцированные шестнадцатеричные байты, а затем деобфусцирует их с помощью ассемблерных инструкций xor/sub/add/not.
Проверка языка по умолчанию - техника, в основном используемая авторами из стран бывшего Советского Союза для уклонения от заражения нежелательных систем. Beep использует API-функцию GetUserDefaultLangID для получения идентификатора языка и проверки, представляет ли он следующие языки:
- a. 419 - русский
- b. 422 - украинский
- c. 423 - белорусский
- d. 428 - таджикский
- e. 424 - словенский
- f. 437 - грузинский
- g. 43F - казахский
- h. 843 - узбекский (кириллица)
Ассемблерная реализация API-функции IsDebuggerPresent - определяет, отлаживается ли текущий процесс отладчиком в пользовательском режиме, проверяя флаг BeingDebugged блока окружения процесса (PEB).
Поле NtGlobalFlag антиотладки - определяет, был ли процесс создан отладчиком. Более подробную информацию можно найти здесь.
инструкция RDTSC - эта инструкция используется для определения того, сколько тактов процессора прошло с момента сброса процессора. Это также может быть использовано как антиотладочная техника. Наиболее распространенный способ ее использования - получить текущую временную метку с помощью этой инструкции, сохранить ее в регистре, затем получить другую временную метку и проверить, не превышает ли дельта между ними количество тиков, заранее определенное автором.
Регистр сегмента стека - используется для определения того, отслеживается ли программа. После однократного перехода в отладчике через инструкции 'push ss pop ss pushf' будет установлен флаг Trap Flag.
CPUID anti-vm - Вредоносная программа использует инструкцию cpuid с EAX=40000000 в качестве входа. Возвращаемым значением будет строка Hypervisor Brand, а затем проверяется, содержит ли она часть слова 'VMware'.
Анти-VM ключ реестра VBOX - Вредоносная программа использует API функцию RegOpenKeyExW для проверки существования ключа реестра HKLM\HARDWARE\ACPI\DSDT\VBOX__.
Функция API Beep против песочницы - Вредоносные программы обычно используют функцию API Sleep, чтобы задержать выполнение и избежать обнаружения песочницами. В данном случае вредоносная программа использует API-функцию Beep Windows. Согласно MSDN: "Генерирует простые звуковые сигналы на динамике. Функция является синхронной; она выполняет ожидание с оповещением и не возвращает управление вызывающей стороне до тех пор, пока звук не закончится". Эта функция приостанавливает выполнение вредоносной программы, достигая того же эффекта, что и функция Sleep API.
Инжектор (AphroniaHaimavati.dll) реализует дополнительные менее распространенные техники уклонения:
INT 3 против отладки - инструкция сборки INT 3 представляет собой прерывание, используемое в качестве точки программного останова. Без присутствия отладчика после достижения инструкции INT3 генерируется исключение EXCEPTION_BREAKPOINT (0x80000003) и вызывается обработчик исключений. Если отладчик присутствует, управление wi не передается обработчику исключений.
Антиотладочная INT 2D - аналогична приведенной выше технике INT 3, но в случае INT 2D адрес исключения устанавливается в регистр EIP, а затем значение регистра EIP увеличивается. У некоторых отладчиков могут возникнуть проблемы, поскольку после увеличения значения EIP байт, следующий за инструкцией INT2D, будет пропущен, что потенциально может продолжить выполнение с поврежденной инструкции.
CheckRemoteDebuggerPresent() API против отладки - Определяет, подключен ли отладчик к текущему процессу.
IsDebuggerPresent() API антиотладочный - Определяет, отлаживается ли текущий процесс отладчиком в пользовательском режиме.
ProcessDebugPort антиотладочный - определяет номер порта отладчика для процесса с помощью NtQueryInformationProcess().
VirtualAlloc() / GetWriteWatch() антиотладка - редко используемая техника антиотладки, которая заставляет систему отслеживать страницы, которые записываются в фиксированную область памяти. Этим можно злоупотреблять для обнаружения отладчиков и хуков, которые модифицируют память вне ожидаемого шаблона. Подробнее об этой технике можно прочитать здесь.
OutputDebugString() против отладки - Эта функция используется для обнаружения отладчика. Техника проста: можно вызвать OutputDebugString для передачи строки отладчику. Если отладчик подключен, то при возврате пользовательского кода значение в EAX будет действительным адресом в адресном пространстве процесса.
Indicators of Compromise
IPv4
- 37.1.215.220
SHA256
- 59f42ecde152f78731e54ea27e761bba748c9309a6ad1c2fd17f0e8b90f8aed1
- ab5dc89a301b5296b29da8dc088b68d72d8b414767faf15bc45f4969c6e0874e
Mutex
- \Sessions\2\BaseNamedObjects\{8B30B3CD-2068-4F75-AB1F-FCAE6AF928B6}
- \Sessions\2\BaseNamedObjects\{99C10657-633C-4165-9D0A-082238CB9FE0}