
CLI/TUI em Python para triagem forense de sistemas Ubuntu — detecta e corrige mecanismos de persistência com coleta de artefatos, correlação de linha do tempo e integração com Wazuh.
Triagem forense para sistemas Ubuntu em execução — coleta automatizada de artefatos, detecção de persistência e remediação guiada em menos de 5 segundos.
Quando você suspeita que um sistema Linux foi comprometido, os primeiros 30-40 minutos geralmente são gastos executando os mesmos dez comandos em sequência: verificar processos em execução, procurar tarefas cron estranhas, fazer grep de LD_PRELOAD, escanear authorized_keys em busca de novas entradas, auditar sudoers. Cada etapa é manual, com troca de contexto, e propensa a erros sob pressão. Perca uma fonte — digamos, /etc/sudoers.d/ em vez de apenas /etc/sudoers, ou crontabs de usuário além de /etc/cron.d/ — e você terá um panorama incompleto.
As opções existentes não resolvem isso de forma limpa. O lynis é um auditor de hardening, não uma ferramenta de triagem — ele relata fraquezas de configuração em um sistema limpo e gera ruído em um sistema comprometido. O chkrootkit e o rkhunter verificam assinaturas de rootkits conhecidos, mas são cegos a técnicas de persistência novas, como timers systemd abusados ou entradas cron com aparência legítima. Consultas genéricas de SIEM exigem infraestrutura de logs que pode não existir no sistema que você está analisando. E suítes forenses como o Volatility visam imagens de memória, não um shell ativo em um host em execução.
A lacuna é uma ferramenta que roda no sistema em execução agora mesmo, cobre os vetores de persistência mais comuns, correlaciona atividade entre fontes de log em uma linha do tempo e diz exatamente o que examinar — sem exigir um agente externo, um banco de dados ou uma conexão com a internet.
O ubuntils roda em quatro estágios sequenciais:
/proc, tabelas cron, unidades systemd, chaves SSH, arquivos sudoers, definições de ambiente, integridade de pacotes (dpkg --verify), configuração de PAM/NSS e módulos de kernel carregados. Leva cerca de 2,5 segundos em um sistema típico.--rules — sobre os artefatos coletados, produzindo uma lista de achados classificada e com pontuação de confiança em cerca de um segundo.--json).O próprio ubuntils não faz chamadas de rede, e todos os recursos — incluindo regras personalizadas e correlação — rodam contra artefatos coletados localmente. A única forma de os achados saírem do host é a integração com o Wazuh: se um agente Wazuh estiver instalado, um scan ao vivo grava seus achados em um arquivo local que o agente então envia ao seu manager. Passe --no-wazuh para desativar isso em uma execução.
O ubuntils scan permanece inalterado por tudo abaixo — ele continua 100% ao vivo, em host único, e todos os flags existentes funcionam de forma idêntica. Dois comandos adicionais, collect e analyze, dividem o mesmo pipeline de detecção/linha do tempo em um fluxo de trabalho de adquirir-e-analisar amigável para uso offline, para casos em que você não pode (ou não quer) executar a detecção diretamente no host sob investigação — veja Análise offline: collect e analyze abaixo, incluindo suas ressalvas sobre cobertura de detecção.
Ubuntu 22.04+ e qualquer sistema com PEP 668 (recomendado):
O Ubuntu 22.04+ bloqueia pip install em todo o sistema. Use o pipx — ele lida com o ambiente de forma transparente, para que você nunca precise pensar nisso:```bash
sudo apt install pipx -y
cd ubuntils
pipx install -e .
ubuntils scan
**Sistemas mais antigos / instalação manual:**```bash
git clone https://github.com/asmitdesai/ubuntils.git
cd ubuntils
pip install -r requirements.txt -e .
ubuntils scan
ubuntils requer root para acesso completo aos artefatos. Se você executar ubuntils scan como um usuário não-root, ele se re-invocará automaticamente com sudo usando o mesmo interpretador Python (por caminho absoluto), para que o ambiente correto seja usado sem encaminhar seu PATH para o processo root. Todo comando externo (ss, dpkg, systemctl, …) é resolvido em um caminho de busca fixo, pertencente ao root, nunca o seu PATH. Executar sem root ignorará /etc/shadow, algumas entradas de /proc e arquivos cron protegidos, e registrará avisos para cada um.
Somente detecção — TUI interativa:```bash sudo ubuntils scan
**Detecção com saída JSON salva em arquivo:**```bash
sudo ubuntils scan --json > /tmp/triage-$(hostname)-$(date +%Y%m%d).json
Detecção com pré-visualização de remediação via CLI (dry run — nenhuma alteração aplicada):```bash sudo ubuntils scan --remediate
**Detecção com remediação via CLI aplicada:**```bash
sudo ubuntils scan --remediate --confirm
Versão para impressão:```bash ubuntils version
**Colete um pacote à prova de adulteração para análise posterior ou offline:**```bash
sudo ubuntils collect --output /path/to/bundle.tar.gz
Analisar um pacote previamente coletado (não requer root):```bash ubuntils analyze /path/to/bundle.tar.gz --json
**Analise uma imagem forense montada ou uma árvore de sistema de arquivos extraída em vez de um pacote:**```bash
ubuntils analyze --root /mnt/forensic-image --json
Consulte Análise offline: coletar e analisar para o formato do bundle e — o mais importante — o que a análise offline não consegue detectar em comparação com um scan ao vivo.
ubuntils scan [OPTIONS] --json Output JSON to stdout instead of launching the TUI --output FILE Write the JSON report to FILE (implies --json) --remediate Run the remediation engine after detection --confirm Required with --remediate to actually apply changes (else dry-run) --min-confidence N Only auto-remediate findings with confidence >= N (default 40) --no-wazuh Never forward findings to a local Wazuh agent --config FILE YAML allowlist of findings to suppress (see below) --baseline FILE YAML baseline of environment-specific known-good fingerprints to suppress (see below) --since TIME Limit the timeline to events since TIME (e.g. '24h', '7d', '2026-05-20') --rules FILE YAML file of custom detection rules to add (see below) --verbose Verbose structlog output
ubuntils collect [OPTIONS] --output FILE Bundle path to write (default ./ubuntils-bundle-.tar.gz) --verbose Verbose structlog output