O Blob GPG: Lendo a Tag de um Pacote OpenPGP a Partir de Um Byte
O desafio
Uma ferramenta de exfiltração deixou data.bin num host comprometido e a equipe registrou como binário bruto. Só o primeiro byte revela o formato. Abra-o no visualizador hexadecimal, compare esse byte com as tags de pacote de referência e digite o formato real.
O que você vai aprender
- Explicar que pacotes binários OpenPGP são delimitados por um byte de tag, não por uma longa string mágica
- Reconhecer que um byte inicial com o bit 0x80 ativado marca o cabeçalho de um pacote OpenPGP
- Identificar 0x85 como o início de um pacote de chave de sessão cifrada por chave pública
- Diferenciar um blob GPG de ZIP, GZIP e PNG pelos seus diferentes primeiros bytes
- Triar um binário desconhecido lendo apenas o suficiente do cabeçalho para classificá-lo
Habilidades testadas
Pré-requisitos
- Familiaridade básica com GPG / OpenPGP como ferramenta de criptografia de chave pública
- Facilidade para ler valores de bytes hexadecimais individuais
Como funciona
A maioria dos formatos se anuncia com um magic number de vários bytes, mas o OpenPGP (o padrão por trás do GPG) é estruturado de forma diferente: um fluxo binário OpenPGP é uma sequência de pacotes, e cada pacote começa com um único byte de tag. Nesse byte, o bit mais significativo (0x80) está sempre ativado para marcar o limite de um pacote, e os bits restantes codificam o tipo do pacote e o formato de comprimento.
Aqui o primeiro byte é 0x85. Como 0x80 está ativado, isso é um cabeçalho de pacote; a tag que ele carrega identifica um pacote de chave de sessão cifrada por chave pública, exatamente o que você vê no início de uma mensagem cifrada com a chave pública de alguém (gpg --encrypt em modo binário, sem armor). Então um arquivo registrado como data.bin opaco é, na verdade, um blob cifrado com GPG, e só esse primeiro byte foi necessário para descobrir isso.
Os iscas são todos formatos com magic numbers convencionais de vários bytes: ZIP é 50 4B 03 04, GZIP é 1F 8B, e PNG é 89 50 4E 47. Nenhum deles corresponde a um byte inicial 0x85. Esse é o lado sutil da identificação de arquivos: quando não há uma assinatura ASCII óbvia, a estrutura de um único byte de framing ainda é suficiente para nomear o formato.
Erros comuns
- Procurar por um magic ASCII de quatro bytes. O OpenPGP não tem um; o sinal é o byte de tag único, então buscar texto imprimível não encontra nada.
- Descartar como binário aleatório. A extensão 'bin' e o corpo de alta entropia tentam fazer você desistir, mas o byte 0 é estruturado.
- Confundir com GZIP. O GZIP também parece binário comprimido, mas começa com
1F 8B, não85. - Ler o cabeçalho além do necessário. Não é preciso analisar o pacote inteiro; o byte de tag sozinho classifica o formato.
Como se proteger
Defensores devem detectar blobs cifrados pela sua estrutura e tratar saídas inesperadas de GPG como possível artefato de exfiltração ou preparação de dados.
- Execute detecção baseada em conteúdo que compreenda o framing de pacotes OpenPGP, não apenas magic numbers de vários bytes, para que blobs binários GPG sejam classificados em vez de registrados como 'binário desconhecido'.
- Alerte quando arquivos cifrados com GPG aparecerem em locais ou fluxos de trabalho que normalmente não os produzem, um passo comum de empacotamento antes da exfiltração.
- Monitore a execução inesperada das ferramentas
gpg/openpgpem servidores que não deveriam cifrar dados. - Faça um inventário de quais chaves conseguem decifrar esses blobs, para que um respondente de incidentes possa determinar o destinatário pretendido.