Comando strings do Linux com Exemplos Práticos

LinuxLinuxBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como usar o comando strings do Linux para extrair strings de caracteres imprimíveis de arquivos binários, incluindo arquivos executáveis, bibliotecas e outros dados binários. Você explorará o propósito e o uso do comando strings, aprenderá como extrair strings de arquivos compactados e criptografados e descobrirá exemplos práticos de como aplicar este comando em seu trabalho diário. Este laboratório fornece uma compreensão abrangente do comando strings e suas aplicações, capacitando você a analisar e solucionar problemas de arquivos binários em sistemas Linux de forma eficaz.

Linux Commands Cheat Sheet

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível intermediário com uma taxa de conclusão de 55%. Recebeu uma taxa de avaliações positivas de 100% dos estudantes.

Compreendendo o Propósito e o Uso Básico do Comando strings

O comando strings no Linux é um utilitário que extrai strings de texto legíveis por humanos de arquivos binários. Arquivos binários, como programas executáveis e bibliotecas, contêm tanto código de máquina quanto dados de texto. Embora o código de máquina não seja legível por humanos, os dados de texto frequentemente incluem informações valiosas, como mensagens de erro, configurações e documentação embutida.

Vamos começar certificando-se de que você está no diretório correto para este laboratório:

cd ~/project/strings_lab

Agora, vamos explorar o uso básico do comando strings examinando o conteúdo de um arquivo binário comum - o comando ls:

strings /bin/ls | head -20

Este comando extrai as primeiras 20 strings legíveis do binário ls. Você deve ver uma saída semelhante a esta:

/lib64/ld-linux-x86-64.so.2
libc.so.6
__stack_chk_fail
__cxa_finalize
setlocale
bindtextdomain
textdomain
__gmon_start__
abort
__errno_location
textdomain
dcgettext
dcngettext
strcmp
error
opendir
fdopendir
dirfd
closedir
readdir

Por padrão, o comando strings exibe qualquer sequência de 4 ou mais caracteres imprimíveis que terminam com uma nova linha ou caractere nulo. Isso o torna valioso para:

  1. Encontrar texto embutido em executáveis
  2. Descobrir caminhos e configurações hardcoded
  3. Análise forense básica
  4. Solução de problemas de arquivos binários

Vamos tentar um exemplo mais específico. Você pode usar o comando grep com strings para encontrar tipos específicos de informações. Por exemplo, para encontrar quaisquer referências a "error" no comando ls:

strings /bin/ls | grep error

Sua saída pode incluir:

error
strerror
strerror_r
__file_fprintf::write_error
error in %s
error %d

O comando strings também fornece várias opções úteis para personalizar seu comportamento. Por exemplo, você pode especificar o comprimento mínimo das strings a serem exibidas:

strings -n 10 /bin/ls | head -10

Este comando mostra apenas strings que têm pelo menos 10 caracteres de comprimento. A saída pode ser semelhante a:

/lib64/ld-linux-x86-64.so.2
__stack_chk_fail
__cxa_finalize
bindtextdomain
__gmon_start__
__errno_location
_ITM_registerTMCloneTable
_ITM_deregisterTMCloneTable
__cxa_atexit
__cxa_finalize

Outra opção útil é -t, que mostra o offset de cada string dentro do arquivo:

strings -t x /bin/ls | head -10

A saída inclui offsets hexadecimais:

    238 /lib64/ld-linux-x86-64.so.2
    4ca __stack_chk_fail
    4dd __cxa_finalize
    4ec setlocale
    4f7 bindtextdomain
    507 textdomain
    512 __gmon_start__
    522 abort
    528 __errno_location
    539 textdomain

Esses offsets podem ser úteis para uma análise mais avançada de arquivos binários.

Analisando Diferentes Tipos de Arquivos Binários com strings

Nesta etapa, você aprenderá como usar o comando strings para analisar diferentes tipos de arquivos binários, incluindo bibliotecas do sistema e binários de aplicativos. Compreender como extrair texto de vários arquivos binários pode ajudá-lo a solucionar problemas, localizar informações específicas ou até mesmo descobrir funcionalidades ocultas.

Primeiro, certifique-se de que você ainda está no diretório do laboratório:

cd ~/project/strings_lab

Explorando Bibliotecas do Sistema

