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


9

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

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

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

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

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

ssh  sftp 

1
SFTP는 SSH를 통해 실행됩니다. bash는 SSH를 통해 실행될 수도 있습니다. 그러나 SFTP는 bash를 통해 실행되지 않습니다. (여기서 "over over"을 느슨하게 사용하고 있음)
user253751

답변:


13

일반적으로 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는 시작하는 데 거시적 시간이 걸리므로 안정적으로 작동하지 않지만 실제로 수행 할 수 있습니다.


2
SFTP는 대화식이 아닌 bash 를 전혀 실행하지 않는다고 생각 합니다.
user253751

@immibis 나는 당신이 그것에 대해 맞다고 생각합니다. SFTP를 사용하여 "실제"셸이 아닌 일부 응용 프로그램을 로그인 셸로 구성한 사용자 계정에서 파일을 교환했습니다.
kasperd

@immibis SFTP는 bash를 실행하지 않습니다. 그러나 SFTP 서버가 내부에 있지 않으면를 sshd실행하는 사용자의 로그인 쉘을 실행 sftp-server합니다. 따라서 로그인 쉘이 문자열 /usr/lib/openssh/sftp-server을 "명령 실행"으로 해석하지 않으면 /usr/lib/openssh/sftp-serverSFTP를 사용할 수 없습니다.
Gilles 'SO- 악마 그만

5

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

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

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


2
SFTP를 실행 하면 셸 시작됩니다. SSH 데몬은 사용자의 로그인 쉘이있는 /path/to/shell -c /path/to/sftp-server곳에서 실행됩니다 /path/to/shell. 사용자의 로그인 쉘이 bash이면 .bashrcbash가 컴파일 된 방법에 따라 실행될 수 있습니다. bash가 rshd(예, 비 대화식 쉘의 경우에도 bash 시작이 이상하다) 실행될 때 항상 실행 되며 컴파일 타임 옵션이 이것을으로 확장합니다 sshd.
Gilles 'SO- 악 그만

나는 가서 확인했다. 좋은 추측이지만 실제로는 미묘하지 않습니다. exit에서는 .bashrc떠들썩한 파티가 상호 작용하는 경우에만 실행됩니다.
Gilles 'SO- 악마 그만해

@Gilles이 함께 Subsystem sftp internal-sftp하고 echo No.; exit 1내에서 .bashrc내가 더 얻을 ssh서버에 대한 액세스를하지만 sftp여전히 작동합니다. (물론 .bashrc. 권한 을 덮어 쓰거나 제거 할 수도 있습니다.) ssh대화식 여부에 관계없이 연결 시도가 실패합니다. 반면에 내가 가지고 있으면 Subsystem sftp /usr/lib/openssh/sftp-serverSFTP 서비스도 .bashrc엉망 이되면 실패합니다 .
roaima

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.