Explorando Caminhos


Cyberguard: Linux Luminarium.

Este módulo ensinará os fundamentos sobre caminhos de arquivos (paths) no Linux!

O sistema de arquivos do Linux é estruturado como uma "árvore". Isto é, ele possui uma raiz (root, representada por /). A raiz do sistema de arquivos é um diretório, e cada diretório pode conter outros diretórios e arquivos. Você faz referência a arquivos e diretórios por meio do seu caminho (path). Um caminho a partir da raiz do sistema de arquivos começa com / (ou seja, a própria raiz) e descreve o conjunto de diretórios pelos quais é necessário navegar para encontrar o arquivo. Cada parte do caminho é separada por uma barra /.

Munido desse conhecimento, avance e enfrente os desafios abaixo!


Muito bem, o sistema de arquivos começa em /. Abaixo dele, há uma infinidade de outros diretórios, arquivos de configuração, programas e, o mais importante de tudo: flags. Neste nível, adicionamos um programa bem na raiz /, chamado pwn, que entregará a você a flag. Tudo o que você precisa fazer neste desafio é invocar esse programa!

Você pode invocar um programa fornecendo o seu caminho na linha de comando. Neste caso, você informará o caminho exato partindo de /, de modo que o caminho será /pwn. Esse estilo de caminho, que começa diretamente no diretório raiz, é chamado de "caminho absoluto" (absolute path).

Inicie o desafio, abra o terminal, invoque o programa pwn usando seu caminho absoluto e capture essa flag! Boa sorte!

Vamos explorar um caminho um pouco mais elaborado! Com exceção do nível anterior, os desafios no pwn.college ficam no diretório challenge, e o diretório challenge, por sua vez, está localizado diretamente no diretório raiz (/). O caminho para o diretório de desafios é, portanto, /challenge. O nome do programa de desafio neste nível é run, e ele reside dentro do diretório /challenge. Dessa forma, o caminho para o executável do desafio run é /challenge/run.

Este desafio novamente exige que você o execute invocando seu caminho absoluto. Você deve executar o arquivo run localizado no diretório challenge, que por sua vez está no diretório /. Se você invocar o desafio corretamente, ele entregará a flag a você. Boa sorte!

O sistema de arquivos do Linux possui toneladas de diretórios com milhares de arquivos. Você pode navegar entre os diretórios usando o comando cd (change directory, mudar de diretório) e passando um caminho como argumento, desta forma:

hacker@dojo:~$ cd /some/new/directory
hacker@dojo:/some/new/directory$

Isso altera o diretório atual de trabalho (current working directory ou cwd) do seu processo (neste caso, a shell bash). Todo processo possui um diretório no qual está posicionado no momento. Os motivos para isso ficarão claros mais adiante neste módulo.

Como curiosidade, agora você pode entender o que significava o ~ no prompt! Ele exibe o caminho atual onde a sua shell está posicionada.

Este desafio exigirá que você execute o programa /challenge/run a partir de um diretório específico (que ele próprio informará). Você precisará usar o comando cd para entrar nesse diretório antes de executar novamente o programa do desafio. Boa sorte!

A mesma coisa, mas 5 vezes seguidas!

Agora você já está familiarizado com o conceito de referenciar caminhos absolutos e mudar de diretórios. Se você utilizar caminhos absolutos para tudo, então realmente não importa em qual diretório você esteja, como você provavelmente percebeu nos três desafios anteriores.

No entanto, o diretório de trabalho atual importa — e muito — para caminhos relativos.

  • Um caminho relativo é qualquer caminho que não começa na raiz (ou seja, que não começa com /).
  • Um caminho relativo é interpretado de forma relativa ao seu diretório atual de trabalho (current working directory ou cwd).
  • O seu cwd é o diretório onde o seu prompt está localizado no momento.

Isso significa que a forma de especificar um determinado arquivo depende de onde o prompt do terminal está posicionado.

Imagine que queiramos acessar um arquivo localizado em /tmp/a/b/my_file.

  • Se o meu cwd for /, um caminho relativo até o arquivo será tmp/a/b/my_file.
  • Se o meu cwd for /tmp, um caminho relativo até o arquivo será a/b/my_file.
  • Se o meu cwd for /tmp/a/b/c, um caminho relativo até o arquivo será ../my_file. O .. refere-se ao diretório pai (um nível acima).

Mudar de diretório e invocar um programa são duas ações separadas. Por exemplo:

hacker@dojo:~$ cd /
hacker@dojo:/$ bin/echo Hello
Hello

O primeiro comando muda o diretório de trabalho atual para /. O segundo comando executa /bin/echo usando o caminho relativo bin/echo.

Vamos praticar aqui! Primeiro, mude seu diretório de trabalho atual para /. Em seguida, invoque /challenge/run usando um caminho relativo. Para este nível, aqui vai uma dica: O seu caminho relativo começa com a letra c 😊

Anteriormente, seu caminho relativo foi "direto": ele especificou sem rodeios o diretório no qual navegar a partir do diretório atual. Neste nível, vamos explorar caminhos relativos mais explícitos.

Na maioria dos sistemas operacionais, incluindo o Linux, todo diretório possui duas entradas implícitas que você pode referenciar em caminhos: . e ... A primeira, ., aponta diretamente para o próprio diretório atual, de modo que os seguintes caminhos absolutos são todos idênticos entre si:

  • /challenge
  • /challenge/.
  • /challenge/./././././././././
  • /./././challenge/././

Os seguintes caminhos relativos também são todos idênticos entre si:

  • challenge
  • ./challenge
  • ./././challenge
  • challenge/.

Naturalmente, se o seu diretório atual de trabalho for /, os caminhos relativos acima equivalem exatamente aos caminhos absolutos correspondentes.

Este desafio fará você utilizar o . nos seus caminhos relativos. Seu diretório atual de trabalho deve ser /, e o caminho relativo que você usar para invocar o desafio deve começar obrigatoriamente com .. Prepare-se!

Neste nível, vamos praticar um pouco mais a referência a caminhos usando .. Este desafio exigirá que você o execute a partir do diretório /challenge. Aqui, as coisas ficam ligeiramente mais interessantes.

O Linux evita explicitamente procurar comandos no diretório atual de forma automática quando você fornece apenas o nome do executável. Considere o seguinte exemplo:

hacker@dojo:~$ cd /challenge
hacker@dojo:/challenge$ run

Isso não executará /challenge/run. Na verdade, trata-se de uma medida crucial de segurança: se o Linux procurasse programas no diretório atual toda vez que você digitasse um comando simples, você poderia acidentalmente executar programas maliciosos ou inesperados no seu diretório de trabalho que tivessem o mesmo nome de utilitários centrais do sistema! Como resultado, os comandos acima retornarão o seguinte erro:

bash: run: command not found

Exploraremos os mecanismos por trás desse conceito mais adiante, mas neste desafio aprenderemos como usar explicitamente caminhos relativos para executar run nesse cenário. A forma de fazer isso é dizer ao Linux que você deseja explicitamente executar um programa localizado no diretório atual, utilizando o . como nos níveis anteriores. Tente agora mesmo!

Todo usuário possui um diretório home (diretório pessoal), geralmente localizado sob /home no sistema de arquivos. No dojo, você é o usuário hacker, e seu diretório home é /home/hacker. O diretório home é tipicamente onde os usuários guardam a maior parte dos seus arquivos pessoais. À medida que você avança pelo pwn.college, é aqui que você armazenará a maior parte dos seus scripts e soluções.

Tipicamente, sua sessão de shell começará com o seu diretório home como diretório de trabalho atual. Considere o prompt inicial:

hacker@dojo:~$

O ~ neste prompt representa o diretório de trabalho atual, sendo o ~ um atalho para /home/hacker. O Bash fornece e utiliza esse atalho porque, novamente, a maior parte do seu tempo será gasta dentro do seu diretório pessoal. Portanto, sempre que o bash encontra o ~ no início de um argumento de forma consistente com um caminho, ele o expande automaticamente para o seu diretório home. Veja o exemplo:

hacker@dojo:~$ echo LOOK: ~
LOOK: /home/hacker
hacker@dojo:~$ cd /
hacker@dojo:/$ cd ~
hacker@dojo:~$ cd ~/asdf
hacker@dojo:~/asdf$ cd ~/asdf
hacker@dojo:~/asdf$ cd ~
hacker@dojo:~$ cd /home/hacker/asdf
hacker@dojo:~/asdf$

Observe que a expansão do ~ resulta em um caminho absoluto, e apenas o ~ inicial é expandido. Isso significa, por exemplo, que ~/~ será expandido para /home/hacker/~, e não para /home/hacker/home/hacker.

Curiosidade útil: o comando cd sem argumentos usará o seu diretório home como destino padrão:

hacker@dojo:~$ cd /tmp
hacker@dojo:/tmp$ cd
hacker@dojo:~$

Agora é a sua vez de jogar! Neste desafio, o programa /challenge/run gravará uma cópia da flag em qualquer arquivo que você especificar como argumento na linha de comando, atendendo às seguintes restrições:

  1. O seu argumento deve ser um caminho absoluto.
  2. O caminho deve estar dentro do seu diretório home.
  3. Antes da expansão pelo shell, o seu argumento deve conter no máximo três caracteres.

Lembrando: você deve fornecer o seu caminho como um argumento para /challenge/run, desta forma:

hacker@dojo:~$ /challenge/run SEU_CAMINHO_AQUI

30-Day Scoreboard:

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

Rank Hacker Badges Score