SFTP는 어떤 면에서 SSH를 기반으로 하지 않습니까?

SFTP는 어떤 면에서 SSH를 기반으로 하지 않습니까?

방금 완료했어요OverTheWire Bandit 전쟁 게임, 레벨 18.

그것은 놀라운 일이었습니다. 이 레벨에 대한 지침은 다음과 같습니다.

다음 레벨의 비밀번호는 파일에 저장됩니다.읽어보기홈디렉토리에 있습니다. 안타깝게도 누군가 수정했습니다..bashrcSSH로 로그인하면 로그아웃됩니다.

나는 쉘 스킵 소싱을 갖는 방법을 생각하고 있었습니다 .bashrc. 하지만 해결책을 찾기 전에 단순히 서버와 SFTP 연결을 시작하고 싶은 유혹에 빠졌습니다. 나는 그것이 작동할 것이라고 기대하지 않았습니다. 하지만 그랬습니다. 그리고 그 이유를 알고 싶습니다. SFTP는 SSH를 통해 실행된다고 생각했습니다.

명확하게 말하면 서버에 SSH로 접속하면 예상대로 쫓겨납니다.

답변1

일반적으로 bash에서

시작 파일과 관련된 Bash의 디자인은 다소 독특합니다. Bash는 .bashrc관련되지 않은 두 가지 상황에서 로드됩니다.

  • 대화형 쉘일 때(단,로그인 쉘(로 호출되는 경우는 제외 sh). 이는 이유.bash_profile일반적으로 부하.bashrc.
  • 배쉬가 있을 때~ 아니다대화형도 아니고 로그인 셸도 아니고 호출되지도 않았지만 sh실행할 명령이 주어지고 -c설정 SHLVL되지 않거나 1보다 작거나 같으며 다음 중 하나가 참입니다.

    • 표준 입력이 소켓인 경우. 실제로 이는 bash가 호출될 때 주로 발생합니다.rshd, 즉 실행 중일 때 rsh remotehost.example.com somecommand.
    • 컴파일 타임에 활성화된 경우(Debian 및 파생 제품과 같은 일부 배포판의 경우) 환경 변수 중 하나가 SSH_CLIENT정의 SSH2_CLIENT된 경우. 실제로 이는 bash가 sshd, 즉 에 의해 호출됨을 의미합니다 ssh remotehost.example.com somecommand.
      Bash가 어떻게 컴파일되었는지 모르는 경우 바이너리에 다음 문자열이 포함되어 있는지 확인하여 이 옵션이 설정되었는지 확인할 수 있습니다 SSH_CLIENT.

      strings /bin/bash | grep SSH_CLIENT
      

일반적으로 SSH에서

SSH 프로토콜을 통해 명령을 실행하면 명령이 문자열로 연결을 통해 전달됩니다. 문자열은 원격 쉘에 의해 실행됩니다. 을 실행하면 ssh example.com somecommand원격 사용자의 로그인 셸이 이면 /bin/bashSSH 서버가 실행됩니다 /bin/bash -c somecommand. 로그인 셸을 우회할 수 있는 방법은 없습니다. 이는 제한된 로그인 쉘을 허용합니다. 예를 들어파일 복사만 허용일반 명령 실행이 아닙니다.

한 가지 예외가 있습니다. SSH 프로토콜을 사용하면 클라이언트가 특정 하위 시스템을 요청할 수 있습니다. 클라이언트가 하위 시스템을 요청하면 기본적으로 OpenSSH 서버는 사용자의 로그인 셸을 통해 sftp프로그램(위치는 다를 수 있음)을 호출합니다 . /usr/lib/openssh/sftp-server그러나 회선을 통해 내부 SFTP 서버를 실행하도록 구성할 수도 있습니다.

Subsystem sftp internal-sftp

파일 에서 sshd_config. 내부 SFTP 서버의 경우, 이 경우에만 사용자의 로그인 셸이 우회됩니다.

이 도전을 위해

OverTheWire Bandit 18의 경우 .bashrc,


# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
echo 'Byebye !'
exit 0

따라서 bash가 대화형이 되지 않도록 하는 모든 작업을 수행하여 이 수준을 해결할 수 있습니다.

발견한 대로 SFTP가 작동합니다.
그러나 또한 작동할 것입니다. 처럼 . 그리고 대화형 로그인 중에 적절한 시점에 Ctrl+C를 눌러도 작동합니다. 그러면 bash가 중단되어 완전히 실행되지 않습니다. Bash는 시작하는 데 거시적인 시간이 걸리므로 안정적으로 작동하지는 않지만 실제로는 수행할 수 있습니다. ssh [email protected] cat readme
echo 'cat readme' | ssh [email protected]
.bashrc

답변2

.bashrc쉘을 시작할 때만 실행됩니다 .

Subsystem internal-sftp서버 파일에 명령을 제공하여 SFTP 프로토콜에 대한 셸을 시작하지 않도록 SSH 서버를 구성할 수 있습니다 sshd_config.

추측: 이것이 조정이 아니라 OverTheWire Bandit 전쟁 게임이 실제로 구성되는 방식일 가능성이 높습니다. .bashrc그렇지 않으면 동일한 제한이 서버 명령 ssh도 차단할 것이기 때문입니다 sftp.

답변3

sftp는 동일한 자격 증명을 사용하지만 원격 시스템에서 대화형 셸을 실행하지 않습니다.

관리자는 sftp 사용자가 ssh를 실행하는 것을 방지할 수 있습니다(예: 다음 설명 참조).SSH 대신 SFTP로만 사용자를 제한하는 방법

관련 정보