DEV Community

loading...

[PT-BR] Resolvendo o Bandit (níveis 0-4)

lelepg profile image Leticia Pegoraro Garcez Updated on ・11 min read

Se você leu meu post sobre como escolhi o curso de engenharia de computação, já deve saber que uma área que me interessa muito é a área de segurança da informação. Na minha procura por materiais de estudos, acabei encontrando o OverThewire, um site cheio de wargames visando segurança da informação. É claro que eu não podia deixar de tentar jogar algum deles.

O primeiro wargame que estou jogando é o Bandit, que trabalha conceitos básicos de Linux e de segurança. É um ótimo lugar para se começar se como eu você não sabe nada e está querendo aprender.

O jogo é composto por níveis, onde você precisa realizar alguma tarefa e encontrar uma senha para passar para o próximo nível. No decorrer dessa brincadeira, você tem que descobrir como executar as tarefas que são passadas, já que os níveis possuim dicas como comandos que podem ser úteis e links de referências, mas não respostas. Pode ser bem desafiador, mas acho um processo muito interessante porque quando você encontrar um problema na vida real, não vai encontrar respostas prontas, mas sim descobrir como resolver o problema sozinho.

Nesta série de artigos que eu estou pensando em escrever (o Bandit tem 33 níveis, então é bem possível que demore bastante tempo) eu vou explicar um pouco do processo para passar dos níveis do jogo, focando não em dar uma resposta, mas no processo de aprendizagem para encontrá-la. Vou traduzir todos os enunciados dos desafios, mas é importante que você saiba inglês se quiser tirar o máximo dessa experiência.

Confira o desafio clicando aqui, e se quiser entrar nessa aventura comigo, sinta-se a vontade.

Nível 0

O objetivo deste nível é logar no jogo usando SSH. O servidor onde você deve se conectar é bandit.labs.overthewire.org na porta 2220. O usuário e a senha são bandit0.

Quando eu li este enunciado pela primeira vez, já me assustei. O que é SSH? Você pode utilizar os links de ajuda disponíveis na página para tentar entender um pouco mais, mas o que eu entendi, e o que eu julgo importante entender no momento, é que o SSH é um protocolo de comunicação entre um cliente e um servidor. Não é necessário saber mais nada sobre ele, além de como usá-lo.

Vamos então tentar entender como descobrir como ele funciona. Como eu já tenho familiaridade com o terminal do Linux, já sei de dois comandos essenciais, o --help e o man. O primeiro comando mostra uma ajuda rápida de um comando em específico e o segundo mostra um manual completo daquele comando. Anote esses dois, pois você vai usá-los muito nos desafios. Então eu tinha duas opções pra tentar entender como o protocolo funciona:

  • usar o manual do comando (man ssh)
  • utilizar a ajuda rápida (ssh --help)

Como o manual mostra um texto muito extenso, minha escolha foi usar o --help.

Se voltarmos ao que o exercício fornece, temos algumas informações importantes:

  • um servidor;
  • uma porta;
  • um usuário;
  • uma senha.

O comando que mais me chamou a atenção na ajuda foi [-J [user@]host[:port]]. Esse comando parecia bem simples e capaz de resolver o problema, porém quando eu tentei com as informações do problema, não consegui fazer o login. Isso me deixou bem indignada, então recorri ao manual, e descobri que o comando -J é um atalho para especificar uma diretiva de configuração de ProxyJump. Sei o que é ProxyJump? Definitivamente não, mas sei que não é o que eu quero.

Voltando então à ajuda rapida, outro comando que chamou minha atenção foi [-W host:port]. Também não tive muito sucesso com esse comando. No fim das contas, ao invés de um único comando, eu precisava executar alguns comandos especificados na ajuda rápida. Lembrando que eu tenho quatro itens para logar (servidor, porta, usuario e senha). A solução que eu encontrei foi utilizar a seguinte junção de comandos [user@]hostname -p [port]. Depois desse comando iniciado, só precisei colocar a senha a BAM! Consegui o login.

Essa era a tarefa desse nível, e apesar de ter sido chata, não foi difícil. Tive alguns erros, mas outras alternativas estavam sempre a vista. Agora vamos para o próximo nível.

Checkpoint

Comando de login: ssh bandit0@bandit.labs.overthewire.org -p 2220
Senha: bandit0

Nível 0 -> Nível 1

A senha para o próximo nível está em um arquivo chamado readme localizado no diretório home. Utilize esta senha para logar em bandit1 usando o ssh e ir para o próximo nível

Esse nível é bem simples se você já tem familiaridade com Linux, mas se você não tem essa familiaridade, o nível te fornece alguns comandos que podem ser úteis para te auxiliar nessa tarefa. São eles:

  • ls;
  • cd;
  • cat;
  • file;
  • du;
  • find.

Supondo que você não tenha a minima ideia do que estes comandos fazem, existe um comando que pode ajudar com isso. Esse comando é o whatis, que retorna informações sobre o que determinado comando é.

whatis ls, por exemplo mostra que este comando lista o conteúdo de um diretório. Ele pode ser útil para encontrarmos o que está no diretório onde nos encontramos, e se o arquivo que contém a senha está lá. Para entender melhor como esse comando funciona, podemos usar ls --help, para descobrir que este comando não recebe nenhum argumento.

Rodando o comando ls, vemos que um arquivo chamado readme está no diretório. Sabemos que a senha está dentro deste arquivo, então só precisamos de uma maneira de ler seu conteúdo.

Utilizando o comando whatis com os outros comandos da lista de ajuda, você vai descobrir que o comando cat concatena arquivos e os imprimie na saida padrão. Dentre todos os comandos, esse é o único que trata da impressão de coisas em uma saida. Pode não ficar claro pela documentação que você consegue obter no terminal (então eu recomendaria uma busca no google), mas cat arquivo é suficiente para imprimir o conteúdo de um arquivo na tela. Se você rodar esse arquivo com o readme como parâmetro, vai ter como saída a senha para o próximo nível.

É uma boa ideia salvá-la em algum lugar, mas só por desencargo de consiência, ela é: boJ9jbbUNNfktd78OOpsqOltutMc3MY1. As senhas do Bandit são sempre neste formato, então não pense que vai poder ir chutando senhas para passar de nível.

Agora com essa senha, devemos logar no usuário bandit1, de maneira similar ao que fizemos com o usuário bandit0.

Digite exit para fechar a conexão com o servidor, e é só repetir a mesma estrutura de login que foi usada no bandit0 no nível bandit1, colocar a senha que você conseguiu no nível 1 e se preparar pro próximo desafio.

Checkpoint

Comando de login: ssh bandit1@bandit.labs.overthewire.org -p 2220
Senha: boJ9jbbUNNfktd78OOpsqOltutMc3MY1

Nível 1 -> Nível 2

A senha para o próximo nível se encontra em um arquivo chamado - que está no diretório home

Este nível é bem fácil de resolver, se tivermos como base os níveis anteriores. Já sabemos como descobrir quais arquivos estão em um diretório, e como ler o conteúdo deste arquivo.

Uma vez logado, você só tem que ler o conteúdo do arquivo -, que o enunciado do exercício diz que se encontra na pasta home, ou seja, a pasta que você encontra assim que consegue o login no servidor.

Rodando o comando cat -, uma coisa estranha acontece. O conteúdo do arquivo não é mostrado e ao mesmo tempo você fica "preso" dentro do comando (aperte Ctrl + c para cancelar a execução do comando). Isso acontece porque o terminal entende o "-" como sendo parte do código, e espera uma opção ou o resto do código, como o -p 2220 que usamos para logar no servidor, por exemplo.

Para resolver este problema, recorri a um dos links de apoio que o nível oferece, e descobri uma maneira bem simples de conseguir ler o conteúdo do arquivo. Dar CERTEZA ao terminal que eu estou falando de um arquivo, não de um comando. Qual maneira de fazer isso? Especificando um caminho para o arquivo, ou seja, dizendo ao terminal onde o arquivo se encontra, algo do tipo "no diretório atual, ler o arquivo -". Para espeficiar o diretório atual se usa os caracteres ./ e depois deles o arquivo. Com isso em mente, rodando cat ./- conseguimos a senha para o próximo nível.

Uma outra alternativa que encontrei para esse problema seria renomear o arquivo para ler seu conteúdo, mas esse não é o propósito do exercício, e agora se você encontrar um arquivo chamado - em algum lugar, você já sabe como lê-lo.

A senha desse nível é CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9, e agora estamos prontos para logar no próximo nível com o usuario bandit2.

Checkpoint

Comando de login: ssh bandit2@bandit.labs.overthewire.org -p 2220
Senha: CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9

Nível 2 -> Nível 3

A senha para o próximo nível está em um arquivo chamado "spaces in this filename" (espaços no nome do arquivo), localizada no diretório home.

Assim como o exercício anterior, este está focando na manipulação de arquivos, e na leitura dos mesmos. E assim como no exercício anterior, o comando cat é suficiente para resolver o nível, o problema é o nome do arquivo.

Se você sabe utilizar o autocomplete do terminal (tecla tab), esse nível não vai ser um problema, já que só digitar cat space e apertar tab já preenche o nome do arquivo, então você só precisa dar enter e tem acesso à senha.

Se você observar o nome do arquivo que foi autocompletado, vai perceber a seguinte coisa: Todos os espaços foram substuiídos por "\ " tendo o seguinte resultado : spaces\ in\ this\ filename. Isso acontece porque o caractere espaço é um caractere especial, e precisa da \ para ser lido corretamente pelo terminal. Ele não é o único caracter especial quando falamos de bash scripting, mas é um dos mais comuns.

Caso você não utilizasse o autocomplete, uma busca por nomes com espaços no terminal (como é sugerido no nível) pode ajudar a entender melhor sobre isso.

Agora que você entendeu isso, salve a senha UmHadQclWmgdLOKQ3YNgjWxGoRMb5luK em algum lugar e vamos para o próximo nível.

Checkpoint

Comando de login: ssh bandit3@bandit.labs.overthewire.org -p 2220
Senha: UmHadQclWmgdLOKQ3YNgjWxGoRMb5luK

Nível 3 -> Nível 4

A senha para o próximo nível está em um arquivo oculto no diretório inhere

Vamos começar tentando entender o que devemos fazer para resolver esse problema.

  • Encontrar o diretório;
  • Entrar no diretório;
  • Encontrar o arquivo oculto;
  • Ler esse arquivo.

A primeira coisa a fazer, é tentar encontrar o diretório. Já sabemos qual comando usar para ver o conteúdo do diretório atual, o ls. Rodando este comando, vemos que a pasta que precisamos se encontra no diretório atual, então só precisamos entrar ela.

Para isso, é importante ver quais comandos de ajuda o nível oferece. São eles:

  • ls;
  • cd;
  • cat;
  • file;
  • du;
  • find.

Agora temos de descobrir se algum desses comandos vai nos permitir entrar no diretório. Para isso, usamos o comando whatis com cada um dos comandos. O comando cd, no entanto, não dá nenhum retorno a este comando. Como nenhum dos outros comandos parece ser útil, provavelmente cd é o opção correta, e executando cd --help, realmente descobrimos que este comando troca o diretório atual do terminal, e tem como parâmetro o diretório para onde queremos ir. Logo cd inhere nos dá acesso à pasta.

Ainda temos dois itens pra riscar da lista de tarefas:

  • Encontrar o arquivo oculto;
  • Ler esse arquivo.

Talvez sua primeira tentativa seja rodar o comando ls, ao qual você não vai ter retorno, já que a pasta esta aparentemente vazia. Aqui existe um ponto essencial: O arquivo oculto ESTÁ dentro da pasta, só não é visível, e o comando ls MOSTRA O CONTEÚDO DA PASTA. É intuitivo que o comando ls deve ser usado pra encontrar este arquivo. Porém, nós não sabemos como usar esse comando com seu potencial total, então é justo que vejamos a ajuda do comando com ls --help.

Uma coisa muito importante que você saiba antes de ler a ajuda é que: arquivos ocultos no Linux sempre comçam com ".". Se um arquivo se chama ".arquivo", ele é um arquivo oculto, pois arquivos que comçam por "." não dão mostrados por padrão.

Com isto em mente, a primeira opção do comando ls, é o -a, que também lista arquivos começados por pontos, ou seja, arquivos ocultos. Rodando o comando ls -a vemos o seguinte output:

.  ..  .hidden
Enter fullscreen mode Exit fullscreen mode

".", se refere apenas ao diretório atual. Lembra que usamos ./ para ler o arquivo -? ".." se refere ao diretório anterior. Se quisessemos voltar para a pasta que estavamos antes de entrar na pasta inhere, usariamos cd ... E por fim, temos .hidden, que é o arquivo que precisamos.

Agora que já temos certeza que ele existe e qual seu nome, podemos usar o comando cat novamente para obter a senha. Anote a senha pIwrPrtPN36QITSp3EQaw936yaFoFgAB em algum lugar, e estamos prontos para o próximo nível.

Checkpoint

Comando de login: ssh bandit4@bandit.labs.overthewire.org -p 2220
Senha: pIwrPrtPN36QITSp3EQaw936yaFoFgAB

Nível 4 -> Nível 5

A senha para o próximo nível está no único arquivo que pode ser lido por um humano no diretório inhere. Dica: se seu terminal está bagunçado, tente o comando "reset".

O comando reset limpa o seu teminal, e se você quiser pode usá-lo, mas ele não é necessário.

Vamos começar tentando encontrar o diretório inhere com o comando ls. Vemos que ele está na pasta home, e depois de entrarmos no diretório com o comando cd (como no nível anterior), precisamos descobrir quais arquivos existem na pasta, e qual deles é um arquivo legível.