Bibliotecas do sistema contêm código que é compartilhado entre vários programas. Vamos examinar uma biblioteca comum do sistema, libc.so.6, que é a biblioteca padrão C usada pela maioria dos programas no Linux:

strings /lib/x86_64-linux-gnu/libc.so.6 | head -20

Sua saída pode ser semelhante a:

GNU C Library (Ubuntu GLIBC 2.35-0ubuntu3.4) stable release version 2.35.
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 11.4.0.
libc ABIs: UNIQUE IFUNC ABSOLUTE
For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>.
/build/glibc-bBNzrH/glibc-2.35/elf/../sysdeps/x86_64/startup.c
7e
m3
.n
zN
?$
?G
G0
5')
5$)

Como você pode ver, o início da biblioteca inclui informações de versão, avisos de direitos autorais e outros textos legíveis por humanos. Essas informações podem ser valiosas ao solucionar problemas de compatibilidade ou verificar a versão de uma biblioteca.

Encontrando Informações Específicas em Binários

Digamos que você queira encontrar todas as variáveis de ambiente que podem ser usadas por um programa. Você pode pesquisar strings que começam com "$" em um arquivo binário:

strings /bin/bash | grep '^\$' | head -10

Este comando pode gerar:

$HOME
$PATH
$SHELL
$TERM
$USER
$HOSTNAME
$PWD
$MAIL
$LANG
$LC_ALL

Isso mostra todas as variáveis de ambiente que o shell bash pode referenciar.

Analisando Informações de Versão

Você também pode usar o comando strings para encontrar informações de versão em arquivos binários:

strings /bin/bash | grep -i version

A saída pode incluir:

GNU bash, version %s (%s)
version
VERSION
version_string
dist_version
show_shell_version
BASH_VERSION
GNU bash, version %s-(%s)
@(#)version.c
version.c

Isso pode ser particularmente útil quando você precisa verificar rapidamente a versão de um programa sem executá-lo.

Criando um Arquivo Binário Simples para Análise

Vamos criar um arquivo binário simples que contenha dados binários e strings de texto:

## Create a file with some text and binary data
echo "This is a visible string in our test file." > testfile.bin
echo "Another string that should be extractable." >> testfile.bin
## Add some binary data
dd if=/dev/urandom bs=100 count=1 >> testfile.bin 2> /dev/null
## Add one more text string
echo "Final string after some binary data." >> testfile.bin

Agora, use o comando strings para extrair o texto deste arquivo binário:

strings testfile.bin

Sua saída deve incluir todas as três strings de texto:

This is a visible string in our test file.
Another string that should be extractable.
Final string after some binary data.

Isso demonstra como strings pode efetivamente filtrar dados binários e mostrar apenas o texto legível por humanos, mesmo quando misturado com dados não textuais.

Trabalhando com Arquivos Compactados e Criptografados

Nesta etapa, você aprenderá como usar o comando strings com arquivos compactados e criptografados. Como esses arquivos geralmente contêm dados binários, o comando strings pode ser útil para extrair texto legível sem descompactá-los ou descriptografá-los totalmente.

Certifique-se de que você está no diretório do laboratório:

cd ~/project/strings_lab

Analisando Arquivos Compactados

Vamos criar um arquivo de texto e compactá-lo usando diferentes métodos para ver como strings lida com o conteúdo compactado:

Usando a compressão gzip

Primeiro, vamos criar um arquivo de texto simples com várias linhas:

cat > sample_text.txt << EOF
This is a sample text file.
It contains multiple lines of text.
We will compress it in different ways.
Then we'll use the strings command to see what we can extract.
The strings command is useful for examining binary files.
EOF

Agora, vamos compactar este arquivo usando gzip:

gzip -c sample_text.txt > sample_text.gz

A opção -c diz ao gzip para escrever na saída padrão em vez de substituir o arquivo original. Agora, vamos usar strings para ver o que podemos extrair:

strings sample_text.gz

Você pode ver uma saída como:

sample_text.txt
This is a sample text file.
It contains multiple lines of text.
We will compress it in different ways.
Then we'll use the strings command to see what we can extract.
The strings command is useful for examining binary files.

Observe que strings pode extrair o conteúdo original do texto, mesmo que o arquivo esteja compactado. Isso ocorre porque o gzip não criptografa os dados; ele apenas os compacta, o que ainda deixa muitos segmentos de texto legíveis intactos.

Usando diferentes formatos de compressão

Vamos tentar outro método de compressão, bzip2:

bzip2 -c sample_text.txt > sample_text.bz2

Agora, examine este arquivo com strings:

strings sample_text.bz2

A saída pode ser menos legível do que com gzip:

BZh91AY&SY
s1r
U*T)

