• XSS.stack #1 – первый литературный журнал от юзеров форума

Мануал/Книга Отследить NTSTATUS сисколла в пуле потоков

secidiot

Threat Actor
Пользователь
Регистрация
27.04.2023
Сообщения
155
Реакции
340
Гарант сделки
2
Может кому то понадобится метод получения NTSTATUS`a индирект сисколла из пула потоков (пул потоков служит для "очистки" стека). Сам долго думал над реализацией.
Пример работы с пулом потоков https://0xdarkvortex.dev/hiding-in-plainsight/

C:
PVOID pReturnAddress = NULL;
volatile LONG* pNtStatus = NULL;
HANDLE hEvent = NULL;

LONG CALLBACK VectorHandler(PEXCEPTION_POINTERS ExceptionInfo) {
    static bool bpSet = false;
    CONTEXT* ctx = ExceptionInfo->ContextRecord;

    if (ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_ILLEGAL_INSTRUCTION) {

        if (!bpSet) {
            ctx->Dr0 = (DWORD64)pReturnAddress;
            ctx->Dr7 = 0x00000001;
            ctx->Rip += 2;
            bpSet = true;
        }

        return EXCEPTION_CONTINUE_EXECUTION;
    } else if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP) {
        *pNtStatus = (NTSTATUS)ctx->Rax;
        ctx->Dr0 = 0;
        ctx->Dr7 = 0;

        SetEvent(hEvent);
        return EXCEPTION_CONTINUE_EXECUTION;
    }
    return EXCEPTION_CONTINUE_SEARCH;
}

int wmain()
{
    NTSTATUS NtStatus = 0;
    pNtStatus = (volatile LONG*)VirtualAlloc(NULL, sizeof(LONG), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    if (pNtStatus == NULL) {
        return 0;
    }
    
    hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    if (hEvent == NULL) {
        return 0;
    }
    
    pReturnAddress = GetSyscallAddress(0xdeadbeef);
    AddVectoredExceptionHandler(1, VectorHandler);
    
    //вызов syscall`a
    ...
    
    
    
    NtStatus = *pNtStatus;
    printf("NTSTATUS: 0x%X\n", NtStatus);
    
    
    CloseHandle(hEvent);
    VirtualFree((LPVOID)pNtStatus, 0, MEM_RELEASE);
    return 0;
}
 
Очень много потенциальных IOC всего лишь за возможность обрботать ошибку. Достанут твой хендлер и увидят что он в unbacked executable memory. Если будешь спать, то хендлер в RW памяти тоже очень подозрительно. Проще предположить ошибку по параметрам. Или например после NtProtectVirtualMemory вызывать NtQueryVirtualMemory и проверять, что атрибуты памяти изменились.

На худой конец можно крашнуться.
Не приходит в голову ни одна функция, что ивентит в etwti, в которой NTSTATUS можно обработать, как либо кроме как выходом. Разница лишь в возможности сделать cleanup перед выходом.
UPD: Если удалить хендлер сразу после возврата, EDR не успеет его найти т.к. ETWTi ивент позже придет. А вот в kernel коллбеки синхронные. И например CreateThreadNotifyRoutine или LoadImageNotifyRoutine успеют проверить VEH list.
 
Последнее редактирование:
Очень много потенциальных IOC всего лишь за возможность обрботать ошибку
Причем здесь IOC если код для дебагга NTSTATUS`a из пула потоков. Этот код для локальных тестов, дебага.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх