
Gerador de palpites de senhas baseado em Gramática Livre de Contexto Probabilística (PCFG)
PCFG = Gramática Livre de Contexto Probabilística
PCFG = Guessador Difuso Muito Legal
Resumindo: Uma coleção de ferramentas para realizar pesquisas sobre como os humanos geram senhas. Elas podem ser usadas para quebrar hashes de senhas, mas também para criar senhas sintéticas (honeywords) ou ajudar a desenvolver melhores algoritmos de força de senha.
Trainer: 4.4
Guesser: 4.6
PRINCE_LING: 4.3
Password_Scorer: 4.4
Sphinx é usado para criar dinamicamente um Guia do Desenvolvedor baseado em docstrings no código. Para compilar o Guia do Desenvolvedor, consulte as instruções em /doc/INSTRUCTIONS.rst
Um PDF do Guia do Desenvolvedor pré-compilado também pode ser encontrado em /doc/build/latex/pcfgdevelopersguide.pdf. Nota: não vou reconstruir este guia entre versões principais para manter o histórico do git mais limpo. Ou seja, cometer PDFs fica muito bagunçado rapidamente. Isso significa que o guia pré-compilado pode estar um pouco desatualizado; portanto, se você estiver usando-o para ajudar a escrever/modificar código, é recomendável compilar o guia você mesmo em vez de usar o pré-compilado.
Este projeto usa aprendizado de máquina para identificar hábitos de criação de senhas dos usuários. Um modelo PCFG é gerado treinando em uma lista de senhas em texto simples/reveladas. No contexto deste projeto, o modelo é chamado de ruleset e contém muitas partes diferentes das senhas identificadas durante o treinamento, juntamente com suas probabilidades associadas. Essa derivação pode ser útil para outras ferramentas de cracking, como PRINCE, e/ou partes do ruleset podem ser diretamente incorporadas em ataques de dicionário mais tradicionais. Este projeto também inclui um gerador de guesses PCFG que utiliza este ruleset para gerar palpites de senha em ordem de probabilidade. Isso é muito mais poderoso do que ataques de dicionário padrão e, em testes, provou ser capaz de quebrar senhas com significativamente menos palpites do que outros métodos publicamente disponíveis. A desvantagem é que gerar palpites em ordem de probabilidade é lento, criando em média 50-100k palpites por segundo, enquanto algoritmos baseados em GPU podem criar milhões a bilhões (e mais) de palpites por segundo contra algoritmos de hash rápidos. Portanto, o guesser PCFG é melhor usado contra grandes números de hashes com salt, ou outros algoritmos de hash lentos, onde o custo de desempenho do algoritmo é compensado pela precisão dos palpites.
pip3 install chardetO ruleset padrão incluído neste repositório foi criado treinando em um subconjunto de 1 milhão de senhas do conjunto de dados RockYou. Melhor desempenho pode ser alcançado treinando no conjunto completo de 32 milhões de senhas do RockYou, mas isso foi excluído para manter o tamanho do download pequeno. Você pode usar o ruleset padrão para começar a gerar senhas sem precisar treinar em uma nova lista, mas é recomendado treinar em um conjunto alvo de senhas que possa estar mais próximo do que você está tentando atacar. Se você criar seu próprio ruleset, aqui está um guia rápido:
python3 trainer.py -t INPUT_PASSWORD_LIST -r NEW_RULESETpython3 trainer.py -t INPUT_PASSWORD_LIST -r NEW_RULESET -c 0.6
b. --save_sensitive: Se especificado, dados sensíveis como endereços de e-mail e sites completos descobertos durante o treinamento serão salvos no ruleset. Embora o gerador de guesses PCFG atualmente não utilize esses dados, eles são muito valiosos durante um ataque real de cracking de senhas. Isso está desligado por padrão para facilitar o uso desta ferramenta em um ambiente acadêmico. Observe que, mesmo quando desligado, quase certamente ainda haverá dados de PII salvos dentro de um ruleset, então proteja os rulesets gerados adequadamente. Exemplo: python3 trainer.py -t INPUT_PASSWORD_LIST -r NEW_RULESET --save_sensitive
c. --comments: Adiciona um comentário ao arquivo de configuração do ruleset. Isso é útil para saber por que e como você gerou seu ruleset ao revisá-lo posteriormente. Inclua o comentário que deseja adicionar entre aspas.Isso gera palpites para stdout usando um ruleset PCFG previamente treinado. Esses palpites podem então ser canalizados para qualquer programa que você queira usar. Se nenhum ruleset for especificado, o ruleset padrão DEFAULT será usado. Para os fins deste guia, assumiremos que o ruleset usado é NEW_RULESET.
python3 pcfg_guesser.py -r NEW_RULESET -s SESSION_NAMEpython3 pcfg_guesser.py -r NEW_RULESET -s SESSION_NAME --loadExistem muitos casos em que você pode querer estimar a probabilidade de uma senha ser gerada por um ruleset previamente treinado. Por exemplo, isso pode fazer parte de uma métrica de força de senha ou ser usado para outros fins de pesquisa. Um programa de exemplo foi incluído para realizar isso.
python3 password_scorer -r NEW_RULESET -i INPUT_LISTNome: N-Gramas Indexados por Idioma PRINCE (Prince-Ling)
Visão Geral: Constrói listas de palavras personalizadas com base em um ruleset/gramática PCFG já treinado para uso em ataques de combinação estilo PRINCE. A ideia por trás disso é que, como o treinador PCFG já está dividindo um conjunto de treinamento de senhas em análises individuais, essas informações poderiam ser aproveitadas para fazer listas de palavras direcionadas para outros ataques.
Mecânica Básica: Nos bastidores, a ferramenta Prince-Ling é basicamente um mini-gerador de guesses PCFG. Ela remove a geração de guesses Markov e substitui as estruturas base usadas em ataques PCFG normais por uma estrutura base significativamente reduzida, adaptada para gerar listas de palavras PRINCE. Isso permite gerar palavras de dicionário em ordem de probabilidade com um olho em quão úteis essas palavras devem ser em um ataque PRINCE.
Usando Prince-Ling
python3 prince-ling.py -r NOME_DO_RULESET -t TAMANHO_DA_LISTA_DE_PALAVRAS_A_CRIAR -o NOME_DO_ARQUIVO_DE_SAIDApython3 pcfg_guesser -r NEW_RULESET -s SESSION_NAME | ./john --stdin --format=bcrypt PASSWORDS_TO_CRACK.txt
Se você notar algum bug ou se tiver um recurso que gostaria de ver adicionado, por favor, abra uma issue nesta página do github. Também aceito pull requests, embora idealmente, por favor, vincule um pull request a uma issue para que eu possa revisá-lo mais facilmente, fazer perguntas e entender melhor as alterações que você está fazendo.
Há muitas melhorias que podem ser feitas na modelagem de estratégias de criação de senhas usando PCFGs. Estou muito aberto a novas ideias, alterações e sugestões. Só porque o código atualmente faz algo de uma certa maneira não significa que essa seja a melhor opção. Por exemplo, a estrutura base fundamental da abordagem atual em que as máscaras são geradas para strings alfanuméricas, dígitos, outros, etc., foi escolhida porque era a opção "mais fácil" de implementar. Minha equipe debateu muito que uma opção melhor poderia ser começar com uma palavra base e depois modelar regras de manipulação mais tradicionais aplicadas a ela como transições no PCFG. Então, fique à vontade para explorar este código!