Skip to content

HTTP Headers, HTTP por força bruta…

Olá pessoal…

Hoje deixei o aiBur Framework de lado para fazer algumas coisas divertidas… =)

Um antigo camarada de programação ASP que está fazendo algumas brincadeiras com linux e SQUID me perguntou esses dias como ele poderia fazer um POST via linha de comando… Eu que não sabia exatamente o que ele queria indiquei:


echo "nome=danilo&idade=20" | lynx --post-data http://www.meusite.com.br/meu_post.php

Como muitos devem saber, este comando funciona perfeitamente para enviar POSTs via linha de comando. Mas meu amigo precisava de algo mais “bruto”. Ele precisava fazer, por exemplo, POST de um arquivo… Lá vai o Danilo arranjar uma solução…

Aqui vou conciliar uma dica que escrevi a muito tempo atrás para o vivaolinux, e a idéia sobre Headers HTTP que vi no BrunoTorres.net.

Ferramentas que vamos utilizar:

TCPUTILs -> Tcputils é um pacote que contém um conjunto de ferramentas para utilizar sockets diretamente pelo Shell… Na verdade é um servidor e cliente de echo… Quase como um telnet. Mas dá pra fazer algumas coisas bacanas com ele, que nós veremos agora…. =)

HTTP -> Hypertext Transfer Protocol ou Protocolo de transferência de hipertexto: é o formato da comunicação entre o Browser e o servidor. Por exemplo, é o cliente que envia cookies, o servidor que grava sessions, redireciona, etc etc etc… Seu padrão é definido pela W3C

LivehttpHeaders Extension: Extenção do Firefox que visualiza todos os headers de uma requisição http.

Bom, vamos brincar um pouco:

Precisamos primeiramente instalar o pacote TCPutil. Como eu uso Debian, é fácil:

apt-get install tcputil

Depois de instalado, virá uma lista de comandos. Iremos usar apenas o tcpconnect. Outros podem ser visto na documentação (man tcpconnect) ou no meu artigo citado acima…

A descrição do comando é a seguinte:
tcpconnect [HOST] [porta]

Após a conexão estabilizada, o cliente (no caso, você) poderá enviar suas strings de conexão. No caso, poderá mandar cabeçalhos HTTP para o servidor. Vamos fazer um teste?

tcpconnect danilocesar.com 80

Após a conexão com o servidor, você enviará os seguintes Headers do HTTP:

GET /blog/index.php HTTP/1.1
Host: www.danilocesar.com

Este é, talvez, o cabeçalho mais simples que uma requisição HTTP pode ter. Vamos entende-la:

GET -> É o método de envio de dados
/blog/index.php -> É a página que eu estou querendo
HTTP/1.2 -> É a versão do protocolo HTTP que estou usando
Host: -> É o Host que você está buscando.

E como respostas você vai ter os Headers vindos do Servidor e o código HTML específico da página.

Agora, nem todos os Headers que estaremos enviando possuem apenas 2 linhas. Para facilitar a nossa vida, colocaremos o cabeçalho HTTP agora em um arquivo texto e iremos enviar os headers assim:

tcpconnect danilocesar.com 80 < headers.txt Creio que vá facilitar a nossa vida... Bom, vamos continuar. Meus testes agora vão ser feitos no meu localhost… Por poder editar melhor os arquivos e tals….

Creio que está na hora de enviar-mos alguns Headers mais “Pró”

Se você está com preguiça de ler a documentação do HTTP, podemos visualizar os Headers que o firefox envia utilizando a extenção LiveHTTPHeaders.

Vamos fazer um teste…. Com a extensão devidamente instalada, aperte ALT + L, e acesse uma página qualquer. Por exemplo, http://www.google.com.br

Os Headers que enviamos

GET / HTTP/1.1
Host: www.google.com.br
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060209 Debian/1.5.dfsg+1.5.0.1-2 Firefox/1.5.0.1
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: pt-br
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: KIDYMD=#243194:FBOB#

Cuidado: As propriedades dos headers devem ocupar apenas uma linha cada uma. Toda quebra de linha a mais é feita pelo browser e deve ser discartada

Os Headers que recebemos

HTTP/1.x 200 OK
Cache-Control: private
Content-Type: text/html
Content-Encoding: gzip
Server: GWS/2.1
Content-Length: 1556
Date: Sun, 19 Feb 2006 16:25:35 GMT

Se você enviar estes mesmos headers no pelo tcpconnect, talvez você receba apenas algumas Strings estranhas, pois a informação vem toda compactada do Servidor pelo gzip. Para ver as informações inteiras, retire a linha “Accept-Encoding: gzip,deflate ” do seu header.

Agora, dentro do seu LiveHTTPHeaders, dê um Clean, volte ao google e busque por HTTP:
Temos agora 2 diferenças nos Headers.

GET /search?hl=pt-BR&q=HTTP+Headers&btnG=Pesquisa+Google&meta= HTTP/1.1

Referer: http://www.google.com.br/

O get agora está bem mais incrementado certo? Ele contém as Strings de busca do google.
Um novo Header foi enviado pelo browser: Referer. Ele indica o caminho completo da página de onde você veio. Isto é muito utilizado para quebrar spammers de blog (método bem inseguro, mas quebra boa parte dos spammers), para estatisticas (quais sites possuem links para o seu).

E os prometidos arquivos?

Vamos agora aprender a enviar arquivos. Na verdade, não muda muita coisa.


POST /obj/teste.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060209 Debian/1.5.dfsg+1.5.0.1-2 Firefox/1.5.0.1
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: pt-br
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost/obj/teste.php
Content-Type: multipart/form-data; boundary=--BoRdEr_Signature-00253658974569--
Content-Length: 700

----BoRdEr_Signature-00253658974569--
Content-Disposition: form-data; name="teste"; filename="source.list"
Content-Type: text/plain

#deb cdrom:[Debian GNU/Linux testing _Etch_ - Official Snapshot i386 Binary-1 (20051212)]/ etch contrib main

#deb cdrom:[Debian GNU/Linux testing _Etch_ - Official Snapshot i386 Binary-1 (20051212)]/ etch contrib main

#deb file:/ apt/

#deb http://security.debian.org/ testing/updates main contrib
deb http://security.debian.org/ etch/updates main contrib non-free

#deb http://ftp.debian.org/debian/ unstable main
#deb-src http://ftp.pucpr.br/debian/ testing main

deb http://ftp.debian.org/debian/ testing main
deb-src http://ftp.debian.org/debian/ testing main

----BoRdEr_Signature-00253658974569----

No caso, estou mandando o meu arquivo Source.list Vamos às descrições:
Content-Type: multipart/form-data; – Indica o tipo do conteúdo
boundary=–BoRdEr_Signature-00253658974569– Indica o separador de conteúdo.
Content-Length: 700 – Tamanho do seu arquivo.
A parte de dentro seria o seu arquivo propriamente dito…
Content-Type: text/plain – Tipo do conteúdo. No caso, texto plano, mas poderia ser uma imagem, um executável, etc et.

Da mesma forma, o código acima funciona com imagens, mas não mostro aqui com imagens pois seria inútil, pois provavelmente viria encriptada…

Bom, e termina aqui a descrição do problema e da solução.
Caso tenha problemas, ou sugestõe, comente abaixo.

[]s!

O tcpconnect tem um número máximo de caracteres de resposta. Isso pode dar algum problema com Headers muito grandes

4 Comments