
Utilitário de linha de comando do Windows para ler, escrever e executar código em modo kernel a partir do contexto de Administrador usando uma técnica de redirecionamento de execução de validação de fontes, permitindo depuração avançada do kernel e solução de problemas do sistema.
r0ak é um utilitário de linha de comando do Windows que permite ler, escrever e executar código em modo kernel (com algumas limitações) diretamente do prompt de comando, sem exigir nada além de privilégios de Administrador.
r0ak v1.0.0 -- Ring 0 Army Knife
http://www.github.com/ionescu007/r0ak
Copyright (c) 2018 Alex Ionescu [@aionescu]
http://www.windows-internals.com
USAGE: r0ak.exe
[--execute <Address | module.ext!function> <Argument>]
[--write <Address | module.ext!function> <Value>]
[--read <Address | module.ext!function> <Size>]

O kernel do Windows é um ambiente rico no qual centenas de drivers executam em um sistema típico, e onde milhares de variáveis contendo estado global estão presentes. Para solução de problemas avançada, especialistas de TI normalmente usam ferramentas como o Windows Debugger (WinDbg), ferramentas SysInternals, ou escrevem suas próprias. Infelizmente, o uso dessas ferramentas está se tornando cada vez mais difícil, e elas próprias são limitadas pelo seu acesso às APIs do Windows e recursos expostos.
Alguns dos desafios atuais incluem:
Em tal ambiente, ficou claro que uma ferramenta simples que possa ser usada como um curativo/hotfix de emergência e para solucionar rapidamente problemas de kernel/sistema que podem ser aparentes através da análise do estado do kernel poderia ser valiosa para a comunidade.

r0ak funciona redirecionando o fluxo de execução das verificações de validação de fonte confiável do gerenciador de janelas ao tentar carregar uma nova fonte, substituindo a rotina de comparação da tabela de fontes confiáveis por uma função alternativa que agenda um item de trabalho executivo (WORK_QUEUE_ITEM) armazenado no nó de entrada. Em seguida, o filho direito da tabela de fontes confiáveis (que serve como nó raiz) é sobrescrito com o buffer de escrita de um pipe nomeado (NP_DATA_ENTRY) no qual um item de trabalho personalizado é armazenado. A função de trabalho subjacente deste item e seu parâmetro são o que eventualmente será executado por um ExpWorkerThread dedicado em PASSIVE_LEVEL assim que uma tentativa de carregamento de fonte ocorrer e a rotina de comparação executar, recebendo o nó pai baseado no pipe nomeado como sua entrada. Um evento de rastreamento de Event Tracing for Windows (ETW) em tempo real é usado para receber uma notificação assíncrona de que o item de trabalho terminou de executar, o que torna seguro desmontar as estruturas, liberar os buffers em modo kernel e restaurar a operação normal.
Ao usar a opção --execute, esta função e parâmetro são fornecidos pelo usuário.
Ao usar --write, um gadget personalizado é usado para modificar valores arbitrários de 32 bits em qualquer lugar da memória do kernel.
Ao usar --read, o gadget de escrita é usado para modificar o ponteiro e tamanho do buffer HSTI do sistema (N.B.: Este é um comportamento destrutivo em termos de quaisquer outras aplicações que solicitarão os dados HSTI. Como este é um comportamento opcional do Windows, e esta ferramenta é destinada para depuração/experimentação de emergência, esta perda de dados foi considerada aceitável). Em seguida, a API de Consulta HSTI é usada para copiar de volta para o espaço de endereço em modo usuário da ferramenta, e um dump hexadecimal é exibido.
Como apenas funcionalidade nativa do Windows, assinada pela Microsoft, é usada, e todas as funções chamadas fazem parte do bitmap KCFG, não há violação de nenhuma verificação de segurança, e nenhum sinalizador de depuração é necessário, nem o uso de drivers de terceiros mal escritos.
Não. Como esta ferramenta — e a técnica subjacente — exigem um token privilegiado de nível SYSTEM, que só pode ser obtido por um usuário executando sob a conta de Administrador, nenhuma fronteira de segurança está sendo contornada para alcançar o efeito. O comportamento e a utilidade da ferramenta só são possíveis devido ao contexto de segurança elevado/privilegiado da conta de Administrador no Windows, e é entendido como um comportamento de design.
Claro! É importante sempre relatar problemas de segurança para a Microsoft, mesmo quando nenhuma violação de limites privilegiados parece ter ocorrido — suas equipes de pesquisadores e desenvolvedores podem encontrar novos vetores e maneiras de alcançar certos caminhos de código que um pesquisador externo pode não ter pensado.
Assim, em novembro de 2014, um caso de segurança foi registrado no Microsoft Security Research Centre (MSRC), que respondeu: "[…] não se enquadra no escopo de um problema de segurança que abordaríamos através de nosso veículo tradicional de boletim de segurança. […] pressupõe privilégios de administrador — um lugar onde, arquitetonicamente, atualmente não definimos uma fronteira de segurança defensável. Como tal, não vamos buscar corrigir isso."
Além disso, em abril de 2015, na conferência Infiltrate, uma palestra intitulada Insection : AWEsomely Exploiting Shared Memory Objects foi apresentada detalhando este problema, inclusive para desenvolvedores da Microsoft presentes, que concordaram que isso estava atualmente fora do escopo das fronteiras de segurança arquitetônicas do Windows. Isso porque existem literalmente dezenas — senão mais — de outras maneiras pelas quais um Administrador pode ler/escrever/executar memória do Ring 0. Esta ferramenta meramente permite uma comodificação fácil de um desses vetores, para fins de depuração e resolução de problemas do sistema.
Empacotar esse código como uma biblioteca exigiria remover cuidadosamente toda a análise de linha de comando interativa e saída padrão, ponto em que, sem grandes reescritas, o 'kit' iria:
_NT_SYMBOL_PATH sensata tenha sido configurada na máquina alvo, e que cerca de 15MB de dados de símbolos sejam baixados e armazenados em cache como arquivos PDB em algum lugar do discoAtacantes interessados em usar esta abordagem específica — versus muitas outras técnicas mais cross-compatíveis, que não exigem direitos de SYSTEM — provavelmente já adaptaram seu próprio código baseado na Prova de Conceito de abril de 2015 — há mais de 3 anos.
Devido ao uso do Mecanismo de Símbolos do Windows, você deve ter o Windows Software Development Kit (SDK) ou o Windows Driver Kit (WDK) instalado com as Ferramentas de Depuração para Windows. A ferramenta encontrará seu caminho de instalação automaticamente e aproveitará os arquivos DbgHelp.dll e SymSrv.dll presentes nesse diretório. Como esses arquivos não são redistribuíveis, eles não podem ser incluídos no lançamento da ferramenta.
Alternativamente, se você obtiver essas bibliotecas por conta própria, pode modificar o código-fonte para usá-las.
O uso de símbolos requer uma conexão com a Internet, a menos que você os tenha pré-cacheado localmente. Além disso, você deve configurar a variável _NT_SYMBOL_PATH apontando para um servidor de símbolos apropriado e um local de cache.
Presume-se que um Especialista de TI ou outro solucionador de problemas que aparentemente precisa ler/escrever/executar memória do kernel (e tem conhecimento das variáveis de kernel apropriadas para acessar) já está mais do que intimamente familiarizado com os requisitos de configuração acima. Por favor, não abra issues perguntando o que é o SDK ou como definir uma variável de ambiente.
Algum driver vazou pool do kernel? Por que não chamar ntoskrnl.exe!ExFreePool e passar o endereço do kernel que está vazando? E uma referência de objeto? Vá chamar ntoskrnl.exe!ObfDereferenceObject e limpe isso.
Quer despejar o log DbgPrint do kernel? Por que não despejar o buffer circular interno em ntoskrnl.exe!KdPrintCircularBuffer
Curioso sobre o tamanho das pilhas do kernel na sua máquina? Tente olhar em ntoskrnl.exe!KeKernelStackSize
Quer despejar a tabela de chamadas do sistema para procurar hooks? Vá imprimir ntoskrnl.exe!KiServiceTable
Estes são apenas alguns exemplos — todos os endereços do Ring 0 são aceitos, seja pela sintaxe module!symbol ou passando diretamente o ponteiro do kernel se conhecido. O Mecanismo de Símbolos do Windows é usado para localizá-los.
A ferramenta requer certas variáveis e funções do kernel que só são conhecidas por existir em versões modernas do Windows 10, e foi projetada para funcionar apenas em sistemas de 64 bits. Essas limitações se devem ao fato de que em sistemas mais antigos (ou sistemas x86), esses requisitos de segurança mais rigorosos não existem e, como tal, abordagens mais tradicionais podem ser usadas. Esta é uma ferramenta pessoal que estou disponibilizando, e eu não precisava desses sistemas mais antigos, onde eu poderia usar um driver simples. Dito isso, este repositório aceita pull requests, se alguém estiver interessado em portá-la.
Em segundo lugar, devido aos casos de uso e às minhas próprias necessidades, as seguintes restrições se aplicam:
Obviamente, essas limitações poderiam ser corrigidas escolhendo programaticamente uma abordagem diferente, mas elas atendem às necessidades de uma ferramenta de linha de comando e aos meus casos de uso. Novamente, pull requests são aceitos se outros desejarem contribuir com suas próprias adições.
Observe que toda execução (incluindo a execução dos comandos --read e --write) ocorre no contexto de uma Thread de Trabalho do Sistema em PASSIVE_LEVEL. Portanto, endereços em modo usuário não devem ser passados como parâmetros/argumentos.
Pull requests são bem-vindos. Para mudanças importantes, por favor abra uma issue primeiro para discutir o que você gostaria de alterar.
Copyright 2018 Alex Ionescu. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided
that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and
the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions
and the following disclaimer in the documentation and/or other materials provided with the
distribution.
THIS SOFTWARE IS PROVIDED BY ALEX IONESCU ``AS IS'' AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ALEX IONESCU
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those of the authors and
should not be interpreted as representing official policies, either expressed or implied, of Alex Ionescu.