[unix] SFTP는 어떤 방식으로 SSH를 기반으로하지 않습니까?

방금 OverTheWire Bandit 워 게임 레벨 18을 완료 했습니다 .

놀랍습니다. 이 레벨에 대한 지시 사항은 다음과 같습니다.

다음 레벨의 비밀번호는 홈 디렉토리의 파일 readme 에 저장됩니다 . 불행히도 누군가 SSH로 로그인 할 때 로그 아웃 하도록 .bashrc 를 수정했습니다 .

쉘이 소싱을 건너 뛸 수있는 방법을 생각하고 있었다 .bashrc. 그러나 해결책을 찾기 전에 서버와의 SFTP 연결을 시작하는 유혹을 받았습니다. 나는 그것이 작동하기를 기대하지 않았다. 그러나 그렇게했다. 그리고 나는 왜 그런지 알고 싶습니다. SFTP가 SSH를 통해 실행된다고 생각했습니다.

명확히하기 위해 서버에 SSH를 넣으면 예상대로 쫓겨납니다.



답변

일반적으로 bash에서

시작 파일에 대한 Bash의 디자인은 다소 독특합니다. .bashrc두 가지 관련이없는 상황에서 배쉬로드 :

  • 대화 형 쉘인 경우 로그인 쉘인 경우 (및로 호출 된 경우 제외 sh) 이것이 .bash_profile일반적으로로드되는.bashrc 이유 입니다.
  • 배쉬는 경우 없는 대화도 아니고 로그인 쉘도로 호출 sh하여 실행하는 명령어 주어진 있지만 -cSHLVL해제 이하 또는 1 같고, 다음 중 하나에 해당 :

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

      strings /bin/bash | grep SSH_CLIENT
      

일반적으로 SSH

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

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

Subsystem sftp internal-sftp

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

이 도전에

OverTheWire 산적 (18)의 경우 .bashrc가 포함

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

따라서 bash가 대화식이 아닌 원인이되는 작업을 수행하여이 레벨을 해결할 수 있습니다.

알다시피 SFTP가 작동합니다.
그러나 ssh bandit18@bandit.labs.overthewire.org cat readme작동합니다.
그렇습니다 echo 'cat readme' | ssh bandit18@bandit.labs.overthewire.org.
대화 형 로그인 중에 적절한 시간에 Ctrl + C를 누르면 bash가 중단되므로 .bashrc완전히 실행되지 않습니다. Bash는 시작하는 데 거시적 시간이 걸리므로 안정적으로 작동하지 않지만 실제로 수행 할 수 있습니다.


답변

.bashrc당신이 쉘을 시작하는 경우에만 실행됩니다.

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

결론 : OverTheWire Bandit 워 게임이 조정이 아닌 실제로 구성되는 방식 일 가능성이 높습니다. .bashrc그렇지 않으면 동일한 제한 으로 인해 서버 명령이 ssh차단 되기 때문 sftp입니다.


답변

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

관리자는 SSH 대신 SFTP로만 사용자를 제한하는 방법에 설명 된대로 sftp 사용자가 ssh를 실행하지 못하게 할 수 있습니다.


답변