Pró-Reitoria de Pós-Graduação e Pesquisa Lato Sensu em Perícia Digital Trabalho de Conclusão de Curso RECUPERAÇÃO DE CÓDIGOS MALICIOSOS PROTEGIDOS POR CRIPTOGRAFIA Autor: Eliel Martins Orientador: Prof. Dr. Paulo Quintiliano da Silva Brasília - DF 2013 ELIEL MARTINS RECUPERAÇÃO DE CÓDIGOS MALICIOSOS PROTEGIDOS POR CRIPTOGRAFIA Artigo apresentado ao Curso de PósGraduação Latu Senso em Perícia Digital da Universidade Católica de Brasília, como requisito parcial para obtenção do certificado de Especialista em Perícia Digital. Orientador: Prof. Dr. Paulo Quintiliano da Silva Brasília 2013 Artigo de autoria de ELIEL MARTINS, intitulado “RECUPERAÇÃO DE CÓDIGOS MALICIOSOS PROTEGIDOS POR CRIPTOGRAFIA”, apresentado como requisito parcial para obtenção do certificado de Especialista em Perícia Digital da Universidade Católica de Brasília, em 25 de outubro de 2013, defendida e/ou aprovado pela banca examinadora abaixo assinada: ___________________________________________ Prof. Dr. Paulo Quintiliano da Silva Orientador Perícia Digital - UCB ___________________________________________ Prof. MSc. Paulo Roberto Corrêa Leão Examinador Perícia Digital - UCB Brasília 2013 3 RECUPERAÇÃO DE CÓDIGOS MALICIOSOS PROTEGIDOS POR CRIPTOGRAFIA ELIEL MARTINS Resumo: Este artigo apresenta um estudo sobre como a criptografia pode ser utilizada para a proteção de códigos maliciosos em arquivos executáveis no formato Portable Executable (PE) para sistema operacional Microsoft Windows e como recuperar esses arquivos protegidos para análise de suas funcionalidades. Os crypters foram identificados como ferramentas que permitem a aplicação desse tipo de proteção, sendo analisadas suas funcionalidades e sua arquitetura por de códigos fontes de crypters obtidos na internet. Uma pesquisa experimental empírica foi realizada para comprovar se a proteção de arquivo executável por um crypter pode impedir sua a recuperação, considerando um cenário de análise estática de funcionalidade implementadas um arquivo desconhecido. Como subsídios para a pesquisa foram geradas amostras com dois arquivos executáveis no formato PE diferentes, protegendoos com três crypters. O processo de recuperação dos arquivos originais foi realizado com ferramentas livres em um ambiente virtualizado. Os arquivos recuperados foram comparados com os originais para verificar a eficiência da recuperação do arquivos. Com os resultados da pesquisa foi possível concluir que mesmo que um arquivo seja protegido por um algorítimo de criptografia, por mais forte que seja, é possível recuperá-lo com o emprego de ferramentas e técnicas adequadas. Palavras-chave: Código Malicioso. Criptografia. Crypter. Engenharia Reversa. Malware. Portable Executable. 1. INTRODUÇÃO Malware é um termo genérico para definição de softwares maliciosos que são responsáveis por grande parte dos incidentes de segurança e invasão de computadores. Qualquer software que possa causar prejuízos a um usuário, um computador ou uma rede pode ser considerado um malware, tais como os vírus, trojans, worms, rootkits, scareware e spywares (Sikorski e Honig, 2012). Os softwares maliciosos estão cada vez mais sofisticados. Seus autores procuram fazer suas ferramentas indetectáveis. Praticamente todas as técnicas ofensivas conhecidas têm sido incorporada nos malwares para tornar cada vez mais difícil se defender deles. Embora seja raro ver técnicas completamente novas aparecerem pela primeira vez em malwares, seus autores são rápidos na adoção de novas técnicas, tão logo sejam tornadas públicas, e rapidamente se adaptam em face de novas técnicas defensivas (Malin et al, 2012). A criptografia é tradicionalmente utilizada para armazenar informações de forma segura e manter as comunicações privadas. Criptovirologia, tradução do inglês "Cryptovirology", é um termo utilizado para definir o estudo de aplicações de criptografia no desenvolvimento de software malicioso. Trata-se da investigação, de como as ferramentas e paradigmas modernos de criptografia podem ser usadas para fortalecer, desenvolver e melhorar novos ataques de softwares maliciosos (Young e Yung, 2004). 4 Há duas formas principais de utilização de criptografia em malwares: a primeira é para proteger os códigos maliciosos e tornar mais difícil a engenharia reversa, a segunda é garantir o anonimato das comunicações entre o malware e seu controlador (Anandrao, 2011). Historicamente, técnicas de criptografia têm sido utilizadas por autores de malwares desde o início dos anos 1990 para esconder funcionalidades e criar aquivos de aparência randômica que sejam de difícil detecção por Intrusion Detection System (IDS) e softwares antivírus. Ao longo do tempo, os malware têm apresentado técnicas cada vez mais sofisticadas para ocultar algoritmos e as chaves de descriptografia (as vezes até exigem ataque de força bruta descriptografar o malware), a fim de evitar a detecção e a análise forense (Davidoff e Ham, 2012). Ferramentas denominadas de crypter, de baixo custo e comercializadas pela internet, apresentam funcionalidades para proteção de arquivos executáveis com objetivo de impedir a engenharia reversa e torná-los indetectáveis por meio da utilização de criptografia. De acordo com dados do The 2013 Data Breach Investigations Report (Verizon, 2013), houve uma redução de 29% nos incidentes causados por malwares na comparação dos dados de 2011 e 2012. Dados Internet Security Threat Report 2013 (Symantec, 2013), também apontam uma redução no número de e-mails contendo malwares, de 1 em cada 239 para 1 em cada 291 e-mails. Diante dessas informação e considerando que seja realmente possível ocultar códigos maliciosos por meio de técnicas criptográficas, pode-se questionar se os dados do relatório refletem uma diminuição na quantidade de malwares produzidos ou diminuição na quantidade de malwares detectados. Como recuperar códigos maliciosos protegidos por meio de técnicas criptográficas em arquivos executáveis no formato Portable Executable (PE) é problema foco desse artigo. Partindo-se do pressuposto que códigos maliciosos ocultos podem ser recuperados mesmo se estiverem protegidos por meio de algoritmos criptográficos. O objetivo geral do artigo é comprovar a eficácia das proteções aplicadas, por ferramentas que utilizam de criptografia para ocultar códigos maliciosos em arquivos executáveis no Portable Executable (PE), com intenção de impedir a recuperação do artefato malicio para fins de análise de suas funcionalidades por engenharia reversa. Para alcançar esse objetivo o mesmo foi subdivido nos seguintes objetivos específicos: a. demonstrar a importância do formato PE para a área de prevenção e análise de malware; b. identificar, descrever a estrutura e o funcionamento de ferramentas utilizadas para ocultar códigos maliciosos em arquivos executáveis por meio de criptografia; c. recuperar arquivos protegidos por meio de algoritmos criptográfico e ocultos em arquivos no formato PE; e d. comparar os arquivos recuperados com os arquivos originais para comprovar a eficiência das ferramentas de proteção. Os malwares, que afetam diversos setores da sociedade que dependem de tecnologia da informação, são vetores utilizados para realização de diversas ações ilícitas, tais como: obtenção de vantagens financeiras, a coleta de informações confidenciais, vandalismo eletrônico, a realização de ataques virtuais e a disseminação de spam. Essa pesquisa é relevante por difundir de conhecimentos sobre técnicas utilizadas para ocultação de códigos maliciosos e procedimentos para sua recuperação e análise. 5 2. REFERNCIAL TEÓRICO Nesta seção são apresentados trabalhos relacionados ao estudo de criptografia aplicada softwares maliciosos e ao emprego de técnicas de criptoanálise para identificação de algoritmos criptográficos em malwares. Uto (2013) apresenta uma metodologia, com base em criptoanálise, com o objetivo de reduzir esforços com análise estática e dinâmica e recuperação de arquivos criptografados por malwares. Apresenta também um estudo de caso para ilustração da metodologia proposta aplicado em três malwares, obtidos de uma grande empresa brasileira, a qual não foi citada, que tinham por objetivo capturar informações de um hardware de propósito especial que existia no ambiente dessa empresa. Nesse estudo foram utilizadas mais técnicas de criptoanálise do que de análise estática e dinâmica de engenharia reversa. Lyda e Hamrock (2007) apresentam o protótipo de uma ferramenta de análise de arquivos binários denominada Bintropy, que tem por finalidade estimar a probabilidade de um arquivo conter bytes compactados ou criptografados por meio de algoritmos baseados em entropia, ou densidade da informação, que é um método para mensurar incertezas em sequências de números ou bytes. Essa ferramenta analisa detalhadamente os cabeçalhos de arquivos PE, provendo estatísticas rápidas da existência de dados randomizados, permitindo a identificação de malwares compactados ou criptografados. Os resultados da pesquisa indicam que a ferramenta foi útil para identificação códigos criptografados, sem identificar algoritmos ou cifras utilizados. Um estudo sobre como ferramentas e paradigmas modernos de criptografia podem ser utilizados para fortalecer, desenvolver e aprimorar novos ataques de malwares é apresentado em Kumar e Kumar (2013). O trabalho é focado no funcionamento de vírus que criptografam arquivos em computadores comprometidos para tentar extorquir as vítimas, citando os malwares GPcode e Conflicker. Por fim são sugeridas contra medidas para prevenir e defender desse tipo de ataque. Anandrao (2011) faz uma introdução ao emprego de técnicas criptográficas como meios ofensivos para realizar ataques de extorsão que causam perda de acesso a informação, perda de confidencialidade e vazamento de informações, tarefas que geralmente a criptografia impedem. Analisa também as ameaças e ataques que o mau uso da criptografia pode causar quando combinado com os softwares maliciosos. 2.1. PORTABLE EXECUTABLE Esta seção descreve resumidamente o layout do Portable Executable (PE), formato de arquivos para executáveis regulares, bibliotecas (dynamic-link libraries - DLL) e objetos da família de sistemas operacionais Microsoft Windows, destacando elementos principais para compreensão do funcionamento dos crypters. Também são apresentados dados estatísticos para ilustrar a dimensão da utilização do formato PE em malwares. O formato PE, definido pela Microsoft PE and COFF Specification (Microsoft, 2013a), é uma padrão que descreve a estrutura dos dados e códigos de um programa, permitindo ao sistema operacional alocar o espaço necessário em memória e iniciar a execução do programa no ponto de entrada do código. É considerado portável por poder ser utilizado em várias arquiteturas de computados de 32 e 64 bits. A Figura 1 representa a estrutura do de uma arquivo PE em dois momentos. O primeiro quando arquivo esta gravado em sistema de arquivos. O segundo após o arquivos ser 6 mapeado para a memória virtual para ser executado, onde pode notar um aumento dos espaços entre as seções o arquivo. a) DOS Header, os primeiros bytes armazenam os caracteres “MZ” (4D 5A em hexadecimal), que são uma assinatura do DOS que identifica o formato PE; b) DOS Stub, é um executável embutido que é chamado caso o arquivo não possa ser executado; c) NT Header ou PE Header, contem informações sobre os executáveis, incluindo o ponto de entrada de código (entry point), endereço das tabelas de importação e exportação, número de seções, entre outras informações; d) Section Header, contem informações sobre as seções existentes, na proporção de um por seção; e) Section, são as seções códigos e dados. Figura 1: Estrutura de um arquivo PE em disco e carregado na memória Fonte: http://slimv.tistory.com/entry/PE-File-Format-0x01 7 Conforme dados estatísticos de Symantec (2013), sobre dez famílias, conjunto de variações de um mesmo malware, mais detectados, que representaram 41,2 % do total de detecções do ano de 2012, verifica-se que os malwares dessas famílias ou são distribuídos como arquivos PE ou infectam arquivos nesse formato no sistema operacionais Windows. No Gráfico 1 estão representados as famílias e os percentuais ocupados por cada uma. Gráfico 1: Famílias de malwares mais detectados em 2012 Fonte: Symantec (2013) Gráfico 2: Quantidade de arquivos submetidos para analise em VirusTotal Fonte: VirusTotal (2013) Os Gráficos 2 e 3 apresentam estatísticas referente ao período de 7 a 12 de setembro de 2013 sobre a quantidade e os tipo de arquivos submetidos para a análise no período no site VirusTotal1. Nas tabelas 1 e 2 são apresentados de forma compilada os dados exibidos nos 1 VirusTotal é um serviço online gratuito oferecido pela Google para analise de arquivos e URLs suspeitos para identificação de malwares por softwares antivírus e scanners de websistes. 8 gráficos, onde consta que foram submetidos 2.459.062 arquivos no período, sendo que destes 1.341.638 são arquivos no formato PE, representando 54,55% do total de arquivos. Esses resultados refletem a importância do formato PE para as áreas de análise e combate a malwares. Gráfico 3: Tipos de arquivos submetidos para analise em VirusTotal Fonte: VirusTotal (2013) Tabela 1 - Compilação de resultados da quantidade arquivos submetidos Quantidade Total Quantidade arquivos únicos Arquivos únicos detectados por um ou mais antivírus 07 Set 377.333 342.238 164.575 08 Set 364.102 329.214 188.912 09 Set 438.949 367.752 230.882 10 Set 363.756 310.101 198.095 11 Set 470.550 405.533 190.867 12 Set 444.372 390.476 255.736 2.459.062 2.145.314 1.229.067 Data Total Tabela 2 - Compilação dos tipos arquivos no formato PE submetidos Tipo Quantidade Windows 32 bits EXE 1.142.471 Windows 32 bits DLL 188.990 DOS EXE 10.177 Total 1.341.638 2.2. PROTEÇÃO DE CÓDIGOS MALICIOSOS Nesta seção são examinadas técnicas e ferramentas utilizadas para proteger códigos maliciosos em arquivos executáveis com o objetivo de impedir análise com engenharia reversa ou torná-los indetectáveis pela análise de softwares antivírus. 9 Os desenvolvedores de malware empregam diversas técnicas para impedir que suas criações sejam analisadas ou detectadas, podendo-se destacar as seguintes: as que impedem a desmontagem ou disassembler, as que impedem a depuração (debug) do executável, as que impedem a execução do malware em máquinas virtuais (Sikorski e Honig, 2012), as que compactam e criptografam o código malicioso (Malin et al, 2012). A ocultação também é utilizada para evitar que outros criminosos examinem seus códigos maliciosos, pois oportunistas podem analisar os arquivos para; localizar de onde o malware está controlando; identificar máquinas que foram infectadas; determinar onde as informações valiosas capturadas, como conteúdos de keylogers e dados de cartões de crédito, estão sendo armazenadas. De posse dessas informações podem construir suas próprias botnets ou auferir lucros ilícitos por meio de condutas fraudulentas por meio da internet (Malin et al, 2012), sem desprendimento de esforço para desenvolvimento de malwares. A desmontagem consiste em converter um arquivo em linguagem de máquina (binário) para uma linguagem de montagem (Assembly), uma notação mais legível para analise visual de código. Com a finalidade de impedir esse processo são implementadas técnicas por meio de códigos ou dados inseridos no malware para que ferramentas de desmontagem produzam resultados incorretos, atrasando ou impedindo a análise do código (Sikorski e Honig, 2012). A depuração de um programa consiste na sua execução por instrução em ferramenta destinada a este fim, os depuradores (debuggers), constantemente empregados em análises malwares. Segundo Sikorski e Honig (2012) existem centenas de técnicas para reconhecer quando um malware está sobre o controle de um depurador para executar fluxos alternativos, desviando a atenção do analista, ou mesmo interromper seu funcionamento. A utilização de máquinas virtuais é uma prática comum em análises de malwares, pois permitem a rápida criação de ambientes de testes, facilitando o trabalho e provendo maior segurança. Como a grande maioria dos malwares são desenvolvidos para atingir sistemas operacionais em máquinas físicas, implementam-se técnicas para detectar quando o malware está sendo executado em uma máquina virtual, podendo explorar vulnerabilidades dessa máquina ou interromper seu funcionamento (Sikorski e Honig, 2012). Duas ferramentas comumente utilizadas para ocultar códigos maliciosos são os packers, que utilizam algoritmos de compressão para reduzir o tamanho dos executáveis, e os crypters, que utilizam algoritmos criptográficos para proteger os arquivos executáveis (Malin et al, 2012). Normalmente essas ferramentas também são a interface para aplicação das técnicas descritas nos parágrafos anteriores. Por serem as ferramentas que fazem utilização de criptografia para proteção de códigos maliciosos os crypters são analisados com mais detalhes na próxima seção. 2.3. CRYPTERS Nesta sessão são apresentadas a arquitetura, o funcionamento e as principais funcionalidade dos crypters, tendo como base análises realizadas em códigos fontes de crypters obtidos em Crypter Source2 e em HackHound3, pelas informações disponibilizadas pelos sites de comercialização de crypters na internet e pela implementação de referencia descrita em Ammann (2012). Um crypter é uma ferramenta projetada para receber arquivo executável como entrada, criptografá-lo e o anexá-lo a um outro arquivo executável que será o responsável por descriptografar e executar o arquivo original. Seu objetivo é tentar deixar o malware 2 3 Site que disponibiliza códigos fontes de crypter para fins didático e divulgação de crypter comercializados, disponível em http://www.cryptersource.com/ Fórum dedicado a segurança e programação de computadores e redes, disponível em http://hackhound.org/ 10 indetectável e impedir sua engenharia reversa por meio de um algorítimo criptográfico. O processo para proteger um malware é apresentado na Figura 2. Figura 2: Processo de proteção de um arquivo por um crypter Fonte: Adaptado de http://www.crypters.net/crypter-info/how-does-a-crypter-work/ A arquitetura de um crypter é formada por dois componentes: um cliente e um stub. O cliente é a interface com o usuário, onde se seleciona o arquivo a ser criptografado. O stub, também denominado de contêiner por Ammann (2012), é o componente responsável por descriptografar e executar o arquivo protegido. No cliente são implementadas funcionalidades para criptografar arquivos executáveis, realizar a junção de arquivos e geração de stubs. Geralmente também são utilizados para aplicar outros tipos de proteção ao malware e ao stub, tais como as descritas na seção 2.2. Segundo Moss at al (2011) e com base nas analises de códigos dos crypter os algoritmos de criptografia utilizados vão de simples cifras de codificação XOR às cifras compactas como o Tiny Encryption Algorithm (TEA), sendo encontrado também a utilização de cifras mais elaboradas como o Advanced Encryption Standard (AES). Há casos em que os crypters implementam mais de um algorítimo, permitindo seleção de qual utilizar para proteção do arquivo. Figura 3: Execução de arquivo protegido por um crypter O stub é um componente que encapsula o arquivo criptografado, considerando que esse arquivo seja um malware, é a parte que será analisada por softwares antivírus e que estará 11 visível em um primeiro momento para engenharia reversa cabendo ao analista identifica essa condição para não analisar o arquivo errado. Na Figura 3 podemos observar as três fases necessárias para descriptografar e executar um arquivo protegido, sendo que após a execução o arquivo protegido retorna a primeira fase. A primeira função essencial de um stub é descriptografar o aquivo protegido, fase dois, sendo o algoritmo utilizado um ponto fraco do stub. O código de um algoritmo de criptografia é facilmente identificado, e como não é comum ter esse tipo de algorítimo em arquivos executáveis, os que possuem podem ser classificados como malwares (Elisan, 2012), por meio de técnicas heurísticas. A chave para descriptografar o arquivo geralmente é armazenada no próprio stub, existindo porém esquemas mais elaborados para sua proteção, como o encontrado em Ammann (2012), que utiliza um mecanismo de força bruta implementado no stub para localizar a chave correta. Elisan (2012) identificou esquemas onde é possível gerar uma nova chave cada vez que o malware é carregado na memória e criptografado para o disco novamente. A segunda função essencial de um stub é executar o arquivo descriptografado, fase três. Na maioria dos códigos examinados essa função é denominada de RunPE, que implementam o processo descrito por Keong (2004) para carregar dinamicamente o um arquivo executável na memória. A compreensão desse processo é importante para entender como stub executa o arquivo protegido e para identificar em que momento o arquivo original desprotegido pode ser recuperado. Detalhes sobre o funcionamento das função utilizadas podem ser obtidos em: http://msdn.microsoft.com/en-us/library. O processo é descrito resumidamente a seguir: a. Utiliza a função CreateProcess, no stub, com o parâmetro CREATE_SUSPENDED para criar um processo no estado suspenso; b. Utiliza a função GetThreadContext para obter os valores dos registradores (no contexto da thread) do processo suspenso. O registrador EBX do processo suspenso aponta para o Process Environment Block (PEB). O registrador EAX contêm o ponto de entrada (entry point) do primeiro processo (stub); c. Obter endereço base do processo suspenso do PEB; d. Carrega o segundo executável (malware) na memória (utilizando a função ReadFile) e realiza ajustes manualmente se necessário. Isso é requerido se o alinhamento do arquivo executável é diferente do alinhamento dele carregado na memória. e. Se o segundo processo (malware) tem o mesmo endereço base do processo suspenso e o tamanho da sua imagem é menor ou igual tamanho da imagem do processo suspenso, simplesmente utiliza a função WriteProcessMemory para escrever a imagem do segundo executável (malware) no espaço de memória do processo suspenso, inciando no endereço base; f. Caso contrário, desmapear a imagem do primeiro utilizando a função ZwUnmapViewOfSection (ntdll.dll) e utilizar a função VirtualAllocEx para alocar memória suficiente para o segundo executável no espaço de memória do processo suspenso. A função VirtualAllocEx deve ser alimentada com o endereço base do segundo executável para ter certeza que o Windows fornecerá memória na região correta. Na sequência, copia a imagem do segundo executável (malware) para o espaço de memória do processo suspenso iniciando endereço alocado utilizando a função WriteProcessMemory; g. Se a operação de desmapear falhar mas o segundo executável for realocado (se tiver tabela de realocação), então aloca memória suficiente para o segundo 12 executável com base no endereço de memória alocado. Na sequência, copia a imagem do segundo executável (malware) para o espaço de memória do processo suspenso iniciando endereço alocado utilizando a função WriteProcessMemory; h. Altera o endereço base do segundo executável no PEB do processo suspenso. i. Define o valor do registrador EAX do contexto da thread com o endereço do ponto de entrada (entry point) do segundo executável (malware). j. Utiliza a função SetThreadContext para modificar o contexto da thread do processo suspenso. k. Chama a função ResumeThread API continuar a execução do processo suspenso. Para evitar que os stubs sejam identificados como malwares por softwares antivírus, tornando-os ineficazes para as tarefas que foram projetados, são utilizadas diversas técnicas para tentar tornar seu código indetectável. Das análises dos códigos fontes foram identificadas as seguintes técnicas implementadas nos clientes dos crypter utilizadas para produzir stubs com características diferentes, evitando a detecção com base em assinaturas e tentando evitar a detecção por meio de técnicas heurísticas: a) Adição de códigos sem utilidade para modificar o fluxo de execução, incluindo falsos laços, funções, variáveis, textos e estruturas de controle. São inseridos de forma randomizada em várias partes do código de forma a não interferir muito no fluxo execução; b) Alteração da ordem das estruturas de código, alterando a posição de funções e variáveis, ou colocando-as até mesmo em outros arquivos ou módulos; c) Mascaramento das chamadas a Application Programming Interface (API) do sistema operacional; d) Alteração de nomes de variáreis por outros gerados aleatoriamente; e) Criptografia de textos, com mecanismos para descriptografá-los sob demanda; No Quadro 1 são apresentados exemplos de crypters comercializados pela internet, com custos para aquisição dos mesmos, incluído suporte técnico e atualizações pelo período de um ano. Considerando-se que um malware oculto pode causar grandes prejuízos, caso não seja detectado no momento oportuno, esses custos apresentados podem ser considerados irrisórios. Quadro 1 - Crypters comercializados pela internet Ferramenta Site Custo Aegis Crypter 3.2 http://www.aegiscrypter.com/ U$ 250,00 CypherX Crypter https://cypherx.org U$ 497,00 Execrypter total http://www.execrypter.com.br/ R$ 54,00 RDG Tejon Crypter http://rdgsoft.8k.com/Tejon.html U$ 40,00 Sheikh Crypter http://www.buycrypter.com/ U$ 49,90 Xprotect http://www.buycrypter.com/ U$ 74,90 3. PESQUISA EXPERIMENTAL A pesquisa foi realizada considerando o cenário em que um analista recebe arquivos executáveis suspeitos, sem nenhuma informação adicional a respeito dos mesmos, tendo como objetivo realizar análises estáticas para determinar suas funcionalidades. Como os arquivos recebidos estão protegidos, o analista primeiramente deve localizar e extrair o código original 13 do suposto malware para não incorrer no erro de analisar o programa errado, considerando a utilização de crypters o analisa inicialmente teria acesso somente ao código do stub. A localização e a extração do programa original são foco dessa pesquisa. Para localização e recuperação do arquivo original foi seguindo o seguinte processo, adaptado de Ligh at al (2011): a) Localizar o endereço original da primeira instrução do aquivo protegido antes de ser criptografado, denominado de Original Entry Point (OEP). A seguir são apresentados em ordem de prioridade de utilização, do mais simples para o mais complexo, os métodos utilizados para localizar o OEP: 1. Utilizar uma ferramenta automatizada genérica para localização de OEP; 2. Utilizar uma ferramente de depuração, setando pontos de parada em função que são normalmente chamadas antes da execução de programa; 3. Analisar o código descompilado manualmente. Exige mais tempo e habilidade do analista; b) Depurar o programa até alcançar o OEP. Isto permite que o malware seja executado o suficiente para que ele extrai-lo da memória, mas não a ponto de começar a execução do código de malicioso. c) Extrair o arquivo descompactado da memória para um arquivo no disco. d) Reconstruir a tabela de endereços de importação (Import Address Table - IAT) do arquivo extraído, caso seja necessário. Como última alternativa para extrair o arquivo original, caso os procedimentos anteriores não funcionassem, considerou-se a possibilidade de executar a amostra e extrair o arquivo original da memória. Para o tipo de cenário considerado nesta pesquisa essa abordagem não é a mais adequada, uma vez que um artefato malicio for executado, além de comprometer o sistema de suporte a análise, não se pode prever qual a proporção do código foi carregada na memória. 3.1. AMBIENTE E FERRAMENTAS O ambiente de execução da pesquisa foi constituído de uma máquina virtual com sistema operacional Microsoft Windows XP, executado no software de virtualização VirtualBox, em máquina real com sistema operacional Debian. As seguintes ferramentas, todos distribuídas livremente, foram utilizadas nas atividades da pesquisa experimentar: a) PeiD - disponível em http://www.aldeid.com/wiki/PEiD, é uma ferramenta importante para identificação de informações básicas de arquivos suspeitos. Também detecta os tipos mais comuns de packers, crypters e compiladores, com mais de 600 tipos diferentes de assinaturas; b) OllyDbg - disponível em http://www.ollydbg.de, é um disassembler utilizado para análise estática de binários, podendo acessar toda a estrutura de código de um programa. É também um depurador (debugger), utilizado para análises dinâmicas, permitindo a manipulação de um programa em tempo de execução no nível de linguagem de máquina; c) Process Explorer – disponível em http://technet.microsoft.com/enus/sysinternals/ /bb896653.aspx, é um gerenciador de avançado de processos que permite identificar bibliotecas utilizadas, arquivos abertos e subprocessos. Permite também extrair um arquivo da memória; 14 d) Hex Workshop Hex Editor– disponível em http://www.hexworkshop.com/, é conjunto de ferramentas para desenvolvimento em hexadecimal, com ele e possível editar dados binários diretamente nos arquivos; e) NoVirusThanks NPE File Analyzer - disponível em http://www.novirusthanks.org/ /product/npe-file-analyzer/, é um utilitário que permite visualizar e editar arquivos PE de 32 e 64 bits. Possui funções que permitir analisar toda a estrutura de um arquivo, comparar estrutura de arquivos, extrair um arquivo de outro, extrair arquivos da memória, entre outras funcionalidades; f) LordPE - disponível em http://www.woodmann.com/collaborative/tools/ index.php/LordPE, é uma ferramenta para visualização e edição de arquivos PE; g) RegShot - disponível em http://sourceforge.net/projects/regshot/, é um utilitário que permite comparar o estado registro do sistema operacional Windows. 3.2. PROTEÇÃO DE ARQUIVOS Nesta etapa foram utilizados os crypter apresentados no Quadro 2, numerados para facilitar a referencia aos mesmos. Foram geradas amostras com dois arquivos diferentes, num total de seis amostras. O estado das amostras geradas é correspondente a fase três da Figura 2. Quadro 2: Crypters utilizados na pesquisa Número Crypter Amostras 01 Aegis Crypter 3.2 http://www.aegiscrypter.com/ 02 Indetectables crypter http://www.indetectables.net/ 03 Crypter v3.5 Multi-Tool http://hackhound.org/forums/topic/2568-crypter-multi-tool-v35/? hl=crypter Os arquivos utilizados para geração das amostras foram: o primeiro uma aplicação simples escrita especificamente para essa pesquisa na linguagem Visual Basic 6. O segundo arquivo é um arquivo identificado como malware pelo VirusTotal 4 como 39/46 mecanismos antivírus como software malicioso. O processo de geração das amostras consistiu em utilizar as interfaces gráficas dos clientes do crypters, selecionar o arquivo a ser protegido e solicitar a criptografia do mesmo. Não foram aplicadas outras proteções aos arquivos para não tornar demasiadamente dispendiosa a recuperação do arquivo protegido. O Quadro 3 apresenta dados sobre as amostras geradas. Comparando os tamanhos dos arquivos original e das amostras geradas, observa-se um aumento médio de 162,5, 112,5 e 1222,5, para o primeiro, segundo e terceiro crypter, respectivamente. Esse tamanho médio a mais indica o tamanho do stub gerado pelo crypter. O valor da coluna entropia foi calculado com a ferramenta PeiD. Considerando dados estatísticos de experimento realizado por Lyda e Hamrock (2007), em que foram obtidos valores médios 7.175 para arquivos criptografados, apenas as amostras do primeiro crypter indicam a presença de dados criptografados. As outras amostras apresentam valores de executáveis normais. 4 https://www.virustotal.com/pt/file/27a596ed3a49a27754115cd9d5f0b2926ae0d9eb59308e1bf06ac7c78e2efc 48/analysis/ 15 Quadro 3: Dados amostras geradas Amostra Tamanho arquivo Tamanho amostra original em KB em KB Diferença de tamanho em KB Entropia crypter-01-amostra-1 92 257 165 7,16 crypter-01-amostra-2 41 201 160 7,14 crypter-02-amostra-1 92 205 113 5,11 crypter-02-amostra-2 41 153 112 5,11 crypter-03-amostra-1 92 1317 1225 5,12 crypter-03-amostra-2 41 1261 1220 5,11 3.3. RECUPERAÇÃO DE ARQUIVOS PROTEGIDOS Inicialmente tentou-se localizar o OEP de forma automatizada com a ferramenta PeiD, porém não foi possível localizá-lo em nenhuma das amostras, partindo-se então para a depuração das amostras com o OllyDBG, definindo de pontos de parada em funções do sistema operacional chamadas antes da execução do programa protegido. Analisando as funções utilizadas pelas amostras, identificou-se que os três crypters utilizam o esquema Keong (2004) para carregamento do arquivo descriptografado na memória, apenas mascarando a chamada a essas ou utilizando versões não documentadas das mesmas. Para criação de processo em modo suspenso os crypter 01 e 02 utilizam a função CreateProcessW e CreateProcessA, que são variações da função CreateProcess, utilizada pelo crypter 03, para trabalhar com o padrão de codificação caracteres Unicode e ANSI, respectivamente. A função não documentada ZwResumeThread é utilizada em todos os crypters para continuar a execução do processo suspenso. As chamadas a essas funções estavam mascaradas por mecanismos não identificados, dificultando a localização do ponto onde eram chamadas, sendo necessário ama lenta depuração das das amostras da identificá-las. Tendo conhecimento da utilização dessas funções foram definidos pontos de parada com OllyDBG nas funções CreateProcess (ou suas variações) e na função ZwResumeThread, no endereço de memória 7C90DB20, conforme Figura 4. A transferência da execução do processo é efetivada na chamada a função KiIntSystemCall, também não documentada. Figura 4: Ponto de parada na função ZwResumeThread O terceiro crypter, cujas amostras geradas eram dez maiores do que as dos outros crypters, foi também o que apresentou maior grau de dificuldade para localizar a chamada 16 correta da função ZwResumeThread, pois a mesma é chamada diversas vezes com parâmetros falsos, não executando nenhum processo, mas dificultado a localização da chamada correta. A Figura 5 apresentada uma tela da ferramenta Process Explorer no exato momento em que a depuração do programa estava parada na função ZwResumeThread, com o processo nesse ainda estado suspenso. Figura 5: Estado do processo suspenso no ponto de parada da Figura 4 O Process Explorer possuí funcionalidade para extrair um processo da memória, porém essa se mostrou menos eficiente do que a existente no LordPE, em que é possível fazer uma extração parcial do processo, passando como parâmetros o endereço base na memória (Imagebase) e tamanho a ser extraído do processo. Uma tela do LodePE no momento em que os processos foram extraídos da memória é apresentada na Figura 6. Figura 6: Momento da extração do arquivo da memória no LordPE 17 Para verificar a qualidade dos arquivos gerados a partir da extração do processo da memória foram realizadas dois tipos de comparações com os arquivos originais: execução do arquivo gerado e a comparação da estrutura do formato PE. A execução dos arquivos gerados da primeira amostra foi comprovada, por se tratar de aplicação gráfica, observado sua renderização correta. Para comprovar os resultados da execução da segunda amostra, que é um arquivo malicioso, foi utilizada a ferramenta RegShot, comparando-se o estado do registro do Windows após a execução do malware original com o estado após a execução malware gerando a partir da extração, sendo observado que foram feitas as mesmas alterações no registro, podendo-se presumir o malware funcionou corretamente. As estruturas do formato PE foram comparadas por meio da ferramenta NPE File Analyzer, sendo constatado que somente o atributo tamanho (File Size) era diferente. Na Figura 7 é apresentado um exemplo da comparação da estrutura da primeira amostra do primeiro crypter com o arquivo original. Figura 7: Exemplo de comparação de arquivos PE Com essas comparação encerram-se as atividades da pesquisa experimental cumprindo com o objetivo proposto de recuperar um arquivo executável no formato PE protegido por meio de criptografia. 4. METODOLOGIA Para atingir os objetivos propostos neste artigo, desenvolveu-se inicialmente uma pesquisa bibliográfica para identificar trabalhos, técnicas e ferramentas relacionadas a aplicação de técnicas criptográficas para ocultação de códigos maliciosos e as técnicas existentes para recuperação desse códigos maliciosos. Posteriormente realizou-se uma pesquisa experimental empírica em um ambiente controlado para verificar a viabilidade de recuperação de arquivos protegidos por meio de técnicas criptográficas, e comprovar a eficiência dessa proteção. 18 Figura 8: Metodologia de pesquisa experimental A pesquisa experimental foi realizada seguindo os passos apresentados na Figura 8, inciando a preparação do ambiente virtualizado e seleção de ferramentas para suportar as atividades. Em seguida foi gerado um conjunto de amostras com arquivos protegidos no formato PE. Posteriormente foram realizadas tentativas para recuperação dos arquivos originais protegidos, dividindo o fluxo de trabalho de acordo com o resultado obtido. Caso o arquivo fosse recuperado seria comparado binariamente com seu original, para verificar o grau de recuperação do arquivo. Caso não fosse possível recuperar o arquivo descrever os fatores que impediram essa recuperação. Finalizado a pesquisa o ambiente utilizado foi desativado para evitar a proliferação de artefatos maliciosos manipulados. 5. CONCLUSÃO Ao longo desse artigo foram apresentado conceitos e ferramentas relacionados a proteção de arquivo executáveis por meio de criptografia empregadas para a proteção de códigos maliciosos em arquivos no formato PE. A relevância desse formato de arquivo para as áreas de análise malware ficou evidência por meio de dados estatísticos obtidos no site VirusTotal e dados Internet Security Threat Report 2013: Volume 18 (Symantec , 2013). Os crypter, comercializadas ou até mesmo distribuídas livremente pela internet, foram identificadas fazem como ferramentas que fazem uso de criptografia para ocultar códigos maliciosos em arquivos executáveis, fornecendo uma interface simples e amigável para que possam ser utilizadas por qualquer pessoa para ocultar um arquivo executável gerando um outro executável. As funcionalidades e a arquitetura dos crypters foram analisados por meio de códigos fontes dessas ferramentas obtidas em diversas fontes na internet, onde foram constatadas que são constituídos por um cliente (interface com o usuário) e um stub (mecanismo de descriptografia e execução do arquivo protegido). Foram constatadas que os stubs são empregadas técnicas de programação polimórfica para que não sejam classificados como malware. Uma pesquisa experimental foi realizada para comprovar a efetividade das proteções aplicadas pelos crypters, considerando um cenário de análise estática de malware para estudar 19 suas funcionalidades, protegendo arquivos executáveis com os crypters e recuperando esses arquivos posteriormente para comparação com os originais. Com os resultados da pesquisa experimental, pode-se concluir que a criptografia aplicada na proteção de arquivos maliciosos não impede a sua recuperação, pois em algum momento o malware terá que ser carregado na memória para ser executado, comprovando também a falta de eficácia dos crypters em impedir a recuperação de arquivos protegidos por meio de criptografia. Também ficou evidenciado que não importa o tipo e força do algoritmo criptográfico utilizado, pois em nenhum das amostras analisados foi necessário identificar ou mesmo localizar as chaves criptográficas para poder recuperar o arquivo protegido. 5.1. TRABALHOS FUTUROS Existem esquemas de proteção mais complexos do que os oferecidos pelos crypters analisados, como os oferecidos pelo Themida5, que poderiam ser explorados em outros trabalhos com enfoque em engenharia reversa de código maliciosos. Embora o Themida seja comercializado como uma ferramenta de proteção para fins legítimos, é também utilizado para proteção de malware. Um outro ponto que poderia ser explorado de outros trabalhos é avaliação da eficácia das proteções oferecidas pelos crypter contra a identificação dos códigos protegidos de análises de mecanismos antivírus, e também da classificação de seus stubs como software maliciosos. Esse artigo teve foco no formato de arquivos executáveis PE. Estudos similares poderiam ser realizados para outros formatos como Mach-O (Mach object) 6 dos sistemas operacionais da Apple, ou formato Executable and Linking Format (ELF)7 padrão de arquivos executáveis nos sistemas operacionais Unix e similares (Linux, Solaris, IRIX, FreeBSD, NetBSD, OpenBSD), e nos consoles para videogames PlayStation da Sony. MALICIOUS CODE RECOVERY PROTECTED BY CRYPTOGRAPHY Abstract: This article presents a study on how cryptography can be used for malware protection in the Portable Executable (PE) executable files format for Microsoft Windows operations system and how these files protected can be recovered for analysis. The crypters were identified as tools that allow the application of this type of protection, its features and architecture wore analyzed by the crypters source codes obtained on the Internet . An experimental research was conducted to verify if the executable file protection applied by crypters can prevent its recovery, considering a scenario of functionality static analysis in a unknown file. As subsidies for research samples were generated with two different executable files in PE format, one of them classified as malware, protecting them with three crypters. The recovery process of the original files was done with free tools in a virtualized environment. The recovered files were compared with the original to verify the efficiency of recovering process. With the results of the research we concluded that even if a file is protected by an encryption 5 6 7 http://www.oreans.com/themida.php https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachORuntime/Refere nce/reference.html http://www.cs.princeton.edu/courses/archive/fall13/cos217/reading/elf.pdf 20 algorithm, however how strong it is, you can retrieve it with the use of appropriate techniques and tools. Keywords: Crypter. Cryptography. Malicious code. Malware. Portable Executable. Reverse Engineer. 6. REFERÊNCIAS Ammann , Christian. Hyperion: Implementation of a PE-Crypter. Maio 2012. Disponível em: <http://www.exploit-db.com/wp-content/themes/exploit/docs/18849.pdf>. Acesso em: 01 setembro 2013. Kumar, S.Manoj; Kumar, M.Ravi. Cryptoviral Extortion: A virus based approach. IJCTTInternational Journal of Computer Trends and Technology, May 2013. Anandrao , Shivale Saurabh . Cryptovirology: Virus Approach . International Journal of Network Security & Its Applications (IJNSA), Vol.3, No.4, July 2011 . Davidoff , Sherri; Ham, Jonathan. Network Forensics : Tracking Hackers through Cyberspace . Nova York: Pearson Education , 2012. Elisan, Christopher. The Evolution of Malware Encryption Part I: Basic Malware Encryption. Dezembro 2012. Disponível em: <http://blogs.rsa.com/the-evolution-ofmalware-encryption-part-i-basic-malware- encryption/>. Acesso em: 20 maio 2013. Keong, Tan Chew. Dynamic Forking of Win32 EXE. Abril 2004. Disponível em: <http://www.security.org.sg/code/loadexe.html>. Acesso em: 01 setembro 2013. Ligh, Michael Hale; Adair, Steven; Hartstein, Blake; Richard, Matthew. Malware Analyst’s Cookbook and DVD: Tools and Techniques for Fighting Malicious Code. Indianapolis: Wiley Publishing, 2011. Lyda, Robert; Hamrock, James. Using Entropy Analysis to Find Encrypted and Packed Malware. IEEE Security & Privacy Magazine, March-April 2007, Vol.5(2), pp.40-45. Malin, Cameron H; Casey, Eoghan; Aquilina, James M. Malware Forensics Field Guide for Windows Systems: Digital Forensics Field Guides. São Francisco: Elsevier, 2012. Microsoft Cooperation. Microsoft PE and COFF Specification. Disponível em: <http://msdn.microsoft.com/en-us/windows/hardware/gg463119.aspx>. Acesso em: 10 agosto 2013a. Moss, Jeff; Dodge Jr., Ronald C.; Bradley, Tony; Potter, Bruce. Gray Hat Hacking: The Ethical Hacker’s Handbook. Nova York: McGraw-Hill, 2011. 21 Symantec. Internet Security Threat Report 2013: Volume 18. Disponível em: <http://www.symantec.com/security_response/publications/threatreport.jsp>. Acesso em: 21 maio 2013. Sikorski, Michael e Honig, Andrew. Practical Malware Analysis: The Hands-On Guide to Dissecting Malicious Software. São Francisco: No Starch Press, 2012. Uto, Nelson. A Methodology for Retrieving Information from Malware Encrypted Output Files: Brazilian Case Studies. Future Internet 2013, 5, 140-167. Verizon. The 2013 Data Breach Investigations Report. Disponível em: <http://www.verizonenterprise.com/resources/reports/rp_data-breach-investigations-report2013_en_xg.pdf.>. Acesso em: 28 maio 2013. VirusTotal. File statistics. Disponível em: <https://www.virustotal.com/en/statistics/>. Acesso em: 12 setembro 2013. Young, Adam; Yung, Moti. Malicious Cryptography: Exposing Cryptovirology. Indianapolis: Wiley, 2004.