# 22 - Pentesting SSH/SFTP {{#include ../banners/hacktricks-training.md}} ## Basic Information **SSH (Secure Shell or Secure Socket Shell)** एक नेटवर्क प्रोटोकॉल है जो असुरक्षित नेटवर्क पर एक कंप्यूटर से सुरक्षित कनेक्शन सक्षम करता है। यह दूरस्थ सिस्टम तक पहुँचने पर डेटा की गोपनीयता और अखंडता बनाए रखने के लिए आवश्यक है। **डिफ़ॉल्ट पोर्ट:** 22 ``` 22/tcp open ssh syn-ack ``` **SSH सर्वर:** - [openSSH](http://www.openssh.org) – OpenBSD SSH, BSD, Linux वितरणों और Windows 10 से Windows में शिप किया गया - [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) – कम मेमोरी और प्रोसेसर संसाधनों वाले वातावरण के लिए SSH कार्यान्वयन, OpenWrt में शिप किया गया - [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) – Windows के लिए SSH कार्यान्वयन, क्लाइंट सामान्यतः उपयोग किया जाता है लेकिन सर्वर का उपयोग कम होता है - [CopSSH](https://www.itefix.net/copssh) – Windows के लिए OpenSSH का कार्यान्वयन **SSH पुस्तकालय (सर्वर-साइड कार्यान्वयन):** - [libssh](https://www.libssh.org) – SSHv2 प्रोटोकॉल को लागू करने वाला बहु-प्लेटफ़ॉर्म C पुस्तकालय जिसमें [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) और [R](https://github.com/ropensci/ssh) में बाइंडिंग हैं; इसका उपयोग KDE द्वारा sftp के लिए और GitHub द्वारा git SSH अवसंरचना के लिए किया जाता है - [wolfSSH](https://www.wolfssl.com/products/wolfssh/) – ANSI C में लिखा गया SSHv2 सर्वर पुस्तकालय जो एम्बेडेड, RTOS, और संसाधन-सीमित वातावरण के लिए लक्षित है - [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) – Apache SSHD जावा पुस्तकालय Apache MINA पर आधारित है - [paramiko](https://github.com/paramiko/paramiko) – Python SSHv2 प्रोटोकॉल पुस्तकालय ## एन्यूमरेशन ### बैनर ग्रैबिंग ```bash nc -vn 22 ``` ### Automated ssh-audit ssh-audit एक उपकरण है जो ssh सर्वर और क्लाइंट कॉन्फ़िगरेशन ऑडिटिंग के लिए है। [https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit) एक अपडेटेड फोर्क है [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/) **विशेषताएँ:** - SSH1 और SSH2 प्रोटोकॉल सर्वर समर्थन; - SSH क्लाइंट कॉन्फ़िगरेशन का विश्लेषण करें; - बैनर प्राप्त करें, डिवाइस या सॉफ़्टवेयर और ऑपरेटिंग सिस्टम को पहचानें, संकुचन का पता लगाएं; - कुंजी-परिवर्तन, होस्ट-कुंजी, एन्क्रिप्शन और संदेश प्रमाणीकरण कोड एल्गोरिदम एकत्र करें; - एल्गोरिदम जानकारी आउटपुट करें (उपलब्धता से, हटा/अक्षम, असुरक्षित/कमजोर/पुराना, आदि); - एल्गोरिदम सिफारिशें आउटपुट करें (पहचाने गए सॉफ़्टवेयर संस्करण के आधार पर जोड़ें या हटाएं); - सुरक्षा जानकारी आउटपुट करें (संबंधित मुद्दे, असाइन किए गए CVE सूची, आदि); - एल्गोरिदम जानकारी के आधार पर SSH संस्करण संगतता का विश्लेषण करें; - OpenSSH, Dropbear SSH और libssh से ऐतिहासिक जानकारी; - Linux और Windows पर चलता है; - कोई निर्भरताएँ नहीं ```bash usage: ssh-audit.py [-1246pbcnjvlt] -1, --ssh1 force ssh version 1 only -2, --ssh2 force ssh version 2 only -4, --ipv4 enable IPv4 (order of precedence) -6, --ipv6 enable IPv6 (order of precedence) -p, --port= port to connect -b, --batch batch output -c, --client-audit starts a server on port 2222 to audit client software config (use -p to change port; use -t to change timeout) -n, --no-colors disable colors -j, --json JSON output -v, --verbose verbose output -l, --level= minimum output level (info|warn|fail) -t, --timeout= timeout (in seconds) for connection and reading (default: 5) $ python3 ssh-audit ``` [See it in action (Asciinema)](https://asciinema.org/a/96ejZKxpbuupTK9j7h8BdClzp) ### सर्वर की सार्वजनिक SSH कुंजी ```bash ssh-keyscan -t rsa -p ``` ### कमजोर सिफर एल्गोरिदम यह डिफ़ॉल्ट रूप से **nmap** द्वारा खोजा जाता है। लेकिन आप **sslcan** या **sslyze** का भी उपयोग कर सकते हैं। ### Nmap स्क्रिप्ट्स ```bash nmap -p22 -sC # Send default nmap scripts for SSH nmap -p22 -sV # Retrieve version nmap -p22 --script ssh2-enum-algos # Retrieve supported algorythms nmap -p22 --script ssh-hostkey --script-args ssh_hostkey=full # Retrieve weak keys nmap -p22 --script ssh-auth-methods --script-args="ssh.user=root" # Check authentication methods ``` ### Shodan - `ssh` ## Brute force usernames, passwords and private keys ### Username Enumeration कुछ OpenSSH संस्करणों में, आप उपयोगकर्ताओं की गणना करने के लिए एक टाइमिंग अटैक कर सकते हैं। आप इसे शोषण करने के लिए एक मेटास्प्लॉट मॉड्यूल का उपयोग कर सकते हैं: ``` msf> use scanner/ssh/ssh_enumusers ``` ### [Brute force](../generic-hacking/brute-force.md#ssh) कुछ सामान्य ssh क्रेडेंशियल [यहाँ](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt) और [यहाँ](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt) और नीचे। ### Private Key Brute Force यदि आप कुछ ssh प्राइवेट कीज़ जानते हैं जो उपयोग की जा सकती हैं... चलो इसे आजमाते हैं। आप nmap स्क्रिप्ट का उपयोग कर सकते हैं: ``` https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html ``` या MSF सहायक मॉड्यूल: ``` msf> use scanner/ssh/ssh_identify_pubkeys ``` Or use `ssh-keybrute.py` (native python3, lightweight and has legacy algorithms enabled): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute). #### Known badkeys can be found here: {{#ref}} https://github.com/rapid7/ssh-badkeys/tree/master/authorized {{#endref}} #### Weak SSH keys / Debian predictable PRNG कुछ सिस्टम में क्रिप्टोग्राफिक सामग्री उत्पन्न करने के लिए उपयोग किए जाने वाले रैंडम सीड में ज्ञात दोष होते हैं। इससे कीस्पेस में नाटकीय रूप से कमी आ सकती है जिसे ब्रूटफोर्स किया जा सकता है। कमजोर PRNG से प्रभावित डेबियन सिस्टम पर उत्पन्न की गई पूर्व-निर्मित कुंजी सेट यहाँ उपलब्ध हैं: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh). आपको पीड़ित मशीन के लिए वैध कुंजी खोजने के लिए यहाँ देखना चाहिए। ### Kerberos **crackmapexec** `ssh` प्रोटोकॉल का उपयोग करते हुए `--kerberos` विकल्प का उपयोग करके **kerberos के माध्यम से प्रमाणीकरण** कर सकता है।\ अधिक जानकारी के लिए `crackmapexec ssh --help` चलाएँ। ## Default Credentials | **Vendor** | **Usernames** | **Passwords** | | ---------- | ----------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | APC | apc, device | apc | | Brocade | admin | admin123, password, brocade, fibranne | | Cisco | admin, cisco, enable, hsa, pix, pnadmin, ripeop, root, shelladmin | admin, Admin123, default, password, secur4u, cisco, Cisco, \_Cisco, cisco123, C1sco!23, Cisco123, Cisco1234, TANDBERG, change_it, 12345, ipics, pnadmin, diamond, hsadb, c, cc, attack, blender, changeme | | Citrix | root, nsroot, nsmaint, vdiadmin, kvm, cli, admin | C1trix321, nsroot, nsmaint, kaviza, kaviza123, freebsd, public, rootadmin, wanscaler | | D-Link | admin, user | private, admin, user | | Dell | root, user1, admin, vkernel, cli | calvin, 123456, password, vkernel, Stor@ge!, admin | | EMC | admin, root, sysadmin | EMCPMAdm7n, Password#1, Password123#, sysadmin, changeme, emc | | HP/3Com | admin, root, vcx, app, spvar, manage, hpsupport, opc_op | admin, password, hpinvent, iMC123, pvadmin, passw0rd, besgroup, vcx, nice, access, config, 3V@rpar, 3V#rpar, procurve, badg3r5, OpC_op, !manage, !admin | | Huawei | admin, root | 123456, admin, root, Admin123, Admin@storage, Huawei12#$, HwDec@01, hwosta2.0, HuaWei123, fsp200@HW, huawei123 | | IBM | USERID, admin, manager, mqm, db2inst1, db2fenc1, dausr1, db2admin, iadmin, system, device, ufmcli, customer | PASSW0RD, passw0rd, admin, password, Passw8rd, iadmin, apc, 123456, cust0mer | | Juniper | netscreen | netscreen | | NetApp | admin | netapp123 | | Oracle | root, oracle, oravis, applvis, ilom-admin, ilom-operator, nm2user | changeme, ilom-admin, ilom-operator, welcome1, oracle | | VMware | vi-admin, root, hqadmin, vmware, admin | vmware, vmw@re, hqadmin, default | ## SSH-MitM यदि आप स्थानीय नेटवर्क में हैं जैसे कि पीड़ित जो उपयोगकर्ता नाम और पासवर्ड का उपयोग करके SSH सर्वर से कनेक्ट होने जा रहा है, तो आप **उन क्रेडेंशियल्स को चुराने के लिए एक MitM हमला करने की कोशिश कर सकते हैं:** **हमले का मार्ग:** - **ट्रैफ़िक पुनर्निर्देशन:** हमलावर पीड़ित के ट्रैफ़िक को अपनी मशीन पर **हस्तांतरित** करता है, प्रभावी रूप से SSH सर्वर से कनेक्शन प्रयास को **अवरोधित** करता है। - **हस्तक्षेप और लॉगिंग:** हमलावर की मशीन एक **प्रॉक्सी** के रूप में कार्य करती है, उपयोगकर्ता के लॉगिन विवरण को वैध SSH सर्वर होने का नाटक करके **कैप्चर** करती है। - **कमांड निष्पादन और रिले:** अंततः, हमलावर का सर्वर **उपयोगकर्ता के क्रेडेंशियल्स को लॉग करता है**, **कमांड को वास्तविक SSH सर्वर पर अग्रेषित करता है**, **उन्हें निष्पादित करता है**, और **परिणामों को उपयोगकर्ता को वापस भेजता है**, जिससे प्रक्रिया सहज और वैध प्रतीत होती है। [**SSH MITM**](https://github.com/jtesta/ssh-mitm) ठीक वही करता है जो ऊपर वर्णित है। MitM को वास्तविक रूप से कैप्चर करने के लिए आप ARP स्पूफिंग, DNS स्पूफिंग या अन्य तकनीकों का उपयोग कर सकते हैं जो [**Network Spoofing attacks**](../generic-methodologies-and-resources/pentesting-network/index.html#spoofing) में वर्णित हैं। ## SSH-Snake यदि आप सिस्टम पर खोजे गए SSH निजी कुंजियों का उपयोग करके नेटवर्क को पार करना चाहते हैं, प्रत्येक सिस्टम पर प्रत्येक निजी कुंजी का उपयोग करके नए होस्ट के लिए, तो [**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake) वही है जिसकी आपको आवश्यकता है। SSH-Snake निम्नलिखित कार्यों को स्वचालित और पुनरावृत्त रूप से करता है: 1. वर्तमान सिस्टम पर, किसी भी SSH निजी कुंजी को खोजें, 2. वर्तमान सिस्टम पर, किसी भी होस्ट या गंतव्यों (user@host) को खोजें जिन्हें निजी कुंजी स्वीकार की जा सकती हैं, 3. खोजी गई सभी निजी कुंजियों का उपयोग करके सभी गंतव्यों में SSH करने का प्रयास करें, 4. यदि किसी गंतव्य से सफलतापूर्वक कनेक्ट किया गया है, तो जुड़े हुए सिस्टम पर चरण #1 - #4 को दोहराएं। यह पूरी तरह से आत्म-प्रतिकृति और आत्म-प्रसार करने वाला है -- और पूरी तरह से फ़ाइल रहित है। ## Config Misconfigurations ### Root login यह सामान्य है कि SSH सर्वर डिफ़ॉल्ट रूप से रूट उपयोगकर्ता लॉगिन की अनुमति देते हैं, जो एक महत्वपूर्ण सुरक्षा जोखिम प्रस्तुत करता है। **रूट लॉगिन को अक्षम करना** सर्वर को सुरक्षित करने में एक महत्वपूर्ण कदम है। प्रशासनिक विशेषाधिकारों के साथ अनधिकृत पहुंच और ब्रूट फोर्स हमलों को इस परिवर्तन के द्वारा कम किया जा सकता है। **OpenSSH में रूट लॉगिन को अक्षम करने के लिए:** 1. **SSH कॉन्फ़िग फ़ाइल को संपादित करें**: `sudoedit /etc/ssh/sshd_config` 2. **सेटिंग को बदलें**: `#PermitRootLogin yes` से **`PermitRootLogin no`**। 3. **कॉन्फ़िगरेशन को पुनः लोड करें**: `sudo systemctl daemon-reload` 4. **परिवर्तनों को लागू करने के लिए SSH सर्वर को पुनः प्रारंभ करें**: `sudo systemctl restart sshd` ### SFTP Brute Force - [**SFTP Brute Force**](../generic-hacking/brute-force.md#sftp) ### SFTP command execution SFTP सेटअप के साथ एक सामान्य चूक होती है, जहां व्यवस्थापक उपयोगकर्ताओं को फ़ाइलों का आदान-प्रदान करने के लिए सक्षम करना चाहते हैं बिना दूरस्थ शेल पहुंच को सक्षम किए। उपयोगकर्ताओं को गैर-इंटरैक्टिव शेल (जैसे, `/usr/bin/nologin`) के साथ सेट करने और उन्हें एक विशिष्ट निर्देशिका में सीमित करने के बावजूद, एक सुरक्षा छिद्र बना रहता है। **उपयोगकर्ता इन प्रतिबंधों को दरकिनार कर सकते हैं** लॉगिन के तुरंत बाद एक कमांड (जैसे `/bin/bash`) के निष्पादन का अनुरोध करके, इससे पहले कि उनका निर्दिष्ट गैर-इंटरैक्टिव शेल नियंत्रण ले ले। यह अनधिकृत कमांड निष्पादन की अनुमति देता है, जो इच्छित सुरक्षा उपायों को कमजोर करता है। [Example from here](https://community.turgensec.com/ssh-hacking-guide/): ```bash ssh -v noraj@192.168.1.94 id ... Password: debug1: Authentication succeeded (keyboard-interactive). Authenticated to 192.168.1.94 ([192.168.1.94]:22). debug1: channel 0: new [client-session] debug1: Requesting no-more-sessions@openssh.com debug1: Entering interactive session. debug1: pledge: network debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0 debug1: Sending command: id debug1: client_input_channel_req: channel 0 rtype exit-status reply 0 debug1: client_input_channel_req: channel 0 rtype eow@openssh.com reply 0 uid=1000(noraj) gid=100(users) groups=100(users) debug1: channel 0: free: client-session, nchannels 1 Transferred: sent 2412, received 2480 bytes, in 0.1 seconds Bytes per second: sent 43133.4, received 44349.5 debug1: Exit status 0 $ ssh noraj@192.168.1.94 /bin/bash ``` यहाँ उपयोगकर्ता `noraj` के लिए सुरक्षित SFTP कॉन्फ़िगरेशन का एक उदाहरण है (`/etc/ssh/sshd_config` – openSSH): ``` Match User noraj ChrootDirectory %h ForceCommand internal-sftp AllowTcpForwarding no PermitTunnel no X11Forwarding no PermitTTY no ``` यह कॉन्फ़िगरेशन केवल SFTP की अनुमति देगा: स्टार्ट कमांड को मजबूर करके शेल एक्सेस को अक्षम करना और TTY एक्सेस को अक्षम करना, बल्कि सभी प्रकार के पोर्ट फॉरवर्डिंग या टनलिंग को भी अक्षम करना। ### SFTP Tunneling यदि आपके पास SFTP सर्वर तक पहुंच है, तो आप उदाहरण के लिए सामान्य पोर्ट फॉरवर्डिंग का उपयोग करके अपने ट्रैफ़िक को इसके माध्यम से टनल कर सकते हैं: ```bash sudo ssh -L :: -N -f @ ``` ### SFTP Symlink The **sftp** have the command "**symlink**". Therefor, if you have **writable rights** in some folder, you can create **symlinks** of **other folders/files**. As you are probably **trapped** inside a chroot this **won't be specially useful** for you, but, if you can **access** the created **symlink** from a **no-chroot** **service** (for example, if you can access the symlink from the web), you could **open the symlinked files through the web**. For example, to create a **symlink** from a new file **"**_**froot**_**" to "**_**/**_**"**: ```bash sftp> symlink / froot ``` यदि आप "_froot_" फ़ाइल को वेब के माध्यम से एक्सेस कर सकते हैं, तो आप सिस्टम के रूट ("/") फ़ोल्डर को सूचीबद्ध कर सकेंगे। ### प्रमाणीकरण विधियाँ उच्च सुरक्षा वातावरण में केवल कुंजी-आधारित या दो-कारक प्रमाणीकरण को सक्षम करना एक सामान्य प्रथा है, बजाय साधारण कारक पासवर्ड आधारित प्रमाणीकरण के। लेकिन अक्सर मजबूत प्रमाणीकरण विधियाँ सक्षम की जाती हैं बिना कमजोर विधियों को निष्क्रिय किए। एक सामान्य मामला `publickey` को openSSH कॉन्फ़िगरेशन में सक्षम करना और इसे डिफ़ॉल्ट विधि के रूप में सेट करना है लेकिन `password` को निष्क्रिय नहीं करना। इसलिए SSH क्लाइंट के विस्तृत मोड का उपयोग करके, एक हमलावर देख सकता है कि एक कमजोर विधि सक्षम है: ```bash ssh -v 192.168.1.94 OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019 ... debug1: Authentications that can continue: publickey,password,keyboard-interactive ``` उदाहरण के लिए, यदि प्रमाणीकरण विफलता सीमा निर्धारित की गई है और आपको पासवर्ड विधि तक पहुँचने का मौका नहीं मिलता है, तो आप इस विधि का उपयोग करने के लिए `PreferredAuthentications` विकल्प का उपयोग कर सकते हैं। ```bash ssh -v 192.168.1.94 -o PreferredAuthentications=password ... debug1: Next authentication method: password ``` SSH सर्वर कॉन्फ़िगरेशन की समीक्षा करना आवश्यक है कि केवल अपेक्षित विधियाँ अधिकृत हैं। क्लाइंट पर विस्तृत मोड का उपयोग करने से कॉन्फ़िगरेशन की प्रभावशीलता को देखना आसान हो सकता है। ### Config files ```bash ssh_config sshd_config authorized_keys ssh_known_hosts known_hosts id_rsa ``` ## Fuzzing - [https://packetstormsecurity.com/files/download/71252/sshfuzz.txt](https://packetstormsecurity.com/files/download/71252/sshfuzz.txt) - [https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2](https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2) ## References - आप SSH को मजबूत करने के लिए दिलचस्प गाइड [https://www.ssh-audit.com/hardening_guides.html](https://www.ssh-audit.com/hardening_guides.html) पर पा सकते हैं - [https://community.turgensec.com/ssh-hacking-guide](https://community.turgensec.com/ssh-hacking-guide) ## HackTricks Automatic Commands ``` Protocol_Name: SSH Port_Number: 22 Protocol_Description: Secure Shell Hardening Entry_1: Name: Hydra Brute Force Description: Need Username Command: hydra -v -V -u -l {Username} -P {Big_Passwordlist} -t 1 {IP} ssh Entry_2: Name: consolesless mfs enumeration Description: SSH enumeration without the need to run msfconsole Note: sourced from https://github.com/carlospolop/legion Command: msfconsole -q -x 'use auxiliary/scanner/ssh/ssh_version; set RHOSTS {IP}; set RPORT 22; run; exit' && msfconsole -q -x 'use scanner/ssh/ssh_enumusers; set RHOSTS {IP}; set RPORT 22; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ssh/juniper_backdoor; set RHOSTS {IP}; set RPORT 22; run; exit' ``` {{#include ../banners/hacktricks-training.md}}