# 22 - Pentesting SSH/SFTP
Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)! Autres moyens de soutenir HackTricks : * Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)! * Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com) * Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs * **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.** * **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
Si vous êtes intéressé par une **carrière dans le piratage** et par pirater l'inpiratable - **nous recrutons !** (_polonais courant écrit et parlé requis_). {% embed url="https://www.stmcyber.com/careers" %} ## Informations de base **SSH ou Secure Shell ou Secure Socket Shell,** est un protocole réseau qui offre aux utilisateurs un **moyen sécurisé d'accéder à un ordinateur sur un réseau non sécurisé.** **Port par défaut :** 22 ``` 22/tcp open ssh syn-ack ``` **Serveurs SSH :** * [openSSH](http://www.openssh.org) – OpenBSD SSH, inclus dans BSD, les distributions Linux et Windows depuis Windows 10 * [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) – Implémentation SSH pour les environnements avec peu de mémoire et de ressources processeur, inclus dans OpenWrt * [PuTTY](https://www.chiark.greenend.org.uk/\~sgtatham/putty/) – Implémentation SSH pour Windows, le client est couramment utilisé mais l'utilisation du serveur est plus rare * [CopSSH](https://www.itefix.net/copssh) – implémentation d'OpenSSH pour Windows **Bibliothèques SSH (implémentant le côté serveur) :** * [libssh](https://www.libssh.org) – bibliothèque C multiplateforme implémentant le protocole SSHv2 avec des bindings en [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) et [R](https://github.com/ropensci/ssh) ; elle est utilisée par KDE pour sftp et par GitHub pour l'infrastructure SSH git * [wolfSSH](https://www.wolfssl.com/products/wolfssh/) – bibliothèque serveur SSHv2 écrite en C ANSI et destinée aux environnements embarqués, RTOS et à ressources limitées * [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) – la bibliothèque java Apache SSHD est basée sur Apache MINA * [paramiko](https://github.com/paramiko/paramiko) – bibliothèque de protocole SSHv2 pour Python ## Énumération ### Récupération de bannière ```bash nc -vn 22 ``` ### Audit automatique avec ssh-audit ssh-audit est un outil d'audit de configuration pour les serveurs et clients SSH. [https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit) est un fork mis à jour de [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/) **Fonctionnalités :** * Support des serveurs protocole SSH1 et SSH2 ; * analyser la configuration du client SSH ; * récupérer la bannière, reconnaître le dispositif ou le logiciel et le système d'exploitation, détecter la compression ; * collecter les algorithmes d'échange de clés, de clé hôte, de chiffrement et de code d'authentification de message ; * afficher les informations sur les algorithmes (disponible depuis, retiré/désactivé, non sécurisé/faible/ancien, etc) ; * afficher les recommandations d'algorithmes (ajouter ou retirer en fonction de la version du logiciel reconnue) ; * afficher les informations de sécurité (problèmes liés, liste de CVE attribués, etc) ; * analyser la compatibilité de la version SSH en fonction des informations sur les algorithmes ; * informations historiques provenant d'OpenSSH, Dropbear SSH et libssh ; * fonctionne sous Linux et Windows ; * aucune dépendance ```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 ``` [Regardez-le en action (Asciinema)](https://asciinema.org/a/96ejZKxpbuupTK9j7h8BdClzp) ### Clé publique SSH du serveur ```bash ssh-keyscan -t rsa -p ``` ### Algorithmes de chiffrement faibles Cela est découvert par défaut par **nmap**. Mais vous pouvez également utiliser **sslcan** ou **sslyze**. ### Scripts 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` ## Force brute des noms d'utilisateur, des mots de passe et des clés privées ### Énumération des noms d'utilisateur Dans certaines versions d'OpenSSH, vous pouvez réaliser une attaque par timing pour énumérer les utilisateurs. Vous pouvez utiliser un module metasploit afin d'exploiter ceci : ``` msf> use scanner/ssh/ssh_enumusers ``` ### [Brute force](../generic-methodologies-and-resources/brute-force.md#ssh) Des identifiants ssh courants [ici](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt) et [là](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt) et ci-dessous. ### Brute Force de Clé Privée Si vous connaissez des clés privées ssh qui pourraient être utilisées... essayons-les. Vous pouvez utiliser le script nmap : ``` https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html ``` Ou le module auxiliaire MSF : ``` msf> use scanner/ssh/ssh_identify_pubkeys ``` Ou utilisez `ssh-keybrute.py` (natif python3, léger et avec des algorithmes anciens activés) : [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute). #### Les mauvaises clés connues peuvent être trouvées ici : {% embed url="https://github.com/rapid7/ssh-badkeys/tree/master/authorized" %} #### Clés SSH faibles / PRNG prévisible de Debian Certains systèmes ont des défauts connus dans la graine aléatoire utilisée pour générer du matériel cryptographique. Cela peut entraîner une réduction drastique de l'espace des clés qui peut être forcée brutalement. Des ensembles pré-générés de clés créées sur des systèmes Debian affectés par un PRNG faible sont disponibles ici : [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh). Vous devriez regarder ici afin de rechercher des clés valides pour la machine victime. ### Kerberos **crackmapexec** utilisant le protocole `ssh` peut utiliser l'option `--kerberos` pour **s'authentifier via kerberos**.\ Pour plus d'informations, exécutez `crackmapexec ssh --help`. ## Identifiants par défaut | **Fabricant** | **Noms d'utilisateur** | **Mots de passe** | | -------------- | ----------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 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 Si vous êtes sur le même réseau local que la victime qui va se connecter au serveur SSH en utilisant un nom d'utilisateur et un mot de passe, vous pourriez essayer de **réaliser une attaque MitM pour voler ces identifiants :** **Chemin de l'attaque :** * le trafic de l'utilisateur est redirigé vers la machine attaquante * l'attaquant surveille les tentatives de connexion au serveur SSH et les redirige vers son propre serveur SSH * le serveur SSH de l'attaquant est configuré, premièrement, pour enregistrer toutes les données saisies, y compris le mot de passe de l'utilisateur, et, deuxièmement, pour envoyer des commandes au serveur SSH légitime auquel l'utilisateur veut se connecter, pour les exécuter, puis renvoyer les résultats à l'utilisateur légitime [**SSH MITM**](https://github.com/jtesta/ssh-mitm) fait exactement ce qui est décrit ci-dessus. Pour capturer et réaliser le MitM, vous pourriez utiliser des techniques comme le spoofing ARP, le spoofing DNS ou d'autres décrites dans les [**Attaques de spoofing réseau**](../generic-methodologies-and-resources/pentesting-network/#spoofing). ## SSH-Snake Si vous souhaitez traverser un réseau en utilisant des clés privées SSH découvertes sur des systèmes, en utilisant chaque clé privée sur chaque système pour de nouveaux hôtes, alors [**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake) est ce dont vous avez besoin. SSH-Snake effectue automatiquement et récursivement les tâches suivantes : 1. Sur le système actuel, trouver toutes les clés privées SSH, 2. Sur le système actuel, trouver toutes les hôtes ou destinations (user@host) où les clés privées peuvent être acceptées, 3. Tenter de se connecter en SSH à toutes les destinations en utilisant toutes les clés privées découvertes, 4. Si une destination est connectée avec succès, répéter les étapes #1 à #4 sur le système connecté. Il est complètement auto-réplicatif et auto-propagateur -- et complètement sans fichier. ## Mauvaises configurations ### Connexion root Par défaut, la plupart des implémentations de serveur SSH permettent la connexion root, il est conseillé de la désactiver car si les identifiants de ce compte fuient, les attaquants obtiendront directement des privilèges administratifs et cela permettra également aux attaquants de mener des attaques par force brute sur ce compte. **Comment désactiver la connexion root pour openSSH :** 1. Éditez la configuration du serveur SSH `sudoedit /etc/ssh/sshd_config` 2. Changez `#PermitRootLogin yes` en `PermitRootLogin no` 3. Prenez en compte les changements de configuration : `sudo systemctl daemon-reload` 4. Redémarrez le serveur SSH `sudo systemctl restart sshd` ### Force brute SFTP * [**Force brute SFTP**](../generic-methodologies-and-resources/brute-force.md#sftp) ### Exécution de commande SFTP Une autre mauvaise configuration SSH courante est souvent observée dans la configuration SFTP. La plupart du temps, lors de la création d'un serveur SFTP, l'administrateur souhaite que les utilisateurs aient un accès SFTP pour partager des fichiers mais pas pour obtenir un shell à distance sur la machine. Ils pensent donc que la création d'un utilisateur, lui attribuant un shell fictif (comme `/usr/bin/nologin` ou `/usr/bin/false`) et le chrootant dans une prison est suffisante pour éviter un accès shell ou un abus sur l'ensemble du système de fichiers. Mais ils ont tort, **un utilisateur peut demander à exécuter une commande juste après l'authentification avant que sa commande par défaut ou son shell soit exécuté**. Ainsi, pour contourner le shell fictif qui refusera l'accès au shell, il suffit de demander à exécuter une commande (par exemple, `/bin/bash`) avant, juste en faisant : ```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 ``` Voici un exemple de configuration SFTP sécurisée (`/etc/ssh/sshd_config` – openSSH) pour l'utilisateur `noraj` : ``` Match User noraj ChrootDirectory %h ForceCommand internal-sftp AllowTcpForwarding no PermitTunnel no X11Forwarding no PermitTTY no ``` Cette configuration autorisera uniquement SFTP : désactivation de l'accès au shell en forçant la commande de démarrage et désactivation de l'accès TTY, mais aussi désactivation de tout type de redirection de port ou de tunneling. ### Tunneling SFTP Si vous avez accès à un serveur SFTP, vous pouvez également acheminer votre trafic à travers celui-ci, par exemple en utilisant la redirection de port commune : ```bash sudo ssh -L :: -N -f @ ``` ### SFTP Symlink Le **sftp** possède la commande "**symlink**". Par conséquent, si vous avez des **droits d'écriture** dans un dossier, vous pouvez créer des **symlinks** vers **d'autres dossiers/fichiers**. Comme vous êtes probablement **piégé** à l'intérieur d'un chroot, cela **ne sera pas particulièrement utile** pour vous, mais, si vous pouvez **accéder** au **symlink** créé depuis un **service sans chroot** (par exemple, si vous pouvez accéder au symlink depuis le web), vous pourriez **ouvrir les fichiers liés via le web**. Par exemple, pour créer un **symlink** d'un nouveau fichier **"**_**froot**_**" vers "**_**/**_**"** : ```bash sftp> symlink / froot ``` Si vous pouvez accéder au fichier "_froot_" via le web, vous pourrez lister le dossier racine ("/") du système. ### Méthodes d'authentification Dans un environnement de haute sécurité, il est courant de n'activer que l'authentification basée sur les clés ou à deux facteurs plutôt que l'authentification simple basée sur un mot de passe. Cependant, souvent, les méthodes d'authentification plus fortes sont activées sans désactiver les plus faibles. Un cas fréquent est l'activation de `publickey` dans la configuration openSSH et sa définition comme méthode par défaut, mais sans désactiver `password`. Ainsi, en utilisant le mode verbeux du client SSH, un attaquant peut voir qu'une méthode plus faible est activée : ```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 ``` Par exemple, si une limite d'échecs d'authentification est définie et que vous n'avez jamais l'occasion d'atteindre la méthode de mot de passe, vous pouvez utiliser l'option `PreferredAuthentications` pour forcer l'utilisation de cette méthode. ```bash ssh -v 192.168.1.94 -o PreferredAuthentications=password ... debug1: Next authentication method: password ``` Revoir la configuration du serveur SSH est nécessaire pour vérifier que seules les méthodes attendues sont autorisées. Utiliser le mode verbeux sur le client peut aider à voir l'efficacité de la configuration. ### Fichiers de configuration ```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) ## Références * Vous pouvez trouver des guides intéressants sur la manière de renforcer la sécurité de SSH sur [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) Si vous êtes intéressé par une **carrière dans le hacking** et par hacker l'inviolable - **nous recrutons !** (_maîtrise du polonais écrit et parlé requise_). {% embed url="https://www.stmcyber.com/careers" %} ## Commandes Automatiques 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' ```
Apprenez le hacking AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)! Autres moyens de soutenir HackTricks : * Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)! * Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com) * Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs * **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.** * **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).