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/
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 é 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:
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??
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 é 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.