Bằng cách nào SFTP không dựa trên SSH?


9

Tôi vừa hoàn thành wargame OverTheWire Bandit, cấp 18 .

Đó là một bất ngờ. Dưới đây là hướng dẫn cho cấp độ này.

Mật khẩu cho cấp độ tiếp theo được lưu trữ trong một tập tin readme trong homedirectory. Thật không may, ai đó đã sửa đổi .bashrc để đăng xuất bạn khi bạn đăng nhập bằng SSH.

Tôi đã nghĩ đến một cách để bỏ vỏ tìm nguồn cung ứng .bashrc. Nhưng trước khi tôi tìm ra giải pháp, tôi đã cố gắng bắt đầu kết nối SFTP với máy chủ. Tôi không mong đợi nó hoạt động. Nhưng nó đã làm. Và tôi muốn biết tại sao. Tôi nghĩ SFTP chạy trên SSH.

Để rõ ràng, khi tôi SSH vào máy chủ, tôi bị đuổi ra, như mong đợi.

ssh  sftp 

1
SFTP không chạy qua SSH. Bash cũng có thể chạy trên SSH. Nhưng SFTP không chạy qua bash. (lưu ý rằng tôi đang sử dụng "chạy qua" một cách lỏng lẻo ở đây)
user253751

Câu trả lời:


13

Bash nói chung

Thiết kế của Bash đối với các tệp khởi động khá đặc biệt. Bash tải .bashrctrong hai trường hợp không liên quan:

  • Khi đó là vỏ tương tác, ngoại trừ khi đó là vỏ đăng nhập (và ngoại trừ khi nó được gọi là sh). Đây là lý do tại sao .bash_profilethường tải.bashrc .
  • Khi bash không tương tác cũng không phải là vỏ đăng nhập cũng không được gọi như shnhưng được đưa ra một lệnh để thực thi -cSHLVLkhông được đặt hoặc nhỏ hơn hoặc bằng 1, và một trong những điều sau đây là đúng:

    • Nếu đầu vào tiêu chuẩn là một ổ cắm. Trong thực tế, điều này chủ yếu xảy ra khi bash được gọi bởi rshd, tức là khi chạy rsh remotehost.example.com somecommand.
    • Nếu được kích hoạt tại thời gian biên dịch (đó là trường hợp của một số bản phân phối, chẳng hạn như Debian và các dẫn xuất), nếu một trong các biến môi trường SSH_CLIENThoặc SSH2_CLIENTđược xác định. Trong thực tế, điều này có nghĩa là bash được gọi bởi sshd, tức là ssh remotehost.example.com somecommand.
      Nếu bạn không biết bash được biên dịch như thế nào, bạn có thể tìm hiểu xem tùy chọn này có được đặt hay không bằng cách kiểm tra xem nhị phân có chứa chuỗi hay không SSH_CLIENT:

      strings /bin/bash | grep SSH_CLIENT
      

Trên SSH nói chung

Khi bạn thực thi một lệnh thông qua giao thức SSH, lệnh được truyền qua dây dưới dạng một chuỗi. Chuỗi được thực hiện bởi shell từ xa. Khi bạn chạy ssh example.com somecommand, nếu vỏ đăng nhập của người dùng từ xa là /bin/bash, máy chủ SSH sẽ chạy /bin/bash -c somecommand. Không có cách nào để bỏ qua vỏ đăng nhập. Điều này cho phép các shell đăng nhập bị hạn chế, ví dụ chỉ cho phép sao chép tệp và không thực thi lệnh chung.

Có một ngoại lệ: giao thức SSH cho phép khách hàng yêu cầu một hệ thống con cụ thể. Nếu máy khách yêu cầu sftphệ thống con, thì theo mặc định, máy chủ OpenSSH gọi chương trình /usr/lib/openssh/sftp-server(vị trí có thể thay đổi) thông qua vỏ đăng nhập của người dùng. Nhưng nó cũng có thể được cấu hình để chạy một máy chủ SFTP nội bộ thông qua dòng

Subsystem sftp internal-sftp

trong sshd_configtập tin Trong trường hợp máy chủ SFTP nội bộ và chỉ trong trường hợp này, vỏ đăng nhập của người dùng bị bỏ qua.

Đối với thử thách này

Trong trường hợp của OverTheWire Bandit 18, .bashrccó chứa

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

Vì vậy, bạn có thể giải quyết cấp độ này bằng cách làm bất cứ điều gì khiến bash không tương tác.

Như bạn đã khám phá, SFTP hoạt động.
Nhưng ssh bandit18@bandit.labs.overthewire.org cat readmecũng sẽ làm việc.
Như sẽ echo 'cat readme' | ssh bandit18@bandit.labs.overthewire.org.
Và nhấn Ctrl + C vào đúng thời điểm trong quá trình đăng nhập tương tác cũng sẽ hoạt động: nó sẽ làm gián đoạn bash, do đó .bashrcsẽ không được thực thi hoàn toàn. Bash mất thời gian vĩ mô để khởi động, vì vậy trong khi điều này không hoạt động đáng tin cậy, nó có thể được thực hiện trong thực tế.


2
Tôi không nghĩ rằng SFTP chạy bash ở tất cả , không chỉ không tương tác.
dùng253751

@immibis Tôi tin bạn đúng về điều đó. Tôi đã sử dụng SFTP để trao đổi các tệp trên tài khoản người dùng được cấu hình với một số ứng dụng làm vỏ đăng nhập thay vì vỏ "thực".
kasperd

@immibis SFTP không chạy bash. Nhưng trừ khi máy chủ SFTP là nội bộ, hãy sshdchạy shell đăng nhập của người dùng sftp-server. Do đó, nếu shell đăng nhập không diễn giải được chuỗi /usr/lib/openssh/sftp-servernhư là chạy lệnh Lệnh /usr/lib/openssh/sftp-server, bạn không thể sử dụng SFTP.
Gilles 'SO- ngừng trở nên xấu xa'

5

Điều .bashrcnày chỉ được thực hiện khi bạn bắt đầu một shell.

Máy chủ SSH có thể được cấu hình để không khởi động hệ vỏ cho giao thức SFTP bằng cách cung cấp lệnh Subsystem internal-sftptrong sshd_configtệp của máy chủ .

Phỏng đoán: có khả năng đây là cách mà wargame OverTheWire Bandit thực sự được cấu hình thay vì điều chỉnh .bashrcvì nếu không thì hạn chế tương tự sshcũng sẽ chặn sftplệnh máy chủ.


2
Chạy SFTP sẽ bắt đầu một shell. Trình nền SSH chạy /path/to/shell -c /path/to/sftp-serverở đâu /path/to/shelllà vỏ đăng nhập của người dùng. Nếu shell đăng nhập của người dùng là bash, thì .bashrccó thể được thực thi tùy thuộc vào cách bash được biên dịch. Nó luôn được thực thi khi bash được thực thi bởi rshd(vâng, ngay cả đối với shell không tương tác, bash startup rất lạ) và tùy chọn biên dịch thời gian mở rộng này sshd.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi đã đi và kiểm tra. Đoán tốt, nhưng trên thực tế nó không quá tinh tế. Các exittại .bashrcchỉ thực hiện nếu bash là tương tác.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles, với Subsystem sftp internal-sftpecho No.; exit 1trong tôi .bashrckhông có sshquyền truy cập vào máy chủ nhưng sftpvẫn hoạt động. (Và sau đó tất nhiên có khả năng ghi đè hoặc xóa .bashrc. Quyền mặc dù.) sshNỗ lực kết nối không thành công cho dù có tương tác hay không. Mặt khác, nếu tôi có Subsystem sftp /usr/lib/openssh/sftp-serverthì dịch vụ SFTP cũng bị lỗi khi .bashrcbị sai lệch.
roaima

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.