чумачечий стиллак, сожалею аверам которые на повседневной основе реверсят такую дичь
сразу начну с того, что считаю странным в нынешних реалиях - коллы к дефолт WINHTTP.dll либе
Для коннекта с вебом (который точно использует BASE64 и еще что-то.. на прошлом опыте с аматерой & stealc скажу, что это RC4 + Base64, но ключ к RC4 я найти не смог) у запроса должен быть следующий заголовок:
Первым делом билд стучит на эндпоинт /api/live с заголовками указанными сверху, после чего оно ожидает получить назад "true", если ответ не дойдет, то билд крашнется
После чего билд вызывает функции SystemFunction036(RtlGenRandom), CreateMutexA для создания мутанта(антидубль?)
После того, как билд создал мутанта и добрал себе WinAPI экспортов связанных с криптографией, мы стучимся уже на эндпоинт /api/conf.
Но встречаемся со следующей проблемой:
Что запрос на веб, что ответ - зашифрованы.. Что делать?
На помощь приходит то, что кодер AURA использовал публичную либу nlohman json - можно предположить, что если она есть в проекте, то скорее всего, через нее будет прогоняться весь веб-траффик билд <--> клиент.
Мне не нужно изучать либу для того, чтобы узнать, где именно будет JSON пакет - я уже знаю, что я ищу функцию под названием json::dump, и что она лежит рядом со строчкой
дальше просто нахожу функцию, использующую эту строчку и ставлю бряк на ret - json::dump должен возвращать распаршенную JSON всегда
успех! у нас на руках появилась JSON-ка следующего содержания:
hosts - прокладки(стиллер является MaaS); anti_vm - запрет запуска билда на виртуалках; anti_dbg - меры против отладчика(?), run_delay - задержка перед процессом стила, build - версия билда и build_id - идентификатор билда в базе данных стиллера..
После того, как стиллер распарсил свой конфиг(я прыгал через этот код несколько минут btw)
запускается следующая функция -
Граббер
Первым делом стиллер хочет собрать Filezilla - происходит вызов ExpandEnviromentStringsW с аргументом (L"%appdata%"\\FileZilla), но из-за того, что у меня не установлена FileZilla стиллер вызывает ExpandEnviromentStringsW, но уже с аргументом (L"%localappdata%\\FileZilla"), тоже самое с ProgramFiles X86...
(маленький мемчик)
Снизу приложу список всего, что оно хочет грабнуть, но учитывайте, что оно так-же лазает и в другие директории за этими папками
после того, как все это дело грабнулось и пробежало, то мы заходим уже в следующую функцию - граб браузеров
Граб msedge
на моей виртуалке стоит только msedge, по этому скорее всего грабить будет как раз его
В этом билде используется техника, в которой спавнится msedge.exe в замороженном состоянии с параметром --headless
ну и ладно...
когда я сидел и смотрел на вызовы, то я заметил следующие дела:
Произошел вызов CreateProcessW и в моей системе появился следующий процесс -
И теперь идет пока что самое интересное, что я увидел тут:
Когда я смотрел на билд на malware-bazaar-е, то я увидел, что билд AURA тригернул YARA индикатор на HEAVENS GATE:
во время того, как я пробегал через программу - я вижу следующий код:
и да, тут используется Heavens Gate, но не простой Heavens Gate, а Hells Gate
Heavens Gate - техника для скрытия от АВ вызовов API путем исполнения в этом случае x64 кода в x32 процессе
Hells Gate в свою же очередь выступает здесь как техника вызова индерект сисколлов через Heavens Gate
следующий текст я даже объяснять не буду - на часах уже 3ий час ночи...
начало x64 кода отмечается инструкциями ret far
^^ - то, что выдает мне x32dbg
копируем эти байты и вставляем на сайт https://defuse.ca/online-x86-assembler.htm и интерпретируем это уже как x64 инструкции..
получаем вот это:
обойти это можно достаточно легко - поставить брейкпоинт на инструкцию call esi которая заводит нас сюда, сделать 1 шаг с входом в функцию, поставить breakpoint на ret(или нажать на Execute till return)
если попытаться пройти через этот код синглстепами, то у вас заспавнится прямо перед инструкциями int 3 + при попытке пробежать вперед уже будет вылезать EXCEPTION_BREAKPOINT
после того, как этот код выполнился, мы получаем следующий адрес в дампе:
(черный дебаггер - x32, белый дебаггер - x64, выделенный адрес указывает на ZwCreateThreadEx уже в x64 ntdll, при этом он находится внутри 32ух битного процесса)
на этом пока что остановлюсь, еще поресерчу и выложу уже как они грабают хром без прав админа, офк если мне вообще хватит бошки дальше прыгать по этому коду
спойлер: они декриптят хром на сервере, так-что ничего особенного скорее всего тут не будет: шелл который оно хочет запустить просто украдет токен у эджа
note: api-hammering(?), lol
сразу начну с того, что считаю странным в нынешних реалиях - коллы к дефолт WINHTTP.dll либе
Код:
sub_427592 <--- connection actvty( WinHttpCrackUrl,
WinHttpConnect,
WinHttpSetCredentials,
WinHttpAddRequestHeaders,
WinHttpSendRequest,
WinHttpWriteData,
WinHttpReceiveResponse,
WinHttpQueryHeaders,
WinHttpQueryAuthSchemes,
WinHttpQueryDataAvailable)
Для коннекта с вебом (который точно использует BASE64 и еще что-то.. на прошлом опыте с аматерой & stealc скажу, что это RC4 + Base64, но ключ к RC4 я найти не смог) у запроса должен быть следующий заголовок:
Код:
Connection: Close
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36
Первым делом билд стучит на эндпоинт /api/live с заголовками указанными сверху, после чего оно ожидает получить назад "true", если ответ не дойдет, то билд крашнется
После чего билд вызывает функции SystemFunction036(RtlGenRandom), CreateMutexA для создания мутанта(антидубль?)
После того, как билд создал мутанта и добрал себе WinAPI экспортов связанных с криптографией, мы стучимся уже на эндпоинт /api/conf.
Но встречаемся со следующей проблемой:
Что запрос на веб, что ответ - зашифрованы.. Что делать?
На помощь приходит то, что кодер AURA использовал публичную либу nlohman json - можно предположить, что если она есть в проекте, то скорее всего, через нее будет прогоняться весь веб-траффик билд <--> клиент.
Мне не нужно изучать либу для того, чтобы узнать, где именно будет JSON пакет - я уже знаю, что я ищу функцию под названием json::dump, и что она лежит рядом со строчкой
Код:
"{\"bytes\":["
дальше просто нахожу функцию, использующую эту строчку и ставлю бряк на ret - json::dump должен возвращать распаршенную JSON всегда
успех! у нас на руках появилась JSON-ка следующего содержания:
Код:
"{\"conf\":
{\"hosts\": [\"https://armydevice.shop\",\"https://glossmagazine.shop\"],
\"anti_vm\": true,
\"anti_dbg\": true,
\"self_del\": true,
\"run_delay\": 0,
\"useragents\": [\"\"]},
\"build\": {\"ver\": \"1.0.0\",
\"build_id\": \"9f594914-9bc5-422b-b4d7-8733894b0b5c\"}}"
После того, как стиллер распарсил свой конфиг(я прыгал через этот код несколько минут btw)
запускается следующая функция -
Граббер
Первым делом стиллер хочет собрать Filezilla - происходит вызов ExpandEnviromentStringsW с аргументом (L"%appdata%"\\FileZilla), но из-за того, что у меня не установлена FileZilla стиллер вызывает ExpandEnviromentStringsW, но уже с аргументом (L"%localappdata%\\FileZilla"), тоже самое с ProgramFiles X86...
(маленький мемчик)
Снизу приложу список всего, что оно хочет грабнуть, но учитывайте, что оно так-же лазает и в другие директории за этими папками
Код:
%appdata%\\Telegram Desktop\\tdata
%appdata%\\Discord\\Local Storage\\leveldb
%appdata%\\Discord PTB\\Local Storage\\leveldb
%appdata%\\.purple
%appdata%\\Psi
%appdata%\\Tox
%appdata%\\OpenVPN Connect\\profiles
%localappdata%\\NordVPN
%localappdata%\\ProtonVPN
%programfiles%\\Steam
%programfiles%\\Steam\\config
%localappdata%\\Ubisoft Game Launcher
%localappdata%\\Authy Desktop\\Local Storage\\leveldb
%appdata%\\Anoncoin
%appdata%\Armory
%appdata%\atomic
%appdata%\atomic\Local Storage\leveldb
%appdata%\BBQCoin
%appdata%\Blockstream\Green\Wallets
%appdata%\bytecoin
%appdata%\Bitcoin\\Wallets
%appdata%\Binance
%appdata%\DashCore
%appdata%\Daedalus Mainnet
%appdata%\Coinomi\Coinomi\wallets
%localappdata%\Dogecoin
%localappdata%\devcoin
%localappdata%\digitalcoin
%localappdata%\ElectronCash\\walets
%appdata%\Electrum\\walets
%localappdata%\Electrum-LTC\\walets
%appdata%\\Etherium
%appdata%\Exodus
%appdata%\Exodus\backups
%appdata%\Exodus\exodus.wallet
%appdata%\Florincoin
%appdata%\Franko
%appdata%\Freiccoin
%appdata%\Guarda
%appdata%\GoldCoinGLD
%appdata%\InfiniteCoin
%appdata%\IOCoin
%appdata%\IxCoin
%appdata%\com.liberty.jaxx\IndexedDB
%appdata%\jaxx\Local Storage
%appdata%\Litecoin
%appdata%\Ledger Live
%appdata%\Ledger Live\Local Storage\leveldb
%appdata%\Ledger Live\Local Storage\Session Storage
%appdata%\Megacoin
%appdata%\Mincoin
%appdata%\MultiDoge
%appdata%\NameCoin
%appdata%\Primecoin
%appdata%\WalletWasabi\Client\Wallets
%appdata%\Terracoin
%appdata%\YACoin
%appdata%\ZCash
%appdata%\Google\Chrome\User Data
%appdata%\Google\Chrome Beta\User Data
%appdata%\Google\Chrome SxS\User Data
%appdata%\Google\Chrome Dev\User Data
%appdata%\Google\Chrome Unstable\User Data
%appdata%\Google\Chrome Canary\User Data
%appdata%\Google (x86)\Chrome\User Data
%appdata%\Google (x86)\Chrome Beta\User Data
%appdata%\Google (x86)\Chrome SxS\User Data
%appdata%\Google (x86)\Chrome Dev\User Data
%appdata%\Google (x86)\Chrome Unstable\User Data
%appdata%\Google (x86)\Chrome Canary\User Data
%appdata%\Chromium\User Data
%localappdata%\Microsoft\Edge\User Data
Граб msedge
на моей виртуалке стоит только msedge, по этому скорее всего грабить будет как раз его
В этом билде используется техника, в которой спавнится msedge.exe в замороженном состоянии с параметром --headless
ну и ладно...
когда я сидел и смотрел на вызовы, то я заметил следующие дела:
Произошел вызов CreateProcessW и в моей системе появился следующий процесс -
И теперь идет пока что самое интересное, что я увидел тут:
Когда я смотрел на билд на malware-bazaar-е, то я увидел, что билд AURA тригернул YARA индикатор на HEAVENS GATE:
во время того, как я пробегал через программу - я вижу следующий код:
и да, тут используется Heavens Gate, но не простой Heavens Gate, а Hells Gate
Heavens Gate - техника для скрытия от АВ вызовов API путем исполнения в этом случае x64 кода в x32 процессе
Hells Gate в свою же очередь выступает здесь как техника вызова индерект сисколлов через Heavens Gate
следующий текст я даже объяснять не буду - на часах уже 3ий час ночи...
начало x64 кода отмечается инструкциями ret far
Код:
022E0014 | 8B4D 10 | mov ecx,dword ptr ss:[ebp+10] |
022E0017 | 67:48 | dec eax | eax:&"LdrGetProcedureAddress"
022E0019 | 8B55 18 | mov edx,dword ptr ss:[ebp+18] |
022E001C | 67:4C | dec esp |
022E001E | 8B45 20 | mov eax,dword ptr ss:[ebp+20] |
022E0021 | 67:4C | dec esp |
022E0023 | 8B4D 28 | mov ecx,dword ptr ss:[ebp+28] | [ebp+28]:&"LdrGetProcedureAddress"
022E0026 | 67:48 | dec eax | eax:&"LdrGetProcedureAddress"
022E0028 | 8B45 30 | mov eax,dword ptr ss:[ebp+30] |
022E002B | A8 01 | test al,1 |
022E002D | 75 04 | jne 22E0033 |
022E002F | 48 | dec eax | eax:&"LdrGetProcedureAddress"
022E0030 | 83EC 08 | sub esp,8 |
022E0033 | 57 | push edi |
022E0034 | 67:48 | dec eax | eax:&"LdrGetProcedureAddress"
022E0036 | 8B7D 38 | mov edi,dword ptr ss:[ebp+38] |
022E0039 | 48 | dec eax | eax:&"LdrGetProcedureAddress"
022E003A | 85C0 | test eax,eax | eax:&"LdrGetProcedureAddress"
022E003C | 74 16 | je 22E0054 |
022E003E | 48 | dec eax | eax:&"LdrGetProcedureAddress"
022E003F | 8D7CC7 F8 | lea edi,dword ptr ds:[edi+eax*8-8] |
022E0043 | 48 | dec eax | eax:&"LdrGetProcedureAddress"
022E0044 | 85C0 | test eax,eax | eax:&"LdrGetProcedureAddress"
022E0046 | 74 0C | je 22E0054 |
022E0048 | FF37 | push dword ptr ds:[edi] |
022E004A | 48 | dec eax | eax:&"LdrGetProcedureAddress"
022E004B | 83EF 08 | sub edi,8 |
022E004E | 48 | dec eax | eax:&"LdrGetProcedureAddress"
022E004F | 83E8 01 | sub eax,1 | eax:&"LdrGetProcedureAddress"
022E0052 | EB EF | jmp 22E0043 |
022E0054 | 67:8B7D 40 | mov edi,dword ptr ds:[di+40] |
022E0058 | 48 | dec eax | eax:&"LdrGetProcedureAddress"
022E0059 | 83EC 20 | sub esp,20 |
022E005C | 67:FF55 08 | call dword ptr ds:[di+8] |
022E0060 | 67:8907 | mov dword ptr ds:[bx],eax | eax:&"LdrGetProcedureAddress"
022E0063 | 67:48 | dec eax | eax:&"LdrGetProcedureAddress"
022E0065 | 8B4D 30 | mov ecx,dword ptr ss:[ebp+30] |
022E0068 | 48 | dec eax | eax:&"LdrGetProcedureAddress"
022E0069 | 8D64CC 20 | lea esp,dword ptr ss:[esp+ecx*8+20] |
022E006D | 5F | pop edi |
022E006E | E8 00000000 | call 22E0073 | call $0
022E0073 | C74424 04 23000000 | mov dword ptr ss:[esp+4],23 | [esp+04]:CloseHandle+4A, 23:'#'
022E007B | 830424 0D | add dword ptr ss:[esp],D |
022E007F | CB | ret far |
022E0080 | 66:8CD8 | mov ax,ds |
022E0083 | 8ED0 | mov ss,ax |
022E0085 | 89EC | mov esp,ebp |
022E0087 | 5D | pop ebp |
022E0088 | C3 | ret |
копируем эти байты и вставляем на сайт https://defuse.ca/online-x86-assembler.htm и интерпретируем это уже как x64 инструкции..
получаем вот это:
Код:
Disassembly:
0: 67 48 8b 4d 10 mov rcx,QWORD PTR [ebp+0x10]
5: 67 48 8b 55 18 mov rdx,QWORD PTR [ebp+0x18]
a: 67 4c 8b 45 20 mov r8,QWORD PTR [ebp+0x20]
f: 67 4c 8b 4d 28 mov r9,QWORD PTR [ebp+0x28]
14: 67 48 8b 45 30 mov rax,QWORD PTR [ebp+0x30]
19: a8 01 test al,0x1
1b: 75 04 jne 0x21
1d: 48 83 ec 08 sub rsp,0x8
21: 57 push rdi
22: 67 48 8b 7d 38 mov rdi,QWORD PTR [ebp+0x38]
27: 48 85 c0 test rax,rax
2a: 74 16 je 0x42
2c: 48 8d 7c c7 f8 lea rdi,[rdi+rax*8-0x8]
31: 48 85 c0 test rax,rax
34: 74 0c je 0x42
36: ff 37 push QWORD PTR [rdi]
38: 48 83 ef 08 sub rdi,0x8
3c: 48 83 e8 01 sub rax,0x1
40: eb ef jmp 0x31
42: 67 8b 7d 40 mov edi,DWORD PTR [ebp+0x40]
46: 48 83 ec 20 sub rsp,0x20
4a: 67 ff 55 08 call QWORD PTR [ebp+0x8]
4e: 67 89 07 mov DWORD PTR [edi],eax
51: 67 48 8b 4d 30 mov rcx,QWORD PTR [ebp+0x30]
56: 48 8d 64 cc 20 lea rsp,[rsp+rcx*8+0x20]
5b: 5f pop rdi
5c: e8 00 00 00 00 call 0x61
61: c7 44 24 04 23 00 00 mov DWORD PTR [rsp+0x4],0x23
68: 00
69: 83 04 24 0d add DWORD PTR [rsp],0xd
если попытаться пройти через этот код синглстепами, то у вас заспавнится прямо перед инструкциями int 3 + при попытке пробежать вперед уже будет вылезать EXCEPTION_BREAKPOINT
после того, как этот код выполнился, мы получаем следующий адрес в дампе:
(черный дебаггер - x32, белый дебаггер - x64, выделенный адрес указывает на ZwCreateThreadEx уже в x64 ntdll, при этом он находится внутри 32ух битного процесса)
на этом пока что остановлюсь, еще поресерчу и выложу уже как они грабают хром без прав админа, офк если мне вообще хватит бошки дальше прыгать по этому коду
спойлер: они декриптят хром на сервере, так-что ничего особенного скорее всего тут не будет: шелл который оно хочет запустить просто украдет токен у эджа
note: api-hammering(?), lol
Последнее редактирование:
