Ricerca personalizzata

mercoledì 3 dicembre 2008

Violare la Password su Linux

Le password nell'epoca informatica, sono state tra le prime tecniche ad affacciarsi nell'infinito panorama della sicurezza dei dati. Inizialmente erano pure parole "in chiaro", usate per proteggere singoli file e magari giochetti dei nostri 486. Con il passare degli anni, e con l'avvento della multiutenza il concetto di password non è cambiato, ma è mutato radicalmente il suo panorama di utilizzo poiché le nostre magiche parole chiavi sono comparse in svariati ambiti tra cui: protezione account, multiutenza, chiavi pubbliche, crittazione ecc.

In Linux, come in ogni altro sistema operativo, le password garantiscono l'accesso al sistema e rappresentano una, spesso unica, barriera fra l'esterno e i dati conservati nel computer. Ma, come vedremo in questo articolo, la loro violazione può essere a volte semplicissima.

Funzionamento delle password nei sistemi Linux

La scoperta, anzi, i tentativi di scovare una password in un sistema unix-like, sono svariati e a volte dipendenti dal tipo di distribuzione in uso e soprattutto dai servizi presenti sulla macchina. Per questo bisogna per prima cosa conoscere come Linux memorizza, protegge e usa le password per tutelare gli utenti, e poi, come gli aggressori potrebbero tentare di scovarle.

Dunque: le password in Linux sono memorizzate in file in formato crittografato.

Questo implica che ovviamente una determinata stringa scelta come password è convertita per mezzo di un algoritmo ripetibile per consentire a Linux, quando si accede al sistema, di prendere la vostra password e confrontarla con la password crittografata in suo possesso. L'algoritmo usato da Linux per crittografare le proprie password utente è "a una via": ciò significa che è possibile crittografare una password, ma teoricamente non è possibile riottenerla dal valore crittografato.

La maggior parte delle prime versioni di Linux, memorizzava le password utente, in formato crittografato, all'interno del file /etc/passwd. Dopo il processo di boot o dopo la chiamata del programma login, il sistema prende il nome utente e cerca il record corrispondente all'interno del file /etc/passwd per ottenerne la password crittografata associata.

Successivamente nome utente e password passano alla funzione crypt(), che contiene all'interno l'algoritmo di crittografia implementato (DES o MD5 di cui parlerò più avanti) per produrre la password crittografata. Se il risultato corrisponde alla password memorizzata in /etc/passwd, viene consentito l'accesso all'utente.

Ecco un esempio del file /etc/passwd:

Il file /etc/passwd

root:$1$X14/EjGB$daoyy4wCu6ct6VKAXHeil/::0:0:root:/root:/bin/bash
daemon::1:1:daemon:/usr/sbin:/bin/sh
bin::2:2:bin:/bin:/bin/sh
sys::3:3:sys:/dev:/bin/sh
sync::4:65534:sync:/bin:/bin/sync
games::5:60:games:/usr/games:/bin/sh
man::6:12:man:/var/cache/man:/bin/sh

Queste prime distribuzioni Linux come potete vedere (la stringa in rosso), mostravano in chiaro la stringa crittografata. Si doveva cercare una soluzione: l'avvento delle shadow password ha fatto sì che le password crittografate non fossero più visibili, rendendo così più difficili attacchi mediante dizionario. In questo scenario il file /etc/passwd esiste sempre, ma viene creato un altro file, chiamato /etc/shadow che contiene la versione crittografata di tutte le password presenti nel sistema ed è leggibile solo da root. Le shadow password modificano il contenuto del file /etc/passwd in un aspetto.


Il file /etc/passwd con shadow

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh

Si può osservare che il 2° campo della stringa crittografata, ora è semplicemente "x". Ecco un esempio di file /etc/shadow:

Il file /etc/shadow

root:$1$X14/EjGB$daoyy4wCu6ct6VKAXHeil/:99999:0:99999:7:::
daemon:*:13991:0:99999:7:::
matteo:$1$ww21XzQm$KAy5P61X0JilPkEQqoE2g0:14133:0:99999:7:::
test:$1$rh2IDIWj$DXdMkLyDOaMdY2W3ZMYjr/:14135:0:99999:7:::
test2:$1$HLy1rDzf$HqzzcB94t6abQE8KCy5R8/:14135:0:99999:7:::

I due punti delimitano i campi di /etc/shadow che sono costituiti così:

  • Nome utente
  • Password crittografata
  • Numero giorni trascorsi dall'1 gennaio 1970
  • Numero giorni dopo i quali l'utente può cambiare la password
  • Numero giorni dopo i quali l'utente deve cambiare la password
  • Numero giorni di avviso precedenti al cambio password
  • Numero giorni rimasti all'utente per cambiare password
  • Campo riservato

Le shadow password non sono solo un metodo per celare password, ma è anche una completa suite di cui fanno parte programmi come: useradd, userdel, usermod, ecc. consoni nella normale amministrazione, ma che possono rivelarsi utili in caso di attacchi.

Panoramica sugli algoritmi crittografici

In ambienti Unix / Unix-like, gli algoritmi implementabili dalla funzione crypt() sono principalmente 2: DES e MD5.

  • DES (Data Encryption Standard) è stato sviluppato dal governo degli Stati Uniti e da IBM e non è esportabile fuori dai confini statunitensi, oltre che essere largamente soppiantato da MD5.
  • MD5 (Message Digest 5) è un algoritmo per la crittografia a senso unico a lunghezza fissa 128bit.

La funzione codifica velocemente stringhe di input ottenendo in output una firma digitale teoricamente univoca e diversa anche quando stringhe di ingresso sono uguali.

A rendere più difficili e complicate le cose, la funzione crypt() in Linux codifica in MD5 con l'aggiunta di un salt che rende ulteriori 4096 combinazioni per l'aggiunta di una chiave a due caratteri variabile alla stringa MD5 da codificare.

Tecniche di attacco

Tenendo presente quanto detto sino ad ora, vediamo le varie tecniche di violazione, creazione e identificazione di password e utenti. Le analizzeremo in modo sintetico, tanto da dare l'idea delle possibili violazioni del nostro sistema.

Sfruttamento dei Boot Loader

Se il PC in questione non ha password a livello di BIOS (problema facilmente scavalcabile resettandolo, togliendo la pila o agendo sul jumper flash), Lilo e Grub, i due gestori dell'avvio di Linux, offrono diversi metodi che ci fanno avere il coltello dalla parte del manico.

Il Lilo fermatosi al prompt, ha la possibilità di inserire alcuni parametri:

  • Immettere: root=/dev/dispositivoCdRom per avviare ad esempio un Cd-Rom con all'interno una distribuzione live.
  • Apriamo una console a noi preferita e montiamo la root della distribuzione aiutandoci magari con cfdisk per sapere quale sia la root. (es mount /dev/sda1 /mnt/linux ).
  • A questo punto abbiamo accesso libero ai file, a noi interessa particolarmente il file /etc/shadow.
  • Copiamo il file e come il precedente metodo, teniamolo per i successivi tentativi di brute force.

Il Grub e la sua flessibilità offrono svariati parametri e impostazioni utilizzabili al caso nostro.

  • Seleziona l'immagine del kernel interessata.
  • Premere e.
  • Premere e nuovamente.
  • Immettere la stringa single e premere b.
  • Il sistema si riavvierà.
  • Grub ora mostrerà una bash dove inserendo password root si potrà modificare la password di sistema.
  • Lanciare sync.
  • Riavviare con reboot.

Abbiamo quindi già ottenuto l'accesso totale alla macchina! Cosa già anticipata data la potenza di Grub

Sfruttamento di "Sudo"

Sudo è un software molto comune per la distribuzione dell'autorità amministrativa. Con sudo è possibile concedere a determinati utenti la possibilità di eseguire attività amministrative specifiche che normalmente richiedono l'accesso a root. Ampliamente usato nelle distribuzioni Ubuntu o in distribuzioni "user friendly", sudo può essere usato abbondantemente come arma a doppio taglio.

Negli esempi di attacco proposti, l'aggressore parte sempre da almeno un account utente compromesso carpito attraverso i metodi precedentemente elencati, e poi "crackato" tramite metodi a forza bruta (lo vedremo più avanti). Solitamente gli account utente, rispetto root, sono creati con password più deboli, e quindi più facili da trovare mediante metodi "brute force".

Ecco elencati, alcuni principali metodi di attacco mediante l'utilizzo volontario, involontario di sudo:

  • Partendo da un account utente, un sistema con sudo non propriamente configurato può permettere un comando passwd che una volta acconsentito, può modificare le password di ogni utente
  • Il metodo più devastante è la possibilità d'uso di editor offerti da sudo. Per esempio l'utilizzo di crontab -e -u user avvierà crontab con editor potenti predefiniti (vi o emacs) che consentono tra le molteplici operazioni, l'esecuzione di comandi. Se quindi avviamo il comando con sudo, possiamo virtualmente accedere, eseguire comandi come root, avviando quindi programmi, accedendo a /etc/shadow, /etc/hosts, passwd, e così via
  • Alcuni sistemi Ubuntu espongono addirittura i file protetti da root dando semplicemente in pasto il binario a sudo. Ad esempio: volete il file pronto /etc/shadow? Date un: sudo cat /etc/shadow ed eccolo già servito!

    Tecniche brute force

    Il password cracking, tra le più vecchie, lunghe ma alla fine efficaci tecniche per violare password, cioè il tentativo di indovinare una password mediante combinazioni incrementali e/o a word list per ottenere l'accesso di un PC.

    La maggior parte delle strategie di questo tipo implica la sottrazione di una copia del file /etc/shadow con le tecniche tramite live CD, boot loader, o vulnerabilità nei servizi spiegate nei precedenti paragrafi, per poi eseguire in un secondo momento un programma che "cerca di indovinare" la password corretta, nel tentativo di produrre la forma crittografata memorizzata nel file.

    Ricordando la costruzione di una password MD5 un programma di cracking può impiegare anche diverso tempo per scovare la password a seconda della complessità e ovviamente della potenza del PC su cui sta girando il programma. Tra i più efficaci programmi per questo scopo sicuramente merita uno spazio l'ormai storico John the ripper, chiamato anche semplicemente John.

    Le principali particolarità di questo programma sono:

  • Progettazione modulare e svincolante da crypt() per essere più veloce e potente.
  • Sospensione e riavvio della sessione
  • Lettura di dizionari
  • Specificazione di quali utenti e gruppi violare.
  • Può funzionare in diverse modalità, tra cui la modalità speciale con cui si può personalizzare propri algoritmi C da affiancare alla potenza di John.

L'esecuzione di John è semplice:

  • Salvare i file delle password
  • Eseguire John come: john -option file_password
  • Il programma inizierà il cracking

Con -option si può modificare la modalità di esecuzione di John:

  • --wordlist=FILE: specificare il nome di un dizionario o proprio file.
  • --single: molto veloce, usa metodi login/GECOS come password.
  • --incrementali: modalità più potente, sperimenta ogni combinazione, ma anche molto lenta.
  • --external: funzioni esterne scritte in linguaggio simil-C.

Come si nota in figura, John riesce a scovare, su un sistema core 2 duo, una password dopo soli 8 minuti.

Figura 1: John in azione

In password più complesse però, si consiglia di optare e scrivere moduli C dedicati, poiché nel successivo esempio con password alfanumeriche, dopo più di 17 ore di elaborazione, john non è riuscito a scovare la password.

Figura 2: John non riesce a violare la password

Miti tentativi e leggende

Girando sul Web e sperimentando alcune idee e tentativi di cracking, ci si può imbattere in alcuni falsi miti che meritano una breve trattazione.

  • Editare il file /etc/shadow lasciando la stringa nulla, in bianco, in questo modo la password dell'utente sarà nulla, e al login basterà schiacciare invio per loggarsi. No, la funzione crypt() non è stupida, verifica questa cosa e questo metodo non funziona tranne probabilmente con vecchissime distribuzioni Linux.
  • Editare il file /etc/shadow copiando nel secondo campo stringhe ash MD5 già trovate, in questo modo la password sarà semplicemente la parola da noi convertita. No, perché la funzione crypt() usa semi diversi per ogni password, rendendo questo metodo non funzionante.

Conclusioni

Sarebbe stato interessante trattare metodi di sicurezza e offensive contro gli attacchi, magari se sarà possibile, creerò un articolo in futuro. Argomento molto importante giacché la sicurezza con il passare degli anni è, e diventerà, sempre più "sicura". Ma questo perché? Perché ci saranno sempre di volta in volta metodi per far diventare le regole obsolete. Spetta quindi anche a voi, testare, trovare e scovare nuovi metodi, che intrinsecamente, faranno evolvere garanzie. Quindi usate le nozioni apprese per successivi sviluppi e completamenti; e, buona fusione dei vostri processori con il sempre buon vecchio john the ripper.

4 commenti:

Anonimo ha detto...

Ci sarebbe molto da dire, ma mi limiterò a tre punti fondamentali:
1. i boot loader sono sfruttabili solo in presenza fisica del computer e non riguardano la sicurezza di rete.
2. sudo è utilizzato solo da pochissime distro, in primis da Ubuntu/Kubuntu, NESSUNA DISTRO SERIA LO USA.
3. il brute force è possibile solo con password scadenti.

oɟn1 ha detto...

1. Vero
2. Vero
3. Vero

per un PC domestico nessun problema.
L'articolo è dedicato alle persone che hanno la loro bella postazione Linux aziendale, e se ne vanno lasciando il Pc acceso, tanto c'è Linux, chi mai può fare qualcosa se non sa la mia pass?

Luigi Cocola ha detto...

@ oɟn1

uè, mi meravigli, sei una persona realmente competente!

oɟn1 ha detto...

Troppa grazia...

L'articolo è stato riportato qui per mia memoria. Altri l'autore.
Mi serve come blocco note per ricordarlo e inviarlo ad alcuni miei ex colleghi, che non possono dietro firewall aziendale, risalire all'originale.

Privacy Policy

This site uses Google AdSense for advertisements. The DoubleClick DART cookie is used by Google in the ads served on publisher websites displaying AdSense for content ads. When users visit an AdSense publisher's website and either view or click on an ad, a cookie may be dropped on that end user's browser. The data gathered from these cookies will be used to help AdSense publishers better serve and manage the ads on their site(s) and across the web. * Google, as a third party vendor, uses cookies to serve ads on this site. * Google's use of the DART cookie enables it to serve ads to you users based on your visit to this site and other sites on the Internet. * Users may opt out of the use of the DART cookie by visiting the Google ad and content network privacy policy. We use third-party advertising companies to serve ads when you visit our website. These companies may use information (not including your name, address, email address, or telephone number) about your visits to this and other websites in order to provide advertisements about goods and services of interest to you.

Questo sito utilizza Google AdSense per la pubblicità. Il DoubleClick DART cookie è utilizzato da Google per gli annunci pubblicati su siti web publisher AdSense per i contenuti, visualizzazzandone gli annunci. Quando un utente visita un sito web publisher AdSense e clicca su un annuncio, un cookie può essere rilasciato a tal fine, nel browser dell'utente. I dati raccolti da questi cookie verranno utilizzati per aiutare i publisher AdSense a servire meglio e a gestire gli annunci sul loro sito(i) in tutto il web. * Google, come parte di terzo fornitore, utilizza i cookie per la pubblicazione di annunci su questo sito. * L'uso del DART cookie consente a Google di pubblicare annunci per gli utenti, e si basa sulla vostra visita a questo sito e su altri siti su Internet. * Gli utenti possono scegliere di utilizzare i DART cookie visitando i contenuti sulla privacy nell'annuncio di Google. Usiamo società di pubblicità per la pubblicazione di annunci di terze parti, quando si visita il nostro sito web. Queste aziende possono utilizzare le informazioni (non compreso il vostro nome, indirizzo, indirizzo e-mail, o numero di telefono) sulle visite a questo e ad altri siti web, al fine di fornire la pubblicità su beni e servizi di vostro interesse.