sábado, 1 de setembro de 2007

Nosso Amigo Hash - Parte VI

Hash Aplicado na Forense Computacional - Prática

Contra-ataque contra técnicas de Anti-Forense


Estamos chegando ao final da nossa série sobre o uso de hash nas investigações computacionais. Mas vamos fechar a série com chave de ouro. A idéia desse último artigo é falar de como podemos contra-atacar uma técnica de Anti-Forense de descaracterização bastante discutida em alguns seminários da Black Hat.


Classificando os arquivos - Anti-Forense.


Primeiro, vamos a uma definição. O que é exatamente Anti-Forense ?


Anti-Forense são técnicas que tem por finalidade reduzir a quantidade ou a qualidade das evidências. Na prática, para cada técnica conhecida para análises e investigações, pode haver uma técnica contrária, montada para quebrar a análise em algum ponto.


Vou exemplificar isso fora da Forense Computacional. Um indivíduo que, logo após cometer um crime, limpa todos os materiais presentes na cena para retirar suas digitais, está usando uma técnica de Anti-Forense, justamente porque isso vai reduzir ou eliminar a existência de digitais, e isso é uma das técnicas usadas na análise da cena do crime. Usar luvas para manipular a arma também seria outro bom exemplo.


Saindo do CSI e voltando a nossa realidade de Investigadores Computacionais (será que algum dia lançam uma série sobre a gente ? :D ), há várias técnicas conhecidas hoje com o objetivo de eliminar artefatos ou criar condições artificiais que atrapalhem as técnicas de análise mais conhecidas.

Uma das técnicas mais conhecidas é fazer a Linha de Tempo (Timeline) dos arquivos na imagem e a técnica Anti-Forense criada contra a Linha de Tempo é fazer uso de softwares que alteram ou destroem as informações conhecidas como MAC times. Essas informações são a base para a montagem da Linha de Tempo dos arquivos.


Falamos nos posts passados sobre como classificar os arquivos entre conhecidos e desconhecidos. Essa técnica, baseada em comparar o hash dos arquivos da imagem contra uma base de hashes, é muito útil porque nos permite reduzir sensivelmente o número de arquivos a analisar, focando nos arquivos desconhecidos. Na maioria das vezes, a redução ocorre porque um percentual grande dos arquivos de um HD é composto por arquivos executáveis e arquivos de suporte a aplicações e/ou ao sistema operacional.


Pois bem. Existe uma técnica de Anti-Forense que pega todos os arquivos executáveis, DLLs, etc e altera uma pequena porção deles, em geral inócua para a execução. Ou seja, o executável continua funcionando normalmente. No entanto, mesmo com a mudança de um mero byte, o hash do arquivo muda completamente.

Um exemplo: Os arquivos executáveis de Windows têm em seu header algumas palavras em inglês, indicando que o executável é para ser rodado apenas em Windows ("This program cannot be run in DOS mode"). É possível construir um utilitário para alterar especificamente o byte onde se lê "in DOS mode" para "on DOS mode". Não muda nada para o programa, mas o hash fica completamente diferente.

O resultado disso, se aplicado em todos os executáveis, é que a operação de classificação por hashes vai gerar um número de arquivos desconhecidos muito grande, aumentando o tempo necessário para a análise; em alguns casos, tornando-a inviável por questões de prazo.


Vamos a um pouco de prática:

Calculamos o hash do arquivo md5deep.exe

C:\Forensics\SoftwareWin\teste>md5deep md5deep.exe

7b17a3c9c31de090e59e275795b68df3 C:\Forensics\SoftwareWin\teste\md5deep.exe

Agora calculamos o hash de uma cópia do arquivo md5deep.exe com uma alteração de apenas um byte:

C:\Forensics\SoftwareWin\teste>md5deep md5deep2.exe

17dd22393903da269e54bb5b086dc32f C:\Forensics\SoftwareWin\teste\md5deep2.exe

Repare como o resultado (hash) é completamente diferente.


Uma Nova Esperança ...


Há pouco tempo um pesquisador da área de Resposta a Incidentes - Jesse Kornblum, o mesmo criador do md5Deep - lançou um utilitário que faz um cálculo de hash levando em consideração apenas partes do arquivo. Além de calcular o hash usando essa nova técnica, esse utilitário, conhecido como ssdeep, permite comparar o hash calculado contra uma base de hashes, fornecendo um score entre 0 e 100 que indica o grau de proximidade dos arquivos. Quanto maior o score, mais parecidos serão os arquivos. Score 100 significa que os arquivos são completamente iguais.


Vamos a alguns exemplos:

Primeiro, vamos calcular o hash do arquivo md5deep.exe:


C:\Forensics\SoftwareWin\teste>ssdeep md5deep.exe

ssdeep,1.0--blocksize:hash:hash,filename
768:lHNpDqU/EDXgEzayDYldcJummjytKBNjTe6wV8:FWuEz5kGOytKBNne6w6,"C:\Forensics\SoftwareWin\teste\md5deep.exe"


