2.3 Procurando texto e manipulação

Lição 18/50 | Tempo de Estudo: 20 Min

Muito importante para um profissional de Cyber Security , ganhar eficiência com o manuseio de arquivos e textos introduzindo alguns comandos: grep, sed, cut e awk. O uso avançado de algumas dessas ferramentas requer um bom entendimento de como as expressões regulares (regex) funcionam. Uma expressão regular é uma sequência de texto especial para descrever um padrão de pesquisa. Se você não estiver familiarizado com expressões regulares, visite os seguintes URLs antes de continuar:

- http://www.rexegg.com/
- http://www.regular-expressions.info/


grep e família (Grep/Egrep/Fgrep)


Em poucas palavras, grep pesquisa arquivos de texto para a ocorrência de uma dada expressão regular e produz qualquer linha contendo uma correspondência com a saída padrão, que geralmente é a tela do terminal. Alguns das opções mais comumente usados ​​incluem -r para busca recursiva e -i para ignorar maiúsculas e minúsculas.
Considere o seguinte exemplo:

ls -la /usr/bin/ | grep zip


É bem básico. Em qualquer treinamento isso seria suficiente para usar o mínimo do grep, mas ele é muito importante e vou aprofundar esse comando. Vamos lá.

O grep é um comando do Unix que serve para pesquisar textos em arquivos, usando expressões regulares. Trata-se de um comando clássico, surgido na década de 1970 (Deve ser mais velho que você) e ainda hoje é um dos comandos mais utilizados por sysadmins e na área de segurança pela linha de comando do Unix, Linux e Mac. Também pode ser instalado no Windows ou dentro do ambiente Cygwin.

Seu funcionamento é bem simples: Lê o conteúdo do arquivo informado linha a linha e , para cada uma delas, tenta casar a expressão regular. Se obteve sucesso, mostra a linha toda na saída. Note que é "a linha toda" e não "o trecho casado", essa diferença é bem importante. Exemplo:


grep '^r' /etc/passwd


Procuramos por linhas que começam com a letra r no arquivo /etc/passwd. O trecho casado foi somente a primeira letra da linha.

Por sua rapidez e facilidade de uso, o grep é uma ferramenta excelente para testar rapidamente uma expressão regular. Você pode utilizá-lo para buscar algo em:

- Um arquivo

grep '^r' /etc/passwd



- Um arquivo TXT

grep '^r' *.TXT*



- Da entrada padrão STDIN

cat /etc/passwd | grep '^r'


Sempre colocar as expressões entre aspas simples para protegê-las:

- Errado:

grep ^r /etc/passwd


- Certo:

grep '^r' /etc/passwd


Para ignorar a diferença entre letras maiúsculas e minúsculas, basta utilizar a opção `-i` :

cat /etc/services | grep -i SMTP


O grep possui três identidades: grep, egrep e fgrep. São todos o mesmo programa, a diferença está na maneira que vão interpretar o padrão de pesquisa informado:

- O grep procura uma expressão regular básica usando aquela sintaxe antiga em que vários caracteres precisam ser escapados para ser considerado metacaracteres.
- O egrep é o "extend" que usa a sintaxe moderna das expressões regulares., Com ele, não são necessários escapes nos metacaracteres.
- O fgrep é o "fast" ou "fixed string" que não sabe nada de expressões regulares e somente procura textos normais.

Sempre que possível, use o egrep para não ter que ficar escapando os metacaracteres. Quando precisar pesquisar textos normais, use o frep.

Para inverter a expressão ignorando todas as linhas que casam com ela, use a opção `-v`. Usa-se muito para verificar apenas as linhas que contém conteúdo válido em arquivos de configuração: Exemplos:

