--- 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.