Роман Резвухин
Заместитель руководителя Лаборатории цифровой криминалистики Group-IB
Семён Рогачёв
Ведущий специалист Лаборатории цифровой криминалистики Group-IB
Кирилл Полищук
Младший специалист Лаборатории цифровой криминалистики Group-IB
В начале этого года неспешное субботнее утро специалиста Group-IB — с семейным завтраком, тренировкой по теннису и поездкой к родителям — полетело в тартарары после звонка безопасника одной российской компании. У предприятия украли пару десятков миллионов рублей: деньги увели со счета несколькими траншами, причем все платежные переводы, как и положено, были подписаны цифровой подписью — токеном главбуха. Безопасник хотел разобраться, как это произошло.
На первый взгляд все переводы казались легальной операцией. Однако некоторая странность в них все-таки была: пароль для входа в систему клиент-банк был не напечатан на клавиатуре, а скопирован из буфера. Записи видеокамер показали, что в этот момент за компьютером никого не было — бухгалтер уходил на обед. Выходит, к ПК кто-то подключился удаленно? Ответ на вопрос, как это произошло, дали специалисты Лаборатории цифровой криминалистики Group-IB: компьютер главбуха был заражен вредоносной программой. И это оказался... наш старый знакомый — троян-долгожитель Buhtrap.
Шесть лет назад Group-IB первой из вендоров выпустила отчет о деятельности преступной группы Buhtrap, которая атаковала банки и компании, заражая пользователей — преимущественно бухгалтеров, юристов и директоров — одноименным банковским трояном. За активностью этого вредоносного ПО эксперты Group-IB наблюдают примерно с 2014 года: тогда исходные коды Buhtrap были опубликованы в открытом доступе и начался вал атак через систему клиент-банк.
Прошло 8 лет, а киберпреступники продолжают использовать этот “троян-долгожитель”. На хакерских форумах до сих пор можно встретить объявления: “Ищу вот эти штуки Buhtrap и RTM куплю только с инструкцией а лучше всего с настройкой и установкой” или “Я ищу это Buhtrap и RTM и того кто разбирается в настройках” (орфография и пунктуация сохранены). Как работает Buhtrap, как он эволюционировал за эти годы и как теперь пользователям и бизнесу защитить свои деньги — разбираемся в этом блоге.
Волны гасят Buhtrap
Эксперты Group-IB давно обратили внимание на любопытную деталь: для Buhtrap характерны «волны активности». Количество успешных хищений с использованием этого ВПО то возрастает, то падает. Интересно, что при этом меняются и техники атакующих. Например, в 2018 году использовался автозалив — автоматическая подмена информации в платежных поручениях “на лету”, что позволяло успешно проводить несанкционированные платежные операции уже через несколько часов после проникновения на компьютер жертвы. В 2020 году злоумышленники вернулись к истокам и проводили хищения вручную.
Волнообразная активность Buhtrap легко прослеживается, если построить график, отражающий динамику среднего размера хищения в зависимости от времени. Собрав данные об успешных (и не очень) атаках, мы построили график, позволяющий выделить три основных периода активности за последние несколько лет:
Годы | Название периода | Описание |
2014−2016 | Период LiteManager | Назван в честь одноименного ПО для удаленного доступа, которое операторы Buhtrap использовали для хищений "вручную". |
2018 | Период автозалива | |
2020−2021 | Период VNC | Buhtrap вновь стали использовать для хищений инструмент удаленного управления, но в этот раз сами его разработали. |
Ущерб от атак группы Buhtrap, который зафиксировали эксперты Group-IB в 2020−2022 годах, оценивается как минимум в 2 млрд рублей. Глобальный ущерб от Buhtrap за все годы его активности может достигать 6−7 млрд рублей.
Обратим внимание на следующие интересные моменты:
При использовании автозалива средний размер хищения невелик (по сравнению с хищениями вручную): при таком методе злоумышленнику весьма трудно определить, сколько у атакованной организации доступно денег для совершения платежа — из-за этого злоумышленники придерживались тактики множественных небольших переводов. При этом частота хищений (а также неудачных попыток) гораздо выше из-за использования практически автоматического инструмента.
При хищениях вручную разброс среднего размера хищения гораздо выше, чем при автозаливе, а в отдельных случаях украденная сумма достигала 90 млн рублей. При таком методе злоумышленник легко определяет количество средств на балансе организации и может совершить перевод в соответствующем размере.
Отдельное внимание стоит обратить на провал в активности Buhtrap в феврале 2021 года — в этот момент была приостановлена Drive-by-раздача Buhtrap. Примерно месяц спустя злоумышленники вернулись к хищениям, но при этом целями все чаще становились бухгалтеры, чьи компьютеры были заражены сравнительно давно (в некоторых случаях от заражения до хищения проходило почти 6 месяцев). Это позволило нам предположить, что Buhtrap действительно больше не могли заражать новых жертв (по крайней мере в рамках текущего периода активности).
Характерной чертой Buhtrap является постоянство техник первоначального доступа и обеспечения персистентности в системе. Далее мы расскажем, чем отличился Buhtrap в 2020−2021 годах и почему он остался все той же «ловушкой для бухгалтера».
Первоначальный доступ и установка в системе
Как и в прошлых волнах активности, Buhtrap попадал на компьютеры своих жертв через использование Drive-by compromise (T1189) при посещении взломанного интернет-ресурса, интересующего «целевую аудиторию». В 2020−2021 годах это был специализированный ресурс, содержащий информацию и новости из бухгалтерского мира. Чаще всего жертвы попадали на страницы сайта через поисковую выдачу в любом поисковом движке. В коде загружаемой страницы содержался следующий JavaScript-код:
Встроенный код обфусцирован, и его единственная задача — загрузить с URL wss://houzz.rest/webchat через интерфейс WebSocket данные, декодировать их, расшифровать и исполнить как JavaScript-код. Нетрудно догадаться, что этот код должен приводить к эксплуатации уязвимости: в наблюдаемых нами случаях заражения это была CVE-2018-8174 (которая, кстати, уже использовалась для распространения Buhtrap). Полученный через WebSocket код на языке JavaScript с самого начала выглядит весьма многообещающе:
Назначение этого скрипта тоже весьма простое — запустить код эксплойта при выполнении определенного условия. В данном случае пользователь должен сначала совершить несколько активных действий на странице (двигать курсор, кликать и скроллить мышью):
Исполняемый VBScript содержит в себе код для эксплуатации уже упомянутой CVE-2018-8174 (тоже не претерпевший особых изменений по сравнению с прошлым периодом активности Buhtrap в 2018 году, когда хищения осуществлялись с помощью автозалива), а также код, непосредственно выполняющий полезную нагрузку:
Полезная нагрузка будет запущена, если при исполнении сценария не будут обнаружены процессы различных защитных решений с именами из списка:
В результате исполнения сценария на компьютер жертвы будет сохранена библиотека DLL, которая является дроппером Buhtrap. В последней обнаруженной нами версии VBScript-кода от февраля 2021 года дроппер сохраняется в %AppData%\LocalLow\7zOrand_int\Windows Mail\oeimport.dll (предыдущая версия, до февраля 2021-го, осуществляла сохранение в %AppData%\LocalLow\Windows Mail\msoe.dll), после чего производится обращение к объекту с CLSID {A1006DE3-2173-11d2-9A7C-00C04FA309D4} (T1559.001), соответствующему оригинальной oeimport.dll клиента Windows Mail (предыдущая версия, вероятно, использовала CLSID {101A8FB9-F1B9-11d1-9A56-00C04FA309D4} — соответствует оригинальной msoe.dll для клиента Windows Mail):
При этом в качестве директорий ProgramFiles и ProgramFiles(x86) для текущего процесса указывается директория %AppData%\LocalLow\7zOrand_int, что позволяет использовать нечто похожее на dll-hijacking для исполнения сохраненной DLL в контексте браузера жертвы:
Таким образом DLL дроппера будет запущена в контексте процесса браузера, соответствующего вкладке, на которой был исполнен код эксплойта. Дерево процессов после успешного запуска дроппера последней обнаруженной версии Buhtrap выглядит следующим образом:
Видно, что процесс браузера также порождает rundll32 с аргументом в виде того самого CLSID, соответствующего библиотеке oeimport.dll. Теперь разберемся, каким образом он был запущен и откуда взялся второй экземпляр rundll32, а также что за CLSID указан в его командной строке.
Расшифрование полезной нагрузки и передача ей управления
Перед описанием функциональных возможностей дроппера и самого пейлоада Buhtrap хотелось бы обратить внимание на то, каким образом была упакована каждая из стадий. В версии, использовавшейся до февраля 2021 года, дроппер хранит в себе полезную нагрузку в зашифрованном виде, однако сам алгоритм шифрования вряд ли можно назвать выдающимся — это простая комбинация XOR и вычитания из каждого байта:
Тем не менее этого вполне достаточно, чтобы дроппер не детектировался большинством антивирусов (нам известно, что данный дроппер использовался in-the-wild как минимум с октября 2020 года):
В версии дроппера, распространявшейся в феврале 2021 года, такое шифрование было заменено на простую перестановку байтов, в результате чего в преобразованной полезной нагрузке стал еще больше угадываться характерный «силуэт» PE-заголовка:
Однако перед расшифрованием нагрузки некоторые версии дроппера осуществляли проверку зараженного компьютера, чтобы выяснить, насколько он потенциально интересен атакующим. В версиях дроппера, распространявшихся в 2020 году, осуществлялась проверка кеша WinInet и списка имен текущих процессов на наличие в них подстрок из списка (в приложении). В глаза бросается то, что помимо взаимодействия с клиент-банковскими приложениями злоумышленников могут интересовать операции с криптовалютами (смотрим на строки btc, bitcoin, electrum, wallet). В новых версиях дроппера эту проверку убрали — вместо неё проверялось лишь, что DLL дроппера запущена в контексте браузера жертвы, после чего DLL перезапускалась путем исполнения команды rundll32.exe /sta {A1006DE3-2173-11d2-9A7C-00C04FA309D4}.
Если зараженный компьютер потенциально интересен — следующая стадия расшифровывается/декодируется и сохраняется в %AppData%\Roaming{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}.dat (имя в формате GUID).
Запуск .dat-файла осуществляется в несколько этапов:
В ключ реестра HKCR\SOFTWARE\Classes\Wow6432Node\CLSID*RANDOM_GUID*\InProcServer32 в значении по умолчанию сохраняется путь до дропнутого DLL-файла (.dat-файла)
DLL-файл (.dat-файл) запускается путём выполнения команды rundll32 /sta *RANDOM_GUID*
Для закрепления и обеспечения работы при перезапуске компьютера та же команда прописывается в ключе реестра HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run (T1547.001)
Этими действиями и объясняется наличие цепочки запусков rundll32, порожденной процессом уязвимого браузера.
Полезная нагрузка
Часть кода запускаемой полезной нагрузки была зашифрована с использованием комбинации побайтового XOR и вычитания либо закодирована с использованием перестановки байтов. Расшифрование происходило, если среди локалей на компьютере присутствует русская:
При успешном прохождении языковой проверки управление передавалось непосредственно коду полезной нагрузки, который почти не претерпел изменений по сравнению с Buhtrap, использовавшимся в прошлых волнах активности этого трояна:
Основные техники, реализуемые Buhtrap, — создание журнала нажатых клавиш (T1056.001), сохраняющегося в %AppData%\Roaming\adobe\system.log, создание снимков экрана жертвы (T1113) и сбор информации о подключенных смарткартах (T1120), которая сохраняется в файле %AppData%\Roaming\ntuser.dat. Собранная информация периодически отправляется на управляющий сервер https://www[.]kogama.rest/images/logo.png. Интересно, что в более ранних версиях Buhtrap, проанализированных нами, в качестве управляющего сервера использовался домен houzz.rest — тот, который в последних атаках применялся для доставки кода эксплойта в браузер жертвы через интерфейс WebSocket.
При прямом обращении к адресу управляющего сервера через браузер можно было обнаружить, что в качестве ответа отдается фрагмент PNG-изображения. Один из замеченных нами фрагментов выглядел следующим образом:
Если обращение происходит от известного зараженного хоста (идентификатор бота передается при первом подключении к управляющему серверу), то в конец PNG-фрагмента добавляются зашифрованные данные, которые могут содержать исполняемые модули. Если расшифрованные данные начинаются с «MZ», то полученный таким образом модуль будет сохранен в директории %Temp% под случайным именем и запущен на исполнение. Если данные начинаются с «LD», то такой модуль будет исполнен непосредственно в памяти процесса Buhtrap.
А что насчет загружаемых модулей?
В инцидентах 2020−2021 годов, к которым причастен Buhtrap, мы обнаружили следующие модули:
VNC
Основной модуль, через который осуществлялось слежение за действиями пользователя и хищение (именно этот модуль исполнялся в памяти без сохранения на диск). Ранее для хищений использовался модуль автозалива, который позволял успешно похитить средства уже через несколько часов после изначального заражения, однако данный способ мог относительно легко обнаруживаться антифрод-решениями. При использовании же VNC между проникновением на потенциально интересный хост и выводом средств могло пройти около недели, однако так действия злоумышленника гораздо сложнее отличить от действий легального пользователя системы клиент-банка. Используемый экземпляр VNC осуществляет бэкконект к прокси-серверу, который расшифровывает трафик и перенаправляет его на VNC-сервер злоумышленника.
Fake Windows Update
Этот модуль загружался на зараженный хост непосредственно перед хищением денежных средств. Назначение этого модуля весьма простое — скрывать пользовательский интерфейс и демонстрировать ложное сообщение об обновлении операционной системы:
Reboot/Killdisk
Этот модуль загружался после хищения, его основное назначение — приводить зараженный хост в состояние циклической перезагрузки путем записи в значение реестра HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell следующей команды: shutdown -s -f -t 0 (при достаточных правах будет использоваться куст реестра HKLM). Также при достаточных привилегиях будет предпринята попытка перезаписи нулями первых 512 байтов для первых 10 физических дисков.
Screenshotter
Модуль, появившийся после прекращения распространения Buhtrap с использованием Drive-By Download. Предположительно, использовался вместо модуля VNC для изначальной разведки. Обладает предельно простым функционалом: периодически создает снимки экрана и отсылает их на управляющий сервер с использованием URL https://www[.]kogama.rest/export.
Хронология атаки
Теперь, обладая информацией о модулях, используемых Buhtrap, можно рассмотреть таймлайны атак и увидеть, сколько времени проходило от успешного “пробива” жертвы до хищения:
Обычно между заражением и хищением проходит 4−7 дней (в зависимости от того, попадает ли активность зараженного пользователя на выходные). Однако после остановки распространения Buhtrap с новостного ресурса для бухгалтеров в феврале 2021 года таймлайн атаки претерпел изменения:
Видно, что к активным действиям злоумышленники перешли спустя более 100 дней после заражения (а сам пользователь за это время заразился Buhtrap еще 4 раза). Также стоит отметить, что в хищениях, выполняемых после февраля 2021 года, атакующие словно действовали более небрежно: в приведенном примере не загружался модуль с фейковым окном обновления или модуль Killdisk.
Выводы
Из проведенного анализа деятельности Buhtrap за 2020−2021 годы можно сделать главный вывод: злоумышленники, стоящие за этим трояном, не идут по пути использования сложных техник — наоборот, они предпочитают использовать как можно более простые методы: XOR-шифрование полезной нагрузки, эксплойт под старую CVE, «ручное» хищение денежных средств и т.д. Тем не менее они приносят свои плоды и позволяют успешно атаковать различные организации.
Хоть распространение Buhtrap через специализированный ресурс и было остановлено в феврале 2021 года, это не помешало злоумышленникам атаковать пользователей, которые были скомпрометированы ранее. По данным Group-IB, Buhtrap проявлял свою активность в середине первого квартала 2022 года, а URL, использующийся для передачи данных зараженных клиентов, доступен и сейчас. Учитывая, что злоумышленники адаптируют свой арсенал (пусть довольно топорными, но работающими способами), нам остается ждать, как преобразуется Buhtrap в текущей или следующей волне активности.
Приложение 1. Список подстрок, поиск которых осуществляется дроппером Buhtrap в кеше WinInet и среди имен процессов:
priovtb, ISAPIgate, bsi, PortalSSL, IIS-Gate, mcb.ru, ibank, ibrs, iclient, mdmbank, zubsb, ibc, elbrus, elba, minbank, clbank, chelindbank, uwagb, wwwbank, dbo, ib., ip-client, rclient, saclient, CLBClient, twawebclient, vegaClient, dsstart, dtpaydesk, eelclnt, elbank, props, eTSrv, ibconsole, kb_cli, KLBS, KlientBnk, lfcpaymentais, loadmain, lpbos, mebiusbankxp, mmbank, pkimonitor, alfa, bank, bss, -client, cbmain, wallet, electrum, javaw, kb_cli, jp2launcher, ent, bank.ru, corp., faktura, online., dboul., cb., dbs., falcon., e-plat, ic., bspb, ib., ibrs., kubankredit, vbo., clbank., bss., btc, bitcoin, jp2launcher, ftcgpk, wallet, cbsmain, javaw, cbmain, cbank, saplogon, sgbclient, klientbnk, scardsvr, fcclient, cbsmain, CLMAIN, 1cv7, 1cv8, ADirect, wfica32, sgbclient, javaw, kb_cli, incontroller, modulbank, main.zul, bk., raiffeisen, rshb, bsi.dll, solutbank, tinkoff, vpnkeylocal, pkimonitor, prclient, rtcert, rclient, al.exe, mstsc.exe
Приложение 2. Список индикаторов компрометации:
Дроппер Buhtrap
04B7D68E2847C954CA5294A91BDCB5096DE64829C3C550D9FCD772E76AE62E34
265CB4C78D086B8B49D201BE4DA721942ABA35D8E3B2CDA965090FAEA3BEBC05
A5D759E62019B8403115191CB4CDD2F1F734AAD3AAF45852BEAE0AA82F990DB0VNC
2A260C0509446D59C7A5E79160C9D051A247F12F5AFCA85F9DE3BC86DF9CAD85Fake Windows Update
2E153CE31BAADBF8263DADD4F02628E3758176CCF95D58A3D3433EC0528DE568Reboot/Killdisk
D7CEF0616A04CAEBB1844080C54184D445DC603CDB56F6E85E341D2CD1268DF1C2 URL
https://www.kogama.rest/images/logo.png
http://houzz.rest/images/7080.pngExploit URL
wss://houzz.rest/webchat