- Verificar quais as configurações inicializadas por padrão do apache2. Vai excluir o que tiver no começo da linha, um carácter de comentário (#) e linhas em branco:

egrep -v "^#|^$" /etc/apache2/apache2.conf


- Aqui vai verificar em arquivo de configuração do Ansible. Nesse caso, o comentário também pode ser o `;`:

egrep -v '^;|^$|^#' /etc/ansible/ansible.cfg


sed


sed é um poderoso editor de fluxo. Ele também é muito complexo, então vamos apenas arranhar sua superfície brevemente aqui. Em um nível muito alto, sed executa edição de texto em um fluxo de texto, seja um conjunto de arquivos específicos ou saída padrão. Vejamos um exemplo:

echo "Windows é bom para segurança" | sed 's/Windows/Linux/'


Criamos um fluxo de texto usando o comando echo e então o canalizamos para sed a fim de substituir a palavra “Windows” por “Linux”. Observe que, por padrão, a saída foi automaticamente redirecionada para a saída padrão.

Ok, só arranhar a superfície não é suficiente, vamos aprofundar um pouco. Vamos lá!

O sed sempre manipula linhas inteiras. Você passa um arquivo ou um texto pela entrada padrão (STDIN) e ele lê linha por linha, aplicando as regras definidas pelo usuário. Você pode casar linhas e aplicar  comandos nelas.

Para casar linhas, basta colocar a expressão regular entre barras. Em seguida, insere-se o comando a ser executado, como o `d` (delete), ou o `p` (print). Se sua expressão possuir algum barra / lembre-se de escapá-la \ /.

Exemplos:

/[0-9]/ d  # Deleta as linhas com números
/[0-9]/ p  # Duplica as linhas com números


Crie um arquivo chamado teste.txt dentro de /tmp.

vim /tmp/teste.txt
Windows é melhor que o Linux
Meu endereço IP é: 192.168.1.2


Agora quero deletar as linhas que tenham números. Vou fazer de duas formas:


cat teste.txt | sed -e '/[0-9]/d'
sed -e '/[0-9]/d' teste.txt


Quero duplicar as linhas que tenham números. Só trocar o d por p.

cat teste.txt | sed -e '/[0-9]/p'
sed -e '/[0-9]/p' teste.txt


Quero substituir no arquivo Windows por Mac:

sed -e 's/Windows/Mac/' teste.txt


O sed faz muito mais coisas... deve-se separar um tempo da vida para aprender mais sobre ele, e quando você tiver necessidades específicas.




Exemplo muito prático do sed:


Lab: Integrando hashes maliciosos no Wazuh EDR

Podemos facilmente automatizar, analisar e hospedar IOCs. O Wazuh EDR também é capaz de processar IOCs como hashes para detectar arquivos maliciosos potencialmente acessados ​​ou criados no disco. Neste laboratório, utilizaremos uma lista de hashes malicioso de uma fonte OSINT do Threatview.

Crie uma nova pasta de trabalho (um diretório) e baixe o arquivo do seu terminal para a pasta de trabalho usando os seguintes comandos:

mkdir wazuh-hashes && cd wazuh-hashes
wget https://threatview.io/Downloads/SHA-HASH-FEED.txt


Veja o conteúdo do arquivo SHA-HASH-FEED.txt

head SHA-HASH-FEED.txt
02cc0ace499d401aaefa37e3e6dc7ac205eacec7
032ed44468e04a8d0e081aae2743212a93c1ff4e
0473bf944ad25ae189c663dc260cca2d7db63f57
070ce160371cc9c1a9772ba73b575f99924c9fbd
071b457946758202cdfbe5da955822232f49e2c3
09847af7e077cef3f78ae16cebddc8c632e975d1
09f2cb0186494d2be40649c0748d36e671e8b749
0a46ce7d67989ef9369a32c17b436eb8f6f7a098
0b66ad0d35dd8fd85ed8131d4b413a8aefdadaa7


Agora, analisaremos o arquivo de texto no formato que o Wazuh espera, o que requer formatação `hash:tag` por linha. A tag pode ser qualquer valor de string, mas para nossos propósitos no laboratório, rotularemos tudo threatview usando o seguinte comando:

sed -e 's/$/:threatview/' -i SHA-HASH-FEED.txt


Veja agora o conteúdo do arquivo:


head SHA-HASH-FEED.txt
02cc0ace499d401aaefa37e3e6dc7ac205eacec7:threatview
032ed44468e04a8d0e081aae2743212a93c1ff4e:threatview
0473bf944ad25ae189c663dc260cca2d7db63f57:threatview
070ce160371cc9c1a9772ba73b575f99924c9fbd:threatview
071b457946758202cdfbe5da955822232f49e2c3:threatview
09847af7e077cef3f78ae16cebddc8c632e975d1:threatview
09f2cb0186494d2be40649c0748d36e671e8b749:threatview
0a46ce7d67989ef9369a32c17b436eb8f6f7a098:threatview
0b66ad0d35dd8fd85ed8131d4b413a8aefdadaa7:threatview


Agora o Wazuh entende o formato do arquivo. Agora posso renomear o arquivo para por exemplo `cti-threatview-sha1` e copiar para o diretórios de listas do Wazuh:

mv SHA-HASH-FEED.txt cti-threatview-sha1
cp ./cti-threatview-sha1 /var/ossec/etc/rules/lists/


Viram o uso prático do sed??

cut


O comando cut é simples, mas geralmente é bem útil. Ele é usado para extrair uma seção de texto de uma linha e enviá-la para a saída padrão. Algumas das opções mais comumente usadas incluem -f para o número do campo que estamos cortando e -d  para o delimitador de campo.

Por exemplo, quero gerar a relação de usuários que tem no meu sistema. Posso fazer isso com:


cut -d ":" -f 1 /etc/passwd


Posso em linha de comando tirar algumas informações, por exemplo, a quantidade de usuários que tem no meu Linux:

echo "Existem `cut -d ":" -f 1 /etc/passwd | wc -l` usuários no Sistema."


Podemos melhorar, quero agora apenas os usuários que podem fazer login no sistema. No caso você deve conhecer o formato do arquivo `/etc/passwd`. O campo que me interessa agora é o sétimo, onde tem o comando a ser executado quando o usuário fizer login:


echo "Existem `cut -d ":" -f 7 /etc/passwd | grep 'bash$' | wc -l` usuários no Sistema."


awk


AWK é uma linguagem de programação projetada para processamento de texto e é normalmente usada como uma ferramenta de extração e geração de relatórios de dados. Ela também é extremamente poderosa e pode ser bem complexa, então vamos apenas arranhar a superfície aqui. Um opção comumente usado com awk é -F, que é o separador de campo, e o comando print, que gera o texto do resultado.

echo "Ola::Linux::Amigo" | awk -F "::" '{print $1, $3}'


Ele é bom para separar espaços: Por exemplo: Quero saber quantos usuários estão conectados no meu sistema agora. A saída do comando `who`:

root@hunter:/tmp# who
root     tty1         2025-03-21 07:45
sysadmin pts/0        2025-03-21 07:45 (192.168.1.100)



Vamos fazer um pequeno shell script em linha de comando:

echo "Existem $(who | awk -F " " '{print $1}' | wc -l) usuários conectados agora!"


Perceba, que dentro de scripts é melhor trabalhar com a instrução $(comando). Evita erros, faça isso para o seu bem.


André Albuquerque

André Albuquerque

Designer de Produto
4.00
Perfil

Sessões de Aula

1- 3.1 Netcat 2- 4.1 Introdução a comandos de rede no Linux 3- 5.1 Shell Script 4- Temas abordados 5- Temas Abordados 6- 1.1 Instalação do Linux 7- 1.3 Atividades Pós-Instalação 8- 1.4 Usuário root e Usuário comum 9- 1.2 Utilizando LVM 10- 1.5 Sistemas de Arquivos 11- 1.6 Comandos Básicos 12- 1.7 Procurando Arquivos 13- 1.8 Gerenciando Serviços no Linux 14- 1.9 Encontrando, instalando e removendo tools 15- 2.1 Ambiente do Shell 16- 2.2 Piping e redirecionamento 17- 2.3 Procurando texto e manipulação 18- 2.4 Editando arquivos 19- 2.5 Comparando arquivos 20- 2.6 Gerenciando processos 21- 2.7 Monitorando arquivos e comandos 22- 2.8 Baixando arquivos 23- Slide Módulo 2 24- 3.2 Socat 25- Atuar com Cyber Security 26- 6.1 Uma Introdução ao Docker 27- 4.2 Introdução a Análise de Rede 28- 4.3 Networking 29- 4.4 Portas e Serviços 30- 4.5 Análise com Wireshark 31- 4.6 Análise com tcpdump 32- 5.2 Variáveis 33- 5.3 Argumentos 34- 5.4 Lendo Entrada 35- 5.5 Estruturas condicionais if, else e elif 36- 5. 6 Loops 37- 5.7 Criando Menus 38- 5. 8 Funções 39- Exemplos Práticos 40- 6.2 Instalação do Docker no Windows e Linux. 41- 6.3 Imagens e Containers 42- 6.4 Mais Prática - Gerenciando Containers 43- 6.5 Criar conta/usuário no Docker Hub 44- 6.6 Docker Cleanup - Limpando a Casa 45- 6.7 Volumes Docker 46- 6.8 Redes no Docker - Isolamento e Segurança 47- 4.0 🔒 Fundamentos de Redes para Cybersecurity 48- 🎯 EXERCÍCIOS PRÁTICOS 49- 🎯 Wireshark - EXERCÍCIOS PRÁTICOS 50- 🎯 TcpDump- EXERCÍCIOS PRÁTICOS