Trojan.DnsAmp.1 — обзор и техническое описание


Trojan.DnsAmp.1 — троянская программа, разработанная китайскими вирусописателями, основное назначение которой организация DDoS-атак. Вредонос представляет собой Windows-совместимую версию одного из троянов семейства Linux.DnsAmp.

Он устанавливается в систему под видом автоматически запускаемой службы Windows

  • Test My Test Server 1.0

при этом ее исполняемый файл сохраняется в системной папке под именем

  • vmware-vmx.exe.


После своего запуска Trojan.DnsAmp.1 отправляет на серверы злоумышленников информацию об инфицированном компьютере, а в ответ ожидает поступления команды на проведение DDoS-атаки. Кроме этого, троян способен загружать и запускать на исполнение другую вредоносную программу.

Сам Trojan.DnsAmp.1 состоит из дроппера, размещающего вредоносный файл на диске инфицированного компьютера, а также нескольких файлов, в одном из которых реализован основной вредоносный функционал. Trojan.DnsAmp.1 способен реализовывать следующие виды DDoS-атак:

  • Syn Flood;
  • UDP Flood;
  • Ping Flood;
  • HTTP Get Flood,

а также загружать и запускать на инфицированном ПК другие вредоносные программы.

В ходе мониторинга заражений в период с 5 июня по 13 августа 2014 года, наибольшее количество DDoS-атак, предпринятых с использованием троянов данного семейства, пришлось на китайские сайты - 28 093 атаки, а также на ресурсы, расположенные на территории США.

География DDoS-атак Trojan.DnsAmp.1


Технические характеристики Trojan.DnsAmp.1

Дроппер
Читает 0x90 байт с конца файла, после чего расшифровывает их с помощью алгоритма RC4 с ключом {F918FE01-164A-4e62-9954-EDC8C3964C1B}. Расшифрованные данные имеют следующую структуру:

  • struct DROP_INFO
    {
        char szFirstDrop[0x40];
    // имя первого файла
        DWORD dwFirstDropData; // смещение до первого файла
        DWORD dwFirstDropSize; // размер первого файла
        char szSecondDrop[0x40]; // имя второго файла
        DWORD dwSecondDropData; // смещение до второго файла
        DWORD dwSecondDropSize; // размер второго файла
    }

Данные файлов располагаются по смещениям:

  • "dwSecondDropData - dwFirstDropData"

и

  • "Filesize + 0x90 – dwSecondDropData".


Далее дроппер расшифровывает файлы с помощью алгоритма RC4 с ключом

  • для первого файла - {E5A42E7E-8130-4f46-BECC-7E43235496A6};
  • для второго файла - {ADAB6D32-3994-40e2-8C18-2F226306408C}


При этом файлы сохраняются в папку %TEMP%, после чего запускаются.

Один из файлов является трояном Trojan.DnsAmp.1


Установка
Вредонос устанавливает себя в систему под видом автоматически запускающейся службы с именем

  • Windows Test My Test Server 1.0,

создает собственную копию в папке

  • %System32%

под именем

  • vmware-vmx.exe.


После запуска проверяет текущую дату и если она ранее 2013-02-21, то троян бездействует.


Вредоносный функционал
Установив соединение с двумя командными серверами, Trojan.DnsAmp.1 отправляет туда собранную информацию о системе. И если на инфицированном компьютере используется ОС Windows 7 или Windows NT, то отправляемые данные будут иметь вид структуры PC_INFO_WIN7, для остальных версий ОС Windows данные будут иметь вид структуры PC_INFO.

  • struct PC_INFO
    {
        DWORD signature;
    //"UU\t"
        char szOSVersion[16]; //версия ОС
        DWORD dwSpuSpeed; //скорость CPU в МГц
        BYTE dummy[492]; //нули
    }
     
  • struct PC_INFO_WIN7
    {
        DWORD signature;
          //"UU\t"
        char szOSVersion[16]; //версия ОС
        BYTE dummy[48];       //нули
        DWORD dwSpuSpeed;     //скорость CPU в МГц
        BYTE dummy1[444];     //нули
    }


Значение szOSVersion может являться одной из следующих строк:

  • Windows NT         
  • Windows 7          
  • Windows Server 2008
  • Windows Vista                  
  • Windows Server 2003
  • Windows XP         
  • Windows Server 2000


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

  • struct PC_INFO_NETWORK_DATA
    {
        DWORD signature;
    // "ИИ\b"
        DWORD dwPacketsCount; // Вычисленное количество переданных байт
        BYTE dummy[508]; //нули
    }


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

  • struct CMD_PACKET
    {
        DWORD Cmd;
    //команда
        BYTE Parameter[512]; //параметр для выполнения команды
    }


Возможны три команды:

Tri comandi TrojanDnsAmp1

При поступлении команды начать DDoS-атаку троян проверяет текущее состояние соответствующего флага. И если атака уже идет, то команда игнорируется.

Формат параметра для DDoS команды имеет следующий вид:

  • struct DDOS_PARAMS
    {
        char szHost;
    // С-строка содержащая IP адрес для атаки
        DWORD dummy[95]; //нули
        WORD wPort; // порт хоста, на который будет осуществлена атака
        WORD dummy2; // нули
        DWORD dwDuration; // длительность DDoS атаки в секундах
        DWORD dwThreadsCount; //количество потоков для DDoS атаки
        DWORD dwType; // тип DDoS атаки
        DWORD dwFlag; // дополнительный флаг, имеет разное значение при различных видах атак
    }


Поддерживаемый тип атак

  • Syn Flood
  • UDP Flood
  • Ping Flood
  • HTTP Get Flood


При портировании трояна с ОС Linux на ОС Windows авторы отказались от использования атаки типа DNS Amplification, заменив ее на атаку типа HTTP Get Flood.


Загрузка файлов
Для скачивания файлов троян Trojan.DnsAmp.1 загружает в память библиотеку urlmon.dll и получает адрес функции URLDownloadToFileA. Ссылка на скачивание файла находится по нулевому смещению параметра Parameter структуры CMD_PACKET.

Файл скачивается в папку %TEMP%, при этом имя файла формируется следующим образом:

  • DWORD GetRnd(DWORD modulus)
    {
      DWORD dwTicks;
      dwTicks = GetTickCount();
      return ticks * (rand() + 3) % modulus;
    }
    ...
    dwRnd0 = GetRnd(26u) + 97;
    dwRnd1 = GetRnd(26u) + 97;
    dwRnd2 = GetRnd(26u) + 97;
    dwRnd3 = GetRnd(26u) + 97;
    dwRnd4 = GetRnd(26u) + 97;
    wsprintfA(wszFileName, "%c%c%c%c%c.exe", dwRnd4, dwRnd3, dwRnd2, dwRnd1, dwRnd0);
    strcat(szTmpDir, szFileName);