Globbing de Arquivos


Cyberguard: Linux Luminarium.

Mesmo após poucos níveis, você já deve estar cansado de ter que digitar todos esses caminhos de arquivos completos. Felizmente, a shell tem uma solução prática: o globbing! É exatamente isso que aprenderemos neste módulo.

Antes de executar os comandos que você digita, a shell realiza expansões (expansions) neles, e uma dessas expansões é o globbing (com caracteres coringa). O globbing permite que você faça referência a arquivos sem precisar digitar o nome de cada um por extenso ou seus caminhos completos. Vamos começar!


O primeiro caractere coringa (glob) que aprenderemos é o *. Quando a shell encontra um caractere * em qualquer argumento, ela o trata como um coringa (wildcard) e tenta substituir esse argumento por quaisquer arquivos que correspondam ao padrão. É mais fácil demonstrar do que explicar:

hacker@dojo:~$ touch file_a
hacker@dojo:~$ touch file_b
hacker@dojo:~$ touch file_c
hacker@dojo:~$ ls
file_a	file_b	file_c
hacker@dojo:~$ echo Look: file_*
Look: file_a file_b file_c

Naturalmente, embora nesse caso o glob tenha resultado em múltiplos argumentos, ele também pode simplesmente corresponder a apenas um único arquivo:

hacker@dojo:~$ touch file_a
hacker@dojo:~$ ls
file_a
hacker@dojo:~$ echo Look: file_*
Look: file_a

Quando nenhum arquivo corresponde ao padrão, por padrão a shell mantém o padrão inalterado:

hacker@dojo:~$ touch file_a
hacker@dojo:~$ ls
file_a
hacker@dojo:~$ echo Look: nope_*
Look: nope_*

O * corresponde a qualquer parte do nome do arquivo, exceto pelo caractere / ou por um . no início do nome. Por exemplo:

hacker@dojo:~$ echo ONE: /ho*/*ck*
ONE: /home/hacker
hacker@dojo:~$ echo TWO: /*/hacker
TWO: /home/hacker
hacker@dojo:~$ echo THREE: ../*
THREE: ../hacker

Agora, pratique você mesmo! Partindo do seu diretório home, mude de diretório para /challenge, mas use globbing para manter o argumento passado ao cd com no máximo quatro caracteres! Assim que estiver lá, execute /challenge/run para obter a flag!

A seguir, vamos aprender sobre o ?. Quando a shell encontra um caractere ? em qualquer argumento, ela o trata como um coringa de um único caractere. Ele funciona como o *, mas corresponde a exatamente um caractere. Por exemplo:

hacker@dojo:~$ touch file_a
hacker@dojo:~$ touch file_b
hacker@dojo:~$ touch file_cc
hacker@dojo:~$ ls
file_a	file_b	file_cc
hacker@dojo:~$ echo Look: file_?
Look: file_a file_b
hacker@dojo:~$ echo Look: file_??
Look: file_cc

Agora, pratique você mesmo! Partindo do seu diretório home, mude de diretório para /challenge, mas utilize o caractere ? no lugar de c e l no argumento passado para cd! Assim que estiver lá, execute /challenge/run para pegar a flag!

Em seguida, vamos abordar o []. Os colchetes são, essencialmente, uma forma restrita de ?: em vez de corresponder a qualquer caractere, [] é um coringa para um subconjunto específico de caracteres potenciais, definidos dentro dos colchetes. Por exemplo, [pwn] corresponderá ao caractere p, w ou n. Veja um exemplo:

hacker@dojo:~$ touch file_a
hacker@dojo:~$ touch file_b
hacker@dojo:~$ touch file_c
hacker@dojo:~$ ls
file_a	file_b	file_c
hacker@dojo:~$ echo Look: file_[ab]
Look: file_a file_b

Experimente aqui! Colocamos uma série de arquivos em /challenge/files. Mude seu diretório de trabalho para /challenge/files e execute /challenge/run passando um único argumento com correspondência de colchetes (bracket-glob) que resulte em file_b, file_a, file_s e file_h!

O globbing opera com base em caminhos (paths), portanto você pode expandir caminhos inteiros com argumentos baseados em glob. Por exemplo:

hacker@dojo:~$ touch file_a
hacker@dojo:~$ touch file_b
hacker@dojo:~$ touch file_c
hacker@dojo:~$ ls
file_a	file_b	file_c
hacker@dojo:~$ echo Look: /home/hacker/file_[ab]
Look: /home/hacker/file_a /home/hacker/file_b

Agora é a sua vez. Mais uma vez, colocamos vários arquivos em /challenge/files. A partir do seu diretório home, execute /challenge/run com um único argumento que use correspondência de colchetes (bracket-glob) para expandir nos caminhos absolutos dos arquivos file_b, file_a, file_s e file_h!

Até agora, você especificou apenas um padrão de glob de cada vez, mas é possível ir além! O Bash suporta a expansão de múltiplos globs em uma única palavra. Por exemplo:

hacker@dojo:~$ cat /*fl*
pwn.college{YEAH}
hacker@dojo:~$

O que ocorre no exemplo acima é que a shell procura todos os arquivos em / que começam com qualquer coisa (inclusive nada), contêm f e l, e terminam com qualquer coisa (inclusive ag, formando flag).

Agora é a sua vez. Colocamos alguns arquivos com nomes diversos em /challenge/files. Use o cd para ir até lá e execute /challenge/run, passando um único argumento: uma palavra curta (com 3 caracteres ou menos) contendo dois coringas * que case com todas as palavras que contenham a letra p.

Agora, vamos juntar tudo o que vimos nos níveis anteriores! Colocamos alguns arquivos com nomes diversos em /challenge/files. Vá até lá com cd e, utilizando os conceitos de globbing aprendidos, crie um único padrão glob curto (com 6 caracteres ou menos) que (quando passado como argumento para /challenge/run) faça correspondência apenas com os arquivos "challenging", "educational" e "pwning"!


DICA: Certifique-se de examinar os nomes dos arquivos presentes em /challenge/files. Você consegue identificar padrões que ajudem a construir seu glob?

Às vezes, você quer filtrar e excluir arquivos em um padrão glob! Felizmente, o [] ajuda exatamente nisso. Se o primeiro caractere dentro dos colchetes for ! ou (em versões mais recentes do bash) ^, o glob é invertido, e essa instância de colchetes corresponderá a caracteres que não estejam listados. Por exemplo:

hacker@dojo:~$ touch file_a
hacker@dojo:~$ touch file_b
hacker@dojo:~$ touch file_c
hacker@dojo:~$ ls
file_a	file_b	file_c
hacker@dojo:~$ echo Look: file_[!ab]
Look: file_c
hacker@dojo:~$ echo Look: file_[^ab]
Look: file_c
hacker@dojo:~$ echo Look: file_[ab]
Look: file_a file_b

Com esse conhecimento em mãos, vá até /challenge/files e execute /challenge/run passando como argumento todos os arquivos que não comecem com p, w ou n!

NOTA: O caractere ! possui um significado especial diferente no bash quando não é o primeiro caractere dentro de um glob [], portanto tenha isso em mente caso as coisas comecem a se comportar de forma estranha! O ^ não sofre desse problema, mas pode não ser compatível com shells mais antigas.

Por mais tentador que seja, usar * para encurtar o que precisa ser digitado na linha de comando pode levar a erros graves. Seu glob pode se expandir para arquivos indesejados, e você pode só perceber quando o comando rm já estiver em execução! Ninguém está imune a esse tipo de falha.

Uma alternativa mais segura quando você deseja especificar um alvo concreto é o recurso de autocompletar com Tab (tab completion). Se você pressionar a tecla Tab na shell, ela tentará deduzir o que você está prestes a digitar e completará automaticamente. O autocompletar é incrivelmente útil, e este desafio explorará seu uso ao especificar arquivos.

Neste desafio, copiamos a flag para /challenge/pwncollege, e você pode ler esse arquivo livremente com cat. Porém, você não conseguirá digitar o nome do arquivo diretamente: usamos um truque astuto para garantir que você obrigatoriamente use o autocompletar com Tab. Experimente:

hacker@dojo:~$ ls /challenge
Dockerfile  pwncollege
hacker@dojo:~$ cat /challenge/pwncollege
cat: /challenge/pwncollege: No such file or directory
hacker@dojo:~$ cat /challenge/pwn<TAB>
pwn.college{HECK YEAH}
hacker@dojo:~$

Ao pressionar a tecla Tab, o nome do arquivo se expandirá e você conseguirá ler seu conteúdo. Boa sorte!

Considere a seguinte situação:

hacker@dojo:~$ ls
flag  flamingo  flowers
hacker@dojo:~$ cat f<TAB>

Existem múltiplas opções possíveis! O que acontece?

O comportamento varia conforme a shell específica e suas configurações. Por padrão, o bash completará automaticamente até o ponto em que houver ambiguidade (neste caso, fl). Quando você pressionar Tab uma segunda vez, ele exibirá todas as opções correspondentes. Outras shells e configurações podem, em vez disso, alternar ciclicamente entre as opções.

Este desafio possui um diretório /challenge/files com uma série de arquivos começando com pwncollege. Use o autocompletar com Tab a partir de /challenge/files/p ou similar, e encontre o caminho até a flag!

O autocompletar com Tab vai muito além de arquivos! Você também pode autocompletar comandos. Este nível contém um comando que começa com pwncollege, e ele revelará a sua flag. Digite pwncollege e pressione a tecla Tab para completá-lo automaticamente!


NOTA: Você pode autocompletar qualquer comando, mas tome cuidado: autocompletar de forma descuidada sem verificar o resultado pode causar estragos na sua shell caso execute acidentalmente o comando errado!


30-Day Scoreboard:

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

Rank Hacker Badges Score