SFTP ใช้ SSH ไม่ได้ในทางใด


9

ฉันได้เพียงเสร็จOverTheWire โจร wargame ระดับ 18

นั่นเป็นเรื่องน่าประหลาดใจ นี่คือคำแนะนำสำหรับระดับนี้

รหัสผ่านสำหรับระดับถัดไปจะถูกเก็บไว้ในไฟล์readmeในโฮมไดเรกทอรี น่าเสียดายที่มีบางคนได้แก้ไข. bashrcเพื่อให้คุณออกจากระบบเมื่อคุณเข้าสู่ระบบด้วย SSH

.bashrcผมคิดว่าวิธีการที่จะมีเปลือกข้ามจัดหา แต่ก่อนที่ฉันจะค้นพบวิธีแก้ปัญหาฉันถูกล่อลวงให้เริ่มต้นการเชื่อมต่อ SFTP กับเซิร์ฟเวอร์ ฉันไม่ได้คาดหวังให้มันทำงาน แต่มันก็ทำ และฉันอยากจะรู้ว่าทำไม ฉันคิดว่า SFTP ทำงานมากกว่า SSH

เพื่อความชัดเจนเมื่อฉัน SSH เข้าสู่เซิร์ฟเวอร์ฉันจะถูกไล่ออกตามที่คาดไว้

ssh  sftp 

1
SFTP ทำงานมากกว่า SSH bash สามารถวิ่งผ่าน SSH ได้ แต่ SFTP ไม่ได้ใช้งานมากกว่าการทุบตี (โปรดทราบว่าฉันใช้ "หมด" ที่นี่อย่างหลวม ๆ )
user253751

คำตอบ:


13

เมื่อทุบตีทั่วไป

การออกแบบของทุบตีเกี่ยวกับไฟล์เริ่มต้นค่อนข้างแปลก โหลดทุบตี.bashrcในสองสถานการณ์ที่ไม่เกี่ยวข้อง:

  • เมื่อเป็นเชลล์เชิงโต้ตอบยกเว้นเมื่อเป็นเชลล์ล็อกอิน (และยกเว้นเมื่อถูกเรียกเป็นsh) นี่คือเหตุผลที่มักจะโหลด.bash_profile.bashrc
  • เมื่อ bash ไม่ใช่แบบโต้ตอบหรือเชลล์ล็อกอินหรือเรียกใช้shแต่ให้คำสั่งดำเนินการ-cและSHLVLไม่ได้ตั้งค่าหรือน้อยกว่าหรือเท่ากับ 1 และหนึ่งในสิ่งต่อไปนี้เป็นจริง:

    • หากอินพุตมาตรฐานเป็นซ็อกเก็ต ในทางปฏิบัตินี้ส่วนใหญ่เกิดขึ้นเมื่อทุบตีถูกเรียกโดยคือเมื่อทำงานrshdrsh remotehost.example.com somecommand
    • หากเปิดใช้งานในเวลารวบรวม (ซึ่งเป็นกรณีของการแจกแจงบางอย่างเช่น Debian และอนุพันธ์) หากหนึ่งในตัวแปรสภาพแวดล้อมSSH_CLIENTหรือSSH2_CLIENTมีการกำหนดไว้ ในทางปฏิบัติที่นี้หมายถึงว่าทุบตีถูกเรียกโดยคือsshd หากคุณไม่ทราบวิธีการคอมไพล์ bash คุณสามารถค้นหาว่าตัวเลือกนี้ถูกตั้งค่าโดยการตรวจสอบว่าไบนารีมีสตริงหรือไม่:ssh remotehost.example.com somecommand
      SSH_CLIENT

      strings /bin/bash | grep SSH_CLIENT
      

บน SSH โดยทั่วไป

เมื่อคุณรันคำสั่งผ่านโปรโตคอล SSH คำสั่งจะถูกส่งผ่าน wire เป็นสตริง สตริงจะดำเนินการโดยเปลือกระยะไกล เมื่อคุณเรียกใช้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 Bandit 18 .bashrcมี

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

ดังนั้นคุณสามารถแก้ปัญหาในระดับนี้ได้โดยการทำอะไรก็ตามที่ทำให้ทุบตีไม่ให้มีปฏิสัมพันธ์

ในขณะที่คุณค้นพบ SFTP ทำงาน
แต่ssh bandit18@bandit.labs.overthewire.org cat readmeก็ยังใช้ได้ ตามที่จะ
และการกด Ctrl + C ในเวลาที่เหมาะสมในระหว่างการเข้าสู่ระบบแบบโต้ตอบก็จะใช้ได้เช่นกัน: มันจะขัดจังหวะการทุบตีดังนั้นจึงไม่สามารถดำเนินการได้อย่างสมบูรณ์ Bash ใช้เวลาในการเริ่มต้นด้วยกล้องจุลทรรศน์ดังนั้นในขณะที่วิธีนี้ใช้ไม่ได้ผลก็สามารถทำได้ในทางปฏิบัติ echo 'cat readme' | ssh bandit18@bandit.labs.overthewire.org
.bashrc


