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

Статья RAMNIT BOT

Ar3s

Старожил форума
Легенда
Регистрация
30.12.2004
Сообщения
3 357
Реакции
1 404
malware_clustering_wc.png

Вступление от coru.ws

Добрый день, если Вы чувствуете в себе силы писать хорошие материалы, мы будем рады увидеть Вас у себя в гостях https://coru.ws/invite Для экстренной связи: (jid) invite@coru.ws

Предисловие
В сети плавает огромное количество качественной аналитики малвари. К сожалению почти вся она на английском, но многим из нас всё же приятнее читать статьи на Русском. В аналитике скрываются интересные методы, некоторые их них уже стали историей. Для вирусных аналитиков цель - поймать вирус. Для нас - сделать его более живучим, позаимствовать интересные идеи из работы коллег по цеху. Скорее всего имеется много опечаток, ибо текст я не проверял. Обзор получился весьма интересным.


RAMNIT BOT

Впервые появился ~ в апреле 2010, как файловый инфектор, заражающий pe32(.exe, .scr и .dll) и HTML-документы. Сейчас это многокомпонентный бот, который может воровать важные данные, такие как FTP-аккаунты и куки из браузера. В течении лета 2011 ramnit достиг пика своей популяции, занимая более 17% от всех случаев заражения.
Однако очевидно, что владельцы ботнета не могли быть удовлетоврены одним лишь взятием этой отметки, и область интересов малвари сдвинулась с одного заражения и кражи учетных данных к атакам на финансовые учреждения, позаимствовав некоторые модули из утёкшего Zeus.

В этой статье мы погрузимся глубже в анализ Ramnit, в функциональность каждого из его компонентов. ВЫ увидите каким мощным зверем он стал, и мы прольём свет на его вероятные пути развития.

1. INSTALLER
Инсталлятор обсуждаемый в этой части статьи имеет два уровня упаковки,
собственный пакер и UPX. После того как инсталлятор попадает на компьютер жертвы, он распаковывает полезную нагрузку (в процессе исполнения, а не постоянно - прим.пер.), копирует самого себя в системную папку и добавляет ключ в ветку авторана. Основная работа инсталлятора, это инжект двух DLL (имеющих статик имена Rmnsoft.dll и Modules.dll) в контекст легитимного системного процесса или в браузер.
Эти 2 dll общаются между собой и скачивают другие модули из C&C-сервера.
Скачанные модули имеют значительные возможности с точки зрения кражи конфиденциальной информации с локального компьютера и угона(hijacking) сессий для онлайн-банкинга. В дополнении к этому, устанавливается rootkit-драйвер, для защиты бота через сокрытие веток реестра и "убийства" антивирусного софта. Более того, отключая User Account Control и сервис Trusteer Rapport'а, ramnit получает необходимые привилегии, чтобы избежать обнаружения.

В рамках подготовки к инжекции dll, инсталлятор ищет расположение svchost и установленного браузера. Он подменяет системные сервисы WriteVirtualMemory и ZwCreateUserProcess. Метод инжекта обоих dll одинаков, запускается копия svchost.exe, используемый в качестве "оболочки", для внедрённых модулей. Если попытка инжекта провалилась, тоже самое происходит с предварительно найденым exe браузера. После успешного внедрения, создаётся событие (CreateEvent - прим.пер.), сигнализирующие установщику, что пора снимать перехват с системных сервисов. Единственность одновременного существования модулей в системе проверяется через создание мьютексов (mutex).

2. RAMNIT MODULES
Как мы упоминали ранее, различные модули представляют различный функционал, тут их детальное описание.

2.1 Модуль для связи: Rmnsoft.dll
Это первый модуль, внедряемый в чужое АП, так что мы считаем что он играет ключевую роль среди всех модулей. По-факту, это единственный модуль, который связывается с CnC, это центральный компонент на заражённой системе. Его работа состоит из нескольких частей:

2.1.1 Установка
Авторан происходит посредством ветки

Код:
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\

Для того чтобы решить, куда стоит выплюнуть вторую копию, Dll делает попытку записи временного файла в следующие директории:

Код:
1. %UserProfile%\Local Settings\Application Data\
2. %ProgramFiles%
3. %CommonProgramFiles%
4. %UserProfile%
5. %AppData%
6. System directory
7. %WinDir%
8. %Temp% 
9. Current directory

После нахождения доступной для записи директории, ramnit создаёт в ней дочернюю папку со случайным именем и помещает туда вторую копию инсталлятора. Типичнейшее место обитания выглядит так:

