Destruição Ousada


Cyberguard: Linux Luminarium.

Com grandes poderes vêm grandes responsabilidades.

Ao longo do Luminarium, você aprendeu a navegar, manipular e controlar uma máquina Linux. Antes de deixarmos você explorar o mundo por conta própria, é justo encerrarmos com algumas palavras de cautela — e um pouco de caos.

Abaixo está uma coleção não exaustiva de ações aparentemente inocentes que, quando executadas em um sistema real, podem levar à perda catastrófica de dados, negação de serviço (DoS) ou até mesmo corrupção irreparável do sistema. Todas são totalmente reversíveis no pwn.college (basta reiniciar o seu contêiner), mas representam perigos muito reais em qualquer computador desavisado.

Pratique-as, admire o seu impacto, mas nunca as execute em sistemas que importam.


Como você aprendeu no módulo Processos e Tarefas, sempre que você inicia um programa, o sistema operacional Linux cria um novo processo. Se você criar processos mais rápido do que o kernel consegue gerenciar, a tabela de processos ficará cheia e absolutamente tudo irá congelar. Esse novo processo (por exemplo, a execução de um ls) é derivado ("bifurcado" ou forked) a partir de um processo pai (como a instância da sua shell). Por conta disso, essa explosão induzida de processos é chamada de "Bomba Fork" (Fork Bomb).

Você já possui as ferramentas necessárias para fazer isso:

Cada cópia iniciará mais duas, e cada uma dessas iniciará outras duas, inundando o sistema com tantos processos que novos programas não conseguirão ser inicializados!

Este desafio contém o utilitário /challenge/check, que verificará se a sua bomba fork está funcionando (ou seja, se o sistema não consegue mais criar novos processos) e entregará a flag caso o ataque tenha sucesso. Certifique-se de executá-lo (em outro terminal) antes de disparar o ataque; caso contrário, você não conseguirá abri-lo depois!


NOTA: Escusado dizer que isso tornará o seu ambiente temporariamente inoperante. Basta reiniciar o desafio (ou iniciar outro) para retornar tudo ao estado funcional normal!

O espaço disponível em /home/hacker neste contêiner é de míseros 1 gigabyte. Neste nível, você vai entupir o diretório /home/hacker com tanto lixo que nem mesmo um pequeno arquivo de 1 megabyte conseguirá ser criado. Quando isso ocorre, o ambiente de trabalho torna-se inoperante. Vamos praticar a indução dessa falha neste desafio e entender as repercussões disso.

Como encher o disco? Existem incontáveis maneiras. Aqui, ensinaremos o comando yes!

hacker@dojo:~$ yes | head
y
y
y
y
y
y
y
y
y
y
hacker@dojo:~$

O comando yes gera uma saída contínua com a letra y repetidamente para sempre. O uso convencional dele é automatizar respostas afirmativas em solicitações de confirmação ("Tem certeza de que deseja excluir este arquivo?") via pipes, mas aqui o utilizaremos para gerar um arquivo gigantesco repleto de linhas "y". Basta redirecionar a saída do yes para um arquivo no seu diretório home e o seu disco estará cheio em um ou dois minutos!

Este desafio exige que você lote o disco e, em seguida, faça a limpeza. O passo a passo:

  1. Encha o disco.
  2. Execute /challenge/check. Ele tentará criar um arquivo temporário de 1 megabyte. Se essa criação falhar, você passará da primeira etapa e o verificador pedirá que você libere o espaço.
  3. Exclua o arquivo que você criou (usando rm) para liberar o espaço ocupado.
  4. Execute /challenge/check uma segunda vez. Se agora ele conseguir criar o arquivo temporário (ou seja, se você limpou seu diretório home com sucesso), você receberá a flag.

NOTA: Para este desafio, /home/hacker é um diretório home temporário e reduzido. Seus arquivos habituais do diretório home não estarão visíveis aqui, e arquivos salvos aqui não persistirão após a conclusão do desafio.

Por que duas etapas? Seu diretório home persiste entre as instâncias dos desafios. Se deixássemos o disco permanentemente cheio, seu ambiente no pwn.college deixaria de funcionar. Essa é de longe a causa mais frequente de problemas estranhos relatados no pwn.college!

SOCORRO, QUEBROU TUDO! Se você encher o disco e não limpá-lo depois, precisará entrar via ssh para consertar (removendo o arquivo volumoso). Isso exige um pouco mais de cuidado, mas explicamos como fazer na seção "Conectando via SSH" do módulo Começando.

Quer apagar tudo e recomeçar do zero? Você pode!

hacker@dojo:~$ ls /
bin etc blah blah blah
hacker@dojo:~$ rm -rf /
hacker@dojo:~$ ls /
bash: ls: command not found
hacker@dojo:~$

O que aconteceu aqui? Como você se lembra, rm remove arquivos. A opção -r (recursive) remove diretórios e todos os arquivos contidos neles. A opção -f (force) ignora quaisquer erros ou avisos de confirmação que o rm encontraria. Combinadas e apontadas para a raiz /, os resultados são catastróficos: uma exclusão total do seu sistema operacional. Em um sistema moderno, as coisas não são tão simples assim de primeira, mas você entenderá assim que colocar em prática.

Neste desafio, você fará algo que talvez nunca mais faça: aniquilar todo o sistema. Nós fizemos um pequeno ajuste para proteger o seu diretório pessoal (normalmente ele seria varrido junto!), mas, tirando isso, tudo o que separa você da flag é a sua coragem de deletar a unidade inteira. Mas antes de apagar tudo, certifique-se de executar /challenge/check em outro terminal para que ele possa assistir ao espetáculo (e entregar a flag para você)!


NOTA: O comando rm levará algum tempo para concluir. Há muita coisa para deletar!

NOTA: Existem diversos motivos técnicos pelos quais é improvável que você consiga deletar absolutamente tudo, incluindo a técnica que utilizamos para proteger seu diretório home neste nível. Não se preocupe: você causará estragos mais do que suficientes!

Vamos analisar os efeitos de varrer do mapa todo o seu sistema de arquivos. Você agora é um especialista no uso de rm, mas no desafio anterior o /challenge/check imprimiu a flag na tela assim que o disco foi limpo. E se ele não fizesse isso? Sem o binário cat, como você conseguiria ler a /flag?

Lembre-se, do módulo Explorando a Documentação, de que alguns comandos da shell são recursos embutidos (builtins). Enquanto ls, cat e programas semelhantes são binários externos, o comando read (que, como visto no módulo Variáveis de Shell, consegue ler arquivos!) é um comando embutido da shell. Isso significa que, mesmo se você destruir todo o sistema de arquivos, desde que você mantenha uma instância do bash já aberta e rodando, ainda será possível ler arquivos!

Este desafio colocará isso à prova. Ele é muito parecido com o anterior, mas você precisará ler a flag por conta própria após aniquilar o sistema. Depois que você remover tudo com rm, o /challenge/check (que deve ter sido iniciado previamente) restaurará o arquivo /flag com permissão de leitura. Depois disso, bastará usar read para capturá-la!

Então você consegue sobreviver sem o cat! Mas e sem o ls? Desta vez, o /challenge/check restaurará a flag em um arquivo com nome gerado aleatoriamente. Você precisará encontrá-lo sem poder recorrer ao utilitário ls.

Existem várias formas de solucionar este desafio. O comando echo é embutido na shell (builtin), e você pode usar Globbing de Arquivos como argumento para ele expandir todos os arquivos! Por exemplo, echo * listará os nomes de todos os arquivos no diretório atual. Da mesma forma, você pode utilizar o preenchimento automático com a tecla Tab (pressione Tab algumas vezes) para fazer a própria shell listar os arquivos disponíveis para você.

Qualquer que seja o caminho escolhido, localize o arquivo de nome aleatório criado pelo /challenge/check na raiz / após a execução do rm, leia o seu conteúdo e conquiste a flag!


30-Day Scoreboard:

This scoreboard reflects solves for challenges in this module after the module launched in this dojo.

Rank Hacker Badges Score