Como encontrar os BadChars (bof-server)?

80 views
Skip to first unread message

Foca

unread,
Aug 25, 2009, 5:06:27 AM8/25/09
to Metasploit Brasil
Olá pessoal,

Estou aqui novamente com uma pergunta básica, como posso encontrar os
BadChars usando como exemplo o programa bof-server.

Eis o trecho retirado de http://redstack.net:
"Again, in our debugger, by looking at the assembly code (around
0×4146D) we found that the target is doing something special with the
0×0A, 0×0D and 0×20 characters."

Bom não sei se por uma inabilidade minha não consigo encontrar o tal
endereço "0x4146D" ao qual o autor se referi.
Alguém que tenha tido exito por favor me explique onde posso encontra-
lo!!

Obrigado!!

Marcio Mendes

unread,
Aug 31, 2009, 12:43:23 AM8/31/09
to Metasploit Brasil
Olha rapaz, eu também não entendi direito, mas vou tentar explicar o
que eu entendi, se eu estiver errado que
me corrijam
‘BadChars’ => “\x00\x20\x0D\x0A”, # Chars that payloads should not

Seria os carecteres nulos que não podém ser enviado ao servidor, eu
também não achei este respectivo
endereço de memoria citado 0×4146D do bof-server , porém achei outros
fazendo um debbuging, não tenho certeza mas acredito eu que ele tenha
achado caracteres nulos no payload(shellcode) e retirou.

para ter certeza eu gerei o shellcode do windows/meterpreter e outros,
o codigo do meterpreter bind_tcp
é muito grande então só extraí uma parte que tem o tal NULL
Characters, como podem ver no final x00

"\xf0\xff\x75\xe4\x6a\xff\x8b\x45\x08\xff\x90\x78\x01\x00"

lock push dword[ss:ebp+0xffffffe4]
push dword(0xffffffff)
mov eax,dword[ss:ebp+0x8]

resolvi fazer alguns testes retirando da badchars o x00. e os outros e
o exploit não funcionou, apenas retirando o x0a algumas vezes
funcionava outras não, então resumi nisto, caracteres nulos no final
de cada linha ou inicio do shellcode pode-se considerar que ele
finaliza a sessão dali mesmo como se fosse o final do codigo.

Ainda estou estudando este exploit e outros.

Sugestiono começar com assembly, debbuging, livros de bufferoverflow e
fuzzing.

Eu particulamente estou começando do zero nos exploits monoeliticos
mesmo e depois aprenderei o ruby e metasploit para reescrever (caminho
das pedras é necessário).

Sugestão também é ler os livros que o Juan tem traduzido, tem um do
metasploit e bufferoverflow.

juancarloscunha.wordpress.com

OBS:Enquanto a explicação, se eu estiver errado me corrijam por favor,
também estou começando a pouco
tempo

Att

Marcio Mendes



On Aug 25, 6:06 am, Foca <jc...@hotmail.com> wrote:
> Olá pessoal,
>
> Estou aqui novamente com uma pergunta básica, como posso encontrar os
> BadChars usando como exemplo o programa bof-server.
>
> Eis o trecho retirado dehttp://redstack.net:

A.A.

unread,
Aug 31, 2009, 2:49:29 AM8/31/09
to Metasploit Brasil
>endereço "0x4146D" ao qual o autor se referi.

Talvez seja versoes diferentes de sistema operacional. Acho que ele
usava o SP0, naum lembro agora.

[s]
-A.A.


On 25 ago, 10:06, Foca <jc...@hotmail.com> wrote:
> Olá pessoal,
>
> Estou aqui novamente com uma pergunta básica, como posso encontrar os
> BadChars usando como exemplo o programa bof-server.
>
> Eis o trecho retirado dehttp://redstack.net:

WoSH

unread,
Aug 31, 2009, 8:24:22 AM8/31/09
to metasplo...@googlegroups.com
Olá Lista !

Seguinte, o termo bad chars, realmente quer dizer que não podem haver
aqueles caracteres, ou que seja bom evita-los. Porém, para elimina-los
do shellcode não se deve apaga-los, parece meio estranho, mas em
resumo é isso.

Aquele null (0x00) pode ser parte de alguma instrução, como "mov
eax,0" ou algo assim, se você remover isso, irá quebrar a instrução
pela metade, e digamos que tenha o seguinte código:

XX 00 mov eax,0
90 nop

Aonde XX é o opcode do move que eu não lembro. Imagina que a instrução
mov, tenha dois bytes, um pra identificar a instrução (o XX ali) e o
outro pra simbolizar o seu valor (0). Se você apagasse o 0x00 logo
após o XX, você teria um mov eax,90. Assim, quebraria a instrução,
alterando a lógica do shellcode, e que realmente só funcionará por um
milagre :)

Para se retirar os bad chars o bom mesmo, não é remover todas as
possibilidades de bad chars na hora da criação do shellcode, mas
somente os mais comuns, como o 0x00 null. O bom é codifica-lo
(encoders do metasploit) dependendo da situação (e dos bad chars) como
o metasploit já faz, assim terás um shellcode mais flexível e que
poderá ser utilizado em mais situações.


Exemplo bem ficticio, existe um servidor http vulneravel a buffer
overflow (veio IIS em suas cabeças agora ? hehehe), quando se faz uma
requisição a uma pagina e um nome de arquivo (não da pasta) é muito
grande ele estoura a memória.

Pseudo código da função vulneravel :

