Você está na página 1de 20

FUNDAMENTAL SKILLS FOR RED TEAMERS

AULA 02
PDF exclusivo para thamires bione - rm349965
thamiresbione@gmail.com
PDF exclusivo para thamires bione - rm349965
thamiresbione@gmail.com
O QUE VEM POR AÍ?

Atualmente, a maioria dos usuários de computadores estão familiarizados


apenas com a interface gráfica do usuário, porém, devem se atentar de que a
interface de linha de comando é uma forma extremamente expressiva de se
comunicar com um computador. De acordo com alguns especialistas, as
interfaces gráficas do usuário tornam as tarefas fáceis, enquanto as interfaces
da linha de comando tornam as tarefas difíceis possíveis.

Quando falamos especificamente de linha de comando em um ambiente


Linux, estamos realmente nos referindo ao shell, que é um programa que recebe
os comandos e os passa para o sistema operacional executar.

O foco desta aula está relacionado ao que pode ser desenvolvido a partir
de uma dessas interfaces e que já foi mencionada anteriormente. Consegue
adivinhar qual é essa interface?

Antes de chegarmos na parte prática, vamos fundamentar alguns


conceitos e, logo em seguida, apresentaremos os comandos utilizados em
sistemas Linux, para que seja possível analisar o conteúdo de um arquivo.

PDF exclusivo para thamires bione - rm349965


thamiresbione@gmail.com
O QUE REALMENTE É O SHELL?

Quando falamos em linha de comando, estamos nos referindo ao shell,


que é um programa que retira os comandos do teclado e os passa para o sistema
operacional executar. Esse programa era a única interface de usuário disponível
em um sistema semelhante ao Unix, como o Linux. No entanto, a interface
gráfica tornou-se parte da maioria das distribuições Linux, as quais fornecem um
programa shell do projeto GNU, chamado bash. O nome “bash” é um acrônimo
para Bourne Again Shell, uma referência ao factbash, e é um substituto
aprimorado para sh, o programa shell Unix original escrito por Steve Bourne
(WILLIAM, SHOTTS, 2012).

Antes de continuar com o assunto sobre “linha de comando”, vale


mencionar que, ao usar uma interface gráfica de usuário, precisamos de outro
programa chamado de emulador de terminal, para interagir com o shell. Existem
vários emuladores de terminal disponíveis para Linux, e todos eles proporcionam
o acesso ao shell.

Quando iniciamos o emulador de terminal ou simplesmente terminal a


partir de uma interface gráfica, encontramos algo semelhante ao apresentado na
figura 1 - “Emulador de terminal”.

Figura 1 - Emulador de terminal


Fonte: Elaborado pelo autor (2023)

PDF exclusivo para thamires bione - rm349965


