Наши аналитики получают на анализ тысячи новых образцов вредоносных программ каждый день и среди этого общего потока удается обнаружить любопытные экземпляры. В данном случае речь идет даже не об исполняемом файле, а о файле данных, который представляет из себя конфигурационный файл легитимного приложения. Такой файл и попал к нам в руки.
Дальнейший анализ подозрительного файла показал, что он является вредоносным и приводит к срабатыванию уязвимости в продукте Uploader! компании Ksoft. Ниже указаны подробности работы эксплойта и краткое описание его полезной нагрузки.
Сам эксплойт, т. е. обнаруженный нами специальным образом сформированный файл конфигурации указанного ПО, использует для своей работы уязвимость типа buffer overflow (BufferOv). Программа Uploader! разработана для работы пользователя с FTP-протоколом. Такие ее настройки как адрес удаленного FTP-хоста и имя пользователя хранятся в упомянутом файле конфигурации с названием uploadpref.dat.
Код PoC для этого эксплойта был опубликован еще в марте 2014 г.
Файл конфигурации инструмента Uploader! состоит из набора строк, в который входит строка с именем пользователя и названием целевого хоста сервера для загрузки (upload) файлов. Для обработки данных файла и его последующего разбора, приложение использует стандартный входящий поток C++ под названием std::ifstream. При чтении строк из файла, приложение корректно проверяет размер с использованием C++ функции in_stream.get(buffer, sizeof(buffer), ‘\n’). Однако, код приложения обрабатывающий последнее поле в файле с зашифрованным паролем использует код in_stream >> buffer, причем массив buffer расположен на стеке. В том случае, когда приложение не вызывает функцию in_stream.width(…), вызов in_stream >> buffer приведет к заполнению буфера buffer на стеке до тех пор, пока не будет достигнут конец файла или символ white space.
Рис. Уязвимость присутствует в вызове in_stream >> encrypted_password, который позволяет эксплойту переполнить буфер на стеке и выполнить нужный код.
Специалисты ESET оперативно связались с разработчиками этого ПО и сообщили им о найденной уязвимости. В течение 24 часов специалисты Ksoft исправили уязвимость и выпустили новую версию Uploader! v 3.6.
Проанализированный нами вредоносный файл uploadpref.dat заставляет программу скопировать необходимое количество данных на стек и переполнить буфер, размер которого фиксирован и составляет 80 байт. В результате перезаписи данных, размещенных перед переменной buffer, эксплойт повреждает фрейм структуры SEH (Structured Exception Handler) и размещает там шелл-код, а также указатель на него в фрейме. Копирование данных в переполненный буфер останавливается исключением (exception), которое сигнализирует о достижении вершины стека и обращении по недопустимому в памяти адресу (access violation). В результате произошедшего исключения, Windows вызывает функцию по указателю из фрейма SEH, который уже был перезаписан эксплойтом. Этот новый адрес указывает на гаджет с кодом из адресного пространства Uploader!.. Гаджет представляет из себя набор инструкций pop ecx; pop ecx; ret. После выполнения этих инструкций происходит передача потока исполнения на первый шелл-код эксплойта, который уже расположен на стеке.
Рис. Вид из отладчика ситуации срабатывания исключения при нарушении доступа к памяти на стеке. В окне команд видны инструкции гаджета, с которого передается управление на шелл-код.
Метод перезаписи обработчиков SEH является уже довольно древним и детально был описан командой Corelan Team на их сайте. Операционные системы Windows Vista SP1+ содержат в своем составе специальную функцию под названием Structured Exception Handling Overwrite Protection (SEHOP), которая защищает приложения от нелегитимной перезаписи обработчиков SEH на уровне ОС. Такая функция выключена по умолчанию на клиентских выпусках Windows и включена по умолчанию на серверных. Включение такой функции на клиентских выпусках Windows может быть выполнено с использованием инструмента EMET или этой инструкции. Кроме этого, поддержку механизма SEHOP должно обеспечивать и само приложение, которое должно быть скомпоновано с использованием опции /SAFESEH (отсутствует у Uploader!).
Эксплойт основан на том PoC, ссылку на который мы привели выше, он содержит схожие с ним последовательности команд pop; pop; ret в начале файла. В случае с оригинальным PoC, их значительно больше и всего насчитывается 178 команд. Прочие части эксплойта, такие как шелл-код и уровни его исполнения были добавлены самими авторами.
Рис. Заголовок uploadpref.dat из PoC.
Рис. Заголовок uploadpref.dat из эксплойта.
Перед запуском полезной нагрузки, эксплойту необходимо выполнить несколько этапов своего кода.
На нулевом этапе (Stage 0) шелл-код получает управление от кода обработчика SEH, который указывает на гаджет с последовательностью инструкций pop ecx; pop ecx; ret. Первые инструкции шелл-кода распаковывают код последующего уровня (shell_code_1). Он вычисляет однобайтовое значение из двухбайтового слова и записывает его в тот же участок памяти.
Рис. Код распаковки последующей части шелл-кода.
В конце первого уровня (Stage 1) содержимое всего файла uploadpref.dat будет скопировано в память. Для этой цели шелл-код использует функции Windows API, получая их адреса путем анализа таблиц экспортов соответствующих системных библиотек Windows напрямую. Поиск функции выполняется на основе рассчитанного хэша ее названия. Расчет хэша производится за счет суммирования каждого отдельного шестнадцатеричного представления символа из названия функции в нижнем регистре и умножением промежуточной суммы итерации на два. Ниже представлен код на Python, реализующий этот алгоритм.
Интересно отметить, что данный алгоритм расчета хэша идентичен указанному в качестве примера в книге авторов Chris Anley и John Heasman под названием «The Shellcoder’s Handbook: Discovering and Exploiting Security Holes». Его реализацию на языке C можно найти на странице 145 второго издания книги.
После получения соответствующих адресов функций, код shell_code_1 выделяет в памяти два буфера размером с размер файла uploadpref.dat. Содержимое всего файла копируется в один из буферов, а второй остается нетронутым. После этого шелл-код передает управление коду из этого файла, расположенному по смещению 0x10 от начала файла. Ниже этот код указан на C.
На втором уровне (Stage 2) функция распаковывает данные по смещению 0x650 от их начала в буфер memblock2. Для декомпрессии данных используется достаточно неэффективный алгоритм, после чего их размер составляет 3,632 байт. После этой операции, управление передается на начало блока memblock2, который содержит шелл-код третьего уровня (Stage 3).
На уровне Stage 3 код эксплойта заново открывает файл uploadpref.dat и извлекает из него PE-файл, который расположен по смещению 0x1600. Файл размещается в выделенном для него буфере памяти. Алгоритм декомпрессии идентичен тому, который использовался на предыдущем уровне. После этого эксплойт создает новый процесс в приостановленном (suspend) режиме, внедряет туда исполняемый файл и запускает его. Извлеченный из uploadpref.dat PE-файл имеет размер 56,832 байт и специализируется на загрузке и исполнении дроппера Gh0st RAT.
Ниже в таблице указана структура файла uploadpref.dat.
Загрузчик копирует оригинальный файл с эксплойтом (uploadpref.dat) и извлеченный оттуда свой файл под названием msfeedssync.exe в директорию Application Data текущего пользователя. После этого он создает ярлык на исполняемый файл и помещает его в директорию автозапуска меню Пуск. Таким образом, после перезагрузки эксплойт сработает еще раз и все шаги будут выполнены еще раз.
Рис. Ярлык в папке автозагрузки, указывающий на исполнение файла вредоносной программы.
После выполнения указанных выше операций, загрузчик считается успешно установленным в системе и после перезагрузки может успешно выполнить свою основную функцию, которая заключается в скачивании дроппера Gh0st RAT. Загрузка дроппера будет производиться с использованием протокола HTTP. Для этого вредоносная программа запускает с периодичностью в 30 мин. два потока. На основе строки user-agent протокола HTTP, которую каждый из них использует для работы с удаленным сервером, мы назвали первый поток Alan_function, а второй BFunction. Каждый из них пытается загрузить дроппер Gh0st RAT с различных URL-адресов, в которых используется одно доменное имя. После загрузки файла, он распаковывается, каждый из потоков пытается вызвать различные участки кода дроппера.
Мы смогли обнаружить первый метод распространения дроппера вредоносной программы, который использовался в марте 2015 г. Загружаемый на тот момент даунлоадером исполняемый файл был связан с самим даунлоадером, поскольку одна из его функций обфускации включала в себя и код распаковки DLL-файла дроппера с вызовом экспортируемой функции TestFunction. Эта библиотека может быть доставлена потоку BFunction для достижения тех же результатов.
Загруженный таким образом исполняемый файл Gh0st RAT представляет из себя дроппер этой вредоносной программы. Gh0st RAT уже был документирован ранее различными исследователями AV-компаний. Сетевой протокол бэкдора включает в себя строку из пяти символов для идентификации вредоносной кампании. В нашем случае идентификатор представлял из себя строку «A1CEA». Мы смогли обнаружить следующие ссылки, предоставляющие сведения по бэкдору с таким идентификатором кампании
В проанализированном нами образце Gh0st RAT использовался C&C-сервер с адресом www.phw2015.com и TCP-портом 2015. На время нашего анализа домен соответствовал IP-адресу 112.67.10.110.
Эта модификация Gh0st немного отличалась от оригинального бэкдора и содержала в себе следующие функции.
В проанализированном нами образце были активны все функции Gh0st, включая, кейлоггер.
Заключение
Проанализированный эксплойт не является особенным или даже существенным, поскольку ПО Ksoft Uploader!, для которого он предназначен, не является широко распространенным приложением. Нам практически ничего неизвестно о том, для каких целей он был использован и какими злоумышленниками, как и то, что представлял из себя вектор его распространения. Для распространения мог быть использован метод социальной инженерии, но в таком случае атака должна была быть направленной, поскольку атакующие должны были обладать информацией о присутствии на компьютере жертвы данного ПО. Так или иначе, атакующие должны были заманить потенциальную жертву на скачивание данного файла, а затем еще и указать пользователю на его использование и размещение в каталоге с самой программой.
Gh0st RAT был описан в следующих исследованиях.
Michael G. Spohn (McAfee), Know Your Digital Enemy: Anatomy of a Gh0st RAT, 2012
www.mcafee.com/ca/resources/white-papers/foundstone/wp-know-your-digital-enemy.pdf
Snorre Fagerland (Norman), The many faces of Gh0st Rat, 2012
download01.norman.no/documents/ThemanyfacesofGh0stRat.pdf
Идентификаторы компрометации (IoC)
Бэкдор использует мьютекс со следующим названием:
www.phw2015.comwww.phw2015.comwww.phw2015.com
Дальнейший анализ подозрительного файла показал, что он является вредоносным и приводит к срабатыванию уязвимости в продукте Uploader! компании Ksoft. Ниже указаны подробности работы эксплойта и краткое описание его полезной нагрузки.
Сам эксплойт, т. е. обнаруженный нами специальным образом сформированный файл конфигурации указанного ПО, использует для своей работы уязвимость типа buffer overflow (BufferOv). Программа Uploader! разработана для работы пользователя с FTP-протоколом. Такие ее настройки как адрес удаленного FTP-хоста и имя пользователя хранятся в упомянутом файле конфигурации с названием uploadpref.dat.
Код PoC для этого эксплойта был опубликован еще в марте 2014 г.
Файл конфигурации инструмента Uploader! состоит из набора строк, в который входит строка с именем пользователя и названием целевого хоста сервера для загрузки (upload) файлов. Для обработки данных файла и его последующего разбора, приложение использует стандартный входящий поток C++ под названием std::ifstream. При чтении строк из файла, приложение корректно проверяет размер с использованием C++ функции in_stream.get(buffer, sizeof(buffer), ‘\n’). Однако, код приложения обрабатывающий последнее поле в файле с зашифрованным паролем использует код in_stream >> buffer, причем массив buffer расположен на стеке. В том случае, когда приложение не вызывает функцию in_stream.width(…), вызов in_stream >> buffer приведет к заполнению буфера buffer на стеке до тех пор, пока не будет достигнут конец файла или символ white space.
Рис. Уязвимость присутствует в вызове in_stream >> encrypted_password, который позволяет эксплойту переполнить буфер на стеке и выполнить нужный код.
Специалисты ESET оперативно связались с разработчиками этого ПО и сообщили им о найденной уязвимости. В течение 24 часов специалисты Ksoft исправили уязвимость и выпустили новую версию Uploader! v 3.6.
Проанализированный нами вредоносный файл uploadpref.dat заставляет программу скопировать необходимое количество данных на стек и переполнить буфер, размер которого фиксирован и составляет 80 байт. В результате перезаписи данных, размещенных перед переменной buffer, эксплойт повреждает фрейм структуры SEH (Structured Exception Handler) и размещает там шелл-код, а также указатель на него в фрейме. Копирование данных в переполненный буфер останавливается исключением (exception), которое сигнализирует о достижении вершины стека и обращении по недопустимому в памяти адресу (access violation). В результате произошедшего исключения, Windows вызывает функцию по указателю из фрейма SEH, который уже был перезаписан эксплойтом. Этот новый адрес указывает на гаджет с кодом из адресного пространства Uploader!.. Гаджет представляет из себя набор инструкций pop ecx; pop ecx; ret. После выполнения этих инструкций происходит передача потока исполнения на первый шелл-код эксплойта, который уже расположен на стеке.
Рис. Вид из отладчика ситуации срабатывания исключения при нарушении доступа к памяти на стеке. В окне команд видны инструкции гаджета, с которого передается управление на шелл-код.
Метод перезаписи обработчиков SEH является уже довольно древним и детально был описан командой Corelan Team на их сайте. Операционные системы Windows Vista SP1+ содержат в своем составе специальную функцию под названием Structured Exception Handling Overwrite Protection (SEHOP), которая защищает приложения от нелегитимной перезаписи обработчиков SEH на уровне ОС. Такая функция выключена по умолчанию на клиентских выпусках Windows и включена по умолчанию на серверных. Включение такой функции на клиентских выпусках Windows может быть выполнено с использованием инструмента EMET или этой инструкции. Кроме этого, поддержку механизма SEHOP должно обеспечивать и само приложение, которое должно быть скомпоновано с использованием опции /SAFESEH (отсутствует у Uploader!).
Эксплойт основан на том PoC, ссылку на который мы привели выше, он содержит схожие с ним последовательности команд pop; pop; ret в начале файла. В случае с оригинальным PoC, их значительно больше и всего насчитывается 178 команд. Прочие части эксплойта, такие как шелл-код и уровни его исполнения были добавлены самими авторами.
Рис. Заголовок uploadpref.dat из PoC.
Рис. Заголовок uploadpref.dat из эксплойта.
Перед запуском полезной нагрузки, эксплойту необходимо выполнить несколько этапов своего кода.
На нулевом этапе (Stage 0) шелл-код получает управление от кода обработчика SEH, который указывает на гаджет с последовательностью инструкций pop ecx; pop ecx; ret. Первые инструкции шелл-кода распаковывают код последующего уровня (shell_code_1). Он вычисляет однобайтовое значение из двухбайтового слова и записывает его в тот же участок памяти.
Рис. Код распаковки последующей части шелл-кода.
В конце первого уровня (Stage 1) содержимое всего файла uploadpref.dat будет скопировано в память. Для этой цели шелл-код использует функции Windows API, получая их адреса путем анализа таблиц экспортов соответствующих системных библиотек Windows напрямую. Поиск функции выполняется на основе рассчитанного хэша ее названия. Расчет хэша производится за счет суммирования каждого отдельного шестнадцатеричного представления символа из названия функции в нижнем регистре и умножением промежуточной суммы итерации на два. Ниже представлен код на Python, реализующий этот алгоритм.
def hash_name(name):
result = 0
for c in name:
result = 2 * (result + (ord | 0x60))
return result
Интересно отметить, что данный алгоритм расчета хэша идентичен указанному в качестве примера в книге авторов Chris Anley и John Heasman под названием «The Shellcoder’s Handbook: Discovering and Exploiting Security Holes». Его реализацию на языке C можно найти на странице 145 второго издания книги.
После получения соответствующих адресов функций, код shell_code_1 выделяет в памяти два буфера размером с размер файла uploadpref.dat. Содержимое всего файла копируется в один из буферов, а второй остается нетронутым. После этого шелл-код передает управление коду из этого файла, расположенному по смещению 0x10 от начала файла. Ниже этот код указан на C.
HANDLE f = CreateFileA(“uploadpref.dat”, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
DWORD uploadpref_size = GetFileSize(f, 0);
char * memblock1 = VirtualAlloc(NULL, uploadpref_size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
char * memblock2 = VirtualAlloc(NULL, uploadpref_size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
ReadFile(f, memblock1, uploadpref_size);
stage_2 = &memblock1[0x10];
stage_2(&memblock1[0x650], memblock2);
//адрес буфера memblock2 передается коду эксплойта в качестве аргумента, туда эксплойт в последующем передаст управление
На втором уровне (Stage 2) функция распаковывает данные по смещению 0x650 от их начала в буфер memblock2. Для декомпрессии данных используется достаточно неэффективный алгоритм, после чего их размер составляет 3,632 байт. После этой операции, управление передается на начало блока memblock2, который содержит шелл-код третьего уровня (Stage 3).
На уровне Stage 3 код эксплойта заново открывает файл uploadpref.dat и извлекает из него PE-файл, который расположен по смещению 0x1600. Файл размещается в выделенном для него буфере памяти. Алгоритм декомпрессии идентичен тому, который использовался на предыдущем уровне. После этого эксплойт создает новый процесс в приостановленном (suspend) режиме, внедряет туда исполняемый файл и запускает его. Извлеченный из uploadpref.dat PE-файл имеет размер 56,832 байт и специализируется на загрузке и исполнении дроппера Gh0st RAT.
Ниже в таблице указана структура файла uploadpref.dat.
Загрузчик копирует оригинальный файл с эксплойтом (uploadpref.dat) и извлеченный оттуда свой файл под названием msfeedssync.exe в директорию Application Data текущего пользователя. После этого он создает ярлык на исполняемый файл и помещает его в директорию автозапуска меню Пуск. Таким образом, после перезагрузки эксплойт сработает еще раз и все шаги будут выполнены еще раз.
Рис. Ярлык в папке автозагрузки, указывающий на исполнение файла вредоносной программы.
После выполнения указанных выше операций, загрузчик считается успешно установленным в системе и после перезагрузки может успешно выполнить свою основную функцию, которая заключается в скачивании дроппера Gh0st RAT. Загрузка дроппера будет производиться с использованием протокола HTTP. Для этого вредоносная программа запускает с периодичностью в 30 мин. два потока. На основе строки user-agent протокола HTTP, которую каждый из них использует для работы с удаленным сервером, мы назвали первый поток Alan_function, а второй BFunction. Каждый из них пытается загрузить дроппер Gh0st RAT с различных URL-адресов, в которых используется одно доменное имя. После загрузки файла, он распаковывается, каждый из потоков пытается вызвать различные участки кода дроппера.
- Поток Alan_function ожидает, что загруженный файл представляет из себя исполняемый PE-файл и просто запускает его на исполнение, передавая управление на точку входа.
- Поток BFunction ожидает, что загруженный файл представляет из себя DLL-библиотеку. В таком случае, он вызовет из нее экспортируемую функцию с названием TestFunction.
Мы смогли обнаружить первый метод распространения дроппера вредоносной программы, который использовался в марте 2015 г. Загружаемый на тот момент даунлоадером исполняемый файл был связан с самим даунлоадером, поскольку одна из его функций обфускации включала в себя и код распаковки DLL-файла дроппера с вызовом экспортируемой функции TestFunction. Эта библиотека может быть доставлена потоку BFunction для достижения тех же результатов.
Загруженный таким образом исполняемый файл Gh0st RAT представляет из себя дроппер этой вредоносной программы. Gh0st RAT уже был документирован ранее различными исследователями AV-компаний. Сетевой протокол бэкдора включает в себя строку из пяти символов для идентификации вредоносной кампании. В нашем случае идентификатор представлял из себя строку «A1CEA». Мы смогли обнаружить следующие ссылки, предоставляющие сведения по бэкдору с таким идентификатором кампании
- Образец, который был обнаружен в декабре 2013 г. и был загружен в базу Malwr.
- Правило Snort, которое было добавлено 3 марта 2015 г.
- Анализ образца вредоносной программы на корейском портале Wins.
В проанализированном нами образце Gh0st RAT использовался C&C-сервер с адресом www.phw2015.com и TCP-портом 2015. На время нашего анализа домен соответствовал IP-адресу 112.67.10.110.
Эта модификация Gh0st немного отличалась от оригинального бэкдора и содержала в себе следующие функции.
- Функция сбора данных о характеристиках компьютера.
- Специальная функция под названием «TestFunction», которая загружает прочие вредоносные компоненты бэкдора.
В проанализированном нами образце были активны все функции Gh0st, включая, кейлоггер.
Заключение
Проанализированный эксплойт не является особенным или даже существенным, поскольку ПО Ksoft Uploader!, для которого он предназначен, не является широко распространенным приложением. Нам практически ничего неизвестно о том, для каких целей он был использован и какими злоумышленниками, как и то, что представлял из себя вектор его распространения. Для распространения мог быть использован метод социальной инженерии, но в таком случае атака должна была быть направленной, поскольку атакующие должны были обладать информацией о присутствии на компьютере жертвы данного ПО. Так или иначе, атакующие должны были заманить потенциальную жертву на скачивание данного файла, а затем еще и указать пользователю на его использование и размещение в каталоге с самой программой.
Gh0st RAT был описан в следующих исследованиях.
Michael G. Spohn (McAfee), Know Your Digital Enemy: Anatomy of a Gh0st RAT, 2012
www.mcafee.com/ca/resources/white-papers/foundstone/wp-know-your-digital-enemy.pdf
Snorre Fagerland (Norman), The many faces of Gh0st Rat, 2012
download01.norman.no/documents/ThemanyfacesofGh0stRat.pdf
Идентификаторы компрометации (IoC)
Бэкдор использует мьютекс со следующим названием:
www.phw2015.comwww.phw2015.comwww.phw2015.com
lostpassword
Круто!
Как выглядит оповещение о уязвимости? У вас есть какой-то стандартный шаблон письма?Жаль, что я почти не умею в реверс-инжиниринг...(
А еще заинтересовала вот эта фраза: