
방금 완료했어요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
- 표준 입력이 소켓인 경우. 실제로 이는 bash가 호출될 때 주로 발생합니다.
일반적으로 SSH에서
SSH 프로토콜을 통해 명령을 실행하면 명령이 문자열로 연결을 통해 전달됩니다. 문자열은 원격 쉘에 의해 실행됩니다. 을 실행하면 ssh example.com somecommand
원격 사용자의 로그인 셸이 이면 /bin/bash
SSH 서버가 실행됩니다 /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로만 사용자를 제한하는 방법