Compreendendo Comandos


Cyberguard: Linux Luminarium.

Este módulo apresentará a você diversos comandos essenciais do Linux que serão indispensáveis para o restante da sua jornada aqui! Esta está LONGE de ser uma lista exaustiva, mas é exatamente a base sólida que você precisa para dar os primeiros passos.

Portanto, sem mais delongas, vamos dominar os comandos!


Um dos comandos mais fundamentais do Linux é o cat. O cat é usado com maior frequência para ler o conteúdo de arquivos, desta forma:

hacker@dojo:~$ cat /path/to/file
Hello Hackers!

O cat concatena (daí a origem do seu nome) múltiplos arquivos se você fornecer múltiplos argumentos. Por exemplo:

hacker@dojo:~$ cat myfile
This is my file!
hacker@dojo:~$ cat yourfile
This is your file!
hacker@dojo:~$ cat myfile yourfile
This is my file!
This is your file!
hacker@dojo:~$ cat myfile yourfile myfile
This is my file!
This is your file!
This is my file!

Por fim, se você não passar nenhum argumento, o cat lerá a entrada digitada no próprio terminal e a ecoará de volta na saída. Exploraremos esse comportamento em desafios futuros...

Neste desafio, a flag foi copiada para o arquivo flag no seu diretório home (onde a sua shell é iniciada). Vá até lá e leia-o com o comando cat!

No nível anterior, você executou cat flag para ler a flag diretamente do seu diretório home! Naturalmente, você também pode especificar os argumentos do cat como caminhos absolutos:

hacker@dojo:~$ cat /path/to/file
Hello Hackers!

Neste desafio, a flag não foi copiada para o seu diretório home, mas suas permissões foram liberadas para leitura. Você pode lê-la com cat informando seu caminho absoluto: /flag.


CURIOSIDADE: /flag é onde a flag sempre fica no pwn.college, mas, ao contrário deste desafio, normalmente você não tem permissão para acessar esse arquivo diretamente.

Você pode especificar todos os tipos de caminhos como argumentos de comandos, e vamos praticar um pouco mais com o cat. Neste nível, a flag foi colocada em um diretório incomum e você não terá permissão para mudar de diretório com o cd, portanto nada de cat flag simplificado. Você deve recuperar a flag usando o seu caminho absoluto, onde quer que ela esteja.

Às vezes, os arquivos que você deseja ler com o cat são grandes demais. Felizmente, temos o comando grep para buscar exatamente o conteúdo de que precisamos! Aprenderemos a usá-lo neste desafio.

Existem muitas formas de usar o grep, e aprenderemos uma delas aqui:

hacker@dojo:~$ grep SEARCH_STRING /path/to/file

Invocado dessa forma, o grep buscará no arquivo linhas de texto contendo SEARCH_STRING e as exibirá no console.

Neste desafio, foram inseridas centenas de milhares de linhas de texto no arquivo /challenge/data.txt. Use o grep nele para encontrar a flag!

DICA: A flag sempre começa com o texto pwn.college.

Quando você precisa identificar alterações entre arquivos semelhantes, tentar comparar linha por linha "no olho" definitivamente não é a abordagem mais eficiente! É aqui que o comando diff se torna inestimável.

O diff compara dois arquivos linha por linha e mostra exatamente o que é diferente entre eles. Por exemplo:

hacker@dojo:~$ cat file1
hello
world
hacker@dojo:~$ cat file2
hello
universe
hacker@dojo:~$ diff file1 file2
2c2
< world
---
> universe

A saída nos diz que a linha 2 foi alterada (2c2), com world no primeiro arquivo (<) sendo substituído por universe no segundo arquivo (>).

Às vezes, quando novas linhas são adicionadas, você verá algo como:

hacker@dojo:~$ cat old
pwn
hacker@dojo:~$ cat new
pwn
college
hacker@dojo:~$ diff old new
1a2
> college

Isso nos informa que após a linha 1 do primeiro arquivo, o segundo arquivo possui uma linha adicional (1a2 significa "após a linha 1 do arquivo 1, adicione a linha 2 do arquivo 2").