Agora, vamos verificar o hash do arquivo md5deep2.exe, que conforme já comentamos, é cópia do md5deep.exe com um byte modificado, apenas:


C:\Forensics\SoftwareWin\teste>ssdeep md5deep2.exe

ssdeep,1.0--blocksize:hash:hash,filename
768:bHNpDqU/EDXgEzayDYldcJummjytKBNjTe6wV8:LWuEz5kGOytKBNne6w6,"C:\Forensics\SoftwareWin\teste\md5deep2.exe"



Veja que o resultado é expresso em dois blocos de hash, e nos dois blocos, o valor de saída para md5deep.exe e md5deep2.exe são muito semelhantes.


Agora vamos criar uma forma do próprio utilitário indicar o grau de proximidade entre os dois arquivos.
Primeiro, vamos calcular o hash do md5deep.exe e vamos gravar o resultado no arquivo hash.txt:

C:\Forensics\SoftwareWin\teste>ssdeep md5deep.exe > hash.txt

Agora, vamos calcular o hash do arquivo md5deep2.exe, comparando-o com o hash calculado anteriormente, armazenado no arquivo hash.txt:


C:\Forensics\SoftwareWin\teste>ssdeep -m hash.txt md5deep2.exe

C:\Forensics\SoftwareWin\teste\md5deep2.exe matches C:\Forensics\SoftwareWin\teste\md5deep.exe (99)



O resultado indica que os arquivos são 99% similares, o que comprova a situação, já que modificamos apenas um byte.

Vamos fazer o mesmo teste, agora com o arquivo md5deep.exe (o próprio):

C:\Forensics\SoftwareWin\teste>ssdeep -m hash.txt md5deep.exe


C:\Forensics\SoftwareWin\teste\md5deep.exe matches C:\Forensics\SoftwareWin\teste\md5deep.exe (100)



O resultado indica que ambos são iguais (de fato).



Aplicabilidade do ssdeep



Esse utilitário pode ser aplicado na classificação de arquivos da imagem quando há suspeita de que técnicas anti-forenses foram utilizadas para descaracterizar os arquivos. O único problema para isso hoje é que não há (bem, pelo menos ainda não conheço nenhuma) bases distribuídas de hashes para os arquivos conhecidos, como a base NSRL, que contém hashes MD5, SHA-1.
Se não houver uma referência para os arquivos, precisaremos criar nossas próprias bases. Isso não é tão difícil assim, mas é trabalhoso. Basta usar como base o seu próprio sistema e digitar no raiz:
ssdeep -r -l * > basehash.txt

A opção -r vai caminhar recursivamente pelos diretórios e o -l vai eliminar a path do nome dos arquivos.

Logicamente, convém retirar linhas relativas aos arquivos que não pertecem ao SO ou às aplicações.



Essa base pode ser calculada para vários SOs e softwares e os arquivos concatenados. Porém, há um problema com essa abordagem. Esse utilitário tem a mesma estrutura de comparação que o md5deep (não é a toa, já que foram feitos pelo mesmo desenvolvedor). Por conta disso, o arquivo que funciona como base será carregado para a memória primeiro antes da comparação efetivamente começar. Se você tem acompanhado os artigos sobre hash aqui no blog, vai lembrar do que estamos falando. A memória estoura antes da brincadeira começar ...

Há pelo menos mais duas aplicações interessantes para o ssdeep. É sabido que os códigos maliciosos existentes na internet tem seus fontes disponíveis em vários locais. Isso faz com que muitos lammers editem pequenas partes de códigos de worms e relancem o tal, como uma variação. Em muitas vezes, por ser lançado em pequena escala (em âmbito local), restrito a apenas um país ou estado, as assinaturas dos anti-virus demoram para chegar, e é bem possível que o novo código malicioso, recém modificado, não seja detectado pelo anti-virus. Para resolver isso, podemos criar uma base com os hashes calculados pelo ssdeep sobre os virus, worms e outros códigos maliciosos existentes. Com essa base, poderíamos classificar/detectar os arquivos com códigos maliciosos em uma imagem, mesmo que eles tenham sofrido alterações do virus/worm original.

Outra aplicação interessante, principalmente para nossos colegas da Polícia Federal, seria manter uma base de hashes para cada fotografia apreendida na internet com algo sobre pedofilia. É sabido que localização desse tipo de fotografia através de algoritmos de hash convencionais não é adequada, pois facilmente o usuário pode alterar um simples byte e tornar o hash da figura totalmente diferente. É provável que já existam utilitários que façam essas pequenas alterações. Se a figura for usada em esteganografia, ela continuará praticamente igual, e seu hash será completamente diferente. Por outro lado, se montarmos uma base com os hashes calculados a partir do ssdeep, as figuras alteradas ainda serão detectadas pelo utilitário.

Em ambas as sugestões, teremos o problema de performance e estouro de memória quando a base começar a ficar grande.

A solução para isso virá no próximo capítulo dessa série Nosso Amigo Hash. Será um bônus, já que eu tinha me programado a fechar a série com esse artigo aqui.

Até o próximo post !

Nenhum comentário: