Hoje recebi minha fatura mensal do meu provedor de internet e algo me pareceu estranho.
A fatura, contida no e-mail, estava em um arquivo ZIP com senha.
Sem falar o quão estranho foi receber um anexo em formato ZIP nos dias de hoje (spam, malware, phishing, etc.), a senha que escolheram me pareceu muito fraca.
É a data de nascimento do titular da conta no formato YYMMDD.
Fiz um cálculo bem grosseiro de cabeça enquanto estava na academia e deu um número bem pequeno de combinações possíveis. Depois de usar uma ferramenta online para calcular quantos dias se passaram (já que nem todas as combinações resultariam em uma data válida) desde 1900-01-01, descobri que as combinações são apenas 44.075 (até 2020-09-14).
Sabendo que ferramentas otimizadas que usam o poder da GPU para quebrar hashes conseguem fazer tentativas na casa dos milhões por segundo, eu quis ver quão rápido a senha poderia ser descoberta sem usá-las, usando apenas a CLI do Linux/macOS (já que só tinha acesso a uma VPS enquanto estava na academia).
Cheguei ao seguinte código, que funciona no macOS:
echo {1..44000} | xargs -P 16 -n 1 -I{} date -v "-{}d" +"%y%m%d" | xargs -P 16 -I{} sh -c 'unzip -qqoP "{}" 0417160508.zip && echo "{}" && exit 255'
O comando é bem simples em seu funcionamento, mesmo parecendo complicado.
echo {1..44000} gera os números de 1 a 44.000 e os repassa para a próxima etapa.
xargs -P 16 -n 1 -I{} date -v "-{}d" +"%y%m%d" – pega a entrada da primeira etapa e gera datas no formato YYMMDD, aproveitando a funcionalidade do date de “aumentar” uma data com uma quantidade específica. Nesse caso, seria subtrair X dias da data atual, onde X é o número gerado na primeira etapa. Dessa forma, conseguimos gerar datas de hoje até os anos 1900.
A terceira etapa é a mais interessante, então vou dividi-la em duas partes:
xargs -P 16 -I{} sh -c '...'
Isso pega as datas geradas na etapa 2 e executa um comando em cada uma dessas datas. -P 16 aqui significa que isso vai rodar em 16 processos paralelos, para tornar a varredura dos dados mais rápida. O mesmo truque é aplicado na etapa 2 para acelerar a geração das datas.
A segunda parte é onde as tentativas acontecem:
unzip -qqoP "{}" 0417160508.zip && echo "{}" && exit 255
O que isso faz é primeiro tentar descompactar o arquivo zip usando a senha gerada na etapa 2. Se for bem-sucedido, ele imprime (echo) a senha descoberta e então exit 255 força o xargs a parar de rodar. Não queremos continuar tentando senhas se a correta já foi encontrada.
No fim das contas, foi uma decisão bem ruim escolher isso como senha do arquivo, porque rodar o comando acima leva apenas cerca de 10 segundos para descobrir a senha correta da minha fatura. Não muito mais para qualquer outra pessoa.