Isso ocorre porque diferentes algoritmos de compressão produzem diferentes padrões binários, e alguns deixam menos segmentos de texto legíveis do que outros.

Trabalhando com Arquivos Criptografados

A criptografia foi projetada para tornar o conteúdo ilegível sem a chave correta. Vamos criar um arquivo criptografado e ver o que strings pode extrair:

## Create a file with a secret message
echo "This is a top secret message that should be encrypted." > secret.txt

## Encrypt the file using OpenSSL
openssl enc -aes-256-cbc -salt -in secret.txt -out secret.enc -k "password123" -pbkdf2

Agora, vamos usar strings para examinar o arquivo criptografado:

strings secret.enc

Você pode ver uma saída como:

Salted__

Como esperado, você não pode ver a mensagem original porque ela foi devidamente criptografada. O único texto legível é o cabeçalho "Salted__" que o OpenSSL adiciona ao início dos arquivos criptografados para indicar que um salt foi usado no processo de criptografia.

Aplicação Prática: Examinando Arquivos de Log Compactados

Administradores de sistema geralmente compactam arquivos de log para economizar espaço. Vamos simular um arquivo de log e examiná-lo após a compactação:

## Create a simulated log file
cat > system.log << EOF
[2023-10-25 08:00:01] INFO: System startup completed
[2023-10-25 08:05:22] WARNING: High memory usage detected
[2023-10-25 08:10:15] ERROR: Failed to connect to database
[2023-10-25 08:15:30] INFO: Database connection restored
[2023-10-25 08:20:45] WARNING: CPU temperature above threshold
EOF

## Compress the log file
gzip -c system.log > system.log.gz

Agora, vamos usar strings com algumas opções adicionais para examinar o arquivo de log compactado:

strings -n 20 system.log.gz

A opção -n 20 diz ao strings para mostrar apenas sequências de 20 ou mais caracteres imprimíveis. Sua saída pode incluir:

[2023-10-25 08:00:01] INFO: System startup completed
[2023-10-25 08:05:22] WARNING: High memory usage detected
[2023-10-25 08:10:15] ERROR: Failed to connect to database
[2023-10-25 08:15:30] INFO: Database connection restored
[2023-10-25 08:20:45] WARNING: CPU temperature above threshold

Isso demonstra como os administradores de sistema podem verificar rapidamente o conteúdo de arquivos de log compactados sem ter que descompactá-los primeiro, o que pode ser particularmente útil ao lidar com grandes arquivos de log.

Uso Avançado e Aplicações Práticas do Comando strings

Nesta etapa final, você explorará alguns padrões de uso avançados e aplicações práticas do comando strings. Essas técnicas podem ser particularmente úteis para administração de sistemas, desenvolvimento de software e forense digital.

Certifique-se de que você ainda está no diretório do laboratório:

cd ~/project/strings_lab

Combinando strings com Outros Comandos

O verdadeiro poder do comando strings se torna aparente quando você o combina com outros comandos Linux. Vamos explorar algumas combinações úteis:

Encontrando credenciais potencialmente hardcoded

Auditores de segurança geralmente usam strings para procurar credenciais hardcoded em arquivos binários:

## Create a sample program with "credentials"
cat > credentials_example.c << EOF
#include <stdio.h>

int main() {
    char* username = "admin";
    char* password = "supersecret123";
    
    printf("Connecting with credentials...\n");
    return 0;
}
EOF

## Compile the program
gcc credentials_example.c -o credentials_example

Agora, vamos procurar possíveis senhas:

strings credentials_example | grep -i 'password\|secret\|admin\|user\|login'

Isso pode gerar:

admin
supersecret123
password

Isso demonstra como os auditores de segurança podem identificar credenciais potencialmente hardcoded em aplicativos.

Analisando tipos de arquivo

O comando strings pode ajudar a identificar o tipo de um arquivo quando a extensão está ausente ou é enganosa:

## Create a PNG file without the correct extension
cp /usr/share/icons/Adwaita/16x16/places/folder.png mystery_file

