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

Статья LummaC2 - morph

waahoo

ворчливый дед
Эксперт
Регистрация
01.12.2010
Сообщения
843
Реакции
1 661
Сегодня на столе у нас LummaC2. За проектом я наблюдаю практически с самого начала. Видно, что автор прям живет своим детищем, постоянные обновления, доделки, переделки. Сложилось впечатление, что он только спит и кодит стремясь к совершенству. Стало любопытно и я обратился к автору с просьбой предоставить продукт на посмотреть. Автор пошел на встречу и любезно предоставил доступ в панель и три билда. Ну чтож, давайте посмотрим :)

Основной функционал и работоспособность.
Для начала как обычно я ставлю Windows 10 LTSC x64 в качестве гостевой системы т.е. на виртуальную машину. Система полностью обновленная и заряженная на успех, но - билд остучал.
Ставим на эту же систему Хром, сохраняем пасс в браузере и запускаем повторно - пасс упал в лог. Успеху не помешали полностью обновленная система с дефендером и смартскрином.
otstuk.png

Анализ бинарей.
Внутри у нас x86, достаточно жирные (~930кб) и c одинаковым набором секций.
l1s.png

l2s.png

l3s.png
Импорт оказался тоже одинаковым, как по библиотекам, так и по списку импортируемых API.
l1i.png

l2i.png

l3i.png
Заглянем внутрь.
l1entry.png
Ничего особенного, сишная CRT, идем глубже.
l1wm.png
l2wm.png
l3wm.png
Точка входа в WinMain. А вот и сладенькое, давайте посмотрим на то, ради чего собрались.
"Сравнительная математика", так это назовем, с кучей ветвлений. Попробуем постоить граф от точки входа...
В один скрин это конечно же не влазит, прикладываю видос.
При тупом проходе через всю эту кашу было замечено, что весь основной код разбит на маленькие кусочки. Я не представляю как такое можно уместить на один или несколько скринов, чтобы было понятно, поэтому просто словами опишу.
Код:
Взяли число
100500 раз его с чем то посравнивали, на 100501 раз условие сравнения удовлетворено.
Взяли PEB
Покрутили, плюсанули, с чем-то поксорили и опять идем сравнивать.
100500 раз его с чем то посравнивали, на 100501 раз условие сравнения удовлетворено.
Взяли из PEB указатель на PEB_LDR_DATA
Покрутили, плюсанули, с чем-то поксорили и опять идем сравнивать.
100500 раз его с чем то посравнивали, на 100501 раз условие сравнения удовлетворено.
...
Это очень нудно дебажить. К тому же присутствует антиотладка, котороя тоже доставляет некоторые хлопоты.
Удалось найти кастомную GetProcAddress. Просто покажу ее граф.
l2getprocaddress.png

maxresdefault.jpg
Жуть. Я так понимаю и к прочим процедурам применен такой подход. Глубокого реверса не будет. Во первых, ну его нахер такое реверсить, во вторых ну его нахер :)

Недочеты.
1. Открытые строки. В бинаре они вот прям так и лежат. Автор конечно запрещает проливать некриптованные билды, но реверсеру это дает весомые такие ниточки, что не есть хорошо.
2. Не зашифрованные коммуникации, будь то бот с панелью, будь то клиент с панелью. Не вижу никаких проблем натянуть хоть кастомный HTTPS, хоть бесплатный LetsEncrypt.

Выводы.
Видно, что ребята приложили и продолжают прикладывать не мало усилий в свой продукт. Морфер мне понравился, развивайте, не бросайте. Устраните недочеты и станете еще ближе к идеалу.
Также я бы посоветовал примешать в эту математику фейковые вызовы Windows API, будет вообще пушка.
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Спасибо большое за обзор, недочеты примем к сведению. Совершенству нет предела, но стремиться к нему нужно.
 
Это все понятно, но когда кряк выйдет?:t
Server side обработка логов. Как только кто-то повторит панель :)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
кастомный HTTPS, хоть бесплатный LetsEncrypt
Для этого нужен домен, домены часто банят иначе чем хостинги. К примеру я не знаю где можно приобрести нормальный абузоустойчевый домен. А тем более если используется куча прокси это нужно делать куча поддоменов или куча доменов? А нацепить сертификат на голый IP сложнее чем на домен. И если каждый раз покупать домены это занимает время, нужно ждать когда обновиться DNS и то не у всех провайдеров.
 
Для этого нужен домен, домены часто банят иначе чем хостинги. К примеру я не знаю где можно приобрести нормальный абузоустойчевый домен. А тем более если используется куча прокси это нужно делать куча поддоменов или куча доменов?
У того же ракуна(ныне забаненного), домен уже более полугода живет
 
Пожалуйста, обратите внимание, что пользователь заблокирован
У того же ракуна(ныне забаненного), домен уже более полугода живет
Домен под панель или куда клиент отправляет логи?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
У того же ракуна(ныне забаненного), домен уже более полугода живет
По последним данным вижу что все идет на ip
1684698452080.png
1684698413384.png

Ну или я не понял текста и перепутал клиента с сайта, с клиентом стилера
 
Пожалуйста, обратите внимание, что пользователь заблокирован
ну так и в чем отличие их морфера от скажем того же обфускатора на ллвме? а то что-то вся тема свелась к тому, что это всё очень сложно реверсить из-за обфускации. Тогда спрашивается зачем тему создавать. Чтобы импорты показать?)
Примерно такие же графы может выдать обфускатор ллвма. Так что тема не о чём.
Одно из достоинств продукта очень слабо раскрыто.
 
ну так и в чем отличие их морфера от скажем того же обфускатора на ллвме? а то что-то вся тема свелась к тому, что это всё очень сложно реверсить из-за обфускации. Тогда спрашивается зачем тему создавать. Чтобы импорты показать?)
Примерно такие же графы может выдать обфускатор ллвма. Так что тема не о чём.
Одно из достоинств продукта очень слабо раскрыто.
Он есть, он уникальный (авторский), по старым лекалам не получится его пройти, а стало быть АВ будут писать проходы именно под него, если будут вообще. В этой теме освещался морф, в этой теме не говорилось о совокупности применяемых техник вроде обхода вызовов WinAPI через сисколы и применения уникального HeavensGate, об этом уже говорил мой коллега Quake3 (https://xss.pro/threads/78553/#post-546271) и все это присутствует конечно жеж.
 
Последнее редактирование:
waahoo
Спасибо за обзор, было приятно почитать, особенно приятно было видеть эти строки
Глубокого реверса не будет. Во первых, ну его нахер такое реверсить, во вторых ну его нахер :)
мы приложили немало усилий, что бы доставить реверсерам максимум проблем. У нашего морф-движка две основные цели - усложнение реверса и противодействие сигнатурному детекту. Именно поэтому в статике у нас почти всегда fud даже без крипта.

Хотелось бы прокомментировать
Также я бы посоветовал примешать в эту математику фейковые вызовы Windows API, будет вообще пушка.
У нас реализован алгоритм задействования фейк-вызовов апишек, но он построен очень хитро, движок исследует каждую функцию, и при морфинге строит конструкции из тех апишек, которые уже используются в каждой из функций. Это необходимо для того, что бы не было аномального поведения в рантайме. Если функция работает с файлами, то после замусоривания там не появиятся левые апишки, а все так же будет работа с файлами. Это так же обьясняет то, что таблица импорта не меняется. Движок использует уже существующие в импорте апишки. В дополнение, движок генерирует фейк-вызовы к внутренним функциям стиллера, а что бы код не сломался в результате таких преобразований, используются техники, о которых в паблике мы говорить не будем.

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

Думаю, в скором времени, я напишу статью о нашем морфере, она будет в стиле введения для новичков, для тех кто только встает на этот путь, и возможно, поможет реализовать похожее решение.
waahoo, еще раз спасибо за обзор. Было интересно почитать твои мысли.
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Перечислю некоторые из них - рандомизация потока исполнения, шифрование численных констант, разложение математических и логических операций в длинные цепочки, заплетение дуг исполнения, переплетение функций, сглаживание потока исполнения, и это лишь то, что сразу всплывает в памяти.
Открытые строки. В бинаре они вот прям так и лежат. Автор конечно запрещает проливать некриптованные билды, но реверсеру это дает весомые такие ниточки, что не есть хорошо
Ну это странно, накручивать какие-то морферы по коду, но оставлять данные (и в частности строки) не зашифрованными. Разобраться со строками - часто первое, что делается в обфускаторах))

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

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

ЗЫ: хотя если обфускатор на базе ассемблерных инструкций сделан, то тут да, может быть технически сложно находить строки и вставлять им, например, буфферы на стеке для расшифровки.
Тут нужно по сорцам идти, по сути делов то на 100 строк петухона. Надеюсь скоро пофиксят.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Но как факт, не смотря на то, что строки у нас открыты, и они не меняются с начала проекта, у нас в статике fud.
Блажен тот, кто верует))

Тут нужно по сорцам идти, по сути делов то на 100 строк петухона. Надеюсь скоро пофиксят.
Ну да, если они это на уровне исходников делают. Я помню, достаточно помучался, чтобы это сделать на уровне LLVM IR, так как становится не всегда очевидно, где используется строка и как правильно вставить буфер для расшифровки на стек функции, а расшифровывать в прямо в секции .data некошерно. Если они делают это на уровне асма, то тут, наверное, еще сложнее будет. Но опять же, подождем статьи, там понятно будет.

Думаю, в скором времени, я напишу статью о нашем морфере, она будет в стиле введения для новичков, для тех кто только встает на этот путь, и возможно, поможет реализовать похожее решение.
Обязательно пиши, это будет интересно почитать.
 
Для этого нужен домен, домены часто банят иначе чем хостинги. К примеру я не знаю где можно приобрести нормальный абузоустойчевый домен. А тем более если используется куча прокси это нужно делать куча поддоменов или куча доменов? А нацепить сертификат на голый IP сложнее чем на домен. И если каждый раз покупать домены это занимает время, нужно ждать когда обновиться DNS и то не у всех провайдеров.
ну вот то запретили скрипт питона который сделает это автоматически
 


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