Em cenários de resposta a incidentes (Incident Response) de segurança cibernética, a velocidade e a precisão na coleta inicial de dados definem o sucesso da contenção. Em servidores Linux corporativos, a execução de comandos ad-hoc e manuais durante uma intrusão ativa pode causar perda de evidências e atrasar a contenção.
Pensando nisso, desenvolvi e publiquei o LinTriage, um script em puro Bash portátil e leve que coleta as evidências forenses e os Indicadores de Comprometimento (IOCs) mais relevantes em menos de 10 segundos, salvando um relatório estruturado em formato Markdown.
1. O princípio da triagem forense não destrutiva e ordem de volatilidade#
A triagem inicial de segurança cibernética deve seguir estritamente o princípio de preservar as evidências no estado mais íntegro possível. A diretriz RFC 3227 estabelece a Ordem de Volatilidade, que define quais evidências devem ser coletadas primeiro com base em sua suscetibilidade a alterações:
- Registradores e cache da CPU.
- Tabelas de roteamento, cache ARP, tabela de conexões, memória de processos (RAM).
- Estado do sistema de arquivos temporários.
- Disco rígido e mídias de armazenamento persistente.
- Arquivos de log remotos e dados de monitoramento.
O LinTriage adota uma postura estritamente passiva (read-only): ele não tenta erradicar, alterar ou remover as ameaças de forma automatizada, permitindo que a equipe de SecOps tome decisões baseadas em dados íntegros e auditáveis.
2. Análise de timestamps e metadados do file system#
No sistema de arquivos do Linux, os metadados dos arquivos são controlados por três carimbos de data/hora essenciais:
atime(Access Time): Atualizado quando o conteúdo de um arquivo é lido.mtime(Modification Time): Atualizado quando o conteúdo de um arquivo é gravado ou modificado.ctime(Change Time): Atualizado quando os metadados do arquivo (permissões, proprietário, inode) são alterados.
3. Por que não usar o pipe direto "cURL | Bash" (antipadrão de segurança)#
Muitos artigos rápidos sugerem a instalação direta enviando o fluxo de rede de um utilitário de terceiros diretamente para o shell de comandos:
# ANTIPADRÃO PERIGOSO - EVITE EM INFRAESTRUTURAS CORPORATIVAS
curl -fsSL https://perciocastelo.com.br/assets/downloads/lin-triage.sh | bash
Essa abordagem é um grave risco de segurança (RCE/MitM) por três razões fundamentais:
- Falta de Validação de Integridade: Não há verificação de assinatura ou hash para garantir que o script transferido não foi alterado na rede ou comprometido no servidor de origem.
- Execução Parcial com Erro de Rede: Se a conexão cair no meio da transferência, o Bash poderá tentar executar um script truncado, gerando comportamento indefinido ou falhas críticas.
- Privilégios de Execução: Executar códigos baixados diretamente da internet sob privilégios de
rootviola os princípios mais básicos de controle e conformidade.
O procedimento seguro de triagem#
Para executar o LinTriage de forma segura e profissional, adote o seguinte fluxo de trabalho de 3 etapas:
- Baixar o arquivo localmente:
wget -q https://perciocastelo.com.br/assets/downloads/lin-triage.sh -O /tmp/lin-triage.sh
- Validar o hash SHA-256 do arquivo baixado:
echo "8f9a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a /tmp/lin-triage.sh" | sha256sum -c -
- Executar localmente apenas após a validação:
bash /tmp/lin-triage.sh
4. Principais indicadores coletados e código fonte#
O LinTriage é desenvolvido em Bash modularizado. Abaixo estão descritos os principais módulos operacionais do script e seus respectivos mecanismos internos:
A) Usuários, chaves autorizadas e sessões ativas#
Audita a persistência lógica vasculhando o arquivo /etc/passwd e inspecionando os arquivos de chaves SSH authorized_keys:
# Trecho simplificado do LinTriage para auditoria de UID 0 e chaves SSH
echo "=== CONTAS COM UID 0 (ROOT) ==="
awk -F: '$3 == 0 { print "Usuário root alternativo detectado: " $1 }' /etc/passwd
echo "=== TRIAGEM DE CHAVES SSH AUTORIZADAS ==="
while read -r user home; do
auth_file="${home}/.ssh/authorized_keys"
if [ -f "$auth_file" ]; then
echo "Usuário: $user | Arquivo: $auth_file"
cat "$auth_file"
fi
done < <(awk -F: '{ print $1, $6 }' /etc/passwd)
B) Soquetes de rede e portas de escuta#
Mapeia conexões ativas e portas de escuta locais para processos físicos. O script utiliza comandos nativos (preferindo o moderno ss ao clássico netstat):
# Inspecionar sockets ativos.
# IMPORTANTE: ss -tulpn requer root para expor PIDs de outros processos.
if [ "$(id -u)" -eq 0 ]; then
ss -tulpn
else
echo "Aviso: ss -tulpn executado sem privilégios de root. Listando portas sem identificar PIDs."
ss -tuln
fi
C) Arquivos recentes e diretórios temporários#
Busca por novos artefatos ou webshells modificados nos últimos 7 dias nos diretórios compartilhados de escrita /tmp, /var/tmp e /dev/shm:
# Buscar alterações recentes nos diretórios temporários do host
# Nota: /dev/shm pode não estar disponível se a partição tmpfs não estiver montada
find /tmp /var/tmp /dev/shm -type f -mtime -7 -ls 2>/dev/null
D) Tarefas agendadas (cron jobs)#
Mapeia cronjobs no diretório /etc/cron.d e arquivos de agendamento de usuários em /var/spool/cron/crontabs para identificar mecanismos de persistência recorrentes.
5. Fluxo de decisão do lintriage#
O diagrama abaixo ilustra o fluxo lógico de decisão técnica recomendado ao lidar com um incidente e utilizar o LinTriage:
6. Comparativo de ferramentas de segurança e triagem#
| Critério | LinTriage | Lynis | Wazuh (HIDS) | Auditd |
|---|---|---|---|---|
| Objetivo Principal | Triagem Forense Rápida (DFIR) | Auditoria de Hardening e Conformidade | Monitoramento de Segurança e HIDS | Auditoria de Chamadas de Kernel |
| Instalação | Portátil (Zero dependências) | Instalação Local | Baseado em Agente Ativo | Daemon residente no Kernel |
| Velocidade de Coleta | < 10 segundos | Minutos (Varredura completa) | Contínuo (Real-time) | Contínuo (Real-time) |
| Uso de Recursos | Extremamente Baixo | Médio | Baixo-Médio | Alto (Sob alta taxa de I/O) |
| Casos de Uso | Pós-comprometimento (Ad-hoc) | Avaliação preventiva de postura | Detecção contínua e SIEM | Análise forense micro de eventos |
7. Instalação e operação segura#
Acesse o repositório oficial do LinTriage no GitHub para consultar o código fonte completo e as atualizações de segurança da comunidade.
Para iniciar uma triagem padrão e auditar os logs de segurança coletados em /var/log/auth.log ou /var/log/secure, siga o runbook abaixo:
# 1. Obtenha o script seguro
wget -q https://perciocastelo.com.br/assets/downloads/lin-triage.sh -O /tmp/lin-triage.sh
# 2. Execute localmente gerando a saída estruturada
sudo bash /tmp/lin-triage.sh
# 3. Analise o relatório Markdown gerado
cat /tmp/lintriage_report_*.md
8. Interpretando o relatório de triagem#
O relatório Markdown gerado pelo LinTriage divide as evidências em seções lógicas, facilitando o diagnóstico:
- Módulo de Sistema: Fornece o hostname, versão do kernel, uptime e data da execução da triagem.
- Módulo de Conexões: Exibe a saída do comando
ss -tulpn. Se houver portas escutando sem um PID atrelado (em execuções não root), o relatório insere um aviso informando que o processo não pôde ser identificado. - Módulo de Usuários: Exibe chaves autorizadas em caminhos de home e contas suspeitas com UID 0. Útil para identificar webshells que criaram usuários com permissão root.
- Módulo de Alterações: Lista caminhos do sistema temporário modificados recentemente. Arquivos binários suspeitos encontrados no diretório
/dev/shmdevem ser analisados imediatamente (são frequentemente usados para ocultar código em execução que sobrevive à reinicialização).
Considerações práticas#
A resposta rápida a incidentes é a diferença entre uma intrusão isolada de 10 minutos e um comprometimento corporativo de larga escala. O LinTriage fornece uma baseline inicial limpa, auditável e ágil para qualquer administrador de sistemas ou analista de segurança defensiva.
Este artigo foi útil?
Deixe uma reação rápida para apoiar o conteúdo:
Este post está licenciado sob CC BY-NC.



Comentários
Participe da discussão abaixo.
0 comentários