Português (Brasil)

Ferramentas de desenvolvedor · Codificador e decodificador Base64

Como decodificar um comando suspeito do PowerShell Base64 sem executá-lo

· Por que é importante

base64 segurança

Uma carga útil do PowerShell -EncodedCommand decodificada para revelar texto inofensivo sem executá-lo
Ilustração vetorial original ToolAcre

Os invasores usam Base64 para ocultar scripts de inspeções casuais. Esta postagem mostra como decodificar uma carga útil -EncodedCommand sem executá-la, por que a saída pode parecer estranha em um decodificador UTF-8 e o que procurar.

A tarefa agendada com um argumento de 2,000 caracteres — onde os comandos codificados aparecem e por que eles são um sinal de alerta

Um administrador de sistema descobre uma tarefa agendada com um argumento 2,000 de caractere -EncodedCommand que parece suspeito. A tarefa é executada em uma conta de serviço com privilégios elevados.

A tentação de colar o comando no PowerShell e executá-lo para ver o que ele faz é perigosa; se o comando for malicioso, sua execução comprometerá o sistema. A abordagem mais segura é decodificar o Base64 localmente e ler a saída como texto antes de decidir se deseja executar alguma coisa. Esta postagem explica como decodificar comandos do PowerShell com segurança sem executá-los, por que a saída pode parecer distorcida em um decodificador UTF-8 padrão e o que procurar para avaliar se um comando é seguro ou suspeito.

Decodifique, nunca execute — a regra que mantém a análise segura e por que um decodificador somente para navegador é uma boa opção

O principal insight é que o PowerShell usa a codificação UTF-16LE para -EncodedCommand, não UTF-8, portanto, cada outro byte é um zero que as ferramentas padrão interpretam como terminadores nulos. A regra para analisar qualquer código suspeito é simples: decodifique, nunca execute. Isso se aplica a comandos codificados em Base64, scripts compactados, scripts de fontes não confiáveis ​​e qualquer coisa em uma cadeia de codificação desconhecida. Executar um script é um ponto sem volta; depois de executado, ocorreram alterações no sistema, o acesso foi concedido e os dados foram exfiltrados.

Decodificar e ler o script como texto permite avaliá-lo antes da etapa irreversível. A segunda regra é usar uma ferramenta que seja executada localmente e não faça solicitações de rede. Um decodificador baseado em navegador é ideal porque é portátil, não requer software adicional e mantém a carga suspeita em seu dispositivo sem carregá-la em qualquer servidor. Se a ferramenta for do tipo enviada para um serviço de decodificador remoto, não a use; a carga útil é então exposta a esse serviço. O parâmetro PowerShell -EncodedCommand aceita uma string Base64 que, quando decodificada, contém um script do PowerShell.

Por que os bytes decodificados são diferentes do texto UTF-8 — inspecione o padrão de bytes UTF-16LE em hexadecimal em vez de pedir a esta ferramenta de texto UTF-8 para interpretá-lo

No entanto, o PowerShell não usa a codificação UTF-8 para isso; ele usa UTF-16LE (little-endian UTF-16). Em UTF-16, cada caractere ASCII é representado como dois bytes: o código do caractere seguido por um byte zero. A letra A é 41 00 em hexadecimal. A letra B é 42 00. Uma string como Hello aparece como 48 00 65 00 6C 00 6C 00 6F 00 em UTF-16LE bytes. Quando é codificado em Base64, o resultado contém a forma codificada de todos esses bytes, incluindo todos os zeros. A decodificação com um decodificador UTF-8 padrão produz texto ilegível ou trunca no primeiro byte zero porque UTF-8 trata bytes nulos como terminadores de string.

A saída se parece com H e l o em vez de Hello, com caracteres aparentemente aleatórios ou texto ausente. Um exemplo resolvido mostra o problema e a solução. Suponha que um comando do PowerShell codifique a string simples Write-Host Hello. PowerShell UTF-16LE codifica isso em bytes, incluindo todos os zeros, Base64 codifica os bytes e produz uma string longa como VwByAGkAdABlAC0ASwBvAHMAaAAgACIASABlAGwAbABvACIA. Copie esta string no codificador e decodificador Base64 em seu navegador e clique em Decodificar. O decodificador padrão tentará interpretar o resultado como texto UTF-8 e produzirá uma saída corrompida ou truncada devido aos zeros incorporados.

Exemplo resolvido: decodificando um comando codificado de amostra inofensivo - lendo o texto além dos zero bytes intercalados

A solução é usar a visualização hexadecimal. Mude para a visualização hexadecimal e você verá os bytes: 57 00 72 00 69 00 74 00 65 00 2D 00 4B 00 6F 00 73 00 68 00 20 00 22 00 48 00 65 00 6C 00 6C 00 6F 00 22 00. Lendo esses bytes como UTF-16 pares LE produzem W-r-i-t-e---K-o-s-h---H-e-l-l-o-. Com experiência você pode ler UTF-16LE hex diretamente ou você pode gravar os bytes em um arquivo e decodificá-los com um script PowerShell ou Python em execução localmente.