Agora, ao seu desafio! Existem dois arquivos em /challenge:

  • /challenge/decoys_only.txt contém 100 flags falsas (iscas)
  • /challenge/decoys_and_real.txt contém todas as 100 flags falsas mais a única flag real

Use o comando diff para encontrar o que há de diferente entre esses arquivos e capture a sua flag!

Até agora, nós dissemos com quais arquivos você deveria interagir. No entanto, os diretórios podem conter muitos arquivos (e outros subdiretórios) em seu interior, e nem sempre estaremos aqui para revelar seus nomes. Você precisará aprender a listar o conteúdo deles usando o comando ls (list)!

O comando ls lista os arquivos em todos os diretórios passados a ele como argumentos, ou no diretório atual de trabalho se nenhum argumento for fornecido. Observe:

hacker@dojo:~$ ls /challenge
run
hacker@dojo:~$ ls
Desktop    Downloads  Pictures  Templates
Documents  Music      Public    Videos
hacker@dojo:~$ ls /home/hacker
Desktop    Downloads  Pictures  Templates
Documents  Music      Public    Videos
hacker@dojo:~$

Neste desafio, renomeamos /challenge/run para um nome aleatório! Liste os arquivos em /challenge para descobri-lo. Em seguida, invoque o caminho absoluto descoberto para obter a flag.

Naturalmente, você também pode criar arquivos! Existem várias formas de fazer isso, mas veremos um comando bem simples aqui. Você pode criar um novo arquivo em branco "tocando-o" com o comando touch:

hacker@dojo:~$ cd /tmp
hacker@dojo:/tmp$ ls
hacker@dojo:/tmp$ touch pwnfile
hacker@dojo:/tmp$ ls
pwnfile
hacker@dojo:/tmp$

É simples assim! Neste nível, por favor crie dois arquivos: /tmp/pwn e /tmp/college, e em seguida execute /challenge/run para obter a sua flag!

Os arquivos estão por toda parte. Assim como embalagens de doces, eventualmente haverá arquivos demais acumulados. Neste nível, aprenderemos a fazer uma faxina!

No Linux, você remove arquivos usando o comando rm (remove), desta forma:

hacker@dojo:~$ touch PWN
hacker@dojo:~$ touch COLLEGE
hacker@dojo:~$ ls
COLLEGE     PWN
hacker@dojo:~$ rm PWN
hacker@dojo:~$ ls
COLLEGE
hacker@dojo:~$

Vamos praticar. Este desafio criará um arquivo chamado delete_me no seu diretório home! Exclua-o e, em seguida, execute /challenge/check, que verificará se você o removeu corretamente e então entregará a sua flag!

Você também pode mover e renomear arquivos usando o comando mv (move). O uso é muito simples:

hacker@dojo:~$ ls
my-file
hacker@dojo:~$ cat my-file
PWN!
hacker@dojo:~$ mv my-file your-file
hacker@dojo:~$ ls
your-file
hacker@dojo:~$ cat your-file
PWN!
hacker@dojo:~$

Este desafio quer que você mova o arquivo /flag para /tmp/hack-the-planet (faça isso)! Atenção: você deve obrigatoriamente usar o comando mv em vez de outros métodos (como renomear o arquivo graficamente pelo VSCode). Quando terminar, execute /challenge/check, que verificará a operação e entregará a flag a você.

Mas e se você quiser manter o arquivo original? Você pode fazer isso com o comando cp (copy). O modo de uso é idêntico ao do mv, com a diferença de que ele preserva o arquivo de origem intacto. O comando segue a sintaxe cp ORIGEM DESTINO: o primeiro argumento é o arquivo existente, e o segundo é o local onde a cópia deve ser criada.

Este desafio quer que você copie o arquivo /flag para /tmp/hack-the-planet (mãos à obra)! Quando terminar, execute /challenge/check, que verificará a cópia e entregará a flag para você.


NOTA: Quando o destino de um cp é um diretório, o cp coloca a cópia dentro dele preservando o nome do arquivo original. Para este desafio, /tmp/hack-the-planet deve ser o nome do próprio arquivo copiado, e não um diretório existente.

Curiosamente, o comando ls não lista todos os arquivos por padrão. O Linux adota a convenção de que arquivos iniciados com um ponto . não são exibidos por padrão na listagem normal do ls nem em vários outros contextos. Para visualizá-los com o ls, você precisa invocar o ls com o modificador (flag) -a (de all), desta forma:

hacker@dojo:~$ touch pwn
hacker@dojo:~$ touch .college
hacker@dojo:~$ ls
pwn
hacker@dojo:~$ ls -a
.college	pwn
hacker@dojo:~$

Agora é a sua vez! Vá e encontre a flag, que está escondida como um arquivo iniciado por ponto na raiz /.

Com o seu conhecimento sobre cd, ls e cat, estamos prontos para um pequeno jogo investigativo!

Começaremos na raiz /. Normalmente:

hacker@dojo:~$ cd /
hacker@dojo:/$ ls
bin   challenge  etc   home  lib32  libx32  mnt  proc  run   srv  tmp  var
boot  dev        flag  lib   lib64  media   opt  root  sbin  sys  usr

É bastante conteúdo! Em breve você estará muito familiarizado com todos eles, mas você já deve reconhecer o arquivo flag e o diretório challenge.

Neste desafio, a flag foi escondida! Aqui, você usará ls e cat para seguir as pistas e encontrá-la! Veja como vai funcionar:

  1. Sua primeira pista está em /. Dirija-se até lá.
  2. Olhe ao redor com ls. Haverá um arquivo chamado HINT, CLUE ou algo nessa linha!
  3. Use cat nesse arquivo para ler a pista!
  4. Dependendo do que a pista disser, navegue até o próximo diretório indicado (ou não!).
  5. Siga a trilha de pistas até a flag!

Boa sorte!

Nós já sabemos criar arquivos. Mas e quanto a diretórios (pastas)? Você cria diretórios (make directories) usando o comando mkdir. Depois, você pode colocar arquivos dentro deles!

Veja:

hacker@dojo:~$ cd /tmp
hacker@dojo:/tmp$ ls
hacker@dojo:/tmp$ ls
hacker@dojo:/tmp$ mkdir my_directory
hacker@dojo:/tmp$ ls
my_directory
hacker@dojo:/tmp$ cd my_directory
hacker@dojo:/tmp/my_directory$ touch my_file
hacker@dojo:/tmp/my_directory$ ls
my_file
hacker@dojo:/tmp/my_directory$ ls /tmp/my_directory/my_file
/tmp/my_directory/my_file
hacker@dojo:/tmp/my_directory$

Agora, avance e crie um diretório chamado /tmp/pwn e crie um arquivo chamado college dentro dele! Em seguida, execute /challenge/run, que verificará a sua solução e entregará a flag a você!

Agora já sabemos como listar, ler e criar arquivos. Mas como fazemos para encontrá-los? Usamos o comando find!

O comando find aceita argumentos opcionais que definem os critérios de busca e o local inicial da pesquisa. Se você não especificar um critério de busca, o find corresponderá a todos os arquivos. Se você não especificar um local de busca, o find utilizará o diretório atual de trabalho (.). Por exemplo:

hacker@dojo:~$ mkdir my_directory
hacker@dojo:~$ mkdir my_directory/my_subdirectory
hacker@dojo:~$ touch my_directory/my_file
hacker@dojo:~$ touch my_directory/my_subdirectory/my_subfile
hacker@dojo:~$ find
.
./my_directory
./my_directory/my_subdirectory
./my_directory/my_subdirectory/my_subfile
./my_directory/my_file
hacker@dojo:~$

E ao especificar um local de busca:

hacker@dojo:~$ find my_directory/my_subdirectory
my_directory/my_subdirectory
my_directory/my_subdirectory/my_subfile
hacker@dojo:~$

E, claro, podemos especificar critérios! Por exemplo, aqui filtramos por nome com a opção -name:

hacker@dojo:~$ find -name my_subfile
./my_directory/my_subdirectory/my_subfile
hacker@dojo:~$ find -name my_subdirectory
./my_directory/my_subdirectory
hacker@dojo:~$

Você pode pesquisar em todo o sistema de arquivos se desejar:

hacker@dojo:~$ find / -name hacker
/home/hacker
hacker@dojo:~$

Agora é a sua vez. A flag foi escondida em um diretório arbitrário no sistema de arquivos. O arquivo continua se chamando flag. Vá e encontre-o!