// buff contém a string GET /PASTA/ARQUIVO
char *buff;
// Pega a posição da ultima "/" barra da string da requisição para
saber aonde está
// escrito o nome do arquivo
int index = lastIndexOfChar(buff,"/");

// Cria um array de char e copia a string para ele, sem checar o
tamanho nem nada.
char[1024] tmp;
strcopy(tmp, buff[index+1]);
...


Acho que vocês sacaram ali em cima, se mandar um GET
/PASTA/AAAAAAAAA....... para o server ele irá copiar para dentro de
uma variavel de tamanho fixo (tmp) e se o nome do arquivo tiver mais
de 1024, começaremos a ter um bufferoverlow :)

Ou seja, para chegarmos numa situação que seja possível explorar essa
falha, nosso buffer não pode conter os caracteres de controle, ou que
tenham algum efeito sobre o buffer para que ele não seja completamente
copiado para dentro de tmp. São esses caracteres :

Barra "/" - Pois irá quebrar nosso buffer e nosso shellcode não irá
por completo no strcopy.

Nullos (0x00) - Pois no C, as strings são null-terminateds, ou seja,
um 0x00 no meio do shellcode irá fazer o strcopy para a cópia dele
para a memória quando encontrar esse caracteres (afinal, a string
terminou certo ?)

Quebras de linha (0x0A ou outras quebras de linha que não lembro se
tem) - Pois no http, as headers são quebradas por quebras de linha
(redundância), ou seja, se tiver uma quebra de linha no shellcode, o
servidor exemplo ali iria iria cortar a outra parte do shellcode antes
de colocar na variavel buff.

Com isso espero ter sido claro quanto aos bad chars :) em resumo, são
todo e qualquer caractere que possa interferir para o mal
funcionamento do exploit. Para isso, deve-se analisar o código
vulneravel (e o código de antes de chegar lá) para ver oque se pode ou
não.

Deve-se tirar caracteres de controle de protocolo (Exemplo a quebra de
linha ali do http). Caracteres que podem influênciar em funções como o
strcopy (nulo), etc. Não vi o código desse bof server, mas para
adiantar, olhe como ele lê os dados (se lê uma linha, um tamanho fixo
de bytes de um socket), e como os dados são passados para a função
vulneravel ao buffer overflow (se ela joga para a memória através de
um memcopy, strcopy, etc...).

-cya

2009/8/31 A.A. <dec...@gmail.com>:

Danilo Nascimento

unread,
Aug 31, 2009, 9:36:09 AM8/31/09
to metasplo...@googlegroups.com
Fala pessoal!

Só para ficar mais claro o que acontece quando você declara algo em
badchars. Por favor, corrijam-me se eu estiver errado.
Qualquer carácter em assembly pode ser obtido a partir de outras instruções.


Vou citar trechos do Wosh para um simples exemplo:

XX 00 mov eax,0
90 nop

Nesse trecho não podemos declarar o valor 0 ("0x00" null) conforme
explicado pelo Wosh, mas podemos colocar 0 em eax através da
instrução:

XOR eax, eax // "Logical exclusive or" em eax, como ele é idêntico o
valor de eax após essa instrução será 0.


Outro exemplo, caso você precise de 0x0A (quebra de linha), mas esse
carácter é um badchar:

mov eax,0x0a

esse trecho pode ser substituído por:

mov eax, 0x09 // copia 0x09 para o registrador eax
inc eax // incrementa o registrador, deixando ele com 0x0a


Qualquer valor para os "operandos" de uma instrução em assembler pode
ser obtido através de outras instruções, convém falar que isso não é
valido para opcodes (Código de instrução). O metasploit utiliza algo
mais complexo quando você declara algum carácter como BADCHAR, mas a
base é essa técnica de obter valores a partir de outras instruções em
assembler.

[]'s Danilo Nascimento

Focaa

unread,
Aug 31, 2009, 3:50:41 AM8/31/09
to Metasploit Brasil
Então, o meu grande problema é que não consigo de fato achar esse
endereço no debugger O.o
estou usando um XP SP0... se alguém puder tirar um printscreen ou algo
parecido eu ficaria muito agradecido!! =)

WoSH

unread,
Aug 31, 2009, 12:01:27 PM8/31/09
to metasplo...@googlegroups.com
Escrevi algo ali que parece confuso,

"Para se retirar os bad chars o bom mesmo, não é remover todas as
possibilidades de bad chars na hora da criação do shellcode, mas
somente os mais comuns, como o 0x00 null"

No "remover" quis dizer substituir, instruções como "mov eax,0" para
"xor eax,eax", que não tem nulos, e tem o mesmo resultado.

-cya

2009/8/31 WoSH <wos...@gmail.com>:

Marcio Mendes

unread,
Aug 31, 2009, 2:44:44 PM8/31/09
to Metasploit Brasil
agora eu entendi, teria que mudar o null characters por exemplo:

movb $0x0,0x7(%esi)
movl $0x0,0cx(%esi)
movl $0xb,%eax
movl $0x1,%eax
movl $0x0, %ebx

seria:

xorl %eax,%eax ; NULL bytes
movb %eax,0x7(%esi)
movl %eax,0xc(%esi)
movb $0xb,%al
xorl %ebx,%ebx ; Null bytes
movl %ebx,%eax
inc %eax

.... Porém aí está o que você falou o metasploit trabalha de forma
complexa, para eu declarar num exploit monoelitico em C os caracteres
que não podem ser enviado, então eu teria que pegar o shellcode,
converter para asm remover os badchars fazer o processo de comp/
descomp e pegar a shell de novo?
Reply all
Reply to author
Forward
0 new messages