Analisando Artefatos do Sistema Linux
Quando Usar
- Ao investigar um servidor ou estação de trabalho Linux comprometido
- Para identificar mecanismos de persistência (cron, systemd, chaves SSH)
- Ao rastrear atividade do usuário através do histórico de shell e logs de autenticação
- Durante resposta a incidentes para determinar o escopo de uma violação baseada em Linux
- Para detectar rootkits, backdoors e modificações não autorizadas
Pré-requisitos
- Imagem forense ou acesso ao vivo ao sistema Linux (somente leitura)
- Compreensão da hierarquia do sistema de arquivos Linux (FHS)
- Conhecimento de locais comuns de logging Linux (/var/log/)
- Ferramentas: chkrootkit, rkhunter, AIDE, logs auditd
- Familiaridade com configurações de systemd, cron e PAM
- Acesso root para coleta completa de artefatos
Fluxo de Trabalho
Passo 1: Montar e Coletar Artefatos do Sistema
# Montar imagem forense como somente leitura
mount -o ro,loop,offset=$((2048*512)) /cases/case-2024-001/images/linux_evidence.dd /mnt/evidence
# Criar diretórios de coleta
mkdir -p /cases/case-2024-001/linux/{logs,config,users,persistence,network}
# Coletar logs de autenticação
cp /mnt/evidence/var/log/auth.log* /cases/case-2024-001/linux/logs/
cp /mnt/evidence/var/log/secure* /cases/case-2024-001/linux/logs/
cp /mnt/evidence/var/log/syslog* /cases/case-2024-001/linux/logs/
cp /mnt/evidence/var/log/kern.log* /cases/case-2024-001/linux/logs/
cp /mnt/evidence/var/log/audit/audit.log* /cases/case-2024-001/linux/logs/
cp /mnt/evidence/var/log/wtmp /cases/case-2024-001/linux/logs/
cp /mnt/evidence/var/log/btmp /cases/case-2024-001/linux/logs/
cp /mnt/evidence/var/log/lastlog /cases/case-2024-001/linux/logs/
cp /mnt/evidence/var/log/faillog /cases/case-2024-001/linux/logs/
# Coletar artefatos do usuário
for user_dir in /mnt/evidence/home/*/; do
username=$(basename "$user_dir")
mkdir -p /cases/case-2024-001/linux/users/$username
cp "$user_dir"/.bash_history /cases/case-2024-001/linux/users/$username/ 2>/dev/null
cp "$user_dir"/.zsh_history /cases/case-2024-001/linux/users/$username/ 2>/dev/null
cp -r "$user_dir"/.ssh/ /cases/case-2024-001/linux/users/$username/ 2>/dev/null
cp "$user_dir"/.bashrc /cases/case-2024-001/linux/users/$username/ 2>/dev/null
cp "$user_dir"/.profile /cases/case-2024-001/linux/users/$username/ 2>/dev/null
cp "$user_dir"/.viminfo /cases/case-2024-001/linux/users/$username/ 2>/dev/null
cp "$user_dir"/.wget-hsts /cases/case-2024-001/linux/users/$username/ 2>/dev/null
cp "$user_dir"/.python_history /cases/case-2024-001/linux/users/$username/ 2>/dev/null
done
# Coletar artefatos do usuário root
cp /mnt/evidence/root/.bash_history /cases/case-2024-001/linux/users/root/ 2>/dev/null
cp -r /mnt/evidence/root/.ssh/ /cases/case-2024-001/linux/users/root/ 2>/dev/null
# Coletar configuração do sistema
cp /mnt/evidence/etc/passwd /cases/case-2024-001/linux/config/
cp /mnt/evidence/etc/shadow /cases/case-2024-001/linux/config/
cp /mnt/evidence/etc/group /cases/case-2024-001/linux/config/
cp /mnt/evidence/etc/sudoers /cases/case-2024-001/linux/config/
cp -r /mnt/evidence/etc/sudoers.d/ /cases/case-2024-001/linux/config/
cp /mnt/evidence/etc/hosts /cases/case-2024-001/linux/config/
cp /mnt/evidence/etc/resolv.conf /cases/case-2024-001/linux/config/
cp -r /mnt/evidence/etc/ssh/ /cases/case-2024-001/linux/config/
Passo 2: Analisar Contas de Usuário e Autenticação
# Analisar contas de usuário para anomalias
python3 << 'PYEOF'
print("=== ANÁLISE DE CONTAS DE USUÁRIO ===\n")
# Parse /etc/passwd
with open('/cases/case-2024-001/linux/config/passwd') as f:
for line in f:
parts = line.strip().split(':')
if len(parts) >= 7:
username, _, uid, gid, comment, home, shell = parts[0], parts[1], int(parts[2]), int(parts[3]), parts[4], parts[5], parts[6]
# Sinalizar contas com UID 0 (equivalente a root)
if uid == 0 and username != 'root':
print(f" ALERTA: Conta UID 0: {username} (shell: {shell})")
# Sinalizar contas com shells de login que não deveriam ter
if shell not in ('/bin/false', '/usr/sbin/nologin', '/bin/sync') and uid >= 1000:
print(f" Usuário: {username} (UID:{uid}, Shell:{shell}, Home:{home})")
# Sinalizar contas de sistema com shells de login
if uid < 1000 and uid > 0 and shell in ('/bin/bash', '/bin/sh', '/bin/zsh'):
print(f" AVISO: Conta de sistema com shell: {username} (UID:{uid}, Shell:{shell})")
# Parse /etc/shadow para status da conta
print("\n=== STATUS DE SENHAS ===")
with open('/cases/case-2024-001/linux/config/shadow') as f:
for line in f:
parts = line.strip().split(':')
if len(parts) >= 3:
username = parts[0]
pwd_hash = parts[1]
last_change = parts[2]
if pwd_hash and pwd_hash not in ('*', '!', '!!', ''):
hash_type = 'Desconhecido'
if pwd_hash.startswith('$6$'): hash_type = 'SHA-512'
elif pwd_hash.startswith('$5$'): hash_type = 'SHA-256'
elif pwd_hash.startswith('$y$'): hash_type = 'yescrypt'
elif pwd_hash.startswith('$1$'): hash_type = 'MD5 (FRACO)'
print(f" {username}: hash {hash_type}, última alteração: dia {last_change}")
PYEOF
# Analisar histórico de login
last -f /cases/case-2024-001/linux/logs/wtmp > /cases/case-2024-001/linux/analysis/login_history.txt
lastb -f /cases/case-2024-001/linux/logs/btmp > /cases/case-2024-001/linux/analysis/failed_logins.txt 2>/dev/null
Passo 3: Examinar Mecanismos de Persistência
# Verificar tarefas cron para todos os usuários
echo "=== TAREFAS CRON ===" > /cases/case-2024-001/linux/persistence/cron_analysis.txt
# Cron do sistema
for cronfile in /mnt/evidence/etc/crontab /mnt/evidence/etc/cron.d/*; do
echo "--- $cronfile ---" >> /cases/case-2024-001/linux/persistence/cron_analysis.txt
cat "$cronfile" 2>/dev/null >> /cases/case-2024-001/linux/persistence/cron_analysis.txt
echo "" >> /cases/case-2024-001/linux/persistence/cron_analysis.txt
done
# Crontabs de usuário
for cronfile in /mnt/evidence/var/spool/cron/crontabs/*; do
echo "--- Crontab do usuário: $(basename $cronfile) ---" >> /cases/case-2024-001/linux/persistence/cron_analysis.txt
cat "$cronfile" 2>/dev/null >> /cases/case-2024-001/linux/persistence/cron_analysis.txt
echo "" >> /cases/case-2024-001/linux/persistence/cron_analysis.txt
done
# Verificar serviços systemd para persistência
echo "=== SERVIÇOS SYSTEMD ===" > /cases/case-2024-001/linux/persistence/systemd_analysis.txt
find /mnt/evidence/etc/systemd/system/ -name "*.service" -newer /mnt/evidence/etc/os-release \
>> /cases/case-2024-001/linux/persistence/systemd_analysis.txt
for svc in /mnt/evidence/etc/systemd/system/*.service; do
echo "--- $(basename $svc) ---" >> /cases/case-2024-001/linux/persistence/systemd_analysis.txt
cat "$svc" >> /cases/case-2024-001/linux/persistence/systemd_analysis.txt
echo "" >> /cases/case-2024-001/linux/persistence/systemd_analysis.txt
done
# Verificar chaves SSH autorizadas (detecção de backdoor)
echo "=== CHAVES SSH AUTORIZADAS ===" > /cases/case-2024-001/linux/persistence/ssh_keys.txt
find /mnt/evidence/home/ /mnt/evidence/root/ -name "authorized_keys" -exec sh -c \
'echo "--- {} ---"; cat {}; echo ""' \; >> /cases/case-2024-001/linux/persistence/ssh_keys.txt
# Verificar rc.local e scripts de inicialização
cat /mnt/evidence/etc/rc.local 2>/dev/null > /cases/case-2024-001/linux/persistence/rc_local.txt
# Verificar /etc/profile.d/ para scripts acionados por login
ls -la /mnt/evidence/etc/profile.d/ > /cases/case-2024-001/linux/persistence/profile_scripts.txt
# Verificar sequestro LD_PRELOAD
grep -r "LD_PRELOAD" /mnt/evidence/etc/ 2>/dev/null > /cases/case-2024-001/linux/persistence/ld_preload.txt
cat /mnt/evidence/etc/ld.so.preload 2>/dev/null >> /cases/case-2024-001/linux/persistence/ld_preload.txt
Passo 4: Analisar Histórico de Shell e Execução de Comandos
# Analisar histórico bash para cada usuário
python3 << 'PYEOF'
import os, glob
print("=== ANÁLISE DE HISTÓRICO DE SHELL ===\n")
comandos_suspeitos = [
'wget', 'curl', 'nc ', 'ncat', 'netcat', 'python -c', 'python3 -c',
'perl -e', 'base64', 'chmod 777', 'chmod +s', '/dev/tcp', '/dev/udp',
'nmap', 'masscan', 'hydra', 'john', 'hashcat', 'passwd', 'useradd',
'iptables -F', 'ufw disable', 'history -c', 'rm -rf /', 'dd if=',
'crontab', 'at ', 'systemctl enable', 'ssh-keygen', 'scp ', 'rsync',
'tar czf', 'zip -r', 'openssl enc', 'gpg --encrypt', 'shred',
'chattr', 'setfacl', 'awk', '/tmp/', '/dev/shm/'
]
for hist_file in glob.glob('/cases/case-2024-001/linux/users/*/.bash_history'):
username = hist_file.split('/')[-2]
print(f"Usuário: {username}")
with open(hist_file, 'r', errors='ignore') as f:
lines = f.readlines()
print(f" Total de comandos: {len(lines)}")
sinalizados = []
for i, line in enumerate(lines):
line = line.strip()
for cmd in comandos_suspeitos:
if cmd in line.lower():
sinalizados.append((i+1, line))
break
if sinalizados:
print(f" Comandos suspeitos: {len(sinalizados)}")
for linha_num, cmd in sinalizados:
print(f" Linha {linha_num}: {cmd[:120]}")
print()
PYEOF
Passo 5: Verificar Rootkits e Binários Modificados
# Verificar indicadores de rootkit conhecidos
# Comparar hashes de binários do sistema com versões conhecidas como boas
find /mnt/evidence/usr/bin/ /mnt/evidence/usr/sbin/ /mnt/evidence/bin/ /mnt/evidence/sbin/ \
-type f -executable -exec sha256sum {} \; > /cases/case-2024-001/linux/analysis/binary_hashes.txt
# Verificar binários SUID/SGID (potencial escalonamento de privilégio)
find /mnt/evidence/ -perm -4000 -type f 2>/dev/null > /cases/case-2024-001/linux/analysis/suid_files.txt
find /mnt/evidence/ -perm -2000 -type f 2>/dev/null > /cases/case-2024-001/linux/analysis/sgid_files.txt
# Verificar arquivos suspeitos em /tmp e /dev/shm
find /mnt/evidence/tmp/ /mnt/evidence/dev/shm/ -type f 2>/dev/null \
-exec file {} \; > /cases/case-2024-001/linux/analysis/tmp_files.txt
# Verificar arquivos e diretórios ocultos
find /mnt/evidence/ -name ".*" -not -path "*/\." -type f 2>/dev/null | \
head -100 > /cases/case-2024-001/linux/analysis/hidden_files.txt
# Verificar módulos do kernel
ls -la /mnt/evidence/lib/modules/$(ls /mnt/evidence/lib/modules/ | head -1)/extra/ 2>/dev/null \
> /cases/case-2024-001/linux/analysis/extra_modules.txt
# Verificar configuração PAM modificada (backdoor de autenticação)
diff /mnt/evidence/etc/pam.d/ /cases/baseline/pam.d/ 2>/dev/null \
> /cases/case-2024-001/linux/analysis/pam_changes.txt
Conceitos Chave
| Conceito | Descrição |
|---|---|
| /var/log/auth.log | Log de autenticação principal em sistemas Debian/Ubuntu |
| /var/log/secure | Log de autenticação principal em sistemas RHEL/CentOS |
| wtmp/btmp | Logs binários que registram sessões de login bem-sucedidas e com falha |
| .bash_history | Arquivo de histórico de comandos do usuário (pode ser limpo por invasores) |
| crontab | Sistema de tarefas agendadas comumente usado para persistência |
| authorized_keys | Chaves públicas SSH que concedem acesso sem senha a uma conta |
| Bit SUID | Permissão de arquivo que permite execução como o proprietário do arquivo (vetor de escalonamento de privilégio) |
| LD_PRELOAD | Variável de ambiente que carrega uma biblioteca compartilhada antes de todas as outras (técnica de hooking) |
Ferramentas e Sistemas
| Ferramenta | Propósito |
|---|---|
| chkrootkit | Scanner de detecção de rootkit para sistemas Linux |
| rkhunter | Rootkit Hunter - verifica rootkits, backdoors e explorações locais |
| AIDE | Advanced Intrusion Detection Environment - monitor de integridade de arquivos |
| auditd | Framework de auditoria Linux para monitoramento de chamadas de sistema e acesso a arquivos |
| last/lastb | Parseia wtmp/btmp para histórico de login e logins com falha |
| Plaso/log2timeline | Criação de super-timeline incluindo artefatos Linux |
| osquery | Consulta baseada em SQL para investigação forense ao vivo |
| Velociraptor | Agente de endpoint com capacidades de coleta de artefatos Linux |
Cenários Comuns
Cenário 1: Ataque de Força Bruta SSH Seguido de Comprometimento Analise auth.log para tentativas SSH com falha seguidas de sucesso, identifique o IP atacante, verifique .bash_history para comandos pós-comprometimento, examine authorized_keys para chaves backdoor adicionadas, verifique crontab para persistência, revise conexões de rede.
Cenário 2: Comprometimento de Servidor Web via Vulnerabilidade de Aplicação Examine logs de acesso e erro do servidor web para tentativas de exploração, verifique /tmp e /dev/shm para webshells, analise a atividade do usuário do servidor web (www-data), verifique escalonamento de privilégio via binários SUID ou explorações de kernel, revise conexões de saída.
Cenário 3: Ameaça Interna em Servidor de Banco de Dados Analise o histórico bash do usuário suspeito para comandos de dump de banco de dados, verifique arquivos tar/zip grandes no diretório home ou /tmp, examine comandos scp/rsync para transferência de dados, revise tarefas cron para exfiltração automatizada, verifique logs de dispositivos USB.
Cenário 4: Crypto-Miner em Instância de Nuvem Verifique processos de alta CPU em /proc (ao vivo) ou arquivos de serviço systemd, examine entradas crontab para scripts de reinicialização do miner, verifique /tmp para binários de mineração, analise conexões de rede para comunicações com pools de mineração, revise authorized_keys para acesso do invasor.
Formato de Saída
Resumo de Forense Linux:
Sistema: webserver01 (Ubuntu 22.04 LTS)
Hostname: webserver01.corp.local
Kernel: 5.15.0-91-generic
Contas de Usuário:
Total: 25 (3 com UID 0 - 1 ANÔMALA)
Shells interativos: 8 usuários
Criado recentemente: admin2 (criado em 2024-01-15)
Eventos de Autenticação:
Logins SSH bem-sucedidos: 456
Tentativas SSH com falha: 12.345 (de 23 IPs únicos)
Execuções sudo: 89
Mecanismos de Persistência Encontrados:
Tarefas cron: 3 suspeitas (reverse shell, reinicialização do miner)
Serviços systemd: 1 desconhecido (update-checker.service)
Chaves SSH: 2 chaves não autorizadas em authorized_keys do root
rc.local: Modificado com download cradle
Atividade Suspeita:
- bash_history contém wget para URL pastebin
- Binário SUID /t
(... truncado para tradução)