Concessão imperceptível de direitos de administrador

Toda sexta-feira, amigos. Hoje, estamos compartilhando com você mais um material traduzido na véspera do lançamento do curso de engenharia reversa .



Tive uma boa ideia de como fazer um usuário executar seu aplicativo sem engenharia social ou usando explorações de terceiros. Além disso, você pode simplesmente avançar e iniciar uma infecção em massa de arquivos executáveis, mas isso pode causar muitos problemas imprevistos e também significa que aplicativos assinados digitalmente por fornecedores confiáveis ​​aparecerão como arquivos não confiáveis. É uma boa idéia "capturar" apenas uma dll. Não chamarei esse método de ignorar o UAC (controle de conta de usuário), porque você ainda precisa obter permissão para executar o aplicativo (mas não o seu).

Loadlibrary


Você já deve estar familiarizado com esse conceito, mas vou explicar o que é. Quando o aplicativo chama LoadLibrary na dll, mas não fornece o caminho completo para o arquivo, o sistema primeiro verifica a chave de registro KnownDlls, na qual procura o caminho, se não estiver lá, o sistema procurará o diretório no qual o aplicativo foi executado e, em seguida, procurará nos caminhos do sistema, como system32 / syswow64.

É possível colocar sua dll no mesmo diretório que o aplicativo e atribuir o mesmo nome que uma dll de sistema normalmente carregada teria, mas, em qualquer caso, sua dll deve atender aos seguintes requisitos:

  • O aplicativo deve baixar a dll pelo nome e não pelo caminho completo (como costuma ser o caso);
  • A biblioteca necessária não deve existir em HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ KnownDLLs;
  • Sua dll deve corresponder à arquitetura do processador (lembre-se de que os processadores de 64 bits simplesmente ignoram as bibliotecas de 32 bits e vice-versa);
  • A biblioteca está localizada no System32 ou Syswow64, pois caminhos específicos geralmente não funcionam.

O vírus ZeroAccess usou esse método para tirar proveito da "engenharia social" e forçar o usuário a executar o arquivo. Para começar, o instalador do Adobe Flash foi baixado do oficial, a bot dll foi gravada no mesmo diretório que o instalador e, em seguida, o instalador foi iniciado. Quando o instalador é executado, o controle de conta do usuário exibe uma mensagem informando que o aplicativo é fornecido por uma fonte confiável da “Adobe Systems Incorporated” e é mais provável que o usuário instale esse aplicativo (isso leva à execução de uma dll bot maliciosa).


Esta é uma atualização real para o Flash Player? Ou ZeroAccess? Ninguem sabe.

Método menos invasivo


Imagine que existe uma pasta na qual 90% dos aplicativos que exigem direitos elevados de conta estão localizados e que é gravável sem esse tipo de direito. Bem, essa pasta existe e esta é a %userprofile%Downloads . Você provavelmente entende o que estou falando.

Eu não esperava encontrar uma dll que carregasse a maioria dos aplicativos e, ao mesmo tempo, atendesse a todos os critérios para uma dll maliciosa, e após cinco minutos de pesquisa encontrei uma mina de ouro: dwmapi.dll . Essa biblioteca não apenas atendeu a todos os critérios, mas também baixou todos os arquivos de instalação. Agora vamos criar nossa própria dll, nomeie-a “dwmapi.dll” , coloque-a na pasta Downloads e execute o arquivo de instalação.



Sucesso! Mas o fato é que, assim que iniciarmos a instalação, ela não funcionará, pois substituímos uma biblioteca importante, mas isso é fácil de corrigir. Nós infectamos a DLL.

Criando uma dll infectada


No começo, eu só queria adicionar um novo cabeçalho de seção, alterar o campo NumberOfSections no cabeçalho do PE e depois adicionar minha seção ao final do arquivo PE. Aconteceu que imediatamente após o último cabeçalho da seção, há um diretório de importação relacionado que será substituído pelo nosso cabeçalho da seção. Portanto, depois de duas horas escrevendo um aplicativo para restaurar todo o PE do zero, alguém me lembrou que o diretório de importação vinculado existe apenas para acelerar o download de arquivos importados e pode ser substituído e simplesmente desabilitado no cabeçalho do PE.

Nos 15 minutos seguintes, segurei CTRL + Z para voltar ao ponto em que comecei e me senti estúpido. Após duas linhas de código, meu infector funcionou como deveria e eu pude seguir para o próximo passo. Agora, o infector simplesmente desconecta e reescreve o diretório de importação relacionado com um novo cabeçalho de seção, adiciona uma nova seção ao final do arquivo PE, ajusta SizeOfImage para acomodar a nova seção e altera AddressOfEntryPoint para apontar para a nova seção.

Tudo o que precisamos agora é o código que colocamos lá.

Shellcode


A escolha óbvia foi forçar a seção adicionada a executar o shellcode, para que não precisássemos nos preocupar com realocações e importação. O código real é bastante simples e escrito usando algumas macros convenientes do FASM. Analisarei rapidamente como ele funciona.

  • A pilha é verificada para garantir que o dwmapi.dll tenha sido chamado por DLL_PROCESS_ATTACH;
  • A estrutura Ldr PEB é usada para obter o endereço base do Kernel32 e Ntdll;
  • Uma implementação simples de GetProcAddress é usada para importar as seguintes funções: NtOpenProcessToken, NtQueryInformationToken, NtClose, ExpandEnvironmentStringsA, CreateProcessA;
  • O token do processo atual é aberto e o código solicita a confirmação de que o aplicativo a partir do qual estamos iniciando tem direitos de administrador do UAC;
  • Acontece o caminho do cmd.exe e a linha de comando é chamada;
  • A execução é transferida de volta ao ponto de entrada real do dwmapi.dll, e é por isso que a execução pode continuar.

Juntando tudo


O resultado final da operação infecta o dwmapi.dll com nosso shellcode e o coloca na pasta de download, assim que o usuário baixa e executa o instalador, o que requer direitos de administrador, uma linha de comando será chamada como administrador (devido ao Wow64FsRedirect e ao fato de que Como a maioria das configurações funciona em wow64, podemos usar o mesmo código nos sistemas Windows de 32 e 64 bits).

Você pode encontrar o infectador completo e o código do shell no meu github: https://github.com/MalwareTech/UACElevator .

Só isso. Vejo você no curso!

Source: https://habr.com/ru/post/pt457082/


All Articles