--- BEGIN tl; dr ---
Assumindo que o seu Pure-FTPd está sendo executado em um host Linux com o glibc 2.7 +:
- Use
MySQLCrypt crypt- sem parênteses -
Execute este one-liner do Python 3 no mesmo sistema em que o Pure-FTPd é executado:
python3 -c 'import sys, crypt, getpass; print(crypt.crypt(getpass.getpass("Password: "), crypt.METHOD_SHA512))' -
Digite a senha desejada.
- Copie e cole a senha criptografada (começando com
$6$) no banco de dados.
--- END tl; dr ---
A idéia por trás do não-texto plano MySQLCrypt é desabilitar todas as senhas em texto plano. O MySQLCrypt crypt() entre parênteses ainda aceitando o hash como uma senha em texto simples sugere que o Pure-FTPd tratou a string crypt() como um método de criptografia desconhecido e ignorou completamente a diretiva, utilizando o método crypt padrão de texto simples. Os logins de texto simples não fragmentados MySQLCrypt crypt “breaking” são na verdade um passo na direção certa: ele desativou o login de texto simples e começou a tratar senhas no banco de dados apenas como criptografia.
Agora, a questão é como transformar corretamente uma senha em um formato aceitável. De acordo com src/mysql.c do Pure-FTPd, MySQLCrypt crypt faria com que ele usasse a função crypt() , cujos formulários aceitáveis depende da implementação . Por exemplo, se você estiver executando o Pure-FTPd em uma máquina Linux com o glibc 2.7 ou superior, há 4 formulários aceitos:
- SHA-512 (começa com
$6$) - SHA-256 (começa com
$5$) - MD5 (começa com
$1$) - DES tradicional (começa com uma letra alfanumérica); provavelmente deve ser evitado embora
Existem algumas maneiras de invocar o sistema crypt() ; Meu método preferido é o módulo crypt do Python 3. Este breve script faria nossos lances:
import sys
from crypt import crypt, METHOD_SHA512
from getpass import getpass
print(crypt(getpass("Password: "), METHOD_SHA512))
Ou se preferir uma linha única de três cliques e copiar e colar:
python3 -c 'import sys, crypt, getpass; print(crypt.crypt(getpass.getpass("Password: "), crypt.METHOD_SHA512))'
Uma amostra de corrida:
root@ip-172-16-16-117:~# python3 -c 'import sys, crypt, getpass; print(crypt.crypt(getpass.getpass("Password: "), crypt.METHOD_SHA512))'
Password:
$6$vTbR62VMHKQNqnEk$TmfeMj/Q6G62RM.hi7liD0IrEvtUp2.jgXbfVRPone/sFTeOwJKftTrrW9j8Hd8.kJsF36OKwP4xHrnURGZTo/
É imperativo que este comando seja executado no mesmo host em que o Pure-FTPd é executado, para usar a mesma implementação crypt() .
A linha longa que começa com $6$ é a senha criptografada. O prefixo $6$ marca a senha como hash usando o SHA-512. Se o sistema crypt() não suportar o SHA-512, a saída não iniciará $6$ ; Nesse caso, outro algoritmo deve ser usado. Por exemplo, no macOS, uma saída possível é $6UCLzI8sPv16 . Observe que ele é excessivamente curto e também não possui o sinal de dólar após $6 : isso ocorre porque a implementação do macOS de crypt() não suporta o SHA-512.