• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Обзор стиллера StealC + XSS в админке

coder

(L3) cache
Забанен
Регистрация
18.08.2023
Сообщения
213
Реакции
252
Пожалуйста, обратите внимание, что пользователь заблокирован
Всем привет

Сегодня у нас на обзоре стиллер stealc который продаётся вот здесь
Со мной связался один из пользователей данного продукта и попросил сделать на него обзор, предоставив билд и админку

У меня на руках:

- web.zip (Архив с админкой)
- install.sh (Скрипт для установки админки)
- Build.exe (Собранный на мою админку билд)

Удивило то, что автор даёт клиенту баш скрипт для установки панели
На дворе конец 2023 года, пора бы уже начать осваивать докер, это в разы стабильнее чем пляска с кастомными установщиками, зависимыми от ОС на борту
Я передал своему сисадмину файлы админки для установки и тем временем отправился изучать содержимое архива web.zip

Админка написана на голом PHP, для связи с базой данных используется PDO, в каждой папке стоят заглушки index.php чтобы содержимое директорий используемых админкой нельзя было прочитать
Написано всё, само собой, в процедурном стиле и в связи с этим код выглядит как каша
Автор не слышал про принцип единой ответственности, более того, архитектура админки отсутствует как таковая, такое ощущение, что её разработкой занимался не веб программист, а "вебмастер" из 2010 года

Ладно, админка установлена, заходим внутрь и видим авторизацию:

login.png

Вводим пароль, попадаем внутрь панели. Выглядит она вот так:

logs.png
grabber.png
loader.png
stats.png
blocklist.png
markers.png
settings.png

Сразу подмечу пару вещей, которые бросились в глаза:

1) Интерфейс хорошо спроектирован, всё на своих местах, это круто, но он не очень понятен. Автору нужно поработать над тем, чтобы было понятно, какая опция в интерфейсе за что отвечает
2) Текст маленькими буквами, в паре таблиц присутствуют поля "rule_id", "loader_id" и т.д. Выглядит сыро, лично мне непонятно, зачем так называть поля, можно же написать человеческое название

Ради интереса попробовал исполнить жс код, добавив
JavaScript:
<script>alert('xss');</script>
в несколько полей, и к моему удивлению код отработал везде:

alert.png

После этого я окончательно загорелся идеей найти возможность слива инсталлов с панели
Как вы можете заметить, во вкладке Logs у каждого лога в таблице есть кнопка с иконкой восклицательного знака
Там отображается информация о системе жертвы, её мы и попытаемся подменить
Как выяснилось в процессе реверса, стиллер получает версию ОС из реестра, читая поле ProductVersion по пути HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion
Вписываем туда тестовый ЖС код, который выведет алерт, и запускаем билд, после прихода лога открываем блок с системной информацией ииии.... всё отрабатывает!

h4cked.jpg

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

Общее мнение об админке:

Панель очень сырая, такое ощущение что автор никогда не кодил веб и делал её попутно изучая пхп по урокам на ютубе
Несмотря на неплохой визуальный вид, админка до ужаса кривая. Пользоваться этим не безопасно, у вас сольют инсталлы или логи
Это всё нужно переделывать с полного нуля, делать нормальную архитектуру, юзать ORM, шаблонизаторы и т.д. Я бы советовал автору нанять нормального веб разработчика, если сам он не умеет кодить веб
Поставлять такую админку вместе со стиллером недопустимо, это полное неуважение к клиентам которые могут попасть на круглую сумму из за некомпетентности кодера

Переходим к осмотру билда в статике
У меня на руках нативный х86 PE файл весом 100 кб, в таблице импорта присутствуют только некоторые функции из msvcrt и lstrcatA
Внутри видно много base64 строк, есть строки и в открытом виде, которые являются мусорными. Скорее всего аверы кинут статический детект на них

Присутствуют 4 секции:

- Секция кода
- Секция данных
- Секция ресурсов
- Релоки

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

ep.png

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

decrypt_strings.png

Как вы видите, в основном это названия апи функций для последующего динамического импорта и строки, касающиеся проверки на запуск в ВМ

Строки шифруются по схеме base64(rc4(string)), rc4 ключ для моего билда выглядит как строка из 28 цифр, пример: 4597014127588130917345308199, он лежит в секции данных в открытом виде
В функции, которая выполняет декрипт строки имеется утечка памяти, память выделенная через malloc не освобождается, так же не освобождается память, выделенная под хранение этих строк

decrypt_string_leak.png

Так же внутри функции шифрования RC4 было обнаружено вот такое:

trash.jpg

Видимо, это приватный слой обфускации. Если серьёзно, я не понял, зачем добавлять лишнюю сигнатуру к билду и трешгенить в собственном коде :D

