hacktricks/network-services-pentesting/pentesting-ssh.md

23 KiB
Raw Blame History

22 - Test d'intrusion 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 êtes intéressé par une carrière en piratage et par pirater l'inviolable - 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 via un réseau non sécurisé.

Port par défaut : 22

22/tcp open  ssh     syn-ack

Serveurs SSH :

  • openSSH OpenBSD SSH, inclus dans BSD, les distributions Linux et Windows depuis Windows 10
  • Dropbear Implémentation SSH pour les environnements avec peu de mémoire et de ressources processeur, inclus dans OpenWrt
  • PuTTY Implémentation SSH pour Windows, le client est couramment utilisé mais l'utilisation du serveur est plus rare
  • CopSSH implémentation d'OpenSSH pour Windows

Bibliothèques SSH (implémentant le côté 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 SSH de git
  • 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 de protocole SSHv2 pour Python

Énumération

Récupération de bannière

nc -vn <IP> 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 est un fork mis à jour de 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/obsolète, 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
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>

Regardez-le en action (Asciinema)

Clé publique SSH du serveur

ssh-keyscan -t rsa <IP> -p <PORT>

Algorithmes de chiffrement faibles

Cela est découvert par défaut par nmap. Mais vous pouvez également utiliser sslcan ou sslyze.

Scripts Nmap

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

Forcer brutalement les noms d'utilisateur, les mots de passe et les clés privées

Énumération des noms d'utilisateur

Dans certaines versions d'OpenSSH, vous pouvez réaliser une attaque par chronométrage pour énumérer les utilisateurs. Vous pouvez utiliser un module metasploit pour exploiter ceci :

msf> use scanner/ssh/ssh_enumusers

Brute force

Des identifiants ssh courants ici et ainsi que 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 (python3 natif, léger et avec des algorithmes anciens activés) : 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 considérable 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.

Vous devriez consulter ce site pour 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 fait exactement ce qui est décrit ci-dessus.

Pour capturer et réaliser le MitM, vous pourriez utiliser des techniques telles que le spoofing ARP, le spoofing DNS ou d'autres décrites dans les Attaques de spoofing réseau.

Mauvaises configurations

Connexion root

Par défaut, la plupart des implémentations de serveurs SSH autorisent 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 leur permettra également 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

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, l'attribution d'un shell fictif (comme /usr/bin/nologin ou /usr/bin/false) et son enfermement dans une prison sont suffisants pour éviter un accès au shell ou un abus sur l'ensemble du système de fichiers. Mais ils se trompent, un utilisateur peut demander à exécuter une commande juste après l'authentification avant que sa commande par défaut ou son shell ne 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, simplement en faisant :

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

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

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 :

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.

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

ssh_config
sshd_config
authorized_keys
ssh_known_hosts
known_hosts
id_rsa

Fuzzing

Références

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 :