Сегодня мы расскажем вам о новом подходе к рассылке ВПО группировкой Buhtrap.
![](https://habrastorage.org/r/w1560/webt/sn/u8/a1/snu8a1cvx8zvuttb34taqxmyoxi.png)
19 декабря нам стало известно о вредоносной рассылке, содержащей исполняемый файл (md5: faf833a1456e1bb85117d95c23892368). Файл принимал различные названия: «Сверка за декабрь.exe», «Док-ты среда.exe», «Документы 19.12.exe», «Закрывающие документы среда.exe».
Из интересного — файл написан на .Net, что не характерно для этой преступной группировки. Для декомпиляции .Net можно взять любое ПО: Reflector, dotPeek, dnSpy, ILSpy. В статье мы расскажем об особенностях реализации данного файла и о том, как мы его анализировали.
Для анализа мы использовали dnSpy, и все дальнейшие скриншоты будут из него.
По привычке откроем исполняемый файл в IDA Pro и посмотрим на секцию импорта. Примеры:
![](https://habrastorage.org/r/w1560/webt/6n/ks/r-/6nksr-jvgkh8kj5kerx7erkx13w.png)
Наличие некоторых функций подсказывает присутствие запакованной полезной нагрузки (LoadCursorW, LoadIconW — получили объект из ресурсов, VirtualProtect — поменяли атрибуты страницы, затем можно выполнять код) и простенькой антиотладки (IsDebuggerPresent). Но все оказалось даже проще. До IsDebuggerPresent выполнение даже не доходило, а LoadCursorW и LoadIconW бесполезно отрабатывали, потому что пытались обратиться к несуществующим ресурсам (LoadCursorW от «fiza» и LoadIconW от «saxikulatebutohutejijobodugore»):
![](https://habrastorage.org/r/w1560/webt/gp/ye/vf/gpyevft3j2j5-vzaeg87-o9tczw.png)
![](https://habrastorage.org/r/w1560/webt/lo/kq/ic/lokqicp7awjfseefk3gnouqs3p0.png)
Но вернемся к декомпилятору dnSpy. В исполняемом файле видим значительный объем неуправляемого кода:
![](https://habrastorage.org/r/w1560/webt/n1/og/k_/n1ogk_upsf-5baxmk9q04-8tsyw.png)
Чтобы понять, что представляет собой неуправляемый код в исследуемом файле, воспользуемся IDA Pro. Самый простой способ — посмотреть в hex-виде тело неуправляемого кода. Для этого требуется перейти по смещению File Offset. На примере функции _main():
![](https://habrastorage.org/r/w1560/webt/-4/5p/81/-45p816dvsaj7whinkl7ctkaj8u.png)
![](https://habrastorage.org/r/w1560/webt/vr/mf/ua/vrmfua0qkoqgqfcqvwzgj3rl_qc.png)
Далее, в IDA Pro произведем поиск по hex-последовательности:
![](https://habrastorage.org/r/w1560/webt/ro/hh/oy/rohhoylitba4gnuxygzn9bs_pes.png)
На выходе получаем неуправляемую функцию _main(), с которой можно удобно работать с помощью идовского декомпилятора:
![](https://habrastorage.org/r/w1560/webt/zv/gs/pc/zvgspc2az6zmnuymfakhjy8tc0e.png)
![](https://habrastorage.org/r/w1560/webt/ef/ea/sz/efeaszcwmkc-dpzpm_sl-dfjuk0.png)
Вернемся к dnSpy. Внимание привлекает переменная payloadData.
![](https://habrastorage.org/r/w1560/webt/fk/sc/od/fkscodflcwfpqv91v780smb2h4c.png)
![](https://habrastorage.org/r/w1560/webt/rm/xx/xd/rmxxxdvbwil4utycw3fd5romqci.png)
Находим в IDA Pro данную последовательность, получаем ссылки на нее и выявляем, что обращение происходит как раз в функции _main():
![](https://habrastorage.org/r/w1560/webt/lm/2m/i7/lm2mi7e28qgrkqqtwbfenvkppls.png)
Декомпилированный код, использующий данный буфер, выглядит так:
![](https://habrastorage.org/r/w1560/webt/u_/cw/1j/u_cw1jdwih4vxh7xx-2kb09fd5m.png)
За преобразование данного буфера отвечают следующие функции:
![](https://habrastorage.org/r/w1560/webt/oc/tw/a6/octwa6li37592_dxbjjl5iw_vtu.png)
Здесь производится инициализация переменной holdrand значением 0xEA48CB16 и в цикле вызывается функция foo() для каждого байта из payloadData (параметр sbyte c). Надо отметить, что функция t() — из небезопасного кода: если посмотреть ее код, можно убедиться, что она всегда возвращает значение 0x343FD.
Дальше вооружимся IDA Pro и, взглянув на получившийся распакованный буфер, замечаем, что в нем в начале лежит некоторый код:
![](https://habrastorage.org/r/w1560/webt/sf/5r/wu/sf5rwudeoqmxkcs-kcrrk5hskcg.png)
По смещению 0x15A0 от начала буфера находится исполняемый файл:
![](https://habrastorage.org/r/w1560/webt/4y/ul/fa/4yulfappi52yhaucx3iuy2je-tc.png)
Сохраним его для последующего анализа.
Ну а в самом исполняемом коде реализуется довольно тривиальная вещь. Сперва формируется следующая структура (здесь mz_base — адрес смещения в буфере с распакованным PE, а остальные поля — адреса требуемых функций и хэндлы библиотек):
![](https://habrastorage.org/r/w1560/webt/em/tx/2x/emtx2xx3rpongt81rdkgqenspt8.png)
А дальше с помощью полученных функций создается процесс того же самого исполняемого файла (md5: faf833a1456e1bb85117d95c23892368), и по виртуальным адресам нового процесса мапится распакованный исполняемый файл. После изменения адреса исполняемой инструкции (связка GetThreadContext и SetThreadContext) производится старт потока нового процесса, а сам же родительский процесс убивается.
Ну а теперь обратимся к анализу полученного исполняемого файла (полезной нагрузки).
Полезная нагрузка (md5 дампа: d8f40c7060c44fab57df87ab709f058f) также написана на платформе .Net Framework.
Для защиты от статического и динамического анализа разработчики ВПО использовали популярный протектор ConfuserEx последней версии:
![](https://habrastorage.org/r/w1560/webt/75/ui/tb/75uitbdw5gznezlw4flyzx4c6-e.png)
ConfuserEx — хорошо зарекомендовавший себя протектор с открытым исходным кодом.
Точка входа файлов, защищенных данным протектором, выглядит следующим образом:
![](https://habrastorage.org/r/w1560/webt/xc/fk/sr/xcfksree6xb2nl7l3sg-nn1dsqg.png)
После расшифровки массив байт загружается в память в виде модуля под названием koi. Затем определяется и вызывается главный метод данного модуля. На платформе .Net метод или конструктор в модуле можно получить по токену метаданных с помощью вызова функции Module.ResolveMethod(). Для передачи управления полученному методу используется функция MethodBase.Invoke().
![](https://habrastorage.org/r/w1560/webt/-s/1n/xo/-s1nxo2iy6mgehse3asimugo_ra.png)
Исполняемый код в модуле koi выглядит следующим образом:
![](https://habrastorage.org/r/w1560/webt/fp/cj/9v/fpcj9viyn46punvfce7grleeati.png)
Для снятия протектора мы использовали следующие утилиты:
ConfuserEx-Unpacker расшифровал строки и код внутри методов, а de4dot сделал читаемыми названия методов.
В результате получился код, пригодный для статического анализа:
![](https://habrastorage.org/r/w1560/webt/5p/_c/yx/5p_cyxuqhky7vndvuh0htnkkzp4.png)
Нам, конечно, повезло получить читаемый код. Вирусописатели могут модифицировать исходный код протектора ConfuserEx, чтобы еще больше усложнить анализ.
Остались еще две проблемы, которые пришлось решить для комфортного анализа файла.
После снятия протектора декомпилятор не смог разобрать некоторые методы. Например:
![](https://habrastorage.org/r/w1560/webt/uj/xm/h4/ujxmh4ivlwt0fm7w0xzkig5lu_k.png)
Если переключиться на IL-код, можно заметить вызовы по нулевым указателям:
![](https://habrastorage.org/r/w1560/webt/5b/pw/is/5bpwismvu1l9gt6bktnrpvoxlya.png)
Для исправления ошибок декомпиляции заменяем некорректные инструкции на инструкции nop. (Утилита dnSpy позволяет изменять как декомпилированный код, так и IL-код.)
После проделанной замены декомпилированный код выглядит корректно:
![](https://habrastorage.org/r/w1560/webt/gy/zi/8l/gyzi8lglspniec_imqi-uauacz4.png)
Изменив IL-код во всех проблемных методах, мы получили полностью декомпилируемый файл.
Полученный файл вряд ли запустится, а это исключает возможность динамического анализа. Для решения данной проблемы необходимо указать токен входного метода в структуре исполняемого файла.
Найти его можно одним из двух способов:
Module.ResolveMethod() до распаковки файла:
![](https://habrastorage.org/r/w1560/webt/1y/vt/ex/1yvtexa_v0psvugzbzwla1ow4zq.png)
![](https://habrastorage.org/r/w1560/webt/xr/an/wi/xranwidrui8z1gmkbc23c84ibpg.png)
В данном случае токен метаданных для входного метода равен 0x6000106. Изменяем его при помощи утилиты CFF Explorer:
![](https://habrastorage.org/r/w1560/webt/ad/7u/xp/ad7uxpajjbfh1gzvdqgaj8kw3oc.png)
После сохранения изменений распакованный файл корректно запускается и отлаживается.
Сразу после начала работы загрузчик проверяет, запущен ли он в виртуальной среде.
Запуск под VMWare или QEMU определяется поиском подстрок «vmware» и «qemu» в следующем значении реестра:
В случае обнаружения виртуальной машины загрузчик выводит соответствующее оконное сообщение:
![](https://habrastorage.org/r/w1560/webt/wt/pw/lz/wtpwlzmwrcfsghc-bgib6fw0kru.png)
Интересно, что вывод этого сообщения не влияет на работу процесса.
После этого вредоносное ПО пытается загрузить в память библиотеки из следующего списка: SbieDll.dll, dbghelp.dll, api_log.dll, dir_watch.dll, pstorec.dll, vmcheck.dll, wpespy.dll, snxhk.dll, guard32.dll.
Кроме того, с помощью вызовов функций Debugger.IsLogging() и Debugger.get_IsAttached() загрузчик проверяет, запущен ли он под отладчиком.
Если хотя бы одна из библиотек загрузится успешно или загрузчик обнаружит, что запущен под отладчиком, он самоудалится при помощи команды «cmd /C ping 8.8.8.8 -n 1 -w 3000 > Nul & Del». Интересно то, что загрузчик может самоудалиться даже на реальной системе, загрузив библиотеку dbghelp.dll.
Далее ВПО проверяет, запущено ли оно из директории, содержащей подстроку «Mozilla».
![](https://habrastorage.org/r/w780q1/webt/5f/xj/cb/5fxjcbvohua3udy6wiwixj3kwmo.jpeg)
![](https://habrastorage.org/r/w780q1/webt/tc/ra/lh/tcralhf4zikmr0z5egouejvwafw.jpeg)
![](https://habrastorage.org/r/w780q1/webt/g5/5a/4k/g55a4keejjvjzv0jjdto5cs1fgw.jpeg)
IP-адрес сервера в исследуемом образце вредоносного ПО — 213.252.244[.]200. Соединение инициализируется по случайно выбранному порту из списка:
• 8989,
• 5656,
• 2323.
Сразу после инициализации соединения загрузчик отправляет на C&C информацию о зараженной системе:
• идентификатор пользователя,
• имя пользователя,
• версию ОС,
• свою версию (loader v0.2.1),
• списки найденных индикаторов банковских операций на зараженной системе.
Пример строки, отправляемой загрузчиком на управляющий сервер:
Данная строка будет отправлена, если на рабочем столе зараженного пользователя есть папка «1с», а другие индикаторы отсутствуют.
Функция обработки ответа с сервера выглядит следующим образом:
![](https://habrastorage.org/r/w1560/webt/o7/a0/qj/o7a0qjtcivxuursy_coehrz0lds.png)
Расшифрованный ответ с сервера имеет следующий вид:
Как видно из скриншота, COMMAND может принимать одно из следующих значений:
Во время исследования загрузчика нам удалось получить с сервера злоумышленников команду DW. В результате этого в систему установилось ПО Punto Switcher с вредоносной DLL-библиотекой winmm.dll (md5: 9d25553bb09e2785262b2f7ba7923605), которая представляет собой шпионский модуль группировки Buhtrap.
TCP Stream выглядит следующим образом:
![](https://habrastorage.org/r/w1560/webt/3c/su/h_/3csuh_fjfjm6hs4g9tt0ngql5qa.png)
![](https://habrastorage.org/r/w1560/webt/mj/bw/uv/mjbwuvakfsdnak_k8lhfvtsht6o.png)
Для шифрования данных, передаваемых между клиентом и управляющим сервером, используется алгоритм AES-128-ECB. Ключ шифрования инициализируется по захардкоженному паролю.
После расшифровки трафик выглядит следующим образом:
![](https://habrastorage.org/r/w1560/webt/yp/-z/-8/yp-z-8jb5walz17xs-rozjatzjw.png)
![](https://habrastorage.org/r/w1560/webt/lw/kg/ni/lwkgniohrsvqexvxamrwogmcmgy.png)
Из base64 декодируется установщик NSIS со следующим содержимым:
![](https://habrastorage.org/r/w1560/webt/nx/fe/ij/nxfeijizxvvy4agsiobhqeil9tu.png)
Интересно то, что сервер ответил, хотя список индикаторов банковских операций был пустым.
Библиотека winmm.dll исполняется при помощи техники dll hijacking. Вредоносный модуль отправляет на C&C информацию о зараженной системе и список активных считывателей смарт-карт. Кроме того, он имеет компонент кейлогера и способен получать с управляющего сервера другие вредоносные модули, исполнять их с диска или в памяти текущего процесса. C&C-серверы исследуемого образца расположены по следующим адресам:
Процесс заражения можно представить в виде следующей схемы:
![](https://habrastorage.org/r/w1560/webt/r8/ho/0e/r8ho0ecv5utwzrjykx0yg4jrpuk.png)
Несмотря на неплохую защиту от анализа, видно, что в данный момент загрузчик не работает корректно и, скорее всего, находится в процессе разработки:
Напоследок вспомним странное оконное сообщение. Интересно, это недоработка разработчиков — или это сделано специально, чтобы побудить пользователей выйти из виртуальной среды и запуститься на реальной машине? Велком в комментарии.
MD5:
faf833a1456e1bb85117d95c23892368
9d25553bb09e2785262b2f7ba7923605
URLs:
hxxp://my1cprovider[.]xyz:6060/klog[.]php
hxxp://tinderminderorli1999[.]xyz:7764/klog[.]php
IPs:
213.252.244[.]200
![](https://habrastorage.org/webt/sn/u8/a1/snu8a1cvx8zvuttb34taqxmyoxi.png)
Модуль загрузчика
19 декабря нам стало известно о вредоносной рассылке, содержащей исполняемый файл (md5: faf833a1456e1bb85117d95c23892368). Файл принимал различные названия: «Сверка за декабрь.exe», «Док-ты среда.exe», «Документы 19.12.exe», «Закрывающие документы среда.exe».
Из интересного — файл написан на .Net, что не характерно для этой преступной группировки. Для декомпиляции .Net можно взять любое ПО: Reflector, dotPeek, dnSpy, ILSpy. В статье мы расскажем об особенностях реализации данного файла и о том, как мы его анализировали.
Первичный осмотр загрузчика
Для анализа мы использовали dnSpy, и все дальнейшие скриншоты будут из него.
По привычке откроем исполняемый файл в IDA Pro и посмотрим на секцию импорта. Примеры:
![](https://habrastorage.org/webt/6n/ks/r-/6nksr-jvgkh8kj5kerx7erkx13w.png)
Наличие некоторых функций подсказывает присутствие запакованной полезной нагрузки (LoadCursorW, LoadIconW — получили объект из ресурсов, VirtualProtect — поменяли атрибуты страницы, затем можно выполнять код) и простенькой антиотладки (IsDebuggerPresent). Но все оказалось даже проще. До IsDebuggerPresent выполнение даже не доходило, а LoadCursorW и LoadIconW бесполезно отрабатывали, потому что пытались обратиться к несуществующим ресурсам (LoadCursorW от «fiza» и LoadIconW от «saxikulatebutohutejijobodugore»):
![](https://habrastorage.org/webt/gp/ye/vf/gpyevft3j2j5-vzaeg87-o9tczw.png)
![](https://habrastorage.org/webt/lo/kq/ic/lokqicp7awjfseefk3gnouqs3p0.png)
Но вернемся к декомпилятору dnSpy. В исполняемом файле видим значительный объем неуправляемого кода:
![](https://habrastorage.org/webt/n1/og/k_/n1ogk_upsf-5baxmk9q04-8tsyw.png)
Чтобы понять, что представляет собой неуправляемый код в исследуемом файле, воспользуемся IDA Pro. Самый простой способ — посмотреть в hex-виде тело неуправляемого кода. Для этого требуется перейти по смещению File Offset. На примере функции _main():
![](https://habrastorage.org/webt/-4/5p/81/-45p816dvsaj7whinkl7ctkaj8u.png)
![](https://habrastorage.org/webt/vr/mf/ua/vrmfua0qkoqgqfcqvwzgj3rl_qc.png)
Далее, в IDA Pro произведем поиск по hex-последовательности:
![](https://habrastorage.org/webt/ro/hh/oy/rohhoylitba4gnuxygzn9bs_pes.png)
На выходе получаем неуправляемую функцию _main(), с которой можно удобно работать с помощью идовского декомпилятора:
![](https://habrastorage.org/webt/zv/gs/pc/zvgspc2az6zmnuymfakhjy8tc0e.png)
![](https://habrastorage.org/webt/ef/ea/sz/efeaszcwmkc-dpzpm_sl-dfjuk0.png)
Получение полезной нагрузки
Вернемся к dnSpy. Внимание привлекает переменная payloadData.
![](https://habrastorage.org/webt/fk/sc/od/fkscodflcwfpqv91v780smb2h4c.png)
![](https://habrastorage.org/webt/rm/xx/xd/rmxxxdvbwil4utycw3fd5romqci.png)
Находим в IDA Pro данную последовательность, получаем ссылки на нее и выявляем, что обращение происходит как раз в функции _main():
![](https://habrastorage.org/webt/lm/2m/i7/lm2mi7e28qgrkqqtwbfenvkppls.png)
Декомпилированный код, использующий данный буфер, выглядит так:
![](https://habrastorage.org/webt/u_/cw/1j/u_cw1jdwih4vxh7xx-2kb09fd5m.png)
За преобразование данного буфера отвечают следующие функции:
![](https://habrastorage.org/webt/oc/tw/a6/octwa6li37592_dxbjjl5iw_vtu.png)
Здесь производится инициализация переменной holdrand значением 0xEA48CB16 и в цикле вызывается функция foo() для каждого байта из payloadData (параметр sbyte c). Надо отметить, что функция t() — из небезопасного кода: если посмотреть ее код, можно убедиться, что она всегда возвращает значение 0x343FD.
Дальше вооружимся IDA Pro и, взглянув на получившийся распакованный буфер, замечаем, что в нем в начале лежит некоторый код:
![](https://habrastorage.org/webt/sf/5r/wu/sf5rwudeoqmxkcs-kcrrk5hskcg.png)
По смещению 0x15A0 от начала буфера находится исполняемый файл:
![](https://habrastorage.org/webt/4y/ul/fa/4yulfappi52yhaucx3iuy2je-tc.png)
Сохраним его для последующего анализа.
Ну а в самом исполняемом коде реализуется довольно тривиальная вещь. Сперва формируется следующая структура (здесь mz_base — адрес смещения в буфере с распакованным PE, а остальные поля — адреса требуемых функций и хэндлы библиотек):
![](https://habrastorage.org/webt/em/tx/2x/emtx2xx3rpongt81rdkgqenspt8.png)
А дальше с помощью полученных функций создается процесс того же самого исполняемого файла (md5: faf833a1456e1bb85117d95c23892368), и по виртуальным адресам нового процесса мапится распакованный исполняемый файл. После изменения адреса исполняемой инструкции (связка GetThreadContext и SetThreadContext) производится старт потока нового процесса, а сам же родительский процесс убивается.
Ну а теперь обратимся к анализу полученного исполняемого файла (полезной нагрузки).
Распаковка полезной нагрузки
Полезная нагрузка (md5 дампа: d8f40c7060c44fab57df87ab709f058f) также написана на платформе .Net Framework.
Для защиты от статического и динамического анализа разработчики ВПО использовали популярный протектор ConfuserEx последней версии:
![](https://habrastorage.org/webt/75/ui/tb/75uitbdw5gznezlw4flyzx4c6-e.png)
ConfuserEx — хорошо зарекомендовавший себя протектор с открытым исходным кодом.
Первичная распаковка
Точка входа файлов, защищенных данным протектором, выглядит следующим образом:
![](https://habrastorage.org/webt/xc/fk/sr/xcfksree6xb2nl7l3sg-nn1dsqg.png)
После расшифровки массив байт загружается в память в виде модуля под названием koi. Затем определяется и вызывается главный метод данного модуля. На платформе .Net метод или конструктор в модуле можно получить по токену метаданных с помощью вызова функции Module.ResolveMethod(). Для передачи управления полученному методу используется функция MethodBase.Invoke().
![](https://habrastorage.org/webt/-s/1n/xo/-s1nxo2iy6mgehse3asimugo_ra.png)
Исполняемый код в модуле koi выглядит следующим образом:
![](https://habrastorage.org/webt/fp/cj/9v/fpcj9viyn46punvfce7grleeati.png)
Для снятия протектора мы использовали следующие утилиты:
ConfuserEx-Unpacker расшифровал строки и код внутри методов, а de4dot сделал читаемыми названия методов.
В результате получился код, пригодный для статического анализа:
![](https://habrastorage.org/webt/5p/_c/yx/5p_cyxuqhky7vndvuh0htnkkzp4.png)
Нам, конечно, повезло получить читаемый код. Вирусописатели могут модифицировать исходный код протектора ConfuserEx, чтобы еще больше усложнить анализ.
Остались еще две проблемы, которые пришлось решить для комфортного анализа файла.
1-я проблема
После снятия протектора декомпилятор не смог разобрать некоторые методы. Например:
![](https://habrastorage.org/webt/uj/xm/h4/ujxmh4ivlwt0fm7w0xzkig5lu_k.png)
Если переключиться на IL-код, можно заметить вызовы по нулевым указателям:
![](https://habrastorage.org/webt/5b/pw/is/5bpwismvu1l9gt6bktnrpvoxlya.png)
Для исправления ошибок декомпиляции заменяем некорректные инструкции на инструкции nop. (Утилита dnSpy позволяет изменять как декомпилированный код, так и IL-код.)
После проделанной замены декомпилированный код выглядит корректно:
![](https://habrastorage.org/webt/gy/zi/8l/gyzi8lglspniec_imqi-uauacz4.png)
Изменив IL-код во всех проблемных методах, мы получили полностью декомпилируемый файл.
2-я проблема
Полученный файл вряд ли запустится, а это исключает возможность динамического анализа. Для решения данной проблемы необходимо указать токен входного метода в структуре исполняемого файла.
Найти его можно одним из двух способов:
- посмотреть под отладкой, с каким параметром была вызвана функция
Module.ResolveMethod() до распаковки файла:
![](https://habrastorage.org/webt/1y/vt/ex/1yvtexa_v0psvugzbzwla1ow4zq.png)
- в распакованном файле найти метод с меткой [STAThread]:
![](https://habrastorage.org/webt/xr/an/wi/xranwidrui8z1gmkbc23c84ibpg.png)
В данном случае токен метаданных для входного метода равен 0x6000106. Изменяем его при помощи утилиты CFF Explorer:
![](https://habrastorage.org/webt/ad/7u/xp/ad7uxpajjbfh1gzvdqgaj8kw3oc.png)
После сохранения изменений распакованный файл корректно запускается и отлаживается.
Анализ загрузчика
Сразу после начала работы загрузчик проверяет, запущен ли он в виртуальной среде.
Запуск под VMWare или QEMU определяется поиском подстрок «vmware» и «qemu» в следующем значении реестра:
- [HKLM\System\CurrentControlSet\Services\Disk\Enum\0].
В случае обнаружения виртуальной машины загрузчик выводит соответствующее оконное сообщение:
![](https://habrastorage.org/webt/wt/pw/lz/wtpwlzmwrcfsghc-bgib6fw0kru.png)
Интересно, что вывод этого сообщения не влияет на работу процесса.
После этого вредоносное ПО пытается загрузить в память библиотеки из следующего списка: SbieDll.dll, dbghelp.dll, api_log.dll, dir_watch.dll, pstorec.dll, vmcheck.dll, wpespy.dll, snxhk.dll, guard32.dll.
Кроме того, с помощью вызовов функций Debugger.IsLogging() и Debugger.get_IsAttached() загрузчик проверяет, запущен ли он под отладчиком.
Если хотя бы одна из библиотек загрузится успешно или загрузчик обнаружит, что запущен под отладчиком, он самоудалится при помощи команды «cmd /C ping 8.8.8.8 -n 1 -w 3000 > Nul & Del». Интересно то, что загрузчик может самоудалиться даже на реальной системе, загрузив библиотеку dbghelp.dll.
Далее ВПО проверяет, запущено ли оно из директории, содержащей подстроку «Mozilla».
Если процесс не запущен из директории, содержащей подстроку «Mozilla»
- ВПО формирует список директорий, которые расположены на рабочем столе и содержат следующие подстроки (все строки внутри загрузчика зашифрованы при помощи алгоритма AES-256-ECB, ключи шифрования генерируются по захардкоженным паролям):
![](https://habrastorage.org/webt/5f/xj/cb/5fxjcbvohua3udy6wiwixj3kwmo.jpeg)
- Формирует список URL из истории браузера, которые содержат следующие подстроки:
![](https://habrastorage.org/webt/tc/ra/lh/tcralhf4zikmr0z5egouejvwafw.jpeg)
- Формирует список файлов, которые находятся в директориях «%UserProfile%\\Desktop», «%AppData%», «C:\\Program Files (x86)», «C:\\Program Files (x86) (x86)» и имеют следующие названия:
![](https://habrastorage.org/webt/g5/5a/4k/g55a4keejjvjzv0jjdto5cs1fgw.jpeg)
- Считает количество непустых списков из индикаторов, связанных с банковскими операциями (в текущей версии загрузчика данная функциональность ни на что не влияет).
- Создает задачу на запуск данного файла при каждом входе пользователя в систему при помощи команды «schtasks /create /f /sc ONLOGON /RL HIGHEST /tn LimeRAT-Admin /tr».
- Если не удалось создать задачу, создает ярлык «%AppData%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\MozillaUpdate.lnk», указывающий на «%Appdata%\\Mozilla\\xaudiodg.exe», что обеспечивает запуск файла xaudiodg.exe при каждом перезапуске системы.
- Копирует себя по пути «%AppData%\\Mozilla\\xaudiodg.exe».
- Удаляет файл <self_path>:Zone.Identifier, запускает xaudiodg.exe и самоудаляется.
Если процесс запущен из директории, содержащей подстроку «Mozilla»
- ВПО аналогичным образом ищет вышеперечисленные индикаторы банковских операций внутри зараженной системы.
- Собирает другую информацию о системе для отправки на управляющий сервер.
- В отдельном потоке отправляет информацию на C&C и ожидает ответа с сервера.
- В другом потоке в бесконечном цикле отправляет на сервер зашифрованную строку «PING?».
Взаимодействие с управляющим сервером
IP-адрес сервера в исследуемом образце вредоносного ПО — 213.252.244[.]200. Соединение инициализируется по случайно выбранному порту из списка:
• 8989,
• 5656,
• 2323.
Сразу после инициализации соединения загрузчик отправляет на C&C информацию о зараженной системе:
• идентификатор пользователя,
• имя пользователя,
• версию ОС,
• свою версию (loader v0.2.1),
• списки найденных индикаторов банковских операций на зараженной системе.
Пример строки, отправляемой загрузчиком на управляющий сервер:
«INFO<NYANxCAT>9D3A4B22D21C<NYANxCAT>IEUser<NYANxCAT> Windows 7 Enterprise SP 1
<NYANxCAT>loader v0.2.1<NYANxCAT><NYANxCAT><NYANxCAT>1c, »
Данная строка будет отправлена, если на рабочем столе зараженного пользователя есть папка «1с», а другие индикаторы отсутствуют.
Функция обработки ответа с сервера выглядит следующим образом:
![](https://habrastorage.org/webt/o7/a0/qj/o7a0qjtcivxuursy_coehrz0lds.png)
Расшифрованный ответ с сервера имеет следующий вид:
COMMAND<NYANxCAT>DATA1<NYANxCAT>DATA2<NYANxCAT>…
Как видно из скриншота, COMMAND может принимать одно из следующих значений:
- CLOSE — завершает соединение и закрывает текущий процесс;
- DW — декодирует из base64 содержимое из DATA2, записывает его в файл <temp_file_name> c расширением из DATA1 и запускает файл на исполнение;
- UPDATE — декодирует из base64 содержимое из DATA1, записывает его в файл с названием <temp_file_name> и расширением .exe, запускает новый исполняемый файл и самоудаляется;
- RD- — отправляет строку «RD-» в ответ;
- RD+ — отправляет снимок экрана на управляющий сервер;
- DEL — самоудаляется.
Во время исследования загрузчика нам удалось получить с сервера злоумышленников команду DW. В результате этого в систему установилось ПО Punto Switcher с вредоносной DLL-библиотекой winmm.dll (md5: 9d25553bb09e2785262b2f7ba7923605), которая представляет собой шпионский модуль группировки Buhtrap.
TCP Stream выглядит следующим образом:
![](https://habrastorage.org/webt/3c/su/h_/3csuh_fjfjm6hs4g9tt0ngql5qa.png)
![](https://habrastorage.org/webt/mj/bw/uv/mjbwuvakfsdnak_k8lhfvtsht6o.png)
Для шифрования данных, передаваемых между клиентом и управляющим сервером, используется алгоритм AES-128-ECB. Ключ шифрования инициализируется по захардкоженному паролю.
После расшифровки трафик выглядит следующим образом:
![](https://habrastorage.org/webt/yp/-z/-8/yp-z-8jb5walz17xs-rozjatzjw.png)
![](https://habrastorage.org/webt/lw/kg/ni/lwkgniohrsvqexvxamrwogmcmgy.png)
Из base64 декодируется установщик NSIS со следующим содержимым:
![](https://habrastorage.org/webt/nx/fe/ij/nxfeijizxvvy4agsiobhqeil9tu.png)
Интересно то, что сервер ответил, хотя список индикаторов банковских операций был пустым.
Вредоносная DLL-библиотека
Библиотека winmm.dll исполняется при помощи техники dll hijacking. Вредоносный модуль отправляет на C&C информацию о зараженной системе и список активных считывателей смарт-карт. Кроме того, он имеет компонент кейлогера и способен получать с управляющего сервера другие вредоносные модули, исполнять их с диска или в памяти текущего процесса. C&C-серверы исследуемого образца расположены по следующим адресам:
- hxxp://my1cprovider[.]xyz:6060/klog[.]php
- hxxp://tinderminderorli1999[.]xyz:7764/klog[.]php
Заключение
Процесс заражения можно представить в виде следующей схемы:
![](https://habrastorage.org/webt/r8/ho/0e/r8ho0ecv5utwzrjykx0yg4jrpuk.png)
Несмотря на неплохую защиту от анализа, видно, что в данный момент загрузчик не работает корректно и, скорее всего, находится в процессе разработки:
- может самоудалиться даже на реальной системе;
- проверяет связь зараженной системы с банковскими операциями перед копированием себя в «%AppData%\\Mozilla\\xaudiodg.exe» и перед взаимодействием с C&C, но никак не использует эту информацию.
Напоследок вспомним странное оконное сообщение. Интересно, это недоработка разработчиков — или это сделано специально, чтобы побудить пользователей выйти из виртуальной среды и запуститься на реальной машине? Велком в комментарии.
IOCs
MD5:
faf833a1456e1bb85117d95c23892368
9d25553bb09e2785262b2f7ba7923605
URLs:
hxxp://my1cprovider[.]xyz:6060/klog[.]php
hxxp://tinderminderorli1999[.]xyz:7764/klog[.]php
IPs:
213.252.244[.]200