# T1552.003 - Shell History > [!info] Identificação MITRE ATT&CK > **Tática:** Credential Access · **ID:** T1552.003 · **Plataformas:** Linux, macOS, Windows · **Versão:** 16.2 ## Descrição A técnica **T1552.003 - Shell History** descreve como adversários exploram os arquivos de histórico de comandos de shells interativos para recuperar credenciais armazenadas de forma insegura por usuários que as digitaram diretamente na linha de comando. Shells como **Bash**, **Zsh** e **Fish** no Linux/macOS, e **PowerShell** no Windows, registram automaticamente os comandos digitados pelo usuário em arquivos de histórico persistentes. Essa funcionalidade, projetada para conveniência do usuário, cria inadvertidamente um repositório de credenciais quando usuários passam senhas, tokens ou chaves diretamente como argumentos de linha de comando - prática comum em ambientes de desenvolvimento, DevOps e administração de sistemas. **Arquivos de histórico por plataforma:** | Shell | Plataforma | Arquivo de Histórico | |-------|------------|---------------------| | Bash | Linux/macOS | `~/.bash_history` | | Zsh | macOS/Linux | `~/.zsh_history` | | Fish | Linux/macOS | `~/.local/share/fish/fish_history` | | PowerShell | Windows | `%USERPROFILE%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt` | | PowerShell | Linux/macOS | `~/.local/share/powershell/PSReadLine/ConsoleHost_history.txt` | | sh/dash | Linux | `~/.sh_history` (quando configurado) | Por padrão, o Bash mantém os últimos **1000 comandos** (controlado pela variável `HISTSIZE`), enquanto o Zsh mantém **1000 linhas** no arquivo (`SAVEHIST`). Esses valores podem ser aumentados por usuários ou configurações corporativas, expandindo a jánela temporal de exposição. **Por que credenciais acabam no histórico:** - Conexões SSH com senha inline: `sshpass -p 'senha123' ssh usuario@servidor` - Autenticação em APIs: `curl -u admin:senha123 https://api.empresa.com` - Acesso a banco de dados: `mysql -u root -p'senha_db' -h servidor` - Configuração de ferramentas: `aws configure set aws_secret_access_key AKIAIOSFODNN7...` - Tokens em variáveis de ambiente: `export API_TOKEN=ghp_xxxxxxxxxxxx` - Scripts de deploy com credenciais embutidas Essa técnica está classificada como subtécnica de [[t1552-unsecured-credentials|T1552 - Unsecured Credentials]] e frequentemente é utilizada nas fases iniciais de [[ta0006-credential-access|Credential Access]] após comprometimento de um servidor Linux ou estação macOS. ## Como Funciona ### 1. Leitura direta do arquivo de histórico (Linux/macOS) Após comprometer um sistema, o adversário localiza e lê o arquivo de histórico do usuário comprometido: ```bash # Verificar todos os arquivos de histórico de usuários no sistema find /home -name ".*history" 2>/dev/null find /root -name ".*history" 2>/dev/null # Ler histórico do usuário atual cat ~/.bash_history cat ~/.zsh_history # Buscar padrões de credenciais no histórico grep -i "password\|passwd\|secret\|token\|key\|api\|auth" ~/.bash_history grep -i "mysql\|psql\|mongo\|redis\|aws\|curl.*-u\|wget.*--user" ~/.bash_history ``` ### 2. Extração em larga escala (múltiplos usuários) Em sistemas Linux com múltiplos usuários (servidores compartilhados, ambientes de desenvolvimento): ```bash # Varredura de histórico de todos os usuários (requer root) for user_dir in /home/*/; do username=$(basename "$user_dir") for hist_file in .bash_history .zsh_history .sh_history; do [ -f "${user_dir}${hist_file}" ] && echo "=== $username ($hist_file) ===" && cat "${user_dir}${hist_file}" done done ``` ### 3. Extração no Windows via PowerShell No Windows, o histórico persistente do PowerShell (gerenciado pelo módulo PSReadLine) é especialmente valioso: ```powershell # Localizar e ler histórico do PowerShell Get-Content (Get-PSReadlineOption).HistorySavePath # Via variável de ambiente Get-Content "$env:APPDATA\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt" # Histórico da sessão atual (volátil - apenas sessão atual) Get-History ``` ### 4. Mecanismo de sincronização do histórico Em sistemas com múltiplas sessões abertas (comum em servidores), o Bash sincroniza o histórico no logout via `PROMPT_COMMAND` ou ao final da sessão. Adversários com sessão ativa podem ler o histórico em memória antes de ser gravado em disco, extraindo comandos recentes não persistidos ainda. ### 5. Kinsing e mineradores de criptomoeda O malware [[s0599-kinsing|Kinsing]], amplamente utilizado em ataques a ambientes Kubernetes e Docker, implementa varredura de histórico de shell como parte de sua rotina de reconhecimento pós-comprometimento. Após infectar um container ou nó, o Kinsing: 1. Lê arquivos `.bash_history` de diretórios home acessíveis 2. Extrai credenciais de acesso a outros serviços do cluster 3. Usa essas credenciais para propagação lateral dentro do ambiente Kubernetes 4. Busca específicamente por tokens de `kubectl`, credenciais de registries Docker e chaves de cloud providers ## Attack Flow ```mermaid graph TB A[Comprometimento Inicial<br/>RCE / CVE / Credencial Vazada] --> B[Estabelecimento de Sessão Shell<br/>SSH / Webshell / Reverse Shell] B --> C[Reconhecimento Local<br/>id / whoami / uname / env] C --> D{Plataforma Detectada} D --> E[Linux / macOS<br/>Bash / Zsh / Fish] D --> F[Windows<br/>PowerShell / PSReadLine] E --> G[Localizar Arquivos de Histórico<br/>find /home -name '.*history'] F --> H[Ler PSReadLine History<br/>ConsoleHost_history.txt] G --> I[Grep por Padrões de Credencial<br/>password / token / secret / key] H --> I I --> J{Credenciais Encontradas?} J -->|Sim| K[Extração e Classificação<br/>DB / Cloud / VPN / API / SSH] J -->|Não| L[Continuar Reconhecimento<br/>Outros vetores T1552.*] K --> M[Exfiltração via C2<br/>HTTP / DNS / ICMP] M --> N[Movimentação Lateral<br/>Uso de credenciais em outros sistemas] N --> O[Escalada de Impacto<br/>Ransomware / Espionagem / Cryptomining] ``` ## Exemplos de Uso ### Kinsing - Kubernetes Cryptomining O [[s0599-kinsing|Kinsing]] é um dos malwares mais documentados em ataques a ambientes de nuvem no Brasil e globalmente. Após explorar APIs Docker ou Kubernetes expostas sem autenticação, o malware executa varredura agressiva do histórico de shell em busca de: - Tokens `kubectl` (`~/.kube/config` e histórico de comandos `kubectl`) - Credenciais AWS (`aws configure`, `export AWS_SECRET_ACCESS_KEY`) - Credenciais de registry Docker (`docker login`) - Senhas de banco de dados em comandos `psql`, `mysql`, `mongo` Em ambientes brasileiros de cloud (AWS São Paulo, GCP São Paulo), foram identificados incidentes onde o Kinsing usou credenciais extraídas do histórico para criar instâncias EC2 adicionais para mineração de Monero, resultando em faturas de cloud de dezenas de milhares de reais. ### Ataques a Servidores de Hospedagem Web Em ambientes de hospedagem compartilhada (cPanel, Plesk) comuns em provedores brasileiros (HostGator, Locaweb, UolHost), comprometimentos via PHP webshell frequentemente resultam em varredura do histórico de shell de múltiplos usuários no mesmo servidor, expondo: - Credenciais de banco de dados MySQL de múltiplos clientes - Senhas FTP e SFTP - Tokens de acesso a APIs de pagamento (PagSeguro, Mercado Pago) ### APTs em Infraestrutura Linux Corporativa Grupos APT como [[g0050-apt32|APT32]] (OceanLotus) documentadamente utilizam varredura de histórico de shell após comprometer servidores Linux de organizações-alvo, especialmente em busca de: - Credenciais de acesso a bancos de dados internos - Tokens de autenticação de APIs internas - Comandos com IPs internos que revelam topologia da rede ## Detecção ### Sigma Rule - Acesso suspeito a arquivos de histórico de shell ```yaml title: Suspicious Access to Shell History Files status: experimental description: > Detecta processos não esperados acessando arquivos de histórico de shell. Indica possível tentativa de extração de credenciais do histórico de comandos. logsource: category: file_access product: linux detection: selection: TargetFilename|endswith: - '/.bash_history' - '/.zsh_history' - '/.sh_history' - '/fish_history' filter_legitimate: Image|contains: - '/bin/bash' - '/bin/zsh' - '/usr/bin/fish' - 'sshd' condition: selection and not filter_legitimate falsepositives: - Ferramentas de backup (rsync, tar) - Scanners de compliance (Lynis, OpenSCAP) - Agentes de segurança EDR level: medium tags: - attack.credential_access - attack.t1552.003 ``` ### Sigma Rule - Grep de padrões de credenciais em histórico ```yaml title: Grep for Credential Patterns in Shell History status: experimental description: > Detecta uso de grep/awk para buscar padrões de credenciais em arquivos de histórico. Alta fidelidade quando o processo pai não é um shell interativo legítimo. logsource: category: process_creation product: linux detection: selection_grep: Image|endswith: - '/grep' - '/awk' - '/strings' selection_target: CommandLine|contains: - '.bash_history' - '.zsh_history' - 'history' selection_keywords: CommandLine|contains: - 'password' - 'passwd' - 'secret' - 'token' - 'api_key' condition: selection_grep and selection_target and selection_keywords level: high tags: - attack.credential_access - attack.t1552.003 ``` ### Sigma Rule - Leitura do histórico PowerShell no Windows ```yaml title: Suspicious Read of PowerShell PSReadLine History status: experimental description: > Detecta acesso ao arquivo de histórico persistente do PowerShell por processos não esperados, indicando possível coleta de credenciais. logsource: category: file_access product: windows detection: selection: TargetFilename|contains: 'PSReadline\ConsoleHost_history.txt' filter_powershell: Image|endswith: - '\powershell.exe' - '\pwsh.exe' condition: selection and not filter_powershell level: high tags: - attack.credential_access - attack.t1552.003 ``` ### Monitoramento Recomendado | Evento | Plataforma | Ferramenta | |--------|-----------|-----------| | Acesso a `~/.bash_history` por processo não-shell | Linux | auditd / EDR | | Criação de cópia de arquivos `.history` | Linux/macOS | inotifywait / FSEvents | | Grep com keywords de credenciais em histórico | Linux | auditd process_creation | | Leitura de `ConsoleHost_history.txt` | Windows | Sysmon Event ID 11 | | Transferência de arquivo após leitura de histórico | Rede | NetFlow / EDR | ## Mitigação | ID | Mitigação | Descrição | |----|-----------|-----------| | M1028 | [[m1028-operating-system-configuration\|M1028 - Operating System Configuration]] | Configurar shells para NÃO registrar comandos com senhas no histórico; usar variáveis prefixadas com espaço (` comando`) em Bash com `HISTCONTROL=ignorespace`; definir `HISTFILESIZE=0` para usuários de serviço | | M1017 | Treinamento de Usuários | Treinar desenvolvedores e sysadmins para NUNCA digitar senhas diretamente na linha de comando; usar gerenciadores de segredos (Vault, AWS Secrets Manager, 1Password CLI) | | M1047 | Auditoria | Auditar regularmente os arquivos de histórico em busca de credenciais expostas; implementar pré-commit hooks para bloquear commits de credenciais | | M1026 | [[m1026-privileged-account-management\|M1026 - Privileged Account Management]] | Restringir permissões de leitura nos arquivos de histórico (`chmod 600 ~/.bash_history`); em servidores multiusuário, impedir acesso cruzado entre diretórios home | ### Hardening de Shell - Configurações Recomendadas **Bash - `/etc/bash.bashrc` ou `~/.bashrc`:** ```bash # Não registrar comandos duplicados consecutivos export HISTCONTROL=ignoredups:ignorespace # Não registrar comandos específicos (comandos com senha) export HISTIGNORE="*password*:*passwd*:*secret*:*token*:*key*" # Limitar tamanho do histórico export HISTSIZE=500 export HISTFILESIZE=1000 # Proteger arquivo de histórico chmod 600 ~/.bash_history ``` **PowerShell - perfil do usuário:** ```powershell # Remover itens com credenciais do histórico antes de sair Set-PSReadLineOption -HistorySaveStyle SaveIncrementally ``` ### Gerenciamento de Segredos - Boas Práticas 1. **HashiCorp Vault** - para credenciais de infraestrutura em ambientes DevOps 2. **AWS Secrets Manager / Azure Key Vault** - para credenciais de cloud 3. **1Password CLI / Bitwarden CLI** - para credenciais pessoais de desenvolvedores 4. **Variáveis de ambiente com `.env`** - nunca commitar, usar `.gitignore` 5. **SSH keys com `ssh-agent`** - nunca digitar senhas SSH na linha de comando ## Contexto Brasil/LATAM A técnica T1552.003 tem relevância operacional significativa no Brasil por alguns fatores estruturais do mercado de tecnologia regional: **Ambientes DevOps com práticas de segurança imaturas:** O ecossistema de startups e fintechs brasileiro, com crescimento acelerado, frequentemente prioriza velocidade de desenvolvimento sobre segurança. É comum encontrar: - Desenvolvedores passando tokens de API do Mercado Pago, PagSeguro ou Pix diretamente na linha de comando em ambientes de staging - Credenciais de banco de dados MySQL de produção em histórico de shells em servidores de empresas de e-commerce - Tokens de API de operadoras (Vivo, Claro, TIM) para envio de SMS em histórico de scripts de deploy **Provedores de hospedagem brasileiros como alvo:** Empresas como Locaweb, HostGator Brasil e UolHost hospedam milhares de sites em servidores compartilhados onde um comprometimento via webshell pode expor históricos de múltiplos clientes. **Ataques a infraestrutura Kubernetes em cloud brasileira:** O [[s0599-kinsing|Kinsing]] e variantes de cryptominers têm sido consistentemente identificados em ambientes AWS (região sa-east-1) e GCP (southamerica-east1) com clusters Kubernetes expostos, frequentemente resultando em uso de credenciais extraídas do histórico para escalar o comprometimento. **Recomendação para equipes de segurança brasileiras:** - Incluir varredura de arquivos `.history` na fase de IR (Incident Response) como procedimento padrão - Implementar DLP para detectar credenciais em logs de auditoria de shell - Treinar times de DevOps para uso de `HISTCONTROL=ignorespace` e gerenciadores de segredos - Revisar configurações de Kubernetes e Docker para impedir acesso sem autenticação às APIs (vetor primário do Kinsing) **Frameworks aplicáveis no Brasil:** - **Resolução BCB nº 4.893/2021** - Política de segurança cibernética para instituições financeiras; exige controles para acesso e gerenciamento de credenciais - **LGPD (Lei 13.709/2018)** - Exposição de credenciais que resultam em acesso a dados pessoais gera obrigação de notificação à ANPD ## Referências - [MITRE ATT&CK - T1552.003 Shell History](https://attack.mitre.org/techniques/T1552/003) - [CISA - Kubernetes Hardening Guidance](https://www.cisa.gov/sites/default/files/publications/k8s-hardening-guidance.pdf) - [Aqua Security - Kinsing Malware Analysis](https://blog.aquasec.com/threat-alert-kinsing-malware-container-vulnerability) - [Microsoft - PSReadLine Security Considerations](https://docs.microsoft.com/en-us/powershell/module/psreadline/) - [Linux Audit - Monitoring Shell History with auditd](https://linux-audit.com/monitor-bash-history-with-auditd/) - [OWASP - Secrets Management Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html) --- **Técnica pai:** [[t1552-unsecured-credentials|T1552 - Unsecured Credentials]] **Tática:** [[ta0006-credential-access|TA0006 - Credential Access]] *Fonte: [MITRE ATT&CK - T1552.003](https://attack.mitre.org/techniques/T1552/003)*