
Indirect Dynamic Syscall, SSN + Syscall address sorting via Modified TartarusGate approach + Remote Process Injection via APC Early Bird + Spawns a sacrificial Process as target process + (ACG+BlockDll) mitigation policy on spawned process + PPID spoofing + Api resolving from TIB + API hashing
Настраиваемый инструмент-дроппер, нацеленный на Windows.
Недостаток: Если потоки будут возобновлены, все события, произошедшие во время приостановки регистратора событий, будут зарегистрированы снова!
Поэтому решил вместо этого их убить!
"Это более инвазивно, чем приостановка, но решение всегда за оператором. К тому же убийство потоков регистрируется на уровне ядра" - @SEKTOR7net
Непосредственно через компилятор VS:


./compile.bat
PS C:> .\x64\Release\indirect.exe
[!] Wrong!
[->] Syntax: .\x64\Release\indirect.exe <PPID to spoof>
https://github.com/reveng007/DarkWidow/assets/61424547/62a90c5b-84af-4389-8ddc-9f7926debdcf

TIB:
Регистры GS и FS:
Структура PEB LDR:
BlackHat - Что авторы вредоносных программ не хотят, чтобы вы знали - Уклончивое внедрение процессов Hollow от @monnappa22
Изображение памяти процесса из вышеуказанной ссылки:

Из labs.cognisys.group, блог от @D1rkMtr
:

TIB -> TEB -> PEB -> Разрешение Nt API и хэширование API
#include <stdint.h>
#include <stdio.h>
#include <Windows.h>
DWORD64 djb2(const char* str)
{
DWORD64 dwHash = 0x7734773477347734;
int c;
while (c = *str++)
dwHash = ((dwHash << 0x5) + dwHash) + c;
return dwHash;
}
int main(int argc, char** argv)
{
if (argc < 2)
{
printf("[!] Wrong!\n");
printf("[->] Syntax: .\\%s <NTFuncName>\n\n", argv[0]);
return 1;
}
const char* string = argv[1];
DWORD64 hashvalue = djb2(string);
printf("Hash Value: 0x%llX\n", hashvalue);
return 0;
}
Политика смягчения ACG(Arbitrary Code Guard)/BlockDll:

Обнаружение спуфинга PPID:
Обнаружение Moneta и PESieve:\
Moneta:

PESieve:

Сканирование Capa:

Как выглядит стек потока процесса импланта:
| Процесс импланта | Легитимный процесс cmd |
|---|---|
![]() | ![]() |
Из этого следует, что выполняя инструкцию возврата в памяти ntdll.dll в POC непрямого системного вызова, можно успешно подделать адрес возврата, поместить ntdll.dll на вершину стека вызовов, и EDR будет интерпретировать это как более высокую легитимность. - @VirtualAllocEx из DirectSyscall vs Indirect Syscall
Также спасибо @peterwintrsmith!


Установка SeDebugPrivilege:
От Здесь:
До Здесь:

Убийство потоков журнала событий:



Критические оповещения не создаются, за исключением одного журнала низкой степени серьезности!

Один журнал низкой степени серьезности => APC Injection (как и раньше)

Еще один журнал средней степени серьезности возник из-за установки
SeDebugPrivilege.

Synthetic Frame Thread Stack Spoofing.Вот как выглядит стек после применения спуфинга стека потоков с синтетическими фреймами.

Это стек потоков NT API

Это стек потоков шелл-кода (кстати, он не самодельный, это шелл-код Havoc :)).
Для разработки шелл-кода я использовал Havoc и следующую конфигурацию:

Спуфинг начального адреса вновь созданного потока на самом деле не требовался в этом проекте, потому что в технике APC Injection APC перехватывает выполнение уже запущенного легитимного потока. Спасибо @C5pider!

Теперь статус журналов событий?

Журналы не генерировались. Я также удалил часть с убийством регистратора событий из DarkWidow V2, что также снижает генерацию событий!
Надеюсь, никого не пропустил!
Изображение фрагмента из вышеуказанной ссылки, который я использовал здесь для динамического разрешения API без жесткого кодирования смещений:

Код хэширования API, который я применил: