Pure-ftpd com o MySQL - Crypt () não me registrando com senhas com hash

1

Estou usando o pure-ftpd com o mysql para usuários de autenticação.

Aqui está o meu mysql.conf

MYSQLServer     localhost
MYSQLPort       3306
MYSQLSocket     /var/run/mysqld/mysqld.sock
MYSQLUser       user
MYSQLPassword   pwd
MYSQLDatabase   my_db
MYSQLCrypt      crypt()
MYSQLGetPW      SELECT password FROM ftp_users WHERE login="\L"
MYSQLGetUID     SELECT u_id FROM ftp_users WHERE login="\L"
MYSQLGetGID     SELECT g_id FROM ftp_users WHERE login="\L"
MYSQLGetDir     SELECT dir FROM ftp_users WHERE login="\L"
MySQLGetQTAFS   SELECT quota_files FROM ftp_users WHERE login="\L"
MySQLGetQTASZ  SELECT quota_size FROM ftp_users WHERE login="\L"
MySQLGetRatioUL SELECT ul_ratio FROM ftp_users WHERE login="\L"
MySQLGetRatioDL SELECT dl_ratio FROM ftp_users WHERE login="\L"
MySQLGetBandwidthUL SELECT ul_bandwidth FROM ftp_users WHERE login="\L"
MySQLGetBandwidthDL SELECT dl_bandwidth FROM ftp_users WHERE login="\L"

Eu então tentei reiniciar o pure-ftpd-mysql e o pure-ftpd

Minha tabela tem um campo com o pwd como

password    varchar(255)

Quando insiro um usuário com um texto simples pwd, posso fazer login com login e senha. Quando eu insiro um hash com 'lol' como SHA512 ou um hash BCrypt. Não me permite entrar com o pwd 'lol'.

BCrypt $2a$06$JrvxpMAvi6MnRSIvZQMMxOffIDLtEP7lrKNe0k0CTsK51v4zujfpS
SHA512 3DD28C5A23F780659D83DD99981E2DCB82BD4C4BDC8D97A7DA50AE84C7A7229A6DC0AE8AE4748640A4CC07CCC2D55DBDC023A99B3EF72BC6CE49E30B84253DAE

No entanto, se eu colar o hash, ele efetua login com êxito, pois suponho que ele seja usado como um valor de texto simples.

Eu tentei mudar o mysql.conf para

MYSQLCrypt      crypt

Mas isso quebra completamente. Existem muitos sites que dizem usar crypt, mas os comentários na minha lista de arquivos de configuração crypt () como uma das opções.

Eu li muitos posts e fóruns, mas a coisa mais próxima que eu encontrei foi essa, que não funciona de forma alguma.

link

Aqui está o que o pure-ftpd começa com

Starting ftp server: Running: /usr/sbin/pure-ftpd-mysql -l mysql:/etc/pure-ftpd/db/mysql.conf -l puredb:/etc/pure-ftpd/pureftpd.pdb -l puredb:/etc/pure-ftpd/pureftpd.pdb -E -F /etc/pure-ftpd/fortunes.txt -j -H -J ALL:!aNULL:!SSLv3 -u 1000 -8 UTF-8 -A -O clf:/var/log/pure-ftpd/transfer.log -B

Então, basicamente, não está usando criptografia ou não estou usando corretamente. Eu pensei que poderia lidar com SHA512 nativamente com o mysql, mas isso não acontece. Outras coisas que eu posso pensar é que eu preciso de código com a configuração, mas não consigo ver por que isso exigiria qualquer coisa.

    
por ServerSideSkittles 12.03.2017 / 02:08

1 resposta

3

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

    
por 20.03.2017 / 21:44