Rodando o comando ls, vemos que este diretório tem 9 arquivos que devemos analizar. Agora nosso problema é descobrir quando um arquivo é humanamente legível. Vamos dar uma olhada nos comandos de ajuda deste nível:

  • ls;
  • cd;
  • cat;
  • file;
  • du;
  • find.

Já sabemos o que alguns deles fazem, e podemos descobrir os que não conhecemos com whatis ou --help. Algo que podemos raciocinar aqui, é que o arquivo que procuramos terá um tipo específico que seja legível. Não será um código objeto, por exemplo, então vamos tentar usar esse comando no primeiro arquivo da pasta. Vale lembrar que este arquivo começa com um "-" e nós já resolvemos um desafio associado à leitura deste tipo de nome.

Rodando file ./-file01 recebemos como output "data", ou seja, dados. Lendo o conteúdo deste arquivo, vemos que ele contém muitos caracteres aleatórios, e que este tipo de arquivo definitivamente não é legível. Agora temos que testar os outros arquivos, e temos duas opções: testar um a um, ou usar um caracter coringa para testar todos os arquivos de uma vez.

Testar um a um é viável neste exemplo, porém em situações onde temos vários arquivos com nomes parecidos, isso pode ser um problema. Por isso, caso você não conheça o caracter "*", eu vou te apresentar esse caracter brevemente.

"*" funciona como um coringa, ou seja, pode assumir qualquer valor. No caso especifico do asterisco, ele pode assumir o valor de um caracter, ou de uma lista de caracteres. Neste caso, como temos nomes padronizados (-file0NUMERO), podemos pensar em NUMERO como sendo uma variável, e * todos os valores que essa variável pode assumir. Isso faz algum sentido? Você pode testar file com os arquivos 1,2,3,4... mas usando o asterisco, você pode testar todos os arquivos de uma única vez.

Rodando file ./-file0\* descobrimos que quase todos os arquivos possuem o tipo data, como o primeiro arquivo que lemos. Um deles no entanto,o arquivo 7, possui texto ASCII. ASCII é uma sigla para um código que transforma números binários em caracteres (letras, números, simbolos), utilizado para codificar textos. Sendo assim, parece lógico que este arquivo contenha a senha, e de fato, de lermos o conteúdo deste arquivo com cat, temos como saida koReBOKuIDDepwhWk7jZC0RTdopnAYKh e com esta senha podemos fazer login no próximo nível.

Checkpoint

Comando de login: ssh bandit5@bandit.labs.overthewire.org -p 2220
Senha: koReBOKuIDDepwhWk7jZC0RTdopnAYKh

Considerações finais

Estes foram os 5 primeiros níveis do jogo. O Bandit possui 33 níveis, e eu pretendo documentar meu progresso no jogo através da série de artigos que esse aqui inicia. Anote o último login e senha, que no próximo artigo vamos ter a resolução dos níveis 6 ao 10.

Discussion (2)

Collapse
eduardoklosowski profile image
Eduardo Klosowski

Temática e artigo muito bons!!!

Só aproveitando para algumas dicas extras:

  • O site explainshell.com pode ser bem interessante também, basta colar um comando que ele busca nos manuais o que cada parâmetro significa. Obviamente que isso é para quando se tem um comando e deseja-se saber o que ele fez, e não quando quer saber um comando que faça tal coisa, mas pode ser uma ajuda, ou pelo menos facilita a pesquisa.
  • Essa configuração do SSH da para fazer nos arquivos de configuração, como no ~/.ssh/config:
Host bandit
  HostName bandit.labs.overthewire.org
  Port 2220
Enter fullscreen mode Exit fullscreen mode

O que permitiria conectar executando simplesmente ssh bandit5@bandit e passar a senha, por exemplo.

  • Outra opção para o ./ é o -- que em alguns programas funciona para separar os parâmetros iniciados por - dos demais parâmetros, isso permitira executar file -- * posteriormente, mas infelizmente não funciona no cat.
  • Em relação ao \ para arquivos com espaço, também é possível abrir aspas (simples ou duplas) e digitar o nome do arquivo com espaço, e até usar o tab para autocompletar, pode ficar mais fácil de ler o nome do arquivo posteriormente, ainda mais se ele tiver outros caracteres especiais.

Agora esperando para ver o artigo dos próximos níveis.

Collapse
lelepg profile image
Leticia Pegoraro Garcez Author

Muito obrigada pelas dicas! Vou incluir o que puder no próximo artigo! :D

Forem Open with the Forem app