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

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

난 방금 끝났어OverTheWire Bandit War 게임, 레벨 18.

이것은 놀라운 일입니다. 아래는 이 레벨에 대한 설명입니다.

다음 레벨의 비밀번호는 파일에 저장됩니다.읽어보기 파일홈 디렉토리에 있습니다. 누가 수정한게 아쉽네요.bashrcSSH를 사용하여 로그인하면 로그아웃됩니다.

쉘이 구매를 건너뛰도록 하는 방법을 생각 중입니다 .bashrc. 하지만 해결책을 찾을 때까지는 단순히 서버에 대한 SFTP 연결을 시작하고 싶은 유혹이 듭니다. 나는 그것이 작동할 것이라고 기대하지 않았습니다. 하지만 그랬습니다. 이유를 알고 싶습니다. SFTP가 SSH를 통해 실행되는 줄 알았는데.

분명히 말하자면, 예상대로 서버에 SSH로 연결하면 서버에서 쫓겨납니다.

답변1

Bash에 대한 일반 정보

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

  • 대화형 쉘일 때, 그렇지 않은 경우로그인 쉘(로 호출되지 않는 한 sh). 그렇기 때문에.bash_profile일반 부하.bashrc.
  • 배쉬가 있을 때아니요Interactive는 로그인 셸도 아니고 as에 대한 호출도 아니지만 sh실행할 명령이 제공되고 -c설정 SHLVL되지 않거나 1보다 작거나 같고 다음 중 하나가 true입니다.

    • 표준 입력이 소켓인 경우. 실제로 이것은 bash가 호출될 때 주로 발생합니다.rshd, 즉 실행 중입니다 rsh remotehost.example.com somecommand.
    • 컴파일 타임에 활성화된 경우(Debian 및 그 파생 제품과 같은 일부 배포판의 경우) SSH_CLIENT환경 변수 중 하나가 정의됩니다. SSH2_CLIENT사실상 이는 sshdInternet Explorer에서 bash를 호출한다는 의미입니다 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 프로토콜을 사용하면 클라이언트가 특정 하위 시스템을 요청할 수 있습니다. 클라이언트가 이 sftp하위 시스템을 요청하면 기본적으로 OpenSSH 서버는 /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만 사용하도록 사용자를 제한하는 방법

관련 정보