По данным отчета компании CheckPoint за 8 августа, в самом популярном репозитории Python среди разработчиков — PyPI (Python Package Index) — затаились десять вредоносных пакетов. Они предназначались для кражи персональных сведений и учетных данных разработчиков.
Изучив отчет, мы решили проверить PyPI через свою внутреннюю автоматизированную систему для мониторинга репозиториев пакетов с открытым исходным кодом. В результате мы обнаружили еще два вредоносных пакета Python, которые маскировались под один из самых популярных пакетов с открытым исходным кодом — requests.
Хронология отправки пакетов:
Имя пакета | Версия | Временная метка (UTC) |
pyquest | 2.28.1 | 30.07.2022 10:11:47.000 |
pyquest | 2.28.2 | 30.07.2022 10:15:28.000 |
pyquest | 2.28.3 | 30.07.2022 10:19:14.000 |
ultrarequests | 2.28.3 | 30.07.2022 10:25:41.000 |
Злоумышленник скопировал описание официального пакета requests, чтобы пользователи по ошибке устанавливали вредоносную подделку. В описании приведена фальшивая статистика, согласно которой пакет был установлен 230 миллионов раз за месяц и имеет более 48 000 «звезд» на GitHub. Кроме того, даны ссылки на веб-страницы оригинального пакета requests и указана электронная почта автора. Везде, где упоминается имя оригинального пакета, оно заменено на имя вредоносного.
Если загрузить вредоносный пакет, становится ясно, что его исходный код почти идентичен оригинальному коду requests, за исключением одного файла — exception.py. Во вредоносном пакете последний раз этот скрипт был изменен 30 июля, в день публикации этого пакета.
Вредоносная полезная нагрузка — это скрипт Python в кодировке base64, скрытый в классе HTTPError. Он записывает еще один однострочный скрипт Python во временный файл, а затем запускает его с помощью функции system.start(). Затем однострочный скрипт загружает скрипт следующего этапа со страницы https://zerotwo-best-waifu[.]online/778112985743251/wap/enner/injector и выполняет его.
Загрузчик
На следующем этапе запускается загрузчик, обфусцированный с помощью общедоступного инструмента Hyperion. Применено несколько методик обфускации — переименование переменных и библиотечных функций, добавление смешанных логико-арифметических выражений и ненужного кода, а также сжатие фрагментов кода с помощью библиотеки zlib.
Если имя ОС не «nt» (Windows), загрузчик завершает работу. Если же имя подходящее, он случайным образом выбирает один из каталогов в C:\Users\<имяпользователя>\AppData\Roaming или C:\Users\<имяпользователя>\AppData\Local, генерирует случайную восьмисимвольную строку из символов «bcdefghijklmnopqrstuvwxyz» и случайным образом выбирает одно из расширений из следующего списка:
1 |
['.dll', '.png', '.jpg', '.gay', '.ink', '.url', '.jar', '.tmp', '.db', '.cfg'] |
Затем зловред загружает код финальной стадии со страницы https://zerotwo-best-waifu[.]online/778112985743251/wap/shatlegay/stealer123365, сохраняет его в ранее сгенерированном месте и выполняет.
Для закрепления в зараженной системе зловред создает значение Realtek HD Audio Universal Service в ветке системного реестра HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run.
Скрипт ищет существующий исполняемый файл в каталоге %system32% с именем SecurityHealthSystray.exe или SystemSettingsAdminFlows.exe, добавляет символ «&» (для последовательного выполнения в командной строке), а затем добавляет путь к интерпретатору Python и вредоносному скрипту. Стоит отметить, что этот метод закрепления фактически не работает, поскольку система запускает только первый исполняемый файл.
1 |
C:\Windows\System32\<SecurityHealthSystray.exe | SystemSettingsAdminFlows.exe> & <путь к интерпретатору Python> <сгенерированный путь для загрузки финальной полезной нагрузки> |
Финальная полезная нагрузка: W4SP Stealer
Финальная полезная нагрузка представляет собой троянец, написанный на Python и обфусцированный тем же способом, что и загрузчик. Автор зловреда оставил в его коде название W4SP Stealer.
При запуске стилер идентифицирует внешний IP-адрес машины жертвы, отправляя запрос GET на https://api.ipify.org, и устанавливает два легитимных пакета PyPI — requests и pycryptodome, чтобы отправлять оператору полученные данные и расшифровывать файлы cookie и пароли из браузеров. Затем зловред начинает собирать токены Discord, сохраненные файлы cookie и пароли от браузеров в отдельных потоках.
Пароли и файлы cookie сохраняются в файлах %TEMP%\wppassw.txt и %TEMP%\wpcook.txt в следующем формате:
1 |
UR1: <URL> | U53RN4M3: <ИМЯ_ПОЛЬЗОВАТЕЛЯ> | P455W0RD: <РАСШИФРОВАННЫЙ_ПАРОЛЬ> |
1 |
H057 K3Y: <КЛЮЧ_ХОСТА> | N4M3: <НАЗВАНИЕ> | V41U3: <РАСШИФРОВАННЫЙ_ФАЙЛ_COOKIE> |
Все файлы, созданные стилером на машине жертвы, начинаются со строки: <—W4SP STEALER ON TOP—>. Все собранные данные отправляются оператору через веб-хук Discord (https://discord[.]com/api/webhooks/1001296979948740648/4wqCErLU3BVeKWnxDA70Gns5vcfxh5OCb3YDIFZaFujqfSRIwHH4YIu3aLOVWjCDeO1H) и рендерятся в удобном формате:
Стилер также создает и отправляет список сохраненных учетных данных браузера для ссылок, содержащих ключевые слова mail, card, bank, buy, sell и др. (Полный список приведен в Приложении.) Кроме того, он собирает данные из кошельков MetaMask, Atomic и Exodus, а также учетные данные Steam и Minecraft.
Собрав учетные данные, стилер начинает прочесывать каталоги «Загрузки», «Документы» и «Рабочий стол» на компьютере жертвы в поисках имен файлов, содержащих следующие слова:
1 |
passw, mdp, motdepasse, mot de passe, login, paypal, banque, account, metamask, wallet, crypto, exodus, discord, 2fa, code, memo, compte и token. |
Как ни странно, в этом списке есть несколько слов на французском: mot de passe («пароль»), mdp (сокращение от mot de passe), banque («банк») и compte («учетная запись»). Затем соответствующие файлы выгружаются на тот же канал Discord.
Стилер также загружает код JavaScript со страницы zerotwo-best-waifu[.]online/778112985743251/wap/dsc_injection и записывает его в файл index.js платформы Discord. После этого он завершает запущенный процесс discord.exe — пользователю приходится перезапустить Discord, активировав тем самым вредоносный код.
1 |
subprocess.Popen('taskkill /im discord.exe /t /f',shell=true) |
Внедренный скрипт отслеживает действия жертвы — изменение адреса электронной почты, пароля или платежной информации. Обновленная информация также поступает на канал Discord.
Мы уже сообщили об этих двух пакетах команде безопасности PyPI и занесли их в базу данных уязвимостей Snyk.
Программные решения «Лаборатории Касперского» обнаруживают следующие угрозы:
- Trojan.Python.Inject.d
- Trojan.Python.Agent.gj
Индикаторы компрометации
Образцы
34c9d77afd77611ce55716f23594275a | ultrarequests-2.28.3.tar.gz |
f2102dee0caba546ef98b47b373bab9a | pyquest-2.28.3.tar.gz |
556ee928fbffd4bbd1cec282ec1a5bb3 | Скрипт загрузчика |
42f0f3b4d5a2be7f09d1c02668cb2c08 | Внедряемый в Discord файл index.js |
d7b6df674690c2e81c72ea031ed44a6f | W4SP stealer |
URL-адреса
https://zerotwo-best-waifu[.]online/778112985743251/wap/enner/injector
https://zerotwo-best-waifu[.]online/778112985743251/wap/shatlegay/stealer123365
https://zerotwo-best-waifu[.]online/778112985743251/wap/dsc_injection
В репозитории PyPI найдено еще два вредоносных пакета Python