FTP-сервер Linux, который может работать с несолеными хэшами SHA256?

Проблема

Некоторые старые WS_FTP-серверы перестали загружаться на работе после обновления Windows. Соответствующего админа давно нет. Единственная информация, которая у меня есть:

  • файловая структура
  • имена пользователей
  • несоленый хэш SHA256 для каждого пользователя

Один из этих хеш-кодов:

5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1511d15 ". Я мог проверить с помощью: echo -n пароль | sha256sum .

Я даже не знаю, где находятся FTP-клиенты. Некоторые из них - удаленные датчики, к которым я не могу получить доступ. Они все еще отправляли данные, пока сервер не остановился. Данные не конфиденциальны, но тем не менее важны для нас.

Попытки

  • Я пытался запустить john the ripper на хэшах. Было найдено 4 пароля из 30.

  • Я попытался найти FTP-сервер Linux, который использует несоленые хэши SHA256. Я думаю, что это слишком небезопасно, поэтому ни один сервер не предлагал его, по крайней мере, не по умолчанию

  • . Некоторые серверы (например, vsftpd ) делегируют htpasswd. Однако я не смог найти способ сохранить несоленый хэш SHA256.

Вопрос

Можно ли создать хеш htpasswd с SHA256, без соли и только за один раунд? Похоже, что минимум составляет 8 байтов и 1000 раундов с mkpasswd .

Есть ли еще один FTP-сервер Linux, который можно настроить для работы с этими хэшами?

Меня это не волнует. Что касается безопасности, я просто хотел бы настроить FTP-сервер, который принимает входящие соединения от датчиков.

0
задан 20 March 2018 в 11:04
1 ответ

@Broco предлагает использовать pyftpdlib , который идеально подходит для моих нужд!

Вот шаги:

  • Установить сервер Linux
  • Установить Anaconda
  • Установить pyftpdlib
  • Создать файл json с именем пользователя, хешем и папкой
  • Создать pyftpdlib для FTP-сервера, который сравнивает хэши SHA256
  • Перенаправить порт 21 на порт 8021
  • Запустить его как модуль systemd как непривилегированный пользователь
  • Перезапустить ftp-сервер автоматически , если файл json изменен.

Вот шаблон для файла json:

{
    "user1": {
        "folder": "users/user1",
        "sha256": "DFB0CE07EDF923F1F40BA56CC9BA9C396B53E3399E3164D60E35050BAA2BE9C9"
    },
    "user2": {
        "folder": "users/user2",
        "sha256": "5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8"
    }
}

Вот сценарий:

#!/opt/anaconda3/bin/python -u
#encoding: UTF-8
import re
import os
import hashlib
import json
from pathlib import Path
from pyftpdlib.authorizers import DummyAuthorizer, AuthenticationFailed
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
from pyftpdlib.filesystems import AbstractedFS

FTP_FOLDER = Path("/media/ftp_data")

with open('input/ftp_users.json') as users_json:
    USERS = json.loads(users_json.read())

current_folder = Path.cwd().resolve()


def login_dump(username, password, success):
    if success:
        subfolder = 'logins'
        attr = 'w'
    else:
        subfolder = 'logins/failed'
        attr = 'a'
    logins_folder = current_folder.joinpath(subfolder)
    logins_folder.mkdir(parents=True, exist_ok=True)
    with open(str(logins_folder.joinpath(username)), attr) as user_file:
        # NOTE: Could write better hash directly, e.g. with `mkpasswd -m sha-512`
        user_file.write(password + "\n")


class SHA256Authorizer(DummyAuthorizer):
    def validate_authentication(self, username, password, handler):
        sha256_hash = hashlib.sha256(password.encode('ascii')).hexdigest().upper()
        try:
            # NOTE: Case sensitive!
            if self.user_table[username]['pwd'] != sha256_hash:
                login_dump(username, password, False)
                raise AuthenticationFailed
        except KeyError:
            login_dump(username, password, False)
            raise AuthenticationFailed
        login_dump(username, password, True)


authorizer = SHA256Authorizer()

for user, params in USERS.items():
    print("Adding user %r" % user)
    folder = FTP_FOLDER.joinpath(params['folder'])
    folder.mkdir(parents=True, exist_ok=True)
    authorizer.add_user(user,
                        params['sha256'].upper(),
                        str(folder),
                        perm="elradfmw",
                        msg_login="Welcome, %s!" % user)
handler = FTPHandler
handler.authorizer = authorizer
handler.banner = "FTP server"


class WindowsOrUnixPathFS(AbstractedFS):
    def ftpnorm(self, ftppath):
        # NOTE: Some old clients still think they talk to a Windows Server
        return super().ftpnorm(ftppath.replace("\\", "/"))


handler.abstracted_fs = WindowsOrUnixPathFS

handler.passive_ports = range(40000, 40500)
# NOTE: Port forwarding is needed because this script shouldn't be run as root.
# See https://serverfault.com/a/238565/442344
server = FTPServer((IP_ADDRESS, 8021), handler)
server.serve_forever()

Сценарий регистрирует пароли в виде обычного текста, что приемлемо, поскольку данные не конфиденциальны. Через несколько месяцев я перейду на vsftpd.

0
ответ дан 5 December 2019 в 06:22

Теги

Похожие вопросы