Код:
%UserProfile%\Local Settings\Application Data\slyaqmdg\brqmbmmw.exe

Для авторана второй копии используются следующая ветка CurrentVersion\Run в HKLM.

2.1.2 Убийство процессов AV
Rmnsoft.dll получает список антивирусного софта от CnC и делает попытку убийства процесса. Более того, он посылает список модулю руткита, который наносит второй удар по защитному ПО, в режиме ядра.

1.jpg


2.1.3 Куки: удаление и загрузка
Rmnsoft.dll собирает список мест, где хранятся cookies различных браузеров, для сбора и удаления локальных кук по команде от C&C-сервера. Вот список браузеров:

Код:
• Windows IE
• Firefox
• Opera
• Safari
• Chrome
• Flash SOL

Rmnsoft.dll загружает краденые куки на сервер, однако работа по их сборке осуществляется другим модулем.

2.1.4 Снятие скриншотов
Rmnsoft.dll так же создаёт поток, который в состоянии делать снимки экрана и перегонять их в JPEG. Каждый снимок хранится вместе с датой создания. Скриншоты отсылаются на сервер, для дальнейшего использования.

2.1.5 Связь с сервером
TCP-коннект на 443 порт (HTTPS) используется для связи между Rmnsoft.dll и CnC-сервером. RC4 с ключом "black" используется для шифрования трафика. Доменное имя жёстко прописано в модуле. Алгоритм генерации доменного имени (Domain Generating Algorithm) применяется для конструирования новых CnC-адресов, вроде этих:

Код:
htmthgurhtchwlhwklf.com
jiwucjyxjibyd.com
khddwukkbwhfdiufhaj.com
snoknwlgcwgaafbtqkt.com
tfgyaoingy.com
ukiixagdbdkd.com


Для регистрации заражённой машины в системе CnС используются два md5-хеша. Первый берётся от внутренней структуры бота:

Код:
typedef struct BotSysInfo {
DWORD VolumeSerialNumber;
DWORD BuildNumber;
DWORD MajorVersion;
DWORD MinorVersion;
WORD ProcessorArchitecture;
DWORD ActiveProcessorMask;
DWORD NumberOfProcessors;
DWORD ProcessorType;
WORD ProcessorLevel;
WORD ProcessorRevision;
BYTE ComputerName[LenComputerName];
}

Так генерируется первый md5, затем к нему присоединяется строка ‘45Bn99gT’ и от суммарной строки берётся второй md5. Эти два значения отсылаются на CnC-сервер, для регистрации бота.

2.jpg


Структура представленная на рисунке, описывается следующим образом:

Код:
typedef struct BotRegInfo {
 BYTE  Operation;  //value is 0xE2
 BYTE Zero;
 DWORD Len1;  //value is 0x20 BYTE FirstEncryptedMD5[Len1];
 BYTE Zero;
 DWORD Len2;  //value is 0x20 BYTE SecondEncryptedMD5[Len2];
}


Поле Operation отвечает за различные действия, такие как:

Код:
0x10: загрузка скриншотов
0x15: загрузка куки
0x16: получение информации о том, когда куки должны быть 
загружены
0x18: получение информации о том, как часто нужно отправлять скриншоты
0x1A: получение списка av-софта.
0x21: получение определённого модуля
0x23: получение списка модулей
0x50: отчёт об ошибке
0xE2: регистрация бота
0xF0: загрузка локальной информации и получение команды
0xF8: отчёт о состоянии выполнения команды

В протоколе общения бота с сервером, данные организованы в данной структуре:

Код:
typedef struct CommunicationData {
 WORD  Flag;   //value is 0xFF00
DWORD  SizeOfFollowingData;
BYTE  Operation;
DataEntry Array[];
}


Rmnsoft.dll дважды вызывает апи "send", для передачи сперва первых 6 байт, и второй раз для передачи всего остального.
В зависимости от первого байта (принимающего значения 0x00, 0x01, 0x02), структура DataEntry имеет различный вид.
Если флаг равен нулю, то следующий:

Код:
typedef struct DataEntry {
 BYTE  Flag;   //value is 0x00
DWORD SizeOfRC4EncryptedData;
BYTE RC4EncryptedData[SizeOfRC4EncryptedData];
}


Код:
typedef struct DataEntry {
 BYTE  Flag;   //value is 0x01
DWORD Data;
}


Код:
typedef struct DataEntry {
 BYTE  Flag;   //value is 0x02
DWORD Data1;
DWORD Data2;
}

