.. | ||
README.md | ||
unpacking-binaries.md |
Algoritmos Criptográficos/Compressão
Algoritmos Criptográficos/Compressão
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo do telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios do github HackTricks e HackTricks Cloud.
Identificando Algoritmos
Se você terminar em um código usando deslocamentos para a direita e esquerda, xors e várias operações aritméticas, é muito provável que seja a implementação de um algoritmo criptográfico. Aqui serão mostradas algumas maneiras de identificar o algoritmo usado sem precisar reverter cada etapa.
Funções da API
CryptDeriveKey
Se esta função for usada, você pode descobrir qual algoritmo está sendo usado verificando o valor do segundo parâmetro:
Confira aqui a tabela de possíveis algoritmos e seus valores atribuídos: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
RtlCompressBuffer/RtlDecompressBuffer
Comprime e descomprime um dado buffer de dados.
CryptAcquireContext
A função CryptAcquireContext é usada para adquirir um identificador para um contêiner de chave específico dentro de um provedor de serviços criptográficos (CSP) específico. Este identificador retornado é usado em chamadas para funções da CryptoAPI que usam o CSP selecionado.
CryptCreateHash
Inicia a hash de um fluxo de dados. Se esta função for usada, você pode descobrir qual algoritmo está sendo usado verificando o valor do segundo parâmetro:
Confira aqui a tabela de possíveis algoritmos e seus valores atribuídos: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
Constantes do Código
Às vezes é muito fácil identificar um algoritmo graças ao fato de que ele precisa usar um valor especial e único.
Se você pesquisar pela primeira constante no Google, isso é o que você obtém:
Portanto, você pode assumir que a função descompilada é um calculador sha256.
Você pode pesquisar qualquer uma das outras constantes e obterá (provavelmente) o mesmo resultado.
Informações dos dados
Se o código não tiver nenhuma constante significativa, ele pode estar carregando informações da seção .data.
Você pode acessar esses dados, agrupar o primeiro dword e pesquisar por ele no Google como fizemos na seção anterior:
Neste caso, se você procurar por 0xA56363C6, você pode descobrir que está relacionado às tabelas do algoritmo AES.
RC4 (Criptografia Simétrica)
Características
É composto por 3 partes principais:
- Estágio de inicialização/: Cria uma tabela de valores de 0x00 a 0xFF (256 bytes no total, 0x100). Esta tabela é comumente chamada de Caixa de Substituição (ou SBox).
- Estágio de embaralhamento: Vai percorrer a tabela criada anteriormente (loop de 0x100 iterações, novamente) modificando cada valor com bytes semi-aleatórios. Para criar esses bytes semi-aleatórios, a chave RC4 é usada. As chaves RC4 podem ter entre 1 e 256 bytes de comprimento, no entanto, geralmente é recomendado que seja acima de 5 bytes. Comumente, as chaves RC4 têm 16 bytes de comprimento.
- Estágio XOR: Finalmente, o texto puro ou cifrado é XORed com os valores criados anteriormente. A função para criptografar e descriptografar é a mesma. Para isso, um loop pelos 256 bytes criados será realizado quantas vezes forem necessárias. Isso geralmente é reconhecido em um código descompilado com um %256 (mod 256).
{% hint style="info" %} Para identificar um RC4 em um código desmontado/descompilado, você pode verificar 2 loops de tamanho 0x100 (com o uso de uma chave) e depois um XOR dos dados de entrada com os 256 valores criados anteriormente nos 2 loops, provavelmente usando um %256 (mod 256) {% endhint %}
Estágio de Inicialização/Caixa de Substituição: (Note o número 256 usado como contador e como um 0 é escrito em cada lugar dos 256 caracteres)
Estágio de Embaralhamento:
Estágio XOR:
AES (Criptografia Simétrica)
Características
- Uso de caixas de substituição e tabelas de consulta
- É possível distinguir o AES graças ao uso de valores específicos de tabelas de consulta (constantes). Note que a constante pode ser armazenada no binário ou criada dinamicamente.
- A chave de criptografia deve ser divisível por 16 (geralmente 32B) e geralmente um IV de 16B é usado.
Constantes da SBox
Serpent (Criptografia Simétrica)
Características
- É raro encontrar algum malware usando-o, mas existem exemplos (Ursnif)
- Simples de determinar se um algoritmo é Serpent ou não com base em seu comprimento (função extremamente longa)
Identificando
Na imagem a seguir, observe como a constante 0x9E3779B9 é usada (note que esta constante também é usada por outros algoritmos criptográficos como TEA - Tiny Encryption Algorithm).
Observe também o tamanho do loop (132) e o número de operações XOR nas instruções de desmontagem e no exemplo de código:
Como mencionado anteriormente, esse código pode ser visualizado dentro de qualquer descompilador como uma função muito longa, pois não há saltos dentro dela. O código descompilado pode parecer o seguinte:
Portanto, é possível identificar este algoritmo verificando o número mágico e os XORs iniciais, vendo uma função muito longa e comparando algumas instruções da função longa com uma implementação (como o deslocamento à esquerda por 7 e a rotação à esquerda por 22).
RSA (Criptografia Assimétrica)
Características
- Mais complexo que algoritmos simétricos
- Não há constantes! (implementações personalizadas são difíceis de determinar)
- KANAL (um analisador criptográfico) falha em mostrar dicas sobre RSA, pois depende de constantes.
Identificando por comparações
- Na linha 11 (esquerda) há um
+7) >> 3
que é o mesmo que na linha 35 (direita):+7) / 8
- A linha 12 (esquerda) está verificando se
modulus_len < 0x040
e na linha 36 (direita) está verificando seinputLen+11 > modulusLen
MD5 & SHA (hash)
Características
- 3 funções: Init, Update, Final
- Funções de inicialização semelhantes
Identificar
Init
Você pode identificar ambos verificando as constantes. Note que o sha_init tem 1 constante que o MD5 não tem:
Transformação MD5
Note o uso de mais constantes
CRC (hash)
- Menor e mais eficiente, pois sua função é encontrar alterações acidentais nos dados
- Usa tabelas de consulta (então você pode identificar constantes)
Identificar
Verifique constantes da tabela de consulta:
Um algoritmo de hash CRC parece com:
APLib (Compressão)
Características
- Constantes não reconhecíveis
- Você pode tentar escrever o algoritmo em python e procurar por coisas semelhantes online
Identificar
O gráfico é bastante grande:
Verifique 3 comparações para reconhecê-lo:
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo do telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios do github HackTricks e HackTricks Cloud.