RCE в XWORM RAT
Начнём с ревёрса клиента ратника
Начнём наш ревёрс из точки входа. Здесь расшифровывается конфиг, включается кейлоггер и начинается подключение к серверу.
Конфиг расшифровывается с помощью AES-256-ECB. В качестве ключа используется измученный хеш от MUTEX'а( md5[0:15]+md5+\x00 ). Возможно автор так написал с целью обфускации, но правду мы не узнаем никогда.
Протокол здесь спизжен у njrat(сначала отправляется десятичное число, отображающее число байт в payload'е, потом \x00, а потом payload). Единственное, что они дописали от себя - шифрование с помощью md5 от ключа, зашифрованного в конфиге.
Все данные в payload'е разделяются сплиттером.
Переходим к ревёрсу серверной стороны
Одна из главных проблем данного ПО - то, что сервер не сохраняет состояние. Если шкхацкер нажимает на кнопочку, то сервер отправляет клиенту команду а отправь мне пж команду сделать то ,что хочет юзер и какие-то доп. данные.
Например, эта команда откроет окошко файлового менеджера на стороне сервера. И ни что не помешает нам её отправить
Ну, а здесь начинается интересная часть нашего разбора.
Формат команды: [b'downloadedfile',client_hwid,base64(gzip(content)),filename]
gzip тут с небольшим приколом. Перед сжатыми данными пишутся 4 байта размера разжатых данных в LE.
Файлик наш по задумке автора должен сохраниться в f"{c2startup_path}/ClientsFolder/{hwid}/{filename}". Сразу же в голову может прийти идея использовать "../../filename" для выхода из директории с айдишником, а потом и из клиентской директории. Но к глубокому сожалению автор видимо что-то подозревал и запретил использовать / и \\ в именах файлов и id жертвы.
Но ничто не мешает нам вместо hwid использовать просто "..". Тогда мы выйдем из ClientsFolder и сможем писать в папку с exe. Но как это можно превратить во что-то опасное, если мы не можем перезаписывать уже работающие файлы?
Работающие - да, но в папке лежит ещё несколько дллок, которые просто так не импортируются. Путём тыка я выбрал FastColoredTextBox.dll . Эта библиотека используется только для отрисовки окошка в локальном .NET компиляторе, который обычный юзер данного изделия даже не использует. Поэтому, это самый оптимальный вариант.
Ну, а теперь смотрите на цепочку вызова этого компилятора до пропатченной функции
В качестве жертвы для патчинга(перекомпиляции) я выбрал __init__ у FoldedBlockStyle т.к. dnspy у меня не справлялся с большими функциями и выкидывал кучу ошибок(мб я криворукий).
Вот вам собсна функция с бэкдором. Он очень простенький. При первом вызове у нас создаётся скрытая папочка XwormClientConfig(возможно скрытые файлы отображаются и это максимально уведёт подозрения). А после файл runfile.exe запускается из %TEMP%.
Я создал тулзу github.com/encoder000/rathunter, в которую добавил набор атак на XWORM. Со временем планирую добавить и другие ботнеты/ратники.