Приветствую, читатели. Думаю, что для каждого, кто хоть раз в жизни интересовался темой программирования, знаком такой язык, как Python. Все-таки он самый популярный в мире на данный момент.

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

Также будет правильно подметить, что использование именно этого языка достаточно популярно в кругах злоумышленников и львиная доля вредоносных программ написаны именно на Python. 

Но на этот раз злодеи зашли куда дальше, нацелившись на самих Python разработчиков. Ещё в ноябре 2022 года многие исследователи обнаружили более 400 вредоносных пакетов, загруженных в официальный репозиторий Python Package Index (PyPI). 

PyPI — каталог программного обеспечения, написанного на языке программирования Python. В сочетании с системами управления библиотечными пакетами аналогичен PEAR для PHP и CPAN для Perl.

Казалось бы, куда хуже, огромный объем вредоносов находится в официальном ресурсе и количество скачиваний некоторых перевалило за несколько сотен тысяч. Но и это дно было пробито, ведь некоторые пакеты были выгружены ещё в далеком марте 2022 года. А это значит, что потенциально опасное ПО оставалось в тени достаточно долго.

Как же так вышло и почему никто ничего не заметил ранее?

Злоумышленник использовал тайпсквоттинг для маскировки, а сами вредоносы отсутствовали в антивирусных базах. 

Тайпсквоттинг — вид атак социальной инженерии, нацеленный на пользователей интернета, которые допустили опечатку при вводе веб-адреса в браузере и не использовали поисковую систему.

Представьте, что существует некоторый пакет под названием “bitcoinlib”, который пользуется популярностью, зная это, злодей создаст вредоносный пакет, где заменит лишь один символ. Чаще всего фальсифицируют большую букву “i” и маленькую “L”. Не верите? Попытайтесь отличить их: “l”, “I”. Где какая? 

Так называемые злые двойники были созданы для следующих популярных пакетов: 

beautifulsoup, bitcoinlib, cryptofeed, matplotlib, pandas, pytorch, scikit-learn, scrapy, selenium, solana и tensorflow.

Изначально механизм действия был нацелен на криптодержателей и выполнялся очень просто. После установки вредоносного пакета на устройство жертвы стартовала загрузка вирусного файла JavaScript, который активируется при использовании таких популярных браузеров, как Google Chrome, Microsoft Edge, Brave и Opera.

А когда жертва копировала адрес электронного кошелька для перевода криптовалюты, JavaScript заменял его в буфере обмена Windows на адрес кошелька злоумышленника. 

Но в марте 2023 года все изменилось. И многие исследователи начали замечать различные более опасные вредоносы в репозитории PyPi и об одном из таких мы сегодня с вами поговорим более детально. Интересен он тем, что практически полностью реализован на Python, тогда как другие всегда использовали этот язык лишь на стартовой ступени, и имеет огромный арсенал.

Мультифункциональный троян «Colour-Blind»

1 марта 2023 года специалисты по кибербезопасности из группы Kroll Cyber ​​Threat Intelligence, в рамках своей компании по мониторингу вредоносных PyPi пакетов, обнаружили несколько подозрительных файлов.

Одним из самых интересных являлся пакет “ColourFool 0.1.5.py”, который загружал на устройство жертвы новый, ранее нигде не замеченный, троян Colour-Blind. 

В Kroll сделали выводы, что Colour-Blind — это полнофункциональный инструмент для кражи информации и удаленного доступа к устройствам жертвы (так называемый RAT), полностью написанный на Python. 

Количество пострадавших пока что неизвестно, но вредонос действует с середины февраля 2023 года, а количество скачиваний пакета, содержащего вредонос, равно нескольким тысячам.

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

Так как Colour-Blind написан на Python он является кроссплатформенным, то есть он может работать на любой системе, где установлена соответствующая версия Python. 

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

           Количество загруженных вирусных пакетов в месяц
           Количество загруженных вирусных пакетов в месяц

Краткий статистический анализ Colour-Blind

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

Сетап утилит для анализа заметно сократился в сравнении с прошлыми статьями, так как Python особо и не нуждается в дизассемблере и прочей сложной штуковине:

  1. Notepad++ простой редактор кода и других файлов. Бесплатный и отлично подходит для просмотра некомпилированных образцов.

  2. Различные консольные инструменты Linux для сбора и просмотра метаданных . 

Сразу отмечу, что зловред выполняется ступенчато, четко выделить можно следующие три шага: 

  1. Установка необходимых библиотек и запуск вторичного скрипта.

  2. Определение рабочей папки и загрузка следующего этапа.

  3. Развертывание Colour-Blind. 

1. Установка необходимых библиотек и запуск вторичного скрипта

Итак, перед нашими глазами следующая картина:

И на первый взгляд может показаться, что все окей и это у исследователей и автора какая-то паранойя, но нет. Давайте откроем файл setup.py и вы сами убедитесь, что что-то здесь не так. 

Вопрос возникает сразу же после просмотра графы “install_requires”, которая отвечает за установку зависимых библиотек. Теперь задумайтесь, если этот пакет должен просто изменять цветовое оформление консоли, то зачем ему все это?

Screeninfo —  по названию примерно понятно, что эта библиотека отвечает или за получение информации об активных окнах, или за создание снимка рабочего стола. 

Pynput — библиотека, которая используется для захвата ввода с клавиатуры. 

Pyaudio —  а эта библиотека может использоваться для записи аудио с микрофона устройства жертвы. 

Browser_cookie3 —  используется для кражи «печенек» с браузеров. 

Но кроме установки этих зависимостей и запуска следующей ступени, первичный скрипт не делает ничего более. 

Также мы можем узнать примерную дату создания, посмотрев в свойства, я сомневаюсь, что злоумышленник её подделал, так как в день внесения последнего изменения в код вредоноса, этот пакет и появился на PyPi.

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

2. Определение рабочей папки и загрузка следующего этапа

А теперь перейдем во вторую папку ColourFool, где находится скрипт с аналогичным названием, но уже весом в 3 КБ. Создан он в тот же день, что и первый. Вирустотал не показал обнаружений, хотя здесь уже очевидно, что это дроппер. 

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

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

Затем вредонос попытается получить URL-адрес для загрузки следующей ступени Блинда, но в итоге возвращается к тому, который задан в коде. Ошибка или это сделано специально, понять не могу:

Парадокс то в том, что они одинаковы. Исследователи отмечают, что использование жестко заданных URL-адресов в коде легальных библиотек встречается крайне редко и подобное грубое исполнение свойственно исключительно неопытным злоумышленникам.  

Также подозрительным является, что вирус сперва копирует загруженный файл в дефолтную директорию Python, прежде осуществив проверку наличия файла с таким названием. 

Если такой файл уже существует, выполнение этого процесса прерывается, чтобы избежать повторного заражения одного устройства. Своеобразный мьютекс, хотя работает намного хуже, ведь осталось только создать пустой файл code.py —  вы защищены. Если проверка пройдена успешно, происходит запуск загруженного файла.

3. Развертывание Colour-Blind

Итак, загруженный файл заметно больше двух предыдущих, и теперь он весит 314 КБ, состоит из 2039 строчек кода, что достаточно много по сравнению с двумя предыдущими. 

Антивирусы снова удивили, в этом файле уже имеются очевидно вредоносные функции, но процент определения составляет… Правильно, ноль: 

Переходим к вскрытию нашего испытуемого, весь код как на ладони. Стоит отметить огромную таблицу импорта:

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

Примечательно, что сразу после импорта троян попытается добавить себя в исключения антивируса Windows и Microsoft Defender:

Если обобщить, то Блинд действует по следующему алгоритму: 

  1. Импорт и добавление себя в исключения антивируса.

  2. Сбор информации об устройстве жертвы, отключение диспетчера задач и определение среды (виртуальная машина или нет).

  3. Добавление в автозагрузку и связь с командным сервером. 

  4. Кража данных и их выгрузка.

Но прежде чем продолжить разбор алгоритма, нужно отметить непрофессионализм злоумышленника, так как очень похоже, что троян был создан с помощью копипаста и не очень здорового ума. Чего в этом коде только нет, даже змейка (игра) с Github.