Далее происходит импорт API, в начале функции первым делом получается адрес kernel32.dll:
init_api.png
get_kernel32_handle.png

Здесь есть небольшая загвоздка, позиция базы этой библиотеки в списке вшита в код, следовательно если данный стиллер закриптуют криптором написанном на .NET, то будет облом, поскольку в списке перед ntdll будет присутствовать mscoree
Следовательно, вместо адреса kernel32 будет получен адрес ntdll и далее последует краш, ведь возвращаемый функциями результат никак не валидируется
Далее с помощью собственной реализации GetProcAddress получается адрес GetProcAddress из kernel32.dll и уже используя её получаются адреса остальных апи функций
Мне не до конца понятно, зачем нужны эти танцы с бубном, ведь можно реализовать поддержку import forwarding в собственной GetProcAddress и не плодить кучу одинакового кода

Далее происходит проверка на запуск на територии СНГ, получается идентификатор UI системы и сравнивается с некоторыми значениями, после чего в случае совпадения происходит завершение работы
Следом у нас "приватный" метод детекта виртуальных машин. Если название ПК HAL9TH, а название юзера JohnDoe, происходит завершение работы программы

Потом формируется строка формата HAL9TH_computername_username, она будет использоваться в качестве названия ивента, по которому стиллер отслеживает, не запущена ли ещё одна его копия в данный момент
В моём случае сформировалась строка HAL9TH_TestPC_User, далее в цикле со слипом в 6 секунд вызывается функция OpenEventA и производится проверка, вышло ли открыть ивент. Если не вышло, засыпает. Если вышло - выходит из цикла.
После окончания цикла создаётся ивент с таким названием, проверяется активна ли подписка на стиллер и вызывается основная функция, которая содержит в себе основную логику билда

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

Вот главная функция стиллера, в которой и хранится вся основная логика:

start_stealing1.png
start_stealing2.png
start_stealing3.png

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

decrypt_strings2.png

init_api2.png

Как вы видите, здесь дешифруется намного больше строк. Меньшая часть из них содержит названия апи функций, а большая напрямую относится к работе стиллера: Адрес админки, гейта, SQL запросы, маски поиска файлов и т.д
В начале функции мы видим три строки с условными обозначениями str_panel_address, str_gate_address, str_libs_folder, str_build_tag
Это и есть конфиг стиллера, подменив который можно перенаправить запросы на свою панель :)
Сравнив несколько билдов можно заметить, что ключ шифрования строк отличается, поэтому я могу предположить что процесс генерации "боевого" билда производится в автоматическом либо полуавтоматическом режиме (иными словами, с помощью билдера)

Далее происходит сбор лога и отправка его на сервер по частям. Рассматривать детально этот момент мы не будем, я его опишу кратко
В програмдату с сервера скачиваются x64 DLL библиотеки, которые, как я понял, нужны для дешифровки паролей из браузеров на базе движка Gecko (Firefox и прочие)
Оттуда же загружается sqlite3.dll, с помощью которой будет производиться доступ к SQLite БД браузеров

Начинается рекурсивный перебор файлов с помощью FindFirstFileA - FindNextFileA, если файл подходит под требования, он загружается на сервер хттп запросом
Хочу подметить, что файл загружается на сервер одним вызовом HttpSendRequest и размер файла не проверяется перед загрузкой, на этом моменте может возникнуть краш программы

После того, как все данные собраны и отправлены на сервер, проверяется, установлено ли значение константы, именуемое в псевдокоде как v31
Если v31 == 1, производится очистка програмдаты и самоудаление посредством выполнения cmd команд. Почему автор не реализовал это програмно - загадка для меня, ведь я уверен, что на этом месте есть/будет детект от некоторых АВ

Общее мнение о билде:

Видно, что у автора нет опыта в системном программировании
В коде не проверяется результат выполнения функций, поэтому control flow может пойти не туда, выполнение программы сломается
Автор не слышал про принцип единой ответственности, некоторые функции выполняют несколько задач одновременно, код перегружен
Не поддерживаются юникод, стиллер либо не отработает в юникод среде, либо при соблюдении некоторых условностей отработает, но не полностью
Ошибки детские, мне было бы стыдно выкатывать такой софт. Я не спорю, что он работает и даже приносит людям прибыль, но такие ошибки ведут к просадкам в отстуке и впоследствии потере потенциальной прибыли

Теперь протестируем работоспособность билда
Я написал своим тестировщикам и попросил их прогнать билд на всех ОС, начиная с Windows 7 и 2008 сервера до последних билдов 11 и Server 2022
Результаты меня немного огорчили, билд отработал нестабильно, получилась вот такая картинка:

7.png

8.png
81.png

10.jpeg
11.jpeg
srv2008.jpeg
2012.png
srv2016.jpeg
srv2019.jpeg
srv2022.jpeg

Windows 7 - ошибка спустя 5 секунд работы билда, в админку отстучал, пароли собраны не полностью
Windows 8 - ошибка спустя 5 секунд работы билда, в админку отстучал, пароли собраны не полностью + лоадер криво скачал файл, ещё одна ошибка
Windows 8.1 - ошибка спустя 5 секунд работы билда, в админку отстучал, пароли собраны не полностью
Windows 10 - отстучал, проблем не наблюдается
Windows 11 - отстучал, проблем не наблюдается (в админке распознало как Windows 10 PRO)
Windows Server 2008 - отстучал, проблем не наблюдается
Windows Server 2012 - ошибка спустя 5 секунд работы билда, в админку отстучал, пароли собраны не полностью
Windows Server 2016 - отстучал, проблем не наблюдается
Windows Server 2019 - отстучал, проблем не наблюдается
Windows Server 2022 - отстучал, проблем не наблюдается

Как я и ожидал ошибка возникла на этапе загрузки библиотек, связанных с дешифровкой паролей из ФФ
На х86 системах (хоть их и мало, я беру их в счёт, так как стиллер скомпилирован под х86) пароли из ФФ собраны не будут, поскольку с сервера загружаются х64 библиотеки для работы с этим браузером

Лог выглядит вот так:

log.png

Внутри лога всё структурировано, сделано нормально. Но насторожило то что в отдельном файле под названием copyright.txt содержится реклама стиллера:

copyright.png

Итого:

Стиллер мне не понравился, билд нестабилен и содержит много глупых ошибок, которые неприемлемо допускать человеку, называющемому себя кодером
Отсутствие поддержки юникода, нестабильность работы и много проблемных мест в коде полностью испортили впечатления от данного продукта
Админка уязвима к XSS, строки в панели не фильтруются вообще
Под конец написания данного обзора я пообщался с кодером продукта, который сказал мне, что отсутствие поддержки юникода в паблик билдах данного стиллера - защита от работы стиллера по РУ, а ошибки связанные с подгрузом длл для ФФ связаны с отсутствием CRT на моих тестовых стендах))
Я считаю, что автору софта нужно подтянуть свой скилл, а уже только потом продавать стиллеры на этом форуме

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

Статья написана coder специально для площадки xss.pro
 
Последнее редактирование:
Всем привет, автору большой + за то, что перед публикацией связался и заранее передал информацию об уязвимости, чтобы мы её закрыли до выхода его поста.

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

К сожалению, очень поверхностно прошлись по софту, на деле очень много мелких несоответствий в статье - взять даже из последнего аргумент:
- Так же она дублируется в начале каждого файла, вследствии чего искуственно увеличивается вес лога
Но... Оно ведь не прописывается в каждый файл... Копирайт прописывается в файл system_info.txt и добавляется как комментарий к zip-архиву :)

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

Но в любом случае спасибо за пост, есть недочеты, на которые мы уже обратили внимание, опять же спасибо автору за то, что заранее связался и удачи в следующих обзорах!
 
Работа отличная, не спорю.
На будущее, когда тестируешь, сделай фейк метамаск с известным паролем на 1-2 ляма и после пустой метамаск. Системы идентичные. Думаю будешь приятно удивлен как некоторые стилеры работают) у меня после таких тестов на 25 стилаках что нашел в продаже, топ резко поменялся после таких тестов. Стилк думаю на 3-5 месте будет.
А из плохо. Всегда нравится читать такие темы)))) А вот тут а вот там, а че сами то не пишите или покажите код на который все фапать будут) Каждый пишет как может.
А с другой стороны без таких статей и втыков, врятли ктото будет править)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Всем привет, автору большой + за то, что перед публикацией связался и заранее передал информацию об уязвимости, чтобы мы её закрыли до выхода его поста.

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

К сожалению, очень поверхностно прошлись по софту, на деле очень много мелких несоответствий в статье - взять даже из последнего аргумент:
- Так же она дублируется в начале каждого файла, вследствии чего искуственно увеличивается вес лога
Но... Оно ведь не прописывается в каждый файл... Копирайт прописывается в файл system_info.txt и добавляется как комментарий к zip-архиву :)

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

