문제

문제

문제

좀 오래된WS_FTP 서버Windows 업데이트 후 직장에서 부팅이 중지되었습니다. 해당 관리자는 오래 전에 사라졌습니다. 내가 가진 유일한 정보는 다음과 같습니다.

  • 파일 구조
  • 사용자 이름
  • 각 사용자에 대한 무염 SHA256 해시

해당 해시 중 하나는 다음과 같습니다.

5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8

에 해당합니다 "password". : 으로 확인할 수 있습니다 echo -n password | sha256sum.

FTP 클라이언트가 어디에 있는지조차 모릅니다. 그 중 일부는 내가 접근할 수 없는 원격 센서입니다. 서버가 중지될 때까지 그들은 계속 데이터를 보내고 있었습니다. 데이터는 기밀이 아니지만 그럼에도 불구하고 우리에게는 중요합니다.

시도

  • 나는 달리기를 시도했다.존 더 리퍼해시에. 30개의 비밀번호 중 4개의 비밀번호를 찾았습니다.

  • 무염 SHA256 해시를 사용하는 Linux FTP 서버를 찾으려고 했습니다. 내 생각엔 너무 안전하지 않아서 어떤 서버도 제안하지 않았어, 적어도 기본적으로는 제안하지 않았어

  • 일부 서버(예:vsftpd) htpasswd에 위임합니다. 하지만 무염 SHA256 해시를 저장하는 방법을 찾지 못했습니다.

질문

htpasswd소금 없이 단 한 라운드만 SHA256을 사용하여 해시를 생성할 수 있습니까 ? 최소값은 8바이트 솔트와 mkpasswd.

해당 해시와 작동하도록 구성할 수 있는 또 다른 Linux FTP 서버가 있습니까?

저는 보안에 별로 관심이 없습니다. 센서로부터 들어오는 연결을 받아들이는 FTP 서버를 설정하고 싶습니다.

답변1

@Broco는 사용을 제안했습니다.pyftpdlib, 내 요구에 완벽하게 작동했습니다!

단계는 다음과 같습니다.

  • Linux 서버 설치
  • 설치하다아나콘다
  • 설치하다pyftpdlib
  • 사용자 이름, 해시 및 폴더가 포함된 json 파일을 만듭니다.
  • SHA256 해시를 비교하는 FTP 서버용 pyftpdlib 스크립트를 만듭니다.
  • 리디렉션포트 21에서 포트 8021로
  • 다음과 같이 실행하세요.시스템 단위권한이 없는 사용자로서
  • 다시 시작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로 전환하겠습니다.

관련 정보