SSH Anahtarları ile Privilege Escalation (okunabilir private key, writable authorized_keys, agent hijack, known_hosts)
SSH tabanlı privesc/lateral vektörleri: dünyaya okunabilir private key'lerin kırılması/kullanılması, yazılabilir authorized_keys'e kendi key'ini ekleme, ele geçirilen SSH agent socket'inin hijack edilmesi ve known_hosts harvesting ile sonraki hedeflerin keşfi. SSH config'lerden gömülü key ve IdentityFile yollarının toplanması.
- Hedefte düşük yetkili shell
- Kali'de SSH client
- Bazı vektörler için root/agent socket sahibinin yetkisi
Komutlar
find / -name 'id_rsa' -o -name 'id_ed25519' -o -name '*.pem' -o -name 'id_ecdsa' 2>/dev/null find / -name 'authorized_keys' 2>/dev/null -exec ls -la {} \; ssh-keygen -t ed25519 -f ./pwn -N '' echo 'ssh-ed25519 AAAA...attacker pwn' >> /root/.ssh/authorized_keys chmod 600 ./found_key && ssh -i ./found_key {{USER}}@{{RHOST}} ssh2john ./found_key > key.hash && john --wordlist={{WORDLIST}} key.hash ls -l /tmp/ssh-*/agent.* 2>/dev/null; env | grep SSH_AUTH_SOCK SSH_AUTH_SOCK=/tmp/ssh-XXXX/agent.1234 ssh-add -l SSH_AUTH_SOCK=/tmp/ssh-XXXX/agent.1234 ssh {{USER}}@{{RHOST}} cat ~/.ssh/known_hosts /home/*/.ssh/known_hosts 2>/dev/null; cat ~/.ssh/config /home/*/.ssh/config 2>/dev/null grep -rIE 'BEGIN (OPENSSH|RSA|EC|DSA) PRIVATE KEY' / 2>/dev/null | head Genel Bakış
SSH key’leri hem privesc (root’un okunabilir/yazılabilir key materyali) hem lateral movement (başka host’lara giriş) için en sık görülen vektörlerden. Dört ana yol var: okunabilir private key, writable authorized_keys, ssh-agent hijack, known_hosts/config harvesting.
1. Okunabilir Private Key
Yanlış izinli bir id_rsa/id_ed25519/*.pem dosyası başka bir kullanıcıya (özellikle root’a) aitse ve sen okuyabiliyorsan, key’i Kali’ye al, chmod 600 yap (SSH gevşek izinli key’i reddeder) ve ssh -i ile gir. Key parola korumalıysa ssh2john + john ile passphrase’i offline kır — kırılan parola genelde reuse edilir. Standart isimlerde değilse içerik imzasıyla (BEGIN ... PRIVATE KEY) tüm FS’i tara.
2. Writable authorized_keys
Bir kullanıcının ~/.ssh/authorized_keys dosyası sana yazılabiliyorsa (yanlış izin, grup yazma, ya da home dizini world-writable), Kali’de yeni bir key çifti üret ve public kısmını o dosyaya ekle. Ardından private key ile o kullanıcı olarak giriş yap. Root’un authorized_keys’i yazılabiliyorsa direkt root. Dikkat: SSH StrictModes on (varsayılan) iken home/.ssh izinleri çok gevşekse key’i reddedebilir — bu durumda izinleri düzeltebiliyorsan düzelt.
3. ssh-agent Hijacking
Bir admin agent forwarding (ssh -A) ile bağlandıysa, /tmp/ssh-*/agent.* altında bir agent socket’i kalır. SSH_AUTH_SOCK’u o socket’e set edip ssh-add -l ile yüklü identity’leri görebilir, private key dosyasına hiç dokunmadan o key’lerle ssh yapabilirsin. Socket’in sahibi sensen (veya root’sun) bu işler; başka kullanıcının socket’ine erişim için genelde o kullanıcı ya da root olman gerekir — yani bu çoğu zaman lateral/pivot aracı.
4. known_hosts & config Harvesting
~/.ssh/known_hosts bu kullanıcının daha önce bağlandığı host’ları (yeni hedefler), ~/.ssh/config ise Host alias’larını ve IdentityFile yollarını verir. Modern OpenSSH known_hosts’u hash’ler (HashKnownHosts yes); hash’li girdileri ssh-keygen -F host ile test edebilir ya da bilinen IP’lerle brute-force eşleştirebilirsin. config’teki IdentityFile, hangi key’in nereye gittiğini söyleyerek pivot zincirini netleştirir.
Gotcha’lar
- Private key’i Kali’ye taşırken kopyala-yapıştır satır sonlarını bozabilir —
scp/base64 ile transfer et (bkz. lnx-file-transfer) vechmod 600’ü unutma. - Doğru kullanıcı adını bilmiyorsan: key’in bulunduğu home dizini sahibi genelde kullanıcı adıdır;
authorized_keysiçindeki yorum (user@host) da ipucu verir. - agent hijack iz bırakır ve oturum süreklidir; agent’ı kapatırsan erişimi kaybedersin — önce kalıcı bir authorized_keys girişi bırak.
- SSH login PasswordAuthentication kapalı olsa bile key-based vektörler çalışır; sınavda servis 22 açıksa bu yolları daima dene.