Bruno Miyamoto
Jun 5, 2018 · 3 min read

Eram 3h14 da madrugada. Em uma das telas em minha frente, estava acompanhando em tempo real o caminho dos dados que estava injetando na rede do meu alvo. Servidores em Tóquio, Luxemburgo e Milão estavam cumprindo bem o papel de redirecionar as informações para esconder a real origem do ataque. Em outra tela, corria o texto verde sobre fundo preto com informações dos bloqueios realizados pelo firewall, que deveria supostamente proteger o sistema. Estava tudo indo como planejado. Com a sequência quase interminável de comandos que estava digitando, a última barreira de criptografia caia, dando-me acesso aos arquivos sigilosos.

Cenas como essa frequentemente aparecem em filmes e séries quando é necessário retratar alguém invadindo um sistema de informações. A realidade, entretanto, não é bem assim. Não existe uma fórmula mágica, uma rotina que quando executada é capaz de comprometer qualquer máquina. Existem falhas generalizadas já descobertas e ferramentas específicas para explorá-las, mas em muitos casos um simples descuido do desenvolvedor do sistema é suficiente para expor um servidor, site ou aplicativo a riscos desnecessários.

Quando boas práticas de segurança não são seguidas, um conhecimento técnico básico pode ser suficiente para encontrar vulnerabilidades que permitem a visualização ou até mesmo a alteração de informações que não deveriam estar acessíveis. Darei o exemplo de um caso real em que encontrei uma brecha sem sequer estar procurando por uma.

Há alguns anos, eu utilizava um site que possuía uma seção com conteúdo para download, em sua maioria documentos do tipo pdf. Lembro que um detalhe na forma como esses arquivos eram disponibilizados chamou a minha atenção — o link para eles continha uma espécie de código no lugar do nome do arquivo:

https://example.com/download.php?f=YXJ0aWdvcy9tYWlvMDkucGRm

Quando vi pela primeira vez, não fazia ideia do significado desse código então somente ignorei o fato. Mas um tempo depois, reconheci um padrão semelhante quando estava lendo sobre algum tópico de programação. Descobri que se tratava da codificação Base64, que é bastante usada para converter um texto antes de transmiti-lo pela internet. O próximo passo foi, obviamente, decodificar aquele link para ver o que ele continha:

YXJ0aWdvcy9tYWlvMDkucGRm => decodificação => artigos/maio09.pdf

Achei interessante, o código nada mais era que a pasta e o nome do arquivo que deveria ser baixado. Resolvi investigar um pouco e, para isso, fiz o caminho inverso. Codifiquei nomes de outros documentos para ver se eles seriam abertos, o que funcionou como esperado. Por exemplo:

artigos/abril09.pdf => codificação => YXJ0aWdvcy9hYnJpbDA5LnBkZg==

Foi nesse momento em que percebi uma possível falha desse sistema. O código-fonte que contém a lógica de funcionamento do site fica armazenado em arquivos que são escondidos dos usuários por motivos de segurança. E se eu usasse esse método para tentar baixar um desses arquivos? Foi esse o próximo teste que realizei. Codifiquei o nome de um arquivo de código-fonte comum, substituí no link e, surpreendentemente…

Funcionou! Todas as linhas de código que faziam o site operar estavam lá expostas, incluindo caminhos para outros arquivos escondidos e até mesmo logins e senhas de acesso a bases de dados com informações dos usuários. Percebam que não houve nenhum ataque complexo, em que múltiplas camadas de segurança do firewall foram quebradas. A simples falta de atenção do programador do site em uma função específica de uma única página acabou expondo todo o sistema a um grande risco. E alguns testes simples foram suficientes para expor a abertura.

Acredito que experiências como essa foram fundamentais para a formação como desenvolvedor. Tornou-se impossível para mim escrever sequer uma linha de código sem pensar em como ela pode ser potencialmente quebrada ou subvertida. Essa postura defensiva, formada pelo entendimento de pontos de vista diversos, é uma ferramenta valiosa no universo da programação em geral. Afinal, como você pode se defender de um inimigo invisível?


Nota: não estou incentivando ninguém a sair invadindo sites, isso configura crime, além de ser questionável do ponto de vista ético. O que proponho é a pesquisa de técnicas de ataque e a mentalidade defensiva na implementação de qualquer funcionalidade de qualquer sistema.

Launchpad

Tecnologia, negócios e desenvolvimento pessoal em uma só plataforma.

Bruno Miyamoto

Written by

Chief Hacking Officer @ Espresso Labs

Launchpad

Launchpad

Tecnologia, negócios e desenvolvimento pessoal em uma só plataforma.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade