DEV Community

loading...

[PT-BR] Resolvendo o Bandit (níveis 5-10)

lelepg profile image Leticia Pegoraro Garcez ・10 min read

Olá serumaninhos!
Sei que já faz um tempo desde a útlima vez que eu escrevi sobre o assunto, mas com a faculdade fica difícil encontrar tempo entre listas de exerícios para me dedicar ao dev.to, porém faço o melhor que eu posso.

Este é o segundo artigo da série "Resolvendo o Bandit" que eu estou produzindo, e hoje vamos avançar mais cinco níveis desse desafio de Capture the Flag do OverTheWire.

Se você caiu neste artigo de para-quedas, não deixe de conferir o artigo anterior, onde solucionei (e contei minha jornada de solução) dos cinco primeiros níveis desse jogo clicando aqui.

É importante lembrar que estes artigos tem um foco na minha jornada para solucionar o problema, não na solução em si, o que é bem diferente do que você encontra na internet por ai. Então, se você está pronto pra ir nessa aventura comigo, vamos nessa!

Onde parei:

No último artigo, eu consegui a senha e o login para o nível 6 do desafio.
Comando de login: ssh bandit5@bandit.labs.overthewire.org -p 2220
Senha: koReBOKuIDDepwhWk7jZC0RTdopnAYKh

Com essas informações, já podemos acessar o link das instruções e prosseguir o desafio.

Nível 5 -> Nível 6

A senha para o próximo nível está em algum lugar na pasta inhere e tem todas as seguintes propriedades: pode ser lida por humanos, tem tamanho de 1033 bytes e não é executável.

Alguns comandos são disponibilizados na página do desafio, como dicas. O comando que já me parece útil, é o comando find, já que pelo enunciado precisamos procurar por um arquivo de acordo com suas propriedades, mas só para garantir, eu usei o comando whatis find para ter certeza de que é este o comando que eu preciso.

Para saber mais sobre esse comando, eu utilizaria o comando find --help no terminal no Linux, ou man find, mas vou tentar fazer algo diferente, e usar uma sugestão do Eduardo Klosowski (inclusive, se você não conhece o conteúdo que ele produz, recomendo fortemente que conheça, porque ele tem domínio de tudo que fala e está sempre falando de conteúdo relevanete, além é claro de me dar dicas ótimas!) e usar o site https://explainshell.com/ para ter uma alternativa diferente ao terminal. Basta digitar o comando e o site fará uma busca, exibindo os comandos relacionados à sua busca. Então é só selecionar o comando, e tentar entender o que precisamos fazer para passar de nível.

Lendo o resultado da busca para find, vemos que este comando possui uma série de parâmetros para procurar por arquivos por diferentes tipos de coisas. Então precisamos de alguma maneira para filtrar a legibilidade, tamanho, e executabilidade dos arquivos na pasta.

As diretivas que eu encontrei que podem resolver o problema foram -readable, -size e -executable. Para o parâmetro executable, eu preciso descobrir uma maneira de inverter seu resultado, algo que eu penso que pode ser feito usando ! ou not, e como não encontrei essa informação no site, utilizo o find --help para ver se encontro alguma coisa. De fato, podemos obsersar alguns operadores para os parâmetros, entre eles, o -not que deve ser usado antes de outro parâmetros. Agora só preciso combinar todos os parâmetros, e teremos uma solução para o problema.

find -readable -not -executable -size 1033, infelizmente não funcionou (como se algo funcionasse na primeira tentativa hehe), mas quando eu tirei o parâmetro referente ao tamanho, consegui um resultado para a busca, o que significa que meu problema está neste último parâmetro da busca. E como era de se esperar, eu acabei esquecendo de especificar o tamanho, ou seja, indicar que 1033 se refere a bytes. Então é só aplicar find -readable -not -executable -size 1033c e temos como resultado um único arquivo. Agora é só usar o comando cat nesse arquivo, e temos a senha para o próximo nível. Lembrando que para fechar a conexão com o servidor atual, você precisa digitar exit.

Checkpoint

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

Nível 6 -> Nível 7

A senha para o próximo nível está em algum lugar no servidor e tem todas as seguintes propriedades: pertence ao usuário bandit7, pertence ao grupo bandit6 e tem 33 bytes de tamanho.

Lendo este enunciado, me parece que temos que usar o comando find outra vez. Para ter certeza disso, volto à nossa busca no explainshell.com para ver se existe algum comando que filtre a quem determinado arquivo pertence.

Logo encontro os parâmetros -group, que retorna arquivos pertences a determinado grupo, e -user, que retorna arquivos pertences a um determinado usuário. Como já conhecemos o -size para encontrar um arquivo por tamanho, já temos tudo na mão para resolver esse desafio.

find -user bandit7 -group bandit6 -size 33c parece que vai resolver o desafio, porém não consegui nenhum tipo de retorno com este comando. Este é um momento decisivo. Você pode aceitar que algo não funciona e é isso, ou pode tentar entender porque ele não funciona e assim encontrar uma solução. Lógicamente, eu escolhi ler um pouco mais da documentação do comando para entender porque não estava funcionando.

O comando file procura arquivos no diretório atual, e nos diretórios que estão dentro deste diretório, porém precisamos realizar nossa busca no servidor inteiro, não em uma pasta específica, por isso não consegui nenhum resultado na pasta home do usuário.

Para isso, precisamos especificar uma pasta diferente para fazer a procura, no caso, o diretório / do servidor, já que todo o conteúdo do servidor está dentro deste diretório. Para especificar um novo diretório, o colocamos logo após o comando file, então rodando find / -user bandit7 -group bandit6 -size 33c, temos alguns resultados, vários deles indicando "Permission denied", ou permissão negada.

Bom, é quase intuitivo que temos que encontrar um arquivo que tenhamos permissão de acessar, então aqui você tem duas opções: olhar cada um dos resultados atrás de algum que tenha permissão, ou procurar na documentação do find algo que automatize isso. Eu, novamente, escolhi a segunda opção, mas não encontrei nada relevante. Também dei uma olhada no comando grep (utilizado para encontrar padrões), e também não encontrei nada de útil.

Por fim, recorri ao google. É muito importante que você saiba pesquisar para obter melhor um melhor resultado. No meu caso, eu fiz a busca em inglês porque geralmente consigo resultados mais interessantes mais rápido. "linux find skip permission denied" me pareceu uma boa busca, já que eu quero realmente pular os arquivos que não consigo acessar. E olhando os resultados da pesquisa, consegui encontrar o comando 2>/dev/null clique aqui para acessar o link do artigo.

Antes de usar o comando, copiei e colei ele novamente no google (google é essencial se você trabalha com tecnologia, só quero deixar isso registrado aqui), para tentar descobrir do que se tratava, e encontrei a resposta que eu precisava neste link. Basicamente, o número 2 se refere a mensagens de erro, ou seja, falhas no acesso, entre outras coisas. O símbolo > é o simbolo de redirecionamento, então estamos redirecionando todos os erros para /dev/null, que é um diretório de "lixo". Parece fazer sentido com o que eu preciso, então vamos tentar executar o comando find / -user bandit7 -group bandit6 -size 33c 2>/dev/null, e temos um único arquivo novamente, onde temos a senha do próximo nível. Só usar cat e pegar!

Checkpoint

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

Nível 7 -> Nível 8

A senha para o próximo nível está no arquivo data.txt, do lado da palavra "millionth"

Este exercício parece mais simples que o anterior, a primeira vista, mas só vamor ter certeza, resolvendo. Eu comecei usando o comando cat no arquivo data.txt para entender melhor a estrutura dele, e como eu deveria estruturar a minha busca. Basicamente, o arquivo possui várias linhas, cada uma contendo uma palavra chave, e uma senha. O que temos que fazer então é achar um comando que retorne o texto da linha onde determinada palavra foi encontrada.