Algumas observações importantes: Primeiro, existem outros arquivos chamados flag espalhados pelo sistema de arquivos. Não se preocupe se o primeiro que você abrir não contiver a flag verdadeira. Segundo, existem muitos locais no sistema de arquivos aos quais um usuário comum não tem permissão de acesso. Isso fará com que o find exiba mensagens de erro de permissão negada (Permission denied), mas você pode ignorá-las; a flag não está escondida nesses lugares restritos! Por fim, uma busca completa com o find pode levar alguns instantes; seja paciente!

Se você utilizar o Linux (ou computadores em geral) por algum tempo para realizar trabalhos reais, você inevitavelmente se deparará com a seguinte situação: você precisa que dois programas acessem os mesmos dados, mas cada um espera encontrar esses dados em um local diferente. Felizmente, o Linux oferece uma solução elegante para esse dilema: os links (ligações).

Existem dois tipos principais de links: links físicos (hard links) e links simbólicos (soft ou symbolic links). Podemos diferenciá-los com uma analogia simples:

  • Um hard link é como usar formas alternativas para indicar o endereço do seu apartamento que chegam diretamente ao mesmo lugar (por exemplo: "Apartamento 2" versus "Unidade 2").
  • Um soft link (link simbólico) é como quando você se muda de casa e pede aos correios que redirecionem automaticamente todas as cartas do seu endereço antigo para o endereço novo.

No sistema de arquivos, um arquivo é conceitualmente um endereço onde o conteúdo de dados reside. Um hard link é um endereço alternativo que indexa diretamente esses mesmos dados — acessos pelo hard link ou pelo arquivo original são absolutamente idênticos e trazem os dados imediatamente. Já um soft link (link simbólico) armazena, em vez disso, o caminho do arquivo original. Quando você acessa o link simbólico, o Linux reconhece que se trata de um atalho simbólico, lê o nome/caminho original apontado e então (geralmente) acessa aquele arquivo automaticamente. Na grande maioria dos casos, ambos os métodos permitem acessar os dados originais, mas a mecânica por baixo dos panos é diferente.

Hard links podem parecer mais simples à primeira vista, mas possuem diversas restrições e particularidades que tornam os links simbólicos (symlinks), de longe, a alternativa mais comum e flexível no dia a dia.

Neste desafio, aprenderemos sobre links simbólicos (symlinks). Eles são criados com o comando ln utilizando o modificador -s na sintaxe ln -s ALVO NOME_DO_LINK. ALVO (TARGET) é o caminho para onde o link deve apontar, e NOME_DO_LINK (LINK_NAME) é o novo caminho/atalho que você está criando. Por exemplo:

hacker@dojo:~$ cat /tmp/myfile
This is my file!
hacker@dojo:~$ ln -s /tmp/myfile /home/hacker/ourfile
hacker@dojo:~$ cat ~/ourfile
This is my file!
hacker@dojo:~$

Você pode notar que acessar o symlink entrega exatamente o conteúdo do arquivo original! Neste exemplo, /tmp/myfile é o alvo e /home/hacker/ourfile é o nome do link.

Um link simbólico pode ser identificado de várias maneiras. Por exemplo, o comando file, que analisa um arquivo e informa o seu tipo, reconhece links simbólicos perfeitamente:

hacker@dojo:~$ file /tmp/myfile
/tmp/myfile: ASCII text
hacker@dojo:~$ file ~/ourfile
/home/hacker/ourfile: symbolic link to /tmp/myfile
hacker@dojo:~$

Tudo pronto, agora é sua vez de testar! Neste nível, a flag está, como sempre, em /flag, mas o programa /challenge/catflag tentará ler o arquivo /home/hacker/not-the-flag. O caminho /home/hacker/not-the-flag é o nome do link que você deve criar neste desafio. Escolha o alvo correto que fará o /challenge/catflag ser enganado e entregar a flag a você!


ATENÇÃO: Se algum experimento anterior deixou algum arquivo existente em /home/hacker/not-the-flag, remova-o primeiro com rm para que o comando ln possa criar o link simbólico no local.


30-Day Scoreboard:

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

Rank Hacker Badges Score