Sh3rl0ck's Content - Mente Binária
Proposta O Assembly é uma linguagem muito interessante, não no sentido para se programar que nem nas outras linguagens, mas para que um programador realmente entenda o que está fazendo quando criar um software, pois é nessa linguagem que deixamos de ser um programador abstrato com um conhecimento superficial em computação de forma geral e passamos a entender como as coisas realmente funcionam e muitas coisas que fazemos em alto nível ficam muito claras no baixo nível. Apesar de não ser mais usual usar Assembly para programar, esta linguagem nos trás outros leques de possibilidades de técnicas mais avançadas tanto na segurança ofensiva como defensiva, envolvendo principalmente as áreas de pentest, forense e desenvolvimento seguro. (também é o caminho para criar cracks e cheats) A primeira vez que vi Assembly de verdade e que me fez ter interesse na área de forense em geral, foi devido a influência de um amigo que foi da polícia civil. O mesmo me envolveu em um de seus casos, em que utilizou a engenharia reversa em um malware e descobriu o e-mail do criminoso que o criou, a partir deste e-mail ele foi capaz de descobrir o seu criador e tomar as medidas necessárias. Todo aquele processo usando engenharia reversa analisando o Assembly daquele malware me vez ver o grande mar de possibilidades e poder que me traria ao aprender essa linguagem. Quando comecei a estudar vi que era muito difícil achar algo em português para estudar isso bem (acabei aprendendo tudo em inglês) e percebi que tínhamos uma enorme carência desse assunto em nossa lingua, dessa forma pretendo trazer aqui uma série de tutoriais para aprender as base do Assembly em português e poderem em seguida aprender RE, análise de malware, exploits e etc... O que pretendo passar é algo bem passo a passo para que entendam muito bem o funcionamento do Assembly, com o computador como o todo, o que vai envolver um pouco de matemática, eletrônica, programação e sistemas operacionais. Garantindo assim um entendimento de como as coisas funcionam e o por quê. Sugiro que vejam o artigo de engenharia reversa aqui do próprio fórum que fala das vantagens, basicamente se usa assembly muito em engenharia reversa. Além disso, sugiro fortemente que leia um artigo que criei no blog que sou moderador sobre Assembly para iniciantes: http://www.guiadohacker.com.br/artigos/dicas-para-iniciantes-assembly
O que é? A análise de malware, como o próprio nome diz, se trata da análise de código maliciosos a fim de descobrir o seu comportamento ou como funciona mais internamente. Com isso podemos classificar o malware, verificar a sua natureza, tentar descobrir o autor, quais danos pode causar, como pausar os danos e como preveni-lo. A análise de malware é um segmento da computação forense, que foca mais na análise de um artefato (programa / arquivo), podendo identificar se ele é ou não malicioso. Além disso isso é praticamente a base de um anti-vírus, podemos dizer que praticamente o anti-vírus faz uma análise de malware mais automatizada e usa um bom banco de dados de ameaças para auxiliar nesta tarefa, mas a intervenção humana geralmente acaba sendo mais precisa e inteligente na análise de malware, em alguns casos de malwares novos, os analistas verificam o malware e desenvolvem uma forma de identifica-los e remove-los que é inserido no antivírus (que nem os médicos que desenvolvem a vacina para uma doença). É muito importante citar que a análise de malware está diretamente ligado a engenharia reversa, principalmente na parte de análise de código (analisa o malware com RE), já na parte de analise comportamental (verifica as suas interações com o sistema e com a rede) isso não é muito necessário quanto a de código. Por que aprender? A análise de malware é utilizada em várias áreas e situações, seguem alguns exemplos: Criação de assinaturas e outras formas de detecção e remoção usadas pelo antivírus; Se o antivírus não detectar o malware e você sabe que está contaminado, você mesmo poderá remove-lo e criar uma "vacina"; Poderá identificar o respectivo atacante; Em alguns casos poderá verificar se um arquivo é ou não malicioso antes de executa-lo; Em alguns casos poderá verificar se uma página/e-mail é ou não malicioso antes de acessa-lo (nesse caso analisamos a página com o noscript antes); Saber como se prevenir e reagir a uma contaminação por malware; Utilizar em uma análise forense; Além desses exemplos podemos ter outros motivos do por que aprender. Como aprender? Antes de iniciar os estudos diretamente sobre análise de malware, terá certos pré-requisitos para isso: O ponto mais importante é aprende engenharia reversa, para isso existe o artigo abaixo que foi criado que ensina qual o caminho para aprender: Outro aspecto é aprende redes de computadores, as principais referências são Redes de Computadores de Andrew S. Tanenbaum ou Redes de Computadores e a Internet, Uma Abordagem Top-Down de Jim Kurose. Após ler esses livros base de redes, recomendo ver o livro mais específico para análise em redes: Análise de Tráfego em Redes TCP/IP de Eriberto Mota Filho. Após isso já terá boas bases para iniciar com os estudos sobre análise de malware: Practical Malware Analysis: The Hands-On Guide to Dissecting Malicious Software de por Michael Sikorski; Malware Analyst's Cookbook and DVD: Tools and Techniques for Fighting Malicious Code de Michael Ligh; The Art of Memory Forensics: Detecting Malware and Threats in Windows, Linux, and Mac Memory de Michael Ligh;
Hoje tem crescido bastante a utilização de ransomware e ainda mais com a divulgação da mídia, apesar desse crescimento nos últimos anos, o ransomware NÃO é uma porcentagem muito alta com relação a outros tipos de malware, sendo no Brasil o trojan banker o mais predominante. Apesar de não serem tão predominantes eles podem ser letais a algumas empresas, principalmente se não seguirem uma política de backup ou nem terem um. Usando a engenharia reversa contra ransomware pode ser de muita utilidade, diferente do que muitos podem pensar, a RE nesse caso não somente serve para ver como funciona o malware, mas até como reverter o processo e até pausar o processo do mesmo, podendo proteger os dados de uma empresa ou reduzir os danos. No Brasil a produção do ransomware é muito imatura, sendo fáceis de se resolver se comparado aos mais sofisticados de outros países. Um caso que tive contato foi de uma empresa que teria aparentemente perdido seus dados para um ransomware, esta empresa pagou o resgate e nunca mais recebeu notícias do atacante, mas na verdade a empresa nunca perdeu de fato o acesso a seus arquivos, tudo estava em uma outra partição do HD com um nome codificado, ao abrir essa partição, lá estavam todos os seus arquivos que poderia utiliza-los sem nenhum problema. O funcionamento era simples, ele criava uma nova partição e colocava os arquivos neste local, e no local original (c:\ por exemplo) ele compactava os arquivos com senha. Resumindo, nunca precisariam tem pago o resgate. Outro caso foi de uma pequena empresa que também pagou o resgate e nunca mais teve contato do atacante, então uma empresa terceirizada de TI foi verificar e decidiram formatar as máquinas e a deu continuidade a suas rotinas (para variar não tinha backup). Quando a empresa terceirizada de TI me falou sobre isso, e me passaram os dados do ransomware, eu soube a qual família pertencia e disse "tinha como reverter esse processo, o kaspersky já analisou essa família de ransomware e disponibilizou a solução para reverter o processo da criptografia", nesse momento simplesmente responderam que agora era tarde demais. Além desses casos brasileiros, podemos lembrar do caso do internacional do wanna cry o qual após uma análise vi que ao registrar o domínio que o mesmo usava, iria interromper o processo de criptografia antes de ser iniciado. Quando vamos usar a engenharia reversa teremos a possibilidade de: interromper o processo de criptografia, interromper a inicialização, interromper a contaminação e reverter os danos. Para que isto seja possível durante a RE deverá pensar nos seguintes pontos: Qual o C&C? O C&C (comando e controle) é o canal por onde o atacante e o ransomware se comunicam, podendo ser de várias formas como IRC, socket, facebook, twitter, blog, outras páginas da web, acesso a um domínio específico e por ai vai. A grande importância é que o C&C quando for utilizado (nem sempre terá um) ele poderá servir para enviar a chave de criptografia pela rede que será utilizada no processo de criptografia e também pode ser usando para o atacante poder dar a ordem ou autorização para iniciar o processo de cifragem/decifragem. Partindo desse princípio pense o seguinte, se identificarmos o C&C, termos a possibilidade de por exemplo pegar a senha que é trafegada na rede com o wireshark filtrando pelo c&c utilizado, se usa SSL e TLS podemos tentar burlar isso, outro caso é bloquear esse C&C no firewall, pois isso evitará tanto que o atacante dê as ordens como que receba a senha, em alguns casos a cifragem só inicia após conseguir enviar a senha com sucesso para o atacante ou o inverso, quando o atacante conseguir enviar a senha a ser utilizada para o programa usar. Como ele realiza a criptografia? É muito importante saber isso, pois se soubermos o algoritmo, pode ser que saibamos uma forma muito simples de reverter. Se identificar que ele usa criptografia simétrica saiba que ele pode ter armazenado essa senha localmente, ou que ela deverá trafegar na rede do atacante pro ransomware e vice-versa. Se for assimétrica, pode ser muito mais difícil, adquirir a senha, o melhor em alguns casos é bloquear o C&C, mas não soluciona totalmente dependendo do algoritmo para trocar as chaves. A chave está no código? Em alguns casos de atacantes pouco experientes, eles podem colocar uma senha hard-code, podendo ser tanto a senha para compactar ou da criptografia simétrica que será usada, podendo por algum tipo de ofuscação de string, mas programadores mais experientes não realizaram isso. A senha está na RAM? Durante o processo da cifragem a senha poderá estar na memória RAM para que o próprio ransomware utilize, nesse caso podemos fazer o dump da memória da máquina durante o ataque. Qual a família? Podemos identificar a família do ransonware, a maioria deles são derivações se algum já existente. Quando identificamos a família, podemos pesquisar se empresas criaram uma solução para reverter o processo, temos como exemplo o site https://noransom.kaspersky.com/ que podemos usar para reverter isso. Podemos identificar a família pela analise string, hash, comportamento, tela de regate e etc. Esse código tem alguma falha? Da mesma forma que crackers exploram falhas para crackear os programas e demais black hats usam para achar falhas, nós podemos usar a RE para achar alguma falha no código que nos permita de alguma forma parar o ataque, parar o processo de criptografia, ou provocar um erro que interrompa o mesmo, lembre-se que é um software comum programado por uma pessoa comum e softwares sempre podem ter falhas, até mesmo na forma que ele realiza a criptografia, pode ser que possamos ver uma forma de reverter em alguns casos. Qual o modo de propagação? Podemos identificar como ele se propaga e fazer o bloqueio disso com outras ferramentas de segurança como o firewall, novas regras no ids/ips. Também ver se ele não está usando alguma vulnerabilidade de algum sistema para se propagar, nesse caso podemos atualizar o sistema ou simplesmente desativa-lo temporariamente. Para mais informações recomendo o livro: Ransomware - Defendendo-se da extorsão digital.
O DGA (Domain Generation Algorithm) é um algoritmo que tem como objetivo gerar domínios pseudo aleatórios, podendo fazer a variação tanto somente no nome do domínio e mantendo o Top Level Domain (.<domínio_gerado>.com) ou gerar variação de ambos os dois (<domínio_gerado>.<tld_gerado>). Em alguns casos não se utiliza um algoritmos de geração de string de forma pseudo aleatória e sim busca de uma word list online na Internet. Este algorítimo é muito utilizado em malwares de vários tipos como worm, ransomware, botnets (que não são exatamente malware), dentre outros. Dentre os vários malwares que o utilizam pode-se citar o CryptoLocker e Zeus Trojan. A saída desse algoritmo é utilizado para o comando e controle do malware, sendo que a estratégia aqui é que nem todos os domínios gerados vão funcionar, geralmente apenas um ou um pouco mais que isso vão ser domínios válidos para o comando e controle, além do fato de que mesmo esses domínios validos estarão sempre online, pois geralmente o atacante só necessita que eles fiquem ativos por um breve período de tempo em alguns casos. Existe várias vantagem para o atacante em trabalhar desta forma: Quem for analisar o malware de forma estática e realizar uma varredura por strings, não irá localizar as urls, pois somente serão criadas em tempo de execução; Se um antivírus for realizar uma varredura no arquivo de forma estática, ele não vai identificar as urls e como alguns focam nessa etapa em verificar se tem urls maliciosas conhecidas se baseando em uma black list, o mesmo não irá identificar já que não foi gerado; Dará um enorme trabalho para equipe de defesa identificar qual é a verdadeira, por exemplo, o algoritmo gera 50,000 domínios por dia e apenas 1 é o verdadeiro. Em alguns casos é importante descobrir a URL, tanto para achar a origem como em casos de necessitar bloquear ou registrar o domínio, que nem o caso do WannaCry, se ele usa-se esse algorítimo, teria se levado um tempo muito maior para parar o ataque; Pode ocorrer de se conseguir identificar o verdadeiro link analisando o trafego da rede, o que nem todos fazem, mas em um caso atípico se o atacante precisa apenas receber uma informação e usar UDP, isso dificultará bastante a identificação, ainda mais se o servidor ficar ativo por um breve período receber a informação e ficar offline novamente. É importante ter em mente o funcionamento desse algorítimos, pois as vezes passamos por ele em uma RE de um malware, vemos esse comportamento estranho e pode-se acabar passando despercebido, pois vendo isso sem entender o porquê tende-se a ignorar e seguir em frente, além disso esse método vem sendo disseminado entre os criadores de malware e a equipe de defesa deve estar igualmente alinhada sobre estar técnicas. Um exemplo em Python retirado do Ransomware CryptoLocker: def generate_domain(year, month, day): """Generates a domain name for the given date.""" domain = "" for i in range(16): year = ((year ^ 8 * year) >> 11) ^ ((year & 0xFFFFFFF0) << 17) month = ((month ^ 4 * month) >> 25) ^ 16 * (month & 0xFFFFFFF8) day = ((day ^ (day << 13)) >> 19) ^ ((day & 0xFFFFFFFE) << 12) domain += chr(((year ^ month ^ day) % 25) + 97) return domain
Em uma análise de uma página que me solicitaram, tinham links que começavam com hxxp ao invés de http e decidi investigar mais a fundo e descobri o motivo de se utilizar isto. Alguns recursos na web detectam link por vários motivos, seja para escanear, remover o link, criar formatação diferenciada, dentre outros que incluem principalmente tratamentos de segurança, mas a maioria leva em consideração que um link deva começar com http ou https (ou algumas variações dependendo do sistema) e por não seguir a regra o sistema não o identifica e não passa pelas tratativas do sistema. Um link incorreto também não é interpretado pelo browser e então não aparece como link e nem seria possível clicar, mas isso é feito de forma proposital, pois o usuário vai tentar clicar e não vai conseguir, então o mesmo se sente na obrigação de copiar e colar no endereço de URL do browser, neste momento no caso dos navegadores IE e Google Chrome substitui hxxp por http, que é uma url válida e assim jogar o usuário para o link verdadeiro, que geralmente é um site malicioso, ou seja, ele bypassava pelos sistemas de detecção dos sites, anti-spam, analisadores de url e outras ferramentas e quando o usuário cola na url é que o atacante atinge seu objetivo enganando o usuário e os sistemas de defesa no meio. Vi esta técnica ser usada para: Bypassar essas ferramentas citadas acima de anti-spam, antivirus, web crawlers internos do sistema e analisadores de url; Passar por proteções de sites como, por exemplo, um site que é proibido postar conteúdos com links externos ou que todo link é verificado quando passa pelo PHP no back-end, esse link não seria percebido pelo PHP e apareceria na postagem normalmente, podendo ser por exemplo um link malicioso.
O que é? A engenharia reversa, também conhecido com reverse engineering ou RE. O conceito nasceu no mundo real, quando precisávamos saber como algo funciona ou como foi construído, quando não tínhamos uma documentação ou conhecimento disso. Um grande exemplo disso tratasse do ambiente competitivo das indústrias, onde uma empresa x lançava um produto novo com mercado com um bom diferencial, principalmente com algo inovador deixando seu concorrentes para trás, mas um ou mais concorrente para não ter tanta perde financeira ou de imagem, pegava este novo produto e começava a tentar descobrir como ele funcionava de várias formas, uma delas poderia ser desmontando e analisando cada parte do produto e de que material era feito, em seguida o mesmo criava um produto similar para competir baseado na engenharia reversa realizada. Na computação a engenharia reversa existe também, tanto de hardware como para software, mas neste caso vamos somente nos referir a engenharia reversa de software, onde temos geralmente o cenário de ter um programa compilado, já em seu formato binário, não temos seu fonte, mas queremos saber como ele foi feito, como funciona e até como altera-lo. É importante destacar que RE não é exclusivo de caso de arquivos em binário, pode ser também de códigos que estão utilizado técnicas de ofuscação, arquivos intermediários de compilação e etc... Por que aprender? A RE é utilizada em várias áreas e situações, seguem alguns exemplos: Crackear um programa; Criar cheats; Proteção de propriedade intelectual do software; Debugar um programa para achar onde está dando erro; ´Criar exploits; Criação de softwares seguros; Bypass em antivírus e firewall; Na computação forense é muito utilizado para analisar malware; Criar proteções contra malwares, inclusive antivirus nada mais é do que uma analise de malware automatizada pro assim dizer; Entender como determinado programa funciona; Utilizado em parte da criação de Rootkits; Além desses fatores podem existir outros, mas dá para ter uma ideia do quão importante é aprender RE. Como aprender? Antes de partir diretamente para os estudos focados em RE, é necessário que tenha as bases bem formadas, caso contrário poderá ficar muito perdido ao ler literaturas que falam do assunto, pois parte do princípio que já conhece assembly e chamadas de sistema. Primeiramente deve-se aprender arquitetura de computadores, onde aprenderá como o computador funciona como, como o hardware e software funcionam juntos e principalmente o ponto mais importante como que funciona a memória RAM e processador, que é o que o assembly interagem bastante. A literatura que indico é: "Organização Estruturada de Computadores" de Andrew S. Tanenbaum. É indicado saber o que é um sistema operacional, pois o assembly interage frequentemente com o mesmo com as chamadas de sistema. Nesse caso deixo 2 literaturas indicadas, basta ler pelo menos uma delas: "Fundamento de Sistemas Operacionais" de Silberschatz, Galbin e Gagne (De fácil leitura) e "Sistemas Operacionais Modernos" de Andrew S. Tanenbaum. O Assembly em si, que é a linguagem que utilizará na engenharia reversa: Para linux "Assembly Language Step-by-Step: Programming with Linux" de Jeff Duntemann e "The Art of Assembly Language, 2nd Edition" de Randall Hyde. Indico aprende mais sobre o Windows como funciona internamente: "Windows Internals, Part 1: System architecture, processes, threads, memory management, and more (7th Edition)" de Pavel Yosifovich , Alex Ionescu , Mark E. Russinovich , David A. Solomon. Finalmente sobre engenharia reversa indico começar pelo "Practical Reverse Engineering: x86, x64, ARM, Windows Kernel, Reversing Tools, and Obfuscation" de Bruce Dang , Alexandre Gazet, Elias Bachaalany, Sébastien Josse. E depois pegar "Reversing: Secrets of Reverse Engineering" de Eldad Eilam Em seguida poderá se aprofundar melhor em outras áreas que utilizam RE.