Vendo os comandos oferecidos pela ajuda no nível, o comando strings me parece útil, porém após uma rápida busca no explainshell.com, acho que não é este o comando que precisamos. Reanalizando o problema, uma solução muito simples me veio a cabeça. Eu quero encontrar uma sequência de caracteres em um arquivo, e o comando grep é perfeito para isso, já que ele busca por determinados padrões de caracteres em um input. Tudo que eu preciso fazer é redirecionar a saída do comando cat para o comando grep, e BAM! Temos a senha para o próximo nível. E por sorte, cat data.txt | grep millionth retorna exatamente a linha de código que eu preciso com a senha cvX2JJa4CFALtqS87jk27qwqGhBM9plV.

Algo que acho importante mencionar aqui, é que o comando grep foi o primeiro da lista de sugestões do OverTheWire, mas só passou pela minha cabeça utilizá-lo depois que eu já tinha pesquisado e feito algumas tentativas com outros comandos. Talvez eu devesse ter prestado mais atenção às dicas, hehe.

Checkpoint

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

Nível 8 -> Nível 9

A senha para o próximo nível está guardada no arquivo data.txt e é a única linha de código que ocorre apenas uma vez.

Como no exercício anterior, precisamos realizar uma filtragem em um arquivo de texto, mas uma filtragem que identifique um a linha única. Nos comandos oferecidos na ajuda, uniq me parece útil, e observando o resultado e whatis uniq, vejo que ele omite linhas repetidas, então parece que tudo que precisamos fazer é filtrar o arquivo com este comando. Porém não tive muito sucesso com a utilização dele. Isso significa que precisamos ir mais a fundo nas funcionalidades do comando para entender como ele funciona.

Uma opção de contagem está disponível no comando, e utilizando ela em conjunto com o comando grep, ainda recebemos várias ocorrências de linhas que ocorrem apenas uma vez, e observando a saída, encontrei o problema. Como não existem duas linhas iguais em seguida, o comando uniq não filtra essas ocorrências separadas, então precisamos de alguma maneira de ordenar as linhas do arquivo de texto. O comando que me parece útil é o comando sort que ordena linhas de texto. Agora é entender como este comando funciona e de que maneira ele pode ser utilizado.

O comando sort ordena as linhas de texto em ordem alfabética, então tudo o que precisamos fazer é ler o arquivo, ordená-lo e remover as linhas duplicadas. Minha primeira ideia foi criar um novo arquivo com a lista ordenada, mas não tenho permissão de fazer esse tipo de alteração, então minha segunda ideia foi redirecionar a saída do comando sort para o comando uniq, e isso também não deu muito certo, mas lendo a documentação do comando uniq, é possível ver que o parâmetro -u imprime apenas linhas não repetidas, e de fato sort data.txt | uniq -u retorna apenas uma linha de texto, que é a senha do próximo nível. Note que não é necessário especificar o input para o comando uniq, já que a entrada deste comando é a saída do comando sort.

Checkpoint

Comando de login: ssh bandi9@bandit.labs.overthewire.org -p 2220
UsvVyFSfZZWbi6wgC7dAFyFuR6jQQUhR

Nível 9 -> Nível 10

A senha para o próximo nível está no arquivo data.txt em uma das poucas strings que podem ser lidas por um humano, precedida de vários '='

Assim como nos desafios anteriores, aqui precisamos fazer uma filtragem no texto de um arquivo. Basta definir como. Minha primeira ideia para resolver este problema, foi utilizar o comando cat e filtrar essa saída com o comando grep, mas como você já deve estar acostumado se leu tudo o que eu escrevi até aqui, isso não deu certo, e não é nenhuma surpresa.

Já que não deu certo, comecei a procurar na documentação do comando cat algum motivo para me explicar porque isso não deu certo, mas não consegui chegar em nada muito claro. Minha segunda opção (pelas dicas do nível), é o comando strings que parece fazer quase a mesma coisa que o cat, mas ao invés de imprimir na tela, este comando apenas gera uma saída com todas as strings lidas do arquivo, o que o torna um bom candidato para um segundo teste.