2
ฉันไม่คิดว่า SFTP วิ่งทุบตีที่ทุกคนไม่เพียง แต่ไม่ใช่การโต้ตอบ
user253751

@ กลไกผมเชื่อว่าคุณถูกต้องเกี่ยวกับเรื่องนี้ ฉันได้ใช้ SFTP เพื่อแลกเปลี่ยนไฟล์ในบัญชีผู้ใช้ซึ่งได้รับการกำหนดค่าด้วยแอปพลิเคชันบางอย่างเป็นเชลล์ล็อกอินแทนที่จะเป็นเชลล์ "ของจริง"
kasperd

@immibis SFTP ไม่ทำงานทุบตี แต่ถ้าเซิร์ฟเวอร์ SFTP เป็นแบบภายในให้sshdรันเชลล์ล็อกอินของผู้ใช้ที่รันsftp-serverอยู่ ดังนั้นหากเปลือกเข้าสู่ระบบไม่ได้แปลสตริง/usr/lib/openssh/sftp-serverเป็น "เรียกใช้คำสั่ง /usr/lib/openssh/sftp-server" คุณไม่สามารถใช้ SFTP
Gilles 'ดังนั้นหยุดความชั่วร้าย'

5

.bashrcจะถูกดำเนินการเฉพาะเมื่อคุณเริ่มเปลือก

เซิร์ฟเวอร์ SSH สามารถกำหนดค่าไม่ให้เริ่มเชลล์สำหรับโปรโตคอล SFTP โดยการให้คำสั่ง Subsystem internal-sftpในsshd_configไฟล์เซิร์ฟเวอร์

การคาดเดา: เป็นไปได้ว่านี่เป็นวิธีที่ wargame OverTheWire Bandit ได้รับการกำหนดค่าจริง ๆ แทนที่จะปรับเป็น.bashrcเพราะมิฉะนั้นข้อ จำกัด เดียวกันสำหรับsshยังจะบล็อกsftpคำสั่งเซิร์ฟเวอร์


2
การรัน SFTP จะเริ่มเชลล์ SSH daemon รัน/path/to/shell -c /path/to/sftp-serverโดยที่/path/to/shellเป็นเชลล์ล็อกอินของผู้ใช้ หากเชลล์ล็อกอินของผู้ใช้ทุบตี.bashrcอาจถูกดำเนินการขึ้นอยู่กับวิธีการรวบรวมทุบตี มันดำเนินการเสมอเมื่อทุบตีจะถูกดำเนินการโดยrshd(ใช่แม้สำหรับเปลือกไม่โต้ตอบการเริ่มต้นทุบตีเป็นลาง) sshdและเป็นตัวเลือกที่รวบรวมเวลานี้เพื่อขยาย
Gilles 'หยุดชั่วร้าย'

ฉันไปและตรวจสอบ ดีเดา แต่ในความเป็นจริงมันไม่ได้ลึกซึ้ง exitใน.bashrcจะถูกดำเนินการเฉพาะในกรณีที่มีการโต้ตอบทุบตี
Gilles 'SO- หยุดความชั่วร้าย'

@Gilles กับSubsystem sftp internal-sftpและecho No.; exit 1ในของ.bashrcฉันฉันไม่sshสามารถเข้าถึงเซิร์ฟเวอร์ แต่sftpก็ยังใช้งานได้ (และแน่นอนว่าอาจเป็นไปได้ที่จะเขียนทับหรือลบ.bashrcสิทธิ์การใช้งานอย่างไรก็ตามsshความพยายามในการเชื่อมต่อล้มเหลวไม่ว่าจะเป็นแบบโต้ตอบหรือไม่ก็ตาม ในทางตรงกันข้ามถ้าฉันมีSubsystem sftp /usr/lib/openssh/sftp-serverแล้วบริการ SFTP ก็ล้มเหลวเมื่อ.bashrcมีการพันกัน
roaima

4

sftp ใช้ข้อมูลประจำตัวเดียวกัน แต่ไม่เรียกใช้เชลล์แบบโต้ตอบบนเครื่องระยะไกล

ผู้ดูแลระบบสามารถป้องกันผู้ใช้ sftp ไม่ให้รัน ssh ได้ดังที่อธิบายไว้ในวิธีการ จำกัด ผู้ใช้ไปยัง SFTP เท่านั้นแทน SSH

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.