Rmnsoft.dll периодически подключается к CnC-серверу, закачивает локальные данные и получает команды, как показано на следующем рисунке:

3.jpg


Вот полный список поддерживаемых команд:

• getexec: Скачивание и запуск исполняемого файла, из заданного URL. Сохраняет его в "[folder]\[subfolder]\[name].exe", где первая папка это место хранения второй копии бота, а вторая это дополнительный аргумент команды. Благодаря этой команде злоумышленник имеет возможность предоставлять сервис по продаже загрузок.
• kos: акроним от KillOS, убийство операционной системы
• screen: создание и локальное сохранение скриншота
• update: получение новейшей копии Ramnit'a и замещение старого инсталятора .
• cookies: Устанавливает базовую метку времени, для того чтобы фильтровать сохраняемые куки, собирая только те, timestamp которых больше заданного .
• removecookies: удаляет файлы куки с локального компьютера.

2.1.6 Совместная работа с Modules.dll
Работая совместно с Modules.dll, Rmnsoft.dll скачивает несколько других модулей. Обе dll используют именованный канал (named pipe) "\\.\pipe\wtglasop", для общения друг с другом. Modules.dll выполняет роль сервера, тогда как Rmnsoft.dll работает как клиент.

4.jpg


Всю процедуру загрузки можно разделить на несколько шагов:
1. Rmnsoft.dll коннектится на пайп, который Modules.dll слушает.
2. В это время Modules.dll, чья функция - управлять модулями, скаченными из CnC, должен отправить двойное слово Rmnsoft.dll через пайп. Каждый бит этого dword отвечает за конкретный модуль, существующий на заражённой машине, назовем его "флаг".
3. Rmnsoft.dll передаёт флаг на сервер
4. CnC Отправляет список модулей, который он может предоставить.
5. Rmnsoft.dll передаёт список Modules.dll
6. Modules.dll сравнивает список с другим, полученным с локального лог-файла, содержащего информацию обо всех модулях установленных на машине. Исходя из этой информации модуль принимает решение о следующем шаге.
7. Каждый модуль, который существует на локальной машине, но не включён в список на сервере, принудительно останавливается. Вся информация об этом модуле уничтожается, в том числе и в лог-файле.
8. Каждый модуль, включенный в CnC-список, но не представленный на локальной машине скачивается с сервера.
9. Rmnsoft.dll расшифровывает скачанные модули и передаёт их Modules.dll
10. Modules.dll выполняет RC4-шифрование модулей, с ключом созданным из серийного номера диска, загружает их в процессы и сохраняет в зашифрованном виде в лог-файле.

5.jpg


Код:
typedef struct ModuleNameInfo {
 BYTE  Operation;  //value is 0x21
BYTE  Zero;
DWORD LenModuleName;
BYTE  EncryptedModuleName[LenModuleName];
BYTE  One;
DWORD Zero;
}

6.jpg


Код:
typedef struct ModuleData {
 WORD  Flag;   //value is 0xFF00 DWORD SizeOfFollowingData;
 BYTE  Operation;  //value is 0x21 BYTE Zero;
DWORD LenModuleName;
BYTE EncryptedModuleName[LenModuleName];
BYTE Zero;
DWORD Size;
BYTE EncryptedModuleBlock[Size];
}


2.2.2 Управление модулями
Для управления всеми модулями, Modules.dll поддерживает лог-файл в локальной системе, который уже упоминался выше. В нём он хранит все модули в следующей структуре:

Код:
typedef struct ModuleBlockInLog { 
DWORD HashRawModule;
DWORD Flag;
DWORD SizeEncryptedModuleBlock; 
DWORD HashEncryptedModuleBlock;
BYTE  EncryptedModuleBlock[SizeEncryptedModuleBlock];
}


HashRawModule: хеш модуля, используется для подписи файла
Flag: Имеет значение "1", если модуль полезный. "2", если модуль заброшенный.
SizeEncryptedModuleBlock: размер структуры EncryptedModuleBlock
HashEncryptedModuleBlock: хеш структуры EncryptedModuleBlock
EncryptedModuleBlock: сам шифрованный модуль

Данные в EncryptedModuleBlock зашифрованы с помощью RC4, после расшифровки обнаруживается следующая структура данных:

Код:
typedef struct ModuleBlock { 
DWORD MagicNumber;
BYTE ModuleInfo[0x114];
DWORD TimeStamp;
DWORD HashRawModule;
BYTE ModulePE[PESize];
}