Lembrando que eu preciso filtrar o documento por um padrão, (o que já torna o uso do grep quase que institivo). Surpreendentemente, (não, eu não esperava que isso fosse funcionar, porque geralmente preciso de muitos erros e a maioria deles não é documentado aqui), strings data.txt |grep '==' retorna um pequeno texto e a senha para o próximo nível. Note que eu usei '==' como filtro do grep, e se você ler a descrição do problema verá que o exercício enuncia que a senha está precedida de vários '=', portanto me pareceu mais lógico utilizar dois iguais pois estaria retirando algumas linhas que eu já sabia que não se adequavam à condição (aquelas que contém apenas um '=').

Checkpoint

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

Nível 10 -> Nível 11

A senha para o próximo nível está no arquivo data.txt que contém dados criptografados em base64

Já que um dos comandos das dicas se chama literalmente base64, acho que a solução desse problema não vai ser muito difícil. Utilizando o comando whatis vemos que base64 é um comando para criptografar e discriptografar dados. Parece ser o que precisamos, e rodando base64 --help, o parâmetro -d fornece uma descriptografia de um arquivo. E de uma maneira muito mais simples do que parece, só precisamos utilizar o comando base64 -d data.txt para obter a senha do próximo nível.

Checkpoint

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

Considerações finais

Confesso que demorei muito mais do que eu gostaria para escrever este arquivo, porém, antes tarde do que nunca, está publicado.

Resolver estes desafios está sendo bem divertido, porém eu gostaria muito de ter mais tempo para me dedicar aos desafios. Se você acha que eu "enrolo" muito explicando meus erros, saiba que só os mais significativos realmente entram para o artigo, e que esse processo é bem complicado.

De qualquer jeito, espero que este artigo tenha sido útil de alguma forma, e até a próxima!

Discussion (1)

pic
Editor guide
Collapse
eduardoklosowski profile image
Eduardo Klosowski

Muito bom, e parabéns pelo avanço dos níveis!

Aproveitando para comentar algumas coisas, --readable é para listar arquivos que você tem permissão de leitura, e não que seja legível por humanos. Por exemplo, o arquivo em base64 seria listado, mas ele não é um formato legível por humanos, precisa ser processado para que seja possível entender o seu conteúdo. Legível por humanos normalmente são arquivos ditos plaintext.

Não é necessário digitar exit para fechar o SSH. Na maioria das vezes eu simplesmente faço Ctrl + d. As vezes quando ocorre problemas com a conexão, e se torna impossível digitar qualquer comando, nesse casos ainda existe uma outra opção, aperte um Enter para limpar a linha de comando, em seguida ~. e a conexão será fechada, vale lembrar que em teclados em português é necessário apertar ~ e espaço para o caracter seja usado sozinho, uma vez que ele espera a próxima letra para acentuar, logo seria algo como ~ + espaço + ..

Sobre o 2>, eu comento um pouco no meu artigo sobre o URI, tem alguns detalhes lá que podem ser interessantes. E essa é uma das coisas que o explainshell da uma breve explicação quando colado o comando lá.

Eu uso o DuckDuckGo em vez do Google (só para deixar registrado, hahahahaahah).

O comando strings é bastante usado para extrair as strings de executáveis, por exemplo, compile um código em C e veja todas as strings dele com esse comando, ou strings /bin/bash. Se for algum programa que exija senha, e ela esteja dentro do binário sem nenhuma proteção, a senha seria facilmente listada com esse comando, por isso nunca faça if (senha == "secreta") { em um programa.

Base64 não é exatamente criptografia, ele é mais um formato de encode, uma forma de representar um dado. Como o resultado de sua aplicação contêm apenas caracteres legíveis, como letras, números e alguns símbolos como + e =, ele é bastante usado para encodar arquivos e enviá-los por meios que só permitem texto, como o anexo de e-mails, uma vez que o protocolo usado para o envio (SMTP) é baseado em plaintext.

E você não enrola o texto com seus erros. Sua descrição é legal para acompanhar a linha de pensamento, e abre brecha para comentar sobre outros assuntos. Vale a pena comentar sobre eles.