Agora, vamos usar strings para procurar pistas sobre o tipo de arquivo:

strings mystery_file | grep -i 'png\|jpeg\|gif\|image'

Você pode ver uma saída como:

PNG
IHDR
pHYs
iDOT

A presença de strings relacionadas ao PNG sugere que este arquivo pode ser uma imagem PNG, apesar de não ter a extensão correta.

Usando strings com File Offsets

A opção -t permite que você veja o offset de cada string dentro do arquivo, o que pode ser valioso para uma análise mais detalhada:

## Create a sample binary file
cat > offset_example.bin << EOF
This is at the beginning of the file.
EOF

## Add some binary data
dd if=/dev/urandom bs=100 count=1 >> offset_example.bin 2> /dev/null

## Add another string
echo "This is in the middle of the file." >> offset_example.bin

## Add more binary data
dd if=/dev/urandom bs=100 count=1 >> offset_example.bin 2> /dev/null

## Add a final string
echo "This is at the end of the file." >> offset_example.bin

Agora, vamos usar strings com a opção -t para ver os offsets:

strings -t d offset_example.bin

A opção -t d mostra os offsets decimais. Sua saída pode ser semelhante a:

         0 This is at the beginning of the file.
       137 This is in the middle of the file.
       273 This is at the end of the file.

Essas informações podem ser úteis para localizar a posição exata das strings dentro de arquivos binários, o que é essencial para tarefas como binary patching ou análise detalhada de arquivos.

Estudo de Caso: Analisando Tráfego de Rede

Pacotes de rede geralmente contêm dados binários e texto legível. Vamos simular um pacote de rede capturado e analisá-lo:

## Create a simulated network packet with HTTP data
cat > http_packet.bin << EOF
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml
EOF

## Add some binary header and footer to simulate packet framing
dd if=/dev/urandom bs=20 count=1 > packet_header.bin 2> /dev/null
dd if=/dev/urandom bs=20 count=1 > packet_footer.bin 2> /dev/null

## Combine them into a complete "packet"
cat packet_header.bin http_packet.bin packet_footer.bin > captured_packet.bin

Agora, vamos analisar este "pacote capturado" com strings:

strings captured_packet.bin

Sua saída deve incluir a requisição HTTP:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml

Isso demonstra como os analistas de rede podem extrair rapidamente informações úteis do tráfego de rede capturado, mesmo quando misturado com dados de protocolo binário.

Resumo do Uso Avançado

As técnicas que você aprendeu nesta etapa demonstram a versatilidade do comando strings para aplicações avançadas:

  1. Combinando strings com grep para pesquisar padrões específicos
  2. Usando strings para identificar tipos de arquivo
  3. Trabalhando com file offsets para análise binária precisa
  4. Extraindo dados legíveis de conteúdo binário misto, como pacotes de rede

Essas técnicas são valiosas para administradores de sistema, profissionais de segurança e desenvolvedores de software que precisam analisar dados binários sem ferramentas especializadas.

Resumo

Neste laboratório, você explorou o comando strings do Linux e aprendeu como usá-lo para extrair texto legível de arquivos binários. Os pontos-chave abordados neste laboratório incluem:

  1. O objetivo do comando strings é extrair sequências de caracteres legíveis por humanos de arquivos binários, o que é útil para examinar executáveis, bibliotecas e outros arquivos não textuais.

  2. Uso básico do comando strings, incluindo opções como -n para especificar o comprimento mínimo da string e -t para mostrar os file offsets.

  3. Aplicação do comando strings para analisar diferentes tipos de arquivos binários, incluindo bibliotecas do sistema e executáveis de aplicativos.

  4. Técnicas para trabalhar com arquivos compactados e criptografados, demonstrando como strings pode extrair informações de arquivos compactados, enquanto arquivos criptografados normalmente revelam informações mínimas.

  5. Padrões de uso avançados, incluindo a combinação de strings com outros comandos como grep para análise direcionada, identificação de tipos de arquivo e exame de tráfego de rede.

As habilidades que você aprendeu neste laboratório são valiosas para administração de sistemas, desenvolvimento de software, auditoria de segurança e forense digital. O comando strings fornece uma maneira simples, mas poderosa, de espiar dentro de arquivos binários sem ferramentas especializadas, tornando-o um utilitário essencial no toolkit do administrador Linux.

Linux Commands Cheat Sheet