MagicNumber: жёстко заданная сигнатура, а данной версии рамнита это 0xC581F364.
ModuleInfo: описание модуля
TimeStamp: отметка времени модуля
HashRawModule: хеш расшифрованного exe-файла
ModulePE: расшифрованная dll
PESize: размер exe-файла

Теперь давайте рассмотрим структуру, отвечающую за запущенные модули:


Код:
typedef struct ModuleInfoInMem {
DWORD HashRawModule;
DWORD RetValOfModuleCode;
DWORD ModuleBase;
DWORD ModuleSize;
DWORD ModuleEntry;
DWORD PtrCommandRoutine;
}


HashRawModule:хеш модуля
RetValOfModuleCode:значение, возвращенное функцией ModuleCode этого модуля
ModuleBase: базовый адрес образа
ModuleSize: размер образа
ModuleEntry: точка входа модуля
PtrCommandRoutine: VA функции CommandRoutine для модуля

2.2.3 Отчёт об ошибках
Функция баг-репорта реализована в самопальном механизме ловли исключений, реализованном внутри Modules.dll. Когда случается неисправимое исключение (потенциальный баг) в любом модуле, первым делом Modules.dll ищет проблемный модуль, сравнивая адрес в котором произошло исключение, с адресами модулей.
Затем информация об исключении записывается в локальном файле и отсылается к CnC. Modules.dll также изменяет флаг бажного модуля с 1(полезный) на 2 (заброшенный), таким образом он никогда больше не будет загружен. В конце Modules.dll вызывает апи ExitProcess (видимо ExitProcessEx - прим.пер.), для завершения процесса, содержащего бажный модуль.


2.3 Другие модули
Каждый модуль, скаченный от CnC представляет отдельный функционал бота.
Вот краткое описание всех модулей:

FTP grabber: поддерживает следующие клиенты:

Код:
NetDrive  FtpControl
32bit FTP    WinScp
LeapFtp SoftFx FTP
Fling FTP    Classic FTP
FtpExplorer  Core ftp
Coffee cup ftp    FFFtp
TurboFtp  Smart Ftp
BulletproofFTP   FtpCommander
FileZilla FlashXp
Cute FTP    WS FTP
Directory opus    Frigate 3
Far Manager    WebSitePublisher
Windows/Total commander

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

FTP daemon: устанавливает сервер, именуемый ‘RMNetwork FTP’ с юзером и паролем "userftp:passftp", что позволяет злоумышленнику легко украсть любые интересующие его данные.
фтп сервер позволяет просматривать локальные файлы, а также:
-создавать\удалять директории
-создавать\переименовывать\удалять файлы
-скачивать\закачивать файлы
-запускать на исполнение файлы

Cookie grabber: Собранные со всех браузеров куки собираются в 1 архив, с отдельными папками для каждого браузера.

VNC: Нагло украденная у Zeus.

Hooker: Ещё один заимствованный у Zeus модуль. Инжектит Html и JS в легитимные веб-страницы. Говоря привычным языком это "веб-инжект".



3. ROOTKIT
Инсталлятор выплёвывает idrtbjfj.sys в %Temp% и создаёт сервис, называя его ‘Microsoft Windows Service’. После создается устройство ‘\Device\631D2408D44C4f47AC647AB96987D4D5’, драйвер восстанавливает SSDT и Shadow SSDT, читая их с диска, что позволяет устранить антивирусы и чужую малварь.
Драйвер перехватывает несколько сервисов, для запрета изменения некоторых веток реестра (конечно же авторана ramnit'a):

Код:
ZwOpenKey 
ZwOpenKeyEx 
ZwOpenKeyTransacted 
ZwOpenKeyTransactedEx 
ZwCreateKey 
ZwCreateKeyTransacted

При вызове любой из них с фильтруемыми параметрами, драйвер возвращает STATUS_ACCESS_DENIED.
Посредством функции IoDeviceControl руткит убивает все известные ему антивирусы.

3. ЗАКЛЮЧЕНИЕ
С момента своего первого открытия в апреле 2010 года, Ramnit стал мощным ботом с расширяемой модульной архитектурой, интеграцией сложных компонентов и создает значительную угрозу информационной и финансовой безопасности частных лиц и учреждений.
Учитывая быстрое распространение Ramnit через трюки из социальной инженерии и периодические улучшения модулей, вполне вероятно, что битва против Ramnit только начинается.
NOVEMBER 2012 VIRUS BULLETIN

Источник - coru.ws
Перепост согласован с овнером.
 


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