Также присутствуют повторяющиеся участки. К примеру, первый содержит зашифрованную ссылку на Pasterbin, где содержится информация о C&C сервере. Но второй такой же участок имеет ту же самую, но уже расшифрованную ссылку. Каков в этом смысл? 

Так как первый этап мы разобрали, сразу же перейдем ко второму.

Сбор информации об устройстве жертвы, отключение диспетчера задач и определение среды

Итак, сперва троян определит IP-адрес устройства жертвы. Злоумышленник, видимо, решил пойти нестандартными путями и сделать эту проверку с помощью внешнего ресурса и следующего обращения: 

Далее вредонос будет производить поиск заданных приложений, и вся эта информация будет собрана в файл Unnamed.txt и отправлена не на командный сервер, а через WebHook в Discord бота.

После этого троян попытается определить среду, в которой запущен:

Что более интересно, таким же образом он проверит средства безопасности, типа того же TCPView или WireShark. В случае обнаружения виртуальной среды или каких-либо других приложений троян немедленно прекратит работу. 

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

Затем Colour-Blind организует некую самозащиту, используя комбинацию из двух функций. Первая предназначена для уничтожения диспетчера задач Windows:

Вторая же начнет перебор открытых окон и запущенных процессов, если в названии имеется какое-то из заданных слов, процесс уничтожается:

Добавление в автозагрузку и связь с командным сервером

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

Блинд делает это достаточно своеобразно, он создает VBS сценарий с именем «Essentials.vbs» и добавляет его в автозагрузку. Этот скрипт каждый раз при входе в систему будет запускать троян. Примечательно, что храниться он будет в той же папке, куда был помещен code.py. 

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

Следом вредонос начнет устанавливать связь с командным сервером. Для этого на устройстве жертвы будет запущено приложение Flask. Далее троян сделает устройство общедоступным, используя утилиту Cloudflare «Cloudflared», что позволит обойти любые правила брандмауэра. 

Кража данных и их выгрузка

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

  • Кража Cookie файлов из браузеров. 

  • Кража паролей и токенов.

  • Кража файлов wallet.dat из различных криптокошельков таких как: Metamask, Exodus, Phantom. 

  • Развертывание кейлоггера, то есть сбора информации о нажатии клавиш. 

  • Создание снимков экрана, запись аудио и видео.

Далее вся собранная информация упаковывается в архив с названием nice.zip и выгружается на анонимный файлообменник transfer[.]sh.

Стоит также отметить, что вредонос после этого не прекращает свою деятельность, Блинд переходит в режим ожидания. И по необходимости может принимать команды с C&C сервера.

Краткий динамический анализ вредоноса

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

Для динамического анализа у нас уже имеется следующий сетап утилит (все они находятся в открытом доступе):

  1. ProcessHacker — простенько и со вкусом, понаблюдаем за тем, как вирус взаимодействует с другими .dll и системой. 

  2. TCPView — утилита, которая отслеживает исходящие TCP соединения. 

  3. Regshot — очень простое приложение с открытым исходным кодом, которое позволит просмотреть изменения в реестре после запуска вредоноса. 

Но сперва на наше устройство нужно установить Python, дело это минутное, но упомяну, вдруг что. 

Так как наш троян никак не взаимодействует с реестром Windows, то использование утилиты RegShot под вопросом. Сравнив слепки реестра, изменений обнаружить не удалось.

Итак, приступим. Мне стало интересно, насколько увеличится количество процессов, до запуска было 56, а после 61. 

Кстати, ранее я не упоминал, но троян берет рандомное имя процесса и маскируется под него. В нашем случае он выглядел как searchapp.exe. 

Сразу же после запуска вредонос связывается с командным сервером, что видно буквально сразу же:

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

Если внимательно следить за процессами, то можно заметить, как при открытии любого приложения или папки появляется несколько новых активных подключений. 

Что интересно, так это то, что мы не можем открыть вредоносный файл code.py через среду разработки Python. Она сразу же закрывается. Хотя меня посетила одна замечательная мысль, так как мы свободно можем редактировать исходный код трояна другими редакторами и заведомо знаем, что он устанавливает связь с командным сервером, то можно добавить функцию выгрузки туда чего-нибудь. Но это лишь теория. 

Стоило мне открыть браузер, как произошло следующее:

Около 40 процессов начали активно связываться с различными серверами и передавать информацию. 

Аналогичная активность происходит при попытке напечатать какое-то слово. Занимательно однако, но пользователь сразу поймет, что что-то не так, ведь устройство начинает просто разрываться и ловить глюки при каждом действии.  

Ещё стало интересно проверить автозагрузку: все так, как и должно быть, здесь находится вредоносный .vbs, отвечающий за запуск при каждом входе в систему:

Итак, раз у нас есть столько IP-адресов возможных командных серверов, в надежде найти панель управления или, может, что-то ещё — я проверил их все.

Но не судьба, практически все эти адреса вели то на Discord, то на файлообменник, то на нерабочие сервисы, которые показывали ошибки. 

В конце концов мне стало интересно, возможно ли удалить эту напасть в несколько кликов. И оказалось, что да. 

Сперва нужно перейти в папку Автозагрузки, где и содержится скрипт .vbs.

Сделать это можно предельно просто, жмите комбинацию Win+R и пропишите следующее значение: shell:startup . 

Перед нашими глазами сразу же откроется папка, из которой мы удаляем Essentian.vbs. Далее переходим в директорию Python и удаляем файл game.py, прежде завершив все вредоносные процессы. 

Исследователи Kroll более подробно описали функциональность этого трояна и им удалось заполучить командную панель. На момент написания этой статьи она уже неактивна. А новую найти не удалось.

Выводы

Сегодняшний анализ показал, что злодеи не стоят на месте, ведь если раньше в PyPi были только примитивные зловреды, то сейчас пришло время универсальных троянов. Не будет преувеличением сказать, что Блинд может практически все, хотя и написан явно на коленке. 

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

Усугубляет ситуацию ещё и то, что антивирусы никак не реагируют на очевидную угрозу, поэтому кроме головы на плечах, вам ничего не поможет. 

Удалить Блинд и его аналоги будет просто, только вот он все равно успеет стащить ваши данные. Проще пока что вовсе отказаться от использования PyPi и его аналогов. Хотя вирус и ориентирован больше на пользователей Windows, он также способен работать и на других системах, но с заметно уменьшенной функциональностью, выполняя исключительно роль стиллера.

По состоянию на 22.03.23 ни один из популярных антивирусов не показывает обнаружения, что очень печально.

А на этом у меня все. Бывайте.

Автор статьи @DeathDay


НЛО прилетело и оставило здесь промокод для читателей нашего блога:

— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.

Комментарии (4)


  1. Samhuawei
    00.00.0000 00:00
    +6

    Выводы.

    1. Не используйте Windows для разработки на Питоне. И не только из-за дырявости, но и прочих танцев с бубном вроде локального докера.

    2. Никогда не программируйте под рутом/админом. Большая часть функциональности вирусов перестанет работать.

    3. Если и использовать инструменты типа PyPi, то исключительно в изолированных окружениях. Никаких глобальных установок на машину.


    1. 9982th
      00.00.0000 00:00
      +1

      Ничто из предложенного не является панацеей. Этот горе-вирус рассчитан на Windows, другой, например, будет рассчитан на Linux.


      Без рута/админа но под основным рабочим пользователем у вируса, скорее всего, будет возможность стащить печеньки с паролями/сессиями из браузера, ключи из ~/.ssh, зашифровать вашу коллекцию котиков и пет-проекты, поучаствовать в ддосе или майнинге.


      Вызов pip install сам по себе равнозначен выполнению произвольного кода от автора пакета, и был ли этот pip системным или из virtualenv после запуска уже не будет иметь значения. Если под изолированным окружением вы имеете в виду изолированную от файловой системы и сети виртуалку или контейнер — то это отлично организуется и на Windows.


  1. HemulGM
    00.00.0000 00:00

    Горе-вирус, ей богу...


  1. Cerberuser
    00.00.0000 00:00

    очень похоже, что троян был создан с помощью копипаста и не очень здорового ума. Чего в этом коде только нет, даже змейка (игра) с Github.

    В нынешние времена у меня на это первая реакция - "а его точно писал живой разработчик, а не GPT?"