A abordagem prática é observar o padrão e lembrar que o PowerShell usa UTF-16LE. Quando você decodifica o PowerShell -EncodedCommand no navegador e a saída parece errada, observe a visualização hexadecimal em vez da visualização de texto. A visualização hexadecimal mostra cada byte individualmente. Cada caractere ASCII aparece como dois bytes com um zero entre eles. Se os bytes indicarem comandos maliciosos como New-AdminAccount, pesquisas reversas de DNS ou exportação de credenciais de segurança, o comando é suspeito. Se os bytes indicarem algo inócuo, como uma listagem de diretórios ou um script simples, o comando provavelmente será benigno.

Codificação e compactação aninhadas – Base64 dentro de Base64 e fluxos gzip que você não pode ler como texto

A visualização hexadecimal é mais difícil de ler do que texto simples, mas é mais segura do que adivinhar a partir da saída UTF-8 corrompida. A codificação e compactação aninhadas adicionam complexidade à análise de malware. Um comando do PowerShell pode codificar em Base64 outra string em Base64 ou compactar um script com gzip e, em seguida, codificar em Base64 o resultado. Em um cenário aninhado, você decodifica o Base64 externo, lê o resultado e descobre que ele próprio é base64. Decodifique isso também e continue até encontrar um texto legível ou um formato binário que você não consiga interpretar. Gzip e outros formatos de compactação começam com bytes mágicos (1F 8B para gzip) visíveis na visualização hexadecimal.

Se você decodificar Base64 e a visualização hexadecimal começar com 1F 8B, os bytes serão um fluxo compactado que requer descompactação. O codificador e decodificador Base64 mostra o hexadecimal, ajudando você a identificar esses padrões sem executar nada. Cargas compactadas ou codificadas posteriormente são suspeitas porque adicionam camadas de ofuscação.

O que registrar para um relatório de incidente — o texto decodificado, a fonte e os hashes, em vez da carga em si

Comandos legítimos raramente requerem múltiplas etapas de codificação. Registrar descobertas para um relatório de incidente requer disciplina e precisão. Anote a string Base64 exata que você analisou, onde a encontrou e quando. Se você o decodificou e encontrou comandos suspeitos, descreva os comandos, mas ainda não inclua o script completo no relatório; o script pode ser complexo ou longo.

Inclua um hash (SHA-256) do script decodificado para que a descoberta possa ser verificada e rastreada. Se o comando for claramente malicioso ou usar técnicas de exploração conhecidas, envolva equipes de resposta a incidentes e de segurança antes de tomar qualquer ação. Nunca execute o comando sozinho para ver o que ele faz. Se os responsáveis ​​pela resposta a incidentes precisarem executá-lo para teste, eles o farão em um ambiente de área restrita onde qualquer dano será contido. Seu trabalho é decodificar e avaliar o risco a uma distância segura. Este artigo não cobre todo o escopo da análise de malware, ambientes sandbox ou atribuição de ataques.

O que isso não cobre: ​​execução de sandbox, ferramentas de análise de malware e atribuição

Esses são tópicos para profissionais de segurança e equipes de resposta a incidentes. O escopo aqui está estritamente focado na decodificação segura de um comando codificado do PowerShell sem executá-lo, para que você possa ler o script e avaliar se vale a pena investigar mais detalhadamente. A codificação Base64 é ofuscação, não proteção. Qualquer pessoa com a codificação e um decodificador pode extrair o script. Os invasores usam Base64 para evitar a detecção básica e evitar inspeções casuais, e não para ocultar sua intenção da análise. Um comando decodificado do PowerShell que busca e executa um script remoto é malicioso, quer você mesmo o decodifique ou uma ferramenta de segurança o faça.

A próxima etapa prática após decodificar um comando suspeito é denunciá-lo à equipe apropriada. Se for o seu próprio sistema, determine se a tarefa foi criada intencionalmente e por quem. Verifique a data de criação e a conta que a agendou. Se a tarefa não for autorizada, desative-a, preserve os detalhes para análise forense e investigue como o invasor obteve o privilégio de criá-la. Se o comando contiver solicitações de rede ou mecanismos de persistência, como alterações no registro ou criação de tarefas agendadas, é quase certo que seja malicioso.

Conclusão: Base64 é ofuscação, não proteção - como o codificador e decodificador Base64 decodifica a carga localmente sem que ela saia da sua máquina

Se ele executar funções administrativas legítimas e os detalhes de criação forem normais, pode ser um script administrativo legítimo que está codificado por motivos relacionados à política de segurança ou à integração com uma ferramenta de automação maior. Não execute de qualquer maneira; deixe sua avaliação do texto decodificado informar sua decisão. A decodificação segura de comandos suspeitos do Base64 PowerShell segue um processo simples. Use o codificador e decodificador Base64 para decodificar a string sem carregá-la ou executar nada. Observe a visualização hexadecimal para entender o que os bytes representam.

Se você vir padrões UTF-16LE (zero bytes intercalados), lembre-se de que o PowerShell usa UTF-16LE e leia de acordo. Identifique quaisquer padrões suspeitos, como solicitações de rede, elevação de privilégios ou mecanismos de persistência. Registre os detalhes com precisão para o seu relatório de incidente, incluindo a string Base64 original e seu hash. Nunca execute o comando sozinho; deixe isso para os respondentes de incidentes em um ambiente controlado. Confie na sua decodificação local e na sua avaliação do texto simples e deixe que isso guie sua próxima ação.