# 22 - Pentesting SSH/SFTP
Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)! Altri modi per supportare HackTricks: * Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)! * Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com) * Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT**](https://opensea.io/collection/the-peass-family) esclusivi * **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Condividi i tuoi trucchi di hacking inviando PR ai repository** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github.
Se sei interessato a una **carriera nell'hacking** e vuoi hackerare l'impossibile - **stiamo assumendo!** (_richiesta competenza fluente in polacco, scritta e parlata_). {% embed url="https://www.stmcyber.com/careers" %} ## Informazioni di base **SSH (Secure Shell o Secure Socket Shell)** è un protocollo di rete che consente una connessione sicura a un computer su una rete non sicura. È essenziale per mantenere la riservatezza e l'integrità dei dati durante l'accesso a sistemi remoti. **Porta predefinita:** 22 ``` 22/tcp open ssh syn-ack ``` **Server SSH:** * [openSSH](http://www.openssh.org) - OpenBSD SSH, incluso nelle distribuzioni BSD, Linux e Windows a partire da Windows 10 * [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) - Implementazione SSH per ambienti con risorse di memoria e processore limitate, incluso in OpenWrt * [PuTTY](https://www.chiark.greenend.org.uk/\~sgtatham/putty/) - Implementazione SSH per Windows, il client è comunemente utilizzato ma l'uso del server è più raro * [CopSSH](https://www.itefix.net/copssh) - Implementazione di OpenSSH per Windows **Librerie SSH (implementazione lato server):** * [libssh](https://www.libssh.org) - Libreria C multipiattaforma che implementa il protocollo SSHv2 con binding in [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) e [R](https://github.com/ropensci/ssh); viene utilizzata da KDE per sftp e da GitHub per l'infrastruttura SSH di git * [wolfSSH](https://www.wolfssl.com/products/wolfssh/) - Libreria server SSHv2 scritta in ANSI C e destinata a ambienti embedded, RTOS e con risorse limitate * [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) - La libreria Java Apache SSHD si basa su Apache MINA * [paramiko](https://github.com/paramiko/paramiko) - Libreria Python per il protocollo SSHv2 ## Enumerazione ### Banner Grabbing ```bash nc -vn 22 ``` ### Audit automatico di ssh-audit ssh-audit è uno strumento per l'audit della configurazione del server e del client ssh. [https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit) è un fork aggiornato di [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/) **Caratteristiche:** * Supporto per i protocolli server SSH1 e SSH2; * Analisi della configurazione del client SSH; * Recupero del banner, riconoscimento del dispositivo o del software e del sistema operativo, rilevamento della compressione; * Raccolta degli algoritmi di scambio chiave, chiave host, crittografia e codice di autenticazione dei messaggi; * Informazioni sugli algoritmi di output (disponibili da quando, rimossi/disabilitati, insicuri/deboli/obsoleti, ecc.); * Raccomandazioni sugli algoritmi di output (aggiungi o rimuovi in base alla versione del software riconosciuta); * Informazioni sulla sicurezza di output (problemi correlati, elenco CVE assegnato, ecc.); * Analisi della compatibilità della versione SSH basata sulle informazioni degli algoritmi; * Informazioni storiche da OpenSSH, Dropbear SSH e libssh; * Esegue su Linux e Windows; * Nessuna dipendenza. ```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 ``` ### Chiave pubblica SSH del server ```plaintext ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDZz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6Xz6 ```bash ssh-keyscan -t rsa -p ``` ### Algoritmi di cifratura deboli Questo viene scoperto di default da **nmap**. Ma è anche possibile utilizzare **sslcan** o **sslyze**. ### Script di 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` ## Forza bruta per nomi utente, password e chiavi private ### Enumerazione dei nomi utente In alcune versioni di OpenSSH è possibile effettuare un attacco temporizzato per enumerare gli utenti. È possibile utilizzare un modulo di metasploit per sfruttare questa vulnerabilità: ``` msf> use scanner/ssh/ssh_enumusers ``` ### [Forza bruta](../generic-methodologies-and-resources/brute-force.md#ssh) Alcune credenziali ssh comuni [qui](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt) e [qui](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt) e di seguito. ### Forza bruta con chiave privata Se conosci alcune chiavi private ssh che potrebbero essere utilizzate... proviamole. Puoi utilizzare lo script nmap: ``` https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html ``` O il modulo ausiliario MSF: ``` msf> use scanner/ssh/ssh_identify_pubkeys ``` Oppure utilizza `ssh-keybrute.py` (python3 nativo, leggero e con algoritmi legacy abilitati): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute). #### Qui puoi trovare chiavi compromesse: {% embed url="https://github.com/rapid7/ssh-badkeys/tree/master/authorized" %} #### Chiavi SSH deboli / PRNG prevedibile di Debian Alcuni sistemi presentano difetti noti nel seme casuale utilizzato per generare materiale crittografico. Ciò può comportare una riduzione drastica dello spazio delle chiavi che può essere forzato. Sono disponibili set di chiavi pregenerate generate su sistemi Debian affetti da PRNG debole qui: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh). Dovresti cercare qui per cercare chiavi valide per la macchina vittima. ### Kerberos **crackmapexec** utilizzando il protocollo `ssh` può utilizzare l'opzione `--kerberos` per **autenticarsi tramite Kerberos**.\ Per ulteriori informazioni esegui `crackmapexec ssh --help`. ## Credenziali predefinite | **Produttore** | **Nomi utente** | **Password** | | -------------- | ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 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 Se ti trovi nella stessa rete locale della vittima che si connetterà al server SSH utilizzando nome utente e password, potresti provare a **effettuare un attacco MitM per rubare queste credenziali**: **Percorso dell'attacco:** * **Redirezione del traffico:** L'attaccante **devia** il traffico della vittima verso la propria macchina, intercettando così il tentativo di connessione al server SSH. * **Intercezione e registrazione:** La macchina dell'attaccante agisce come un **proxy**, **catturando** i dettagli di accesso dell'utente fingendo di essere il legittimo server SSH. * **Esecuzione dei comandi e trasmissione:** Infine, il server dell'attaccante **registra le credenziali dell'utente**, **inoltra i comandi** al vero server SSH, li **esegue** e **invia i risultati** all'utente, rendendo il processo apparentemente fluido e legittimo. [**SSH MITM**](https://github.com/jtesta/ssh-mitm) fa esattamente ciò che è descritto sopra. Per effettuare effettivamente il MitM puoi utilizzare tecniche come ARP spoofing, DNS spoofing o altre descritte nelle [**attività di spoofing di rete**](../generic-methodologies-and-resources/pentesting-network/#spoofing). ## SSH-Snake Se desideri attraversare una rete utilizzando chiavi private SSH scoperte sui sistemi, utilizzando ogni chiave privata su ogni sistema per nuovi host, allora [**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake) è ciò di cui hai bisogno. SSH-Snake esegue automaticamente e in modo ricorsivo i seguenti compiti: 1. Sul sistema corrente, trova eventuali chiavi private SSH, 2. Sul sistema corrente, trova eventuali host o destinazioni (utente@host) in cui le chiavi private possono essere accettate, 3. Prova a connettersi tramite SSH a tutte le destinazioni utilizzando tutte le chiavi private scoperte, 4. Se viene stabilita una connessione con una destinazione, ripeti i passaggi #1 - #4 sul sistema connesso. È completamente autosufficiente e si replica autonomamente, ed è completamente senza file. ## Configurazioni errate della configurazione ### Accesso root È comune che i server SSH consentano l'accesso dell'utente root per impostazione predefinita, il che rappresenta un rischio significativo per la sicurezza. **Disabilitare l'accesso root** è un passaggio critico per proteggere il server. L'accesso non autorizzato con privilegi amministrativi e gli attacchi di forza bruta possono essere mitigati apportando questa modifica. **Per disabilitare l'accesso root in OpenSSH:** 1. **Modifica il file di configurazione SSH** con: `sudoedit /etc/ssh/sshd_config` 2. **Cambia l'impostazione** da `#PermitRootLogin yes` a **`PermitRootLogin no`**. 3. **Ricarica la configurazione** utilizzando: `sudo systemctl daemon-reload` 4. **Riavvia il server SSH** per applicare le modifiche: `sudo systemctl restart sshd` ### Forza bruta SFTP * [**Forza bruta SFTP**](../generic-methodologies-and-resources/brute-force.md#sftp) ### Esecuzione di comandi SFTP Si verifica spesso una svista comune nelle configurazioni SFTP, in cui gli amministratori intendono consentire agli utenti di scambiare file senza abilitare l'accesso alla shell remota. Nonostante vengano impostati utenti con shell non interattive (ad esempio, `/usr/bin/nologin`) e vengano confinati in una directory specifica, rimane una falla di sicurezza. **Gli utenti possono aggirare queste restrizioni** richiedendo l'esecuzione di un comando (come `/bin/bash`) immediatamente dopo l'accesso, prima che la shell non interattiva designata prenda il controllo. Ciò consente l'esecuzione non autorizzata di comandi, compromettendo le misure di sicurezza previste. [Esempio da qui](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 ``` Ecco un esempio di configurazione sicura SFTP (`/etc/ssh/sshd_config` - openSSH) per l'utente `noraj`: ```plaintext # Impostazioni per SFTP Subsystem sftp internal-sftp Match User noraj ChrootDirectory /home/noraj ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no PasswordAuthentication yes PermitTunnel no AllowAgentForwarding no PermitTTY no PermitRootLogin no PubkeyAuthentication yes AuthorizedKeysFile /home/noraj/.ssh/authorized_keys ``` Assicurati di sostituire `noraj` con il nome utente corretto e di impostare il percorso corretto per `ChrootDirectory` e `AuthorizedKeysFile`. ``` Match User noraj ChrootDirectory %h ForceCommand internal-sftp AllowTcpForwarding no PermitTunnel no X11Forwarding no PermitTTY no ``` Questa configurazione permetterà solo SFTP: disabilitando l'accesso alla shell forzando il comando di avvio e disabilitando l'accesso TTY, ma anche disabilitando ogni tipo di port forwarding o tunneling. ### Tunneling SFTP Se hai accesso a un server SFTP, puoi anche instradare il tuo traffico attraverso questo, ad esempio utilizzando il comune port forwarding: ```bash sudo ssh -L :: -N -f @ ``` ### SFTP Symlink Lo **sftp** ha il comando "**symlink**". Pertanto, se hai i **diritti di scrittura** in una determinata cartella, puoi creare **symlink** di **altre cartelle/file**. Poiché probabilmente sei **intrappolato** all'interno di un chroot, questo **non sarà particolarmente utile** per te, ma se puoi **accedere** al **symlink** creato da un **servizio senza chroot** (ad esempio, se puoi accedere al symlink dal web), potresti **aprire i file symlinkati tramite il web**. Ad esempio, per creare un **symlink** da un nuovo file **"**_**froot**_**" a "**_**/**_**"**: ```bash sftp> symlink / froot ``` Se puoi accedere al file "_froot_" tramite web, sarai in grado di elencare la cartella root ("/") del sistema. ### Metodi di autenticazione In ambienti ad alta sicurezza è pratica comune abilitare solo l'autenticazione basata su chiave o a due fattori anziché l'autenticazione semplice basata su password. Tuttavia, spesso i metodi di autenticazione più sicuri vengono abilitati senza disabilitare quelli più deboli. Un caso frequente è abilitare `publickey` nella configurazione di openSSH e impostarlo come metodo predefinito, ma senza disabilitare `password`. Quindi, utilizzando la modalità dettagliata del client SSH, un attaccante può vedere che è abilitato un metodo più debole: ```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 ``` Ad esempio, se è impostato un limite di fallimento dell'autenticazione e non hai mai la possibilità di raggiungere il metodo della password, puoi utilizzare l'opzione `PreferredAuthentications` per forzare l'utilizzo di questo metodo. ```bash ssh -v 192.168.1.94 -o PreferredAuthentications=password ... debug1: Next authentication method: password ``` È necessario esaminare la configurazione del server SSH per verificare che siano autorizzati solo i metodi previsti. L'utilizzo della modalità dettagliata sul client può aiutare a valutare l'efficacia della configurazione. ### File di configurazione ```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 * Puoi trovare guide interessanti su come rendere più sicuro SSH in [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) Se sei interessato a una **carriera di hacking** e a violare l'invulnerabile - **stiamo assumendo!** (_richiesta competenza fluente nella lingua polacca, sia scritta che parlata_). {% embed url="https://www.stmcyber.com/careers" %} ## Comandi Automatici HackTricks ``` 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' ```
Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)! Altri modi per supportare HackTricks: * Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)! * Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com) * Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT**](https://opensea.io/collection/the-peass-family) esclusivi * **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Condividi i tuoi trucchi di hacking inviando PR ai repository github di** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).