thamiresbione@gmail.com
O que visualizamos como: kali@kali:~$ é chamado de prompt de shell ou
prompt de comando e aparecerá sempre que o shell estiver pronto para aceitar
entradas de comandos. Embora possa variar em aparência dependendo da
distribuição Linux utilizada, geralmente será incluído o
nome_de_usuário@nome_do_host, seguido pelo diretório de trabalho atual
(representado pelo símbolo: ~), e um cifrão. Se o último caracter do prompt for
um sinal de cerquilha (#), ao invés de um cifrão ($), a sessão terminal terá
privilégios de super usuário. Isso significa que logamos como o usuário root ou
selecionamos um emulador de terminal que fornece privilégios de super usuário
(administrativo).

É muito importante aprender e se familiarizar com a maior quantidade de


comandos Linux possíveis, principalmente aqueles relacionados à manipulação
de arquivos, diretórios e os que estão associados aos serviços disponíveis em
uma rede. A partir de agora, esse material tem o propósito de apresentar de
forma prática alguns dos comandos para lidarmos com tarefas em um ambiente
CLI no Linux.

Para desenvolver o conteúdo apresentado, será necessário a utilização


de uma distribuição Linux. Pode-se optar por uma distribuição já existente ou
preparar um ambiente novo, utilizando a mesma distribuição já apresentada: Kali
Linux. Note que, disponibilizar esse ambiente a partir de uma máquina virtual é
uma boa escolha.

NAVEGAÇÃO NO AMBIENTE

O primeiro assunto que você precisa aprender é como navegar no sistema


de arquivos em um sistema Linux. Essa tarefa poderá ser desenvolvida a partir
de um ambiente GUI, como o apresentado na figura 2 - “Gerenciador de
arquivos” ou pelo ambiente CLI. Logo mais, apresentaremos os comandos
executados no ambiente CLI e alguns relacionados às tarefas de navegação.

Um sistema operacional como o Linux ou Windows organiza seus


arquivos a partir de uma estrutura de diretório hierárquica. Isso significa que os
arquivos são organizados em um padrão de diretórios semelhante a uma árvore

PDF exclusivo para thamires bione - rm349965


thamiresbione@gmail.com
(você já deve ter visto o termo “pastas” para referir-se a um diretório), que podem
conter arquivos e outros diretórios. O primeiro diretório no sistema de arquivos é
chamado de diretório raiz. O diretório raiz contém arquivos e subdiretórios, esses
também contêm mais arquivos e subdiretórios e assim por diante.

Ao contrário do Windows, que tem uma árvore do sistema de arquivos


separada para cada dispositivo de armazenamento, os sistemas do tipo Linux
sempre têm uma única árvore do sistema de arquivos, independentemente de
quantas unidades ou dispositivos de armazenamento estejam conectados ao
computador. Em síntese, esses dispositivos estão conectados em vários pontos
da árvore de diretório.

DIRETÓRIOS DO SISTEMA

A maioria dos usuários provavelmente está familiarizada com um


gerenciador de arquivos que usa uma interface gráfica, como mostrado na figura
3 - “Gerenciador de arquivos”.

PDF exclusivo para thamires bione - rm349965


thamiresbione@gmail.com
Figura 2 - Gerenciador de arquivos
Fonte: Elaborado pelo autor (2023)

Observe que a árvore geralmente é mostrada de cabeça para baixo, ou


seja, com a raiz no topo e os vários outros ramos decaindo. De forma diferente,
ao apresentado na Figura 2 - “Gerenciador de arquivos”, o ambiente linha de
comando pode não ser tão amigável visualmente para alguns utilizadores, sendo
assim, para navegar na árvore e ver os arquivos e diretórios do sistema de
arquivos é necessário pensar de uma maneira diferente, ou seja, utilizando
comandos apropriados à essa navegação.

Pensando nas tarefas realizadas no ambiente linha de comando, a


localização nessa árvore de diretórios é essencial para determinar o conteúdo a
ser visualizado. Por exemplo, se você está localizado em determinado diretório,
podemos dizer que esse é o diretório de trabalho atual. Para entender melhor,
observe novamente a Figura 3 - “Gerenciador de arquivos”. Note que o diretório
atual é o i386-pc.

PDF exclusivo para thamires bione - rm349965


thamiresbione@gmail.com
O File Hierarchy Standard (FHS), determina especialmente os principais
diretórios e o seus respectivos conteúdos em sistemas Linux. Como em outras
distribuições Linux, o Kali Linux é organizado para ser consistente com o FHS,
permitindo que os usuários de outras distribuições Linux encontrem facilmente
os seus diretórios. O FHS também define a finalidade de cada diretório e, como
apresentado na tabela 1 - “Descrição de diretórios”, os diretórios de nível superior
são descritos como:

/bin/: programas básicos

/boot/: Kali Linux kernel e outros arquivos necessários para seu processo de
inicialização inicial

/dev/: arquivos do dispositivo

/etc/: arquivos de configuração

/home/: arquivos pessoais do usuário (diretório home)

/lib/: bibliotecas básicas

/media/*: pontos de montagem para dispositivos removíveis (CD-ROM, USB)

/mnt/: ponto de montagem temporário

/opt /: aplicativos extras fornecidos por terceiros

/root/: diretório pessoal do administrador (root)

/run/: runtime data, mantêm dados em tempo de execução, que não persistem nas
reinicializações (ainda não incluídos no FHS)

/sbin/: programas do sistema

/srv/: dados usados por servidores hospedados neste sistema

/tmp/: arquivos temporários (este diretório é frequentemente esvaziado na


inicialização)

/usr/: aplicações, este diretório é subdividido em bin, sbin, lib de acordo com a mesma
lógica do diretório raiz.

/var/: dados variáveis tratados por daemons. Isso inclui arquivos de log, filas, spools
e caches.

/proc/ e /sys/ são específicos para o kernel Linux (e não fazem parte do FHS). Eles
são usados pelo kernel para exportar dados para o espaço do usuário.

Tabela 1 - Descrição de diretórios

PDF exclusivo para thamires bione - rm349965


thamiresbione@gmail.com
Fonte: Elaborado pelo autor (2023)

Observamos, nesse exemplo, que o primeiro diretório disponível é


representado pelo símbolo de uma barra (/). Isso simboliza a raiz do diretório
principal; e é a partir dele que os demais diretórios e arquivos estarão presentes.

A PARTIR DO TERMINAL

Em um sistema Kali Linux padrão, o terminal GNOME pode ser iniciado a


partir da lista de aplicativos favoritos. Podemos digitar “terminal” enquanto
estivermos na tela de “atividades” (aquela que é ativada quando movemos o
mouse para o canto superior esquerdo e clicamos no ícone do aplicativo que
aparece na listagem), como apresentado na figura 3 - “Acesso ao emulador de
terminal do Kali”:

Figura 3 - Acesso ao emulador de terminal do Kali


Fonte: Elaborado pelo autor (2023)

Com o acesso ao prompt, chegou o momento de praticar. Com isso,


consegue saber o que vamos fazer?

PDF exclusivo para thamires bione - rm349965


thamiresbione@gmail.com
HANDS ON

O primeiro comando que vamos praticar permite exibir o diretório de


trabalho atual usando o comando pwd (Print Working Directory). Digitando o
comando pwd a partir do diretório atual, o resultado deverá ser semelhante ao
exibido a seguir:

kali@kali:~$ pwd

Uma possível saída desse comando é /home/kali

Antes de manipular os arquivos existentes em outros diretórios, podemos


criar os nosso próprios arquivos. O que você acha?

O comando touch é geralmente usado para definir ou atualizar o acesso,


alterar e modificar tempos de arquivos. No entanto, se um argumento de nome
de arquivo for um arquivo inexistente, um arquivo vazio será criado. Então,
vamos aproveitar esse recurso que o comando touch proporciona e criar novos
arquivos:

kali@kali:~$ touch arquivo.txt


kali@kali:~$ touch arquivo1.txt arquivo2.txt

Na primeira linha, você criou um arquivo chamando arquivo.txt (o nome é


criativo, não acha?). Já na segunda linha, foram criados mais dois arquivos.

Logo em seguida, você pode usar o comando ls, para visualizar os


arquivos existentes no diretório de trabalho atual:

kali@kali:~$ ls

Podemos usar o comando ls para listar o conteúdo de qualquer diretório,


não apenas o diretório de trabalho atual.

PDF exclusivo para thamires bione - rm349965


thamiresbione@gmail.com
Muitos utilizadores dos sistemas Linux consideram o redirecionamento um
recurso que pode ser mais interessante para o ambiente de linha de comando.
O recurso chamado redirecionamento de entrada/saída (mais comumente
conhecido como “I/O”), permite redirecionar a entrada e a saída de comandos
para arquivos. Para mostrar a facilidade que esse recurso proporciona, vamos
utilizar comandos como cat, sort, uniq e grep, entre outros nessa categoria.

Muitos desses programas que usamos até agora, produzem algum tipo de
saída que geralmente consiste em dois tipos. No primeiro, temos os resultados
do programa. No segundo, por outro lado, temos mensagens de status e de erro
que nos informam como o programa está respondendo. A saída padrão e o erro
padrão são vinculados à tela e não são salvos em um arquivo de disco. Dessa
forma, se você observar o comando como o ls, compreenderá que ele exibe seus
resultados e suas mensagens de erro diretamente na tela.

É possível redirecionarmos a saída padrão com o redirecionamento de


saída padrão. Logo, podemos redirecionar a saída padrão para outro arquivo..
Ao invés da tela, usaremos o operador de redirecionamento “>”, seguido pelo
nome do arquivo.

Por que fazer desta forma? Muitas vezes é útil armazenar o nome dos
arquivos e diretórios em um arquivo. Por exemplo, é possível fazer isso da
seguinte maneira:

kali@kali:~$ ls -l /usr/bin > saida.txt

kali@kali:~$ ls > saida-local.txt

Cada linha de comando utilizada anteriomente transmite ao shell a


informação para enviar à saída do comando ls à um arquivo, em vez da tela.

E se você quiser saber o conteúdo do arquivo que acabamos de criar?


Então será necessário conhecer mais alguns comandos, como por exemplo o
comando less. Evidentemente, haverá outros comandos para utilizarmos. O
comando less faz a paginação de saídas muito extensas, exibindo uma tela por
vez. Vamos usar como exemplo o arquivo saida.txt:

PDF exclusivo para thamires bione - rm349965


thamiresbione@gmail.com
kali@kali:~$ less saida.txt

Observe que podemos usar as setas do teclado para movimentar a página


para baixo ou para cima. Se desejar finalizar a paginação do conteúdo do
arquivo, pressione a tecla “q”.

O comando more é semelhante ao comando less. Ele também realiza a


paginação de uma saída muito grande e será exibida na tela. Note que a
diferença está entre poder utilizar a navegação com as setas do teclado.

kali@kali:~$ more saida.txt

Antes de apresentar outro comando, você deve conhecer os pipelines. A


capacidade que os comandos possuem de ler os dados da entrada padrão e
enviar para a saída padrão é utilizada por um recurso de shell chamado
pipelines. Usando o operador de pipe “|” (barra vertical), a saída padrão de um
comando pode ser canalizada para a entrada padrão de outro:

comando1 | comando2

Para demonstrar isso completamente, vamos precisar de alguns


comandos que já usamos. Primeiro, devemos utilizar:

kali@kali:~$ ls /usr/bin

Consegue dizer qual é o nome do primeiro arquivo dessa lista? Para isso,
vamos conferir a segunda linha de comando:

kali@kali:~$ ls /usr/bin | less

E agora, você tem a resposta para a pergunta anterior?

Ainda bem que você não usou o comando e opção ls -r para responder a
pergunta, pois “estragaria” a surpresa do pipeline. Isso é extremamente útil!

PDF exclusivo para thamires bione - rm349965


thamiresbione@gmail.com
Usando essa técnica, podemos examinar adequadamente a saída de qualquer
comando que produza a saída padrão.

Vamos continuar aprendendo sobre mais comandos. O próximo é o


comando cat, que é utilizado para concatenar arquivos e exibir o resultado na
tela. Contudo, também pode ser utilizado para exibir o conteúdo de arquivos.

kali@kali:~$ cat saida.txt saida-local.txt

Ele une os dois arquivos gerados anteriormente e exibe o resultado na


tela. Ainda não podemos usar cat saida.txt para exibir o conteúdo somente desse
arquivo.

O comando tac é utilizado para concatenar arquivos, exibindo o resultado


na tela, porém de forma inversa. Esse comando também é usado para exibir o
conteúdo de arquivos, mas sempre de forma inversa.

kali@kali:~$ tac saida.txt saida-local.txt

O comando head exibe as primeiras linhas da saída de um arquivo. Por


padrão, se nenhum parâmetro diferente for transmitido ao comando, então as
primeiras dez linhas do conteúdo do arquivo serão exibidas. Podemos modificar
a quantidade de linhas por meio de um argumento de linha de comando.

kali@kali:~$ head saida.txt

Dessa forma, as dez primeiras linhas do conteúdo do arquivo saida.txt são


exibidas. Podemos, por exemplo, exibir apenas as cinco primeiras linhas,
fazendo da seguinte forma:

kali@kali:~$ head -n 5 saida.txt

A opção -n, permite especificar o número de linhas.

O comando tail exibe as últimas linhas da saída de um arquivo. Por


padrão, se nenhum parâmetro diferente for transmitido ao comando, serão

PDF exclusivo para thamires bione - rm349965


thamiresbione@gmail.com
exibidas as últimas dez linhas do arquivo. Mas é possível modificar essa
quantidade de linhas.

kali@kali:~$ tail saida.txt

Com isso, as dez últimas linhas do conteúdo do arquivo saida.txt são


exibidas. Para apresentar apenas as três primeiras linhas, é necessário utilizar
a opção -n e o número de linhas desejadas, da seguinte forma:

kali@kali:~$ tail -n 3 saida.txt

O comando sort escreve de forma ordenada a concatenação do(s)


arquivo(s), na saída padrão. Por padrão, ele classifica alfabeticamente. Existem
muitas opções disponíveis para modificar o mecanismo de classificação e para
conhecê-las a fundo. Sendo assim, consulte o manual do comando, da seguinte
maneira: “man sort”.

Por enquanto, é possível exibir o conteúdo do arquivo saida-local.txt, que


se classifica de forma alfabética.

kali@kali:~$ more saida-local.txt

O comando nl escreve cada arquivo para a saída padrão, juntamente


com os números das linhas.

kali@kali:~$ nl saida-local.txt

Note que cada linha agora possui um número associado a ela.

kali@kali:~$ nl -s ‘. ’ -w 10 saida-local.txt

PDF exclusivo para thamires bione - rm349965


thamiresbione@gmail.com
Nesse exemplo, a primeira opção -s especifica o que deve ser mostrado
após o número, enquanto a segunda opção -w especifica quantos espaços
devemos colocar antes dos números.

O comando wc mostra a quantidade de linhas, palavras e bytes para cada


arquivo. Observe que são quatro colunas: resultado, quantidade de bytes,
palavras e linhas, e o nome do arquivo.

kali@kali:~$ wc saida.txt

Para obtermos apenas resultados separados, devemos utilizar:

kali@kali:~$ wc -c saida.txt
kali@kali:~$ wc -w saida.txt
kali@kali:~$ wc -l saida.txt

O comando cut emite as partes selecionadas das linhas de cada arquivo,


na saída padrão. No exemplo a seguir, podemos escolher exibir apenas a coluna
de número três existente, no conteúdo do arquivo.

kali@kali:~$ cut -d “ “ -f 3 saida.txt

A opção –d define o delimitador, ou seja, o que separa uma coluna da


outra no conteúdo desse arquivo é um caractere de espaço. A opção -f é de
campo, e permite selecionar apenas o campo desejado; também podemos
entender como coluna. Além disso, essa opção imprime qualquer linha que não
contenha nenhum caracter delimitador.

O comando uniq é frequentemente usado em conjunto com sort. O uniq


aceita uma lista ordenada de dados de entrada padrão ou um único argumento
de nome de arquivo e, por padrão, remove quaisquer duplicatas da lista.

kali@kali:~$ uniq saida.txt


Que tal praticar mais um pouco?

Para isso, assista ao vídeo que preparamos para vocês.

PDF exclusivo para thamires bione - rm349965


thamiresbione@gmail.com
O comando grep é um programa poderoso, usado para encontrar padrões
de texto em arquivos. É usado assim:

grep padrão [arquivo]

Quando grep encontra um “padrão” no arquivo, ele imprime as linhas que


contém nele. Os padrões que o grep pode combinar podem ser muito complexos,
mas por enquanto nos concentraremos em correspondências de texto simples.
Vamos supor que, desejamos encontrar todos os arquivos em nossa lista de
programas, lá no diretório /usr/bin, que tem a palavra new embutida no nome.

kali@kali:~$ ls /usr/bin | grep new

Percebemos que a saída do comando ls foi concatenada com o comando


grep.

Existem algumas opções úteis para o comando grep. A opção -i faz com
que o grep ignore a caixa ao realizar a pesquisa, pois normalmente as pesquisas
fazem distinção entre maiúsculas e minúsculas. E a opção –v diz ao grep para
imprimir apenas linhas que não correspondam ao padrão.

Que tal praticar mais um pouco?

Para isso assista a mais esse vídeo que preparamos para vocês.

Para finalizar, note que após os arquivos serem listados, podemos


determinar o tipo de um arquivo usando o comando file.

Utilizamos o comando file da seguinte maneira:

kali@kali:~$ file saída.txt

Note uma possível saída para esse comando:

arquivo.txt: ASCII text

PDF exclusivo para thamires bione - rm349965


thamiresbione@gmail.com
Para mais conteúdo relacionado ao Linux, faça o download do material de
apoio da Aula 01, que está disponível na plataforma FIAP ON. O conteúdo está
bem completo, e proporcionará a você a possibilidade de conhecer outros
comandos que serão necessários em sua trajetória aqui no curso.

O QUE VOCÊ VIU NESTA AULA?

Inicialmente conceituamos o ambiente de linha comando em sistemas


Linux e sua estrutura de diretórios padrão FHS. Além disso, usamos um conjunto
de comandos, que nos posibilitaram realizar uma análise em um arquivo
contendo registros de um serviço Web.

Se você ficou com alguma dúvida, não deixe de acessar o Discord. Lá


você terá a possibilidade de interagir com os colegas, docentes, assistir à lives
e muito mais. Não deixe de participar desse espaço, estamos te esperando!

Abraços virtuais!

PDF exclusivo para thamires bione - rm349965


thamiresbione@gmail.com
REFERÊNCIAS

BLUM, R.; BRESNAHAN, C. Linux Command Line and Shell Scripting Bible.
3. ed. Indianapolis, IN: Wiley, 2015.

DEV MEDIA. Introdução ao Shell Script no Linux. Disponível em:


<https://www.devmedia.com.br/introducao-ao-shell-script-no-linux/25778>.
Acesso em 16 fev. 2023.

PARKER, S. Shell Scripting Tutorial. Disponível em:


<https://www.shellscript.sh/>. Acesso em 16 fev. 2023.

PINHEIRO, H. An Introduction to Shell Scripting. Disponível em:


<https://www.digitalocean.com/community/tutorial_series/an-introduction-to-
shell-scripting>. Acesso em 16 fev. 2023.

WILLIAM, E.; SHOTTS, JR. The Linux Command Line: A Complete


Introduction. 2. ed. [S.l]: No Starch Press, 2012.

PDF exclusivo para thamires bione - rm349965


thamiresbione@gmail.com
PALAVRAS-CHAVE

Command Line. Shell. Linux.

PDF exclusivo para thamires bione - rm349965


thamiresbione@gmail.com
PDF exclusivo para thamires bione - rm349965
thamiresbione@gmail.com

Você também pode gostar