किस तरह से SSH पर आधारित SFTP नहीं है?


9

मैंने अभी-अभी ओवरएवर बैंडिट वॉरगेम, लेवल 18 पूरा किया है ।

यह एक आश्चर्य था। इस स्तर के लिए निर्देश यहां दिए गए हैं।

अगले स्तर के लिए पासवर्ड एक फ़ाइल में संग्रहीत किया जाता है रीडमी homedirectory में। दुर्भाग्य से, किसी ने SSH के साथ लॉग इन करने पर आपको लॉग आउट करने के लिए .bashrc को संशोधित किया है ।

मैं एक तरीका सोच रहा था कि शेल को सोर्स करना छोड़ दें .bashrc। लेकिन इससे पहले कि मुझे कोई उपाय पता चले, मैं सर्वर के साथ बस एक SFTP कनेक्शन शुरू करने के लिए परीक्षा में शामिल हो गया। मुझे उम्मीद नहीं थी कि यह काम करेगा। लेकिन यह किया है। और मैं जानना चाहूंगा कि क्यों। मुझे लगा कि एसएफटीपी एसएसएच से अधिक है।

स्पष्टता के लिए, जब मैं सर्वर में एसएसएच करता हूं, तो मुझे उम्मीद के मुताबिक किक आउट हो जाता है।

ssh  sftp 

1
एसएफटीपी एसएसएच से अधिक चलता है। bash SSH के ऊपर भी चल सकता है। लेकिन SFTP बैश पर नहीं चलता है। (ध्यान दें कि मैं "रन ओवर" का प्रयोग यहां कर रहा हूं)
user253751

जवाबों:


13

सामान्य तौर पर बैश पर

स्टार्टअप फाइलों के संबंध में बैश का डिजाइन अजीबोगरीब है। .bashrcदो असंबंधित परिस्थितियों में बैश लोड :

  • जब यह एक इंटरेक्टिव शेल होता है, तो सिवाय इसके कि यह एक लॉगिन शेल (और इसके अलावा जब इसे छोड़ दिया जाए sh)। यही कारण है कि .bash_profileआम तौर पर लोड होता है.bashrc
  • जब बैश इंटरैक्टिव नहीं है और न ही एक लॉगिन शेल है और न ही इनवोक किया गया है, shलेकिन इसके साथ निष्पादित करने के लिए एक कमांड दिया गया है -cऔर SHLVL1 के बराबर या कम या इसके बराबर है, और निम्न में से एक सत्य है:

    • यदि मानक इनपुट एक सॉकेट है। व्यवहार में, यह ज्यादातर तब होता है जब बैश द्वारा आह्वान किया जाता है rshd, अर्थात दौड़ते समय rsh remotehost.example.com somecommand
    • यदि संकलित समय पर सक्रिय किया जाता है (जो कुछ वितरणों पर मामला है, जैसे कि डेबियन और डेरिवेटिव), यदि पर्यावरण चर में SSH_CLIENTसे SSH2_CLIENTएक या परिभाषित किया गया है। व्यवहार में, इसका मतलब है कि बैश द्वारा sshd, अर्थात ssh remotehost.example.com somecommand
      यदि आप नहीं जानते कि कैसे बैश संकलित किया गया था, तो आप यह पता लगा सकते हैं कि क्या यह विकल्प यह जाँच कर सेट किया गया था कि क्या बाइनरी में स्ट्रिंग है SSH_CLIENT:

      strings /bin/bash | grep SSH_CLIENT
      

सामान्य तौर पर एसएसएच पर

जब आप SSH प्रोटोकॉल के माध्यम से एक कमांड निष्पादित करते हैं, तो कमांड को तार के रूप में तार पर पार किया जाता है। स्ट्रिंग को दूरस्थ शेल द्वारा निष्पादित किया जाता है। जब आप चलाते हैं ssh example.com somecommand, यदि दूरस्थ उपयोगकर्ता का लॉगिन शेल है /bin/bash, तो SSH सर्वर चलता है /bin/bash -c somecommand। लॉगिन शेल को बायपास करने का कोई तरीका नहीं है। यह प्रतिबंधित लॉगिन गोले को अनुमति देता है , उदाहरण के लिए केवल फाइल कॉपी और सामान्य कमांड निष्पादन की अनुमति देने के लिए ।

एक अपवाद है: एसएसएच प्रोटोकॉल क्लाइंट को एक विशिष्ट सबसिस्टम का अनुरोध करने की अनुमति देता है। यदि क्लाइंट sftpसबसिस्टम का अनुरोध करता है , तो डिफ़ॉल्ट रूप से ओपनएसएसएच सर्वर /usr/lib/openssh/sftp-serverउपयोगकर्ता के लॉगिन शेल के माध्यम से प्रोग्राम (स्थान भिन्न हो सकता है) को आमंत्रित करता है । लेकिन यह लाइन के माध्यम से एक आंतरिक SFTP सर्वर चलाने के लिए भी कॉन्फ़िगर किया जा सकता है

Subsystem sftp internal-sftp

में sshd_configफ़ाइल। आंतरिक एसएफटीपी सर्वर के मामले में, और केवल इस मामले में, उपयोगकर्ता के लॉगिन शेल को बायपास किया जाता है।

इस चुनौती के लिए

ओवरएवरवायर बैंडिट 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काम भी करेगा।
जैसा होगा echo 'cat readme' | ssh bandit18@bandit.labs.overthewire.org
और एक इंटरेक्टिव लॉगिन के दौरान सही समय पर Ctrl + C दबाने से भी काम होगा: यह बैश को बाधित करेगा, इसलिए .bashrcइसे पूरी तरह से निष्पादित नहीं किया जाएगा। बैश को शुरू करने के लिए मैक्रोस्कोपिक समय लगता है, इसलिए जब यह मज़बूती से काम नहीं करता है, तो यह अभ्यास में किया जा सकता है।


2
मुझे नहीं लगता कि एसएफटीपी केवल गैर-अंतःक्रियात्मक रूप से, सभी पर बैश चलाता है ।
user253751

@ मिनीबिस मुझे विश्वास है कि आप इसके बारे में सही हैं। मैंने एक उपयोगकर्ता खाते पर फ़ाइलों का आदान-प्रदान करने के लिए SFTP का उपयोग किया है जो "वास्तविक" शेल के बजाय लॉगिन शेल के रूप में कुछ एप्लिकेशन के साथ कॉन्फ़िगर किया गया था।
कास्परड

@immibis SFTP बैश नहीं चलता है। लेकिन जब तक SFTP सर्वर आंतरिक नहीं होता, तब तक sshdउपयोगकर्ता का लॉगिन शेल चलाता है sftp-server। इसलिए, यदि लॉगिन शेल स्ट्रिंग /usr/lib/openssh/sftp-serverको "कमांड रन" के रूप में व्याख्या नहीं करता है /usr/lib/openssh/sftp-server, तो आप SFTP का उपयोग नहीं कर सकते।
गिल्स एसओ- बुराई को रोकें '

5

.bashrcकेवल निष्पादित किया जाता है जब आप एक खोल शुरू करते हैं।

SSH सर्वर Subsystem internal-sftpको सर्वर की sshd_configफाइल में कमांड प्रदान करके SFTP प्रोटोकॉल के लिए एक शेल शुरू नहीं करने के लिए कॉन्फ़िगर किया जा सकता है ।

अनुमान: यह संभावना है कि यह है कि OverTheWire Bandit wargame वास्तव में एक समायोजन के बजाय कॉन्फ़िगर किया गया है .bashrcक्योंकि अन्यथा सर्वर प्रतिबंध sshभी sftpकमांड को ब्लॉक करेगा ।


2
रनिंग SFTP करता है एक खोल शुरू करते हैं। SSH डेमॉन चलता है /path/to/shell -c /path/to/sftp-serverजहां /path/to/shellउपयोगकर्ता का लॉगिन शेल है। यदि उपयोगकर्ता का लॉगिन शेल बैश है, तो .bashrcबैश कैसे संकलित किया गया , इसके आधार पर निष्पादित किया जा सकता है। यह हमेशा निष्पादित होता है जब बैश द्वारा निष्पादित किया जाता है rshd(हां, यहां तक ​​कि एक गैर-इंटरैक्टिव शेल के लिए, बैश स्टार्टअप अजीब है) और एक संकलन-समय विकल्प इसके लिए विस्तारित होता है sshd
गिल्स एसओ-

मैंने जाकर जाँच की। अच्छा अनुमान है, लेकिन वास्तव में यह इतना सूक्ष्म नहीं है। exitमें .bashrcकेवल निष्पादित करता है, तो पार्टी इंटरैक्टिव है।
गिल्स एसओ- बुराई को रोकें '

@ गिल्स, मेरे साथ Subsystem sftp internal-sftpऔर echo No.; exit 1मेरे पास सर्वर तक पहुँच .bashrcनहीं sshहै, लेकिन फिर sftpभी काम करता है। (और फिर निश्चित रूप से यह संभव है कि इसे अधिलेखित या हटा दिया जाए .bashrc। अनुमतियाँ अनुमतियाँ।) sshकनेक्शन का प्रयास विफल हो जाता है कि इंटरैक्टिव है या नहीं। दूसरी ओर, अगर मेरे पास है Subsystem sftp /usr/lib/openssh/sftp-serverतो एसएफटीपी सेवा भी फेल होने पर विफल हो जाती .bashrcहै।
रोज़ा

4

sftp उसी क्रेडेंशियल्स का उपयोग करता है, लेकिन रिमोट मशीन पर इंटरेक्टिव शेल नहीं चलाता है।

एक प्रशासक एक sftp उपयोगकर्ता को ssh चलाने से रोक सकता है, उदाहरण के लिए, SSH के बजाय केवल SFTP में उपयोगकर्ताओं को कैसे प्रतिबंधित करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.