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

  1. Marcelo Brante

    Ola amigo eu tenho um problema que talvez voce saiba me ajudar
    estou fazendo uma pagina php que é acessada por um modulo gsm
    atraves de uma comuincacao gprs
    envio a seguinte linha como voce mostrou acima como exemplo

    GET /blog/index.php?dado=1 HTTP/1.1 (ou mesmo colocar POST da na mesma)
    Host: http://www.danilocesar.com

    isto uso para enviar o dado para a pagina que faz o trabalho de colocar isto no meu banco de dados

    em seguida ele me retorna
    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

    mas isto pra mim nao serve pra nada pois nao preciso desta resposta e como uso gprs isto esta gastando muito, sera que existe um jeito de nao receber esta resposta?
    Obrigado amigo

    Posted on 04-May-07 at 11:17 pm | Permalink
  2. Danilo Cesar

    Certo….

    Bom, que eu saiba não tem como não.
    O que você pode fazer é uma espécie de proxy HTTP que receba uma string de conexão e retorne pra você os dados devidamente tratados….

    Mas simplesmente não receber os dados eu acho que não dá não….

    []’s

    Danilo

    Posted on 05-May-07 at 10:51 am | Permalink
  3. gustavo

    ola danilo .. gostei do seu post mas nao consegui rodar o comando tcpconnect
    da um erro dizendo que o servidor nao pode ser alcaçado … sabe o que pode ser isso!
    flw

    Posted on 10-Oct-07 at 7:32 pm | Permalink
  4. Marcos Antunes

    Estou com um problema e não achei a solução na internet, gostaria

    de saber se alguém já passou por isso.
    Eu instalei o wordpress, configurei, mas quando eu mudo a

    configuração de Links Permanentes de Padrão para Estrutura

    Personalizada, o wordpress funcionama perfeitamente mais no rodapé

    do blog todo aparece esses códigos HTTP/1.1 200 OK Date: Fri, 28

    Nov 2008 21:07:04 GMT Server: Apache/2.2.8 (Unix) mod_ssl/2.2.8

    OpenSSL/0.9.8b mod_auth_passthrough/2.1 mod_bwlimited/1.4

    FrontPage/5.0.2.2635 mod_perl/2.0.3 Perl/v5.8.8 Content-Length: 0

    Keep-Alive: timeout=5, max=96 Connection: Keep-Alive Content-Type:

    application/x-httpd-php5

    Quando eu volto para a configuração de Links Permanentes de Padrão

    ele não aparece mais.

    Alguém já passou por isso??

    Posted on 29-Nov-08 at 2:35 pm | Permalink

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*