Но в любом случае спасибо за пост, есть недочеты, на которые мы уже обратили внимание, опять же спасибо автору за то, что заранее связался и удачи в следующих обзорах!
Касательно копирайтов здесь действительно вышла неточность, сейчас внесу правку в статью, это мелочи. Проблема в другом, ты в разработке опираешься на старый и неактуальный софт, который писал человек без опыта в программировании. Вот взять азорульт и его админку, это же пиздец, была очень много хейта) Малварь полностью поддаётся принципам белой разработки и если ты откроешь их для себя, твоя жизнь станет намного проще. Современные технологии нужно использовать не потому что это круто, а потому что это удобнее и защитит тебя от глупых ошибок, которые ты смог допустить в своём продукте. Более того, скорость разработки увеличится, а время - деньги. В любом случае спасибо за фидбек
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Браво ! Читаю как будто детектив, но с темой программирования, реверса и всё этой фантастике. Спасибо! Жду с нетерпением еще подобных тем! И было бы интересно знать род твой деятельности и чем занимаешься!):smile2:
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Шикарный обзор. Спасибо автору.

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

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

на голом PHP,

в процедурном стиле
Это предвзятое отношение. Программирование это техническая наука, а не мода (а в 2023 надо кодить на путоне и расте!)
по части системного кодинга с замечаниями в целом согласен.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А так, благодаря таким мозговитым реверсерам - продукты будут существенно улучшаться.
это печально, что людей надо тыкать носом в то, что они продают.
С того, что нет поддержки юникода вообще выпал...

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

Тема супер
Безусловно, с Вами нельзя не согласиться. Живой пример:

Screenshot_1.png


Извиняюсь за оффтоп, так, наболело.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Это предвзятое отношение. Программирование это техническая наука, а не мода (а в 2023 надо кодить на путоне и расте!)
по части системного кодинга с замечаниями в целом согласен.
Это не мода, а необходимость. Скрипт установщик может где то не сработать, автора начнёт задрачивать клиент, он будет тратить своё время и гадать, почему админка не встала. С PHP та же тема, автор сейчас пойдет фильтровать хсски в параметрах, а он мог бы использовать шаблонизатор и ORM, которые бы исключили вероятность эксплуатации простых дырок. Нужен как минимум набор библиотек, как максимум фреймворк. Мои замечания более чем уместны, поскольку больше зарабатывает тот, кто быстрее и качественнее пишет код. Заказчику пофиг, на чем написаны билд и админка, важно только то, насколько просто оно ставится и как работает. Только вот используя такие технологические решения, как автор, ошибку допустить проще, а фикс отнимает больше времени
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Заказчику пофиг, на чем написаны билд и админка
Я считаю абсолютно также. И пишу свои админки на процедурном РНР и jQuery. Вопрос не в инструменте, а в том, что человек не осилил strip_tags или подобное.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Вопрос не в инструменте, а в том, что человек не осилил strip_tags или подобное
Это философский вопрос. Кто-то не осилил strip_tags, кто-то не осилил вовремя делать free после malloc, кто-то и то и другое. Но если бы этот кто-то воспользовался фреймворком (а много где обрезка тегов уже встроена), или воспользовался языком со сборщиком мусора (типа дотнетов или петухонов), то этих двух проблемы бы не было в принципе... (были бы другие проблемы, тк хороший код писать нужно уметь где бы то ни было, но скорее всего это были бы меньшие проблемы)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
воспользовался фреймворком
Ну с одной стороны я понимаю, что чем выше абстракция, тем меньше вероятность сделать ошибку (банально сам перешел на Си с Асма по этой причине, ибо надоело ). Но в целом, в шоке с ситуации сейчас - фреймворк для фреймворка, шаблонизатор для шаблонизатора..Сам РНР создавался как веб фреймворк для Си, т.е. по факту это простейший и удобный язык для веба.
 
отсутствие поддержки юникода в паблик билдах данного стиллера - защита от работы стиллера по РУ
это отмазка кодера, причем достаточно глупая
вместе с РУ в таком случае отлетят все арабы, азия, и тому подобная добрая половина мира
это очень грубая ошибка, которая очень сильно будет резать отстук, если пролив идет по миру
 
Пожалуйста, обратите внимание, что пользователь заблокирован
это отмазка кодера, причем достаточно глупая
вместе с РУ в таком случае отлетят все арабы, азия, и тому подобная добрая половина мира
это очень грубая ошибка, которая очень сильно будет резать отстук, если пролив идет по миру
Бро, мне всё это понятно как 2х2. Кодер мне сказал, что ascii (cp1251) нативная кодировка системы, цитата:
касаемо юникода, на отстук это не влияет, поскольку в винде априори существует поддержка в первую очередь собственной кодировки - cp1251, она же ascii, даже внутри ядра винды многие функции сами Майкрософт предварительно конвертят между собой, поскольку часть функций ядра имеет только ascii представление, в часть только unicode представление
поэтому как с технической стороны может повлиять то, что софт использует нативную кодировку системы не совсем понимаем
Поэтому я написал про то, что человеку нужно подтягивать скилл. В целом согласен с твоим комментарием
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх