MSN Messenger e la codifica delle password

Ecco a voi la storia del sistema di salvataggio delle password di MSN messenger, con relative decodifiche XD.

msn_butterfly.jpg

MSN Messenger Versione 5.0 e precedenti:
Le passwords venivano salvate nel registro semplicemente applicandovi il base64….. praticamente in chiaro… L’indirizzo della chiave è HKEY_CURRENT_USER\Software\Microsoft\MSNMessenger ed era possibile decodificarli con una qualsiasi decoder base64 :S

Msn Messenger Versione 6.0-7.0:
Microsoft si accorge che “forse” applicare il base64 non bastava… così si è inventata la funzione interna CryptUnprotectData, ma nell’agosto del 2004, il buon to0mbkeeper ha postato su security focus i sorgenti della suo tool per decodificarle, funzionante solo su Win2000.
Le modifiche apportate alla versione 7.0 che aggiungeva un sistema entropico one delgi hash, e l’incompatibilità con Windows XP hanno fatto da propellente all’opera di Napalm e Gregory Panakkal, che hanno sviluppato dei tool di recupero delle password (ma non è stupefacente questo infinito ciclo “tu proteggi, io ti frego” ? hackers e sistemisti si creano posti di lavoro a vicenda!! XD)

Msn Messenger Versione 7.5:
Nasce il Windows Credentials Manager (con relativo coro di stupore tipo whoooa XD), che accoppia l’entropia ad un salt generato automaticamente, salvando i dati nella chiave: HKEY_CURRENT_USER\Software\Microsoft\IdentityCRL\ . Naturalmente i vecchi tool di decodifica sono stati resi inefficaci.

Windows Live 8:

Questa versione che voi tutti conoscete, non fa a ltro che importare i profili delle vecchie versioni, ed aggiunge dei dati alla fine delle password generate dall’algoritmo introdotto con la 7.5.

A questo punto,l in base alla versione di MSN installata sul computer da cui volete recuperare account potete scaricare gli appositi Tool… io vi consiglio questo (Il collegamento è diretto al download dell’eseguibile).

Chissà cosa attende il futuro di Messenger?

Chissene io uso Kopete!!! 😀

Files al sicuro con Truecrypt

 

CryptoLa maggior parte dei sistemi crittografici, si basa sul mantenimento dei files sull’hard disk dopo averli codificati e resi non intelliggibili, ovvero dopo averli crittografati. Questi diffusissimi sistemi di protezione dei dati si dimostrano però molto insicuri dal momento che, dopo che l’utente che possiede le chiavi crittografiche ha effettuato l’autenticazione (ovvero dopo che ha ricevuto il permesso di leggere il file in chiaro) continua a mantenere il file decodificato salvato nell’ hard disk, esponendolo ad ovvi rischi.
A questo punto viene in aiuto di chi vuole salvaguardare le proprie informazioni, la cosiddetta crittografia on-the-fly (letteralmente crittografia al volo), che dopo aver effettuato l’autenticazione dell’utente, decodifica il file (con la chiave fornita dall’utente in accesso stesso) ma senza salvarlo sull’ hard disk, bensì nella RAM: i dati vengono cifrati o decifrati giusto prima di accedervi, senza un effettivo intervento dell’utente.
Un tipico programma che sfrutta questo tipo di crittografia è Truecrypt: un software open source disponibile sia per Windows che per Linux, capace di creare volumi crittografici sia basati su file (Containers) che su partizioni fisiche. In questo articolo vedremo come creare il primo tipo di volumi, che tornano utili in quanto possono essere spostati in qualsiasi supporto (appunto perchè sono dei file). Dopo aver installato il necessario, che può essere trovato all’indirizzo http://www.truecrypt.org/downloads.php, creiamo il nostro volume tc:
truecrypt -c volume.tc
poiché non sono state specificate abbastanza opzioni da riga di comando, truecrypt richiederà ulteriori informazioni interattivamente:
La prima cosa da decidere è il tipo di volume: normale o hidden.
Il volume Normale è (come ci si aspetta dal nome 😉 mentre quella hidden approfondisce la protezione delle informazioni da nascondere, rendendo invisibile il file all’interno del volume normale, detto “outer”.

Per il momento scegliamo un volume di tipo normale.

Il secondo passo è quello di scegliere il tipo di filesystem per il nostro volume, le scelte possibili ricadono tra FAT e none. La scelta none fa si che truecrypt non formatti da subito il nostro volume per permetterci di scegliere il filesystem più adatto, ma ATTENZIONE:

I filesystem di journaling tengono traccia di moltissime informazioni sui file (ecco perchè per certe applicazioni sono più indicati) salvandole in adatti headers. Questo implica diversi problemi di sicurezza, poiché in questo modo è possibile reperire dagli headers del filesystem di journaling in questione informazioni sensibili, come ad esempio le modifiche apportate alla password del volume Truecrypt, oppure gli orari di accesso ai file. Per evitare questi gravi problemi di sicurezza le soluzioni sono due: utilizzare un volume basato su partizione fisica, oppure salvare il container in un filesystem non di Journaling.

Per la nostra prova scegliamo FAT, ma se volessimo un filesystem ottimizzato basterà formattare il volume con il comando:
truecrypt -N 0 volume.tc && mkfs /dev/mapper/truecrypt0
Dopo aver scelto il filesystem, dobbiamo specificare la dimensione del volume, ad esempio 20 M. A questo punto veniamo messi di fronte alle opzioni di cifratura, ma per il momento, quelle di default fanno al caso nostro.
Inserite e re-inserite la password del volume e poi iniziate l’acquisizione di dati casuali, tramite la pressione casuale di tasti della tastiera e di movimenti del mouse. Il volume viene popolato di questi dati casuali. Per utilizzare il volume ppena creto, montiamolo con
truecrypt ./volume.tc /mnt/miovolume
Aggiungiamo un file qualsiasi al nostro volume:
echo “ciao” >miofile.txt
cp miofile.txt /mnt/miovolume

Infine smontiamo il volume
truecrypt -d ./volume.tc
A questo punto il file non può essere letto!, verifichiamo con
grep “ciao” volume.tc
L’output sarà nullo!!.

Hash Store

Nell’ultimo articolo ho cercato di spiegarvi il funzionamento dell’algoritmo MD5, dopodichè mi sono immediatamente messo al lavoro ed ho pubblicato un mini sito internet utile a fare qualche prova con il suddetto algoritmo.

L’ho chiamato hash Store, così che in seguito potrò aggiungere altri script riguardanti i relativi algoritmi che approfondirò; se siete interessati al codice, mandatemi una mail di richiesta e provvederò a spedirvelo, oppure(cosa molto più saggia) ad aggiungere una sezione download

Buon hashing a tutti XD!!!

Algoritmo MD5: Breve descrizione e procedimento matematico

MD5 è l’acronimo di Message Digest 5, un algoritmo di crittografia a senso unico (cioè che non prevede di essere decrittato), creato nel 1991 da Ronald Rivest a causa dell’inefficienza del suo predecessore: MD4.

Tecnicamente, MD5 è una funzione di compressione, che dato un input composto da una stringa di lunghezza arbitraria, restituisce una firma digitale che consiste in una stringa da 128 bit. Si presuppone che l’hash ( ovvero l’output ) restituito dalla funzione sia univoco o, più precisamente, che sia molto improbabile ottenere due hash identici da due input diversi.

Al giorno d’oggi, tutti sanno quanto sono importanti le firme digitali, la loro sicurezza dipende dalla “forza crittografica” delle funzioni che le generano. Le funzioni di hashing, hanno anche altre funzioni oltre alla sicurezza, infatti permettono di verificare l’integrità dei downloads, tramite un checksum da confrontare: Assieme al file del download, viene fornita la stringa che corrisponde all’hash dei file immessi come input. Se l’hash ottenuto non corrisponde a quello fornito dal download, potrebbe essersi verificata una perdita di dati.

Vediamo ora di analizzare il procedimento alla formazione dell’hash:

  1. Padding: Vengono aggiunti bit alla fine del messaggio da codificare finchè la lunghezza del messaggio diventa pari a 448 mod 512. In particolare, il primo bit aggiunto è un “1”, mentre i successivi sono tutti “0”.
  2. Aggiunta delle informazioni sulla lunghezza del messaggio (calcolata prima del padding) in codifica a 64 bit. Se la lunghezza del messaggio era minore di 264, vengono utilizzati solamente i 64 bit inferiori del messaggio, ottennendo così 2 word (da 32 bit ciascuna) che vengono accodate al messaggio dando precedenza alla word inferiore.
  3. A questo punto il messaggio ha ottenuto una lunghezza multipla di 512.
  4. Inizializzazione del buffer MD: questo buffer è composto da 4 word a 32 bit, inizializzate come segue:
    • A: 01 23 45 67
    • B: 89 ab cd ef
    • C: fe dc ba 98
    • D: 76 65 32 10
  5. Elaborazione del messaggio:Vengono definite quattro funzioni che ricevono in ingresso tre word e ne restituiscono una:
    • F(x,y,z) = (x AND y) OR(NOTx OR z)
    • G(x,y,z) = (x AND z) OR(y OR NOTz)
    • H(x,y,z) = (x XOR y XOR z)
    • I(x,y,z) = y XOR(x OR NOTz)

    In particolare ogni funzione adotta la seguente logica: se è vero x, allora passa ad y altrimenti a z. Ecco lo pseudocode dell’algoritmo:

    //Nota: Tutte le variabili sono "unsigned" da 32 bit
    var int[64] r, k//r specifica lo spostamento per iterazione
    r[ 0..15] := {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22}
    r[16..31] := {5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20}
    r[32..47] := {4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23}
    r[48..63] := {6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21}

    //Usa la parte binaria intera del seno di interi come costante:
    for i from 0 to 63
    k[i] := floor(abs(sin(i + 1)) × (2 pow 32))

    //Inizializzazione
    var int h0 := 0x67452301
    var int h1 := 0xEFCDAB89
    var int h2 := 0x98BADCFE
    var int h3 := 0x10325476

    //Pre-processazione
    append "1" bit to message
    append "0" bits until message length in bits ≡ 448 (mod 512)
    append bit (bit, not byte) length of unpadded message as 64-bit little-endian integer to message

    //Processa il messaggio in pezzi da 512
    for each 512-bit chunk of message
    break chunk into sixteen 32-bit little-endian words w[i], 0 ≤ i ≤ 15

    //inizializza il valore dell'hash di questo pezzo
    var int a := h0
    var int b := h1
    var int c := h2
    var int d := h3

    //Main loop:
    for i from 0 to 63
    if 0 ≤ i ≤ 15 then
    f := (b and c) or ((not b) and d)
    g := i
    else if 16 ≤ i ≤ 31
    f := (d and b) or ((not d) and c)
    g := (5×i + 1) mod 16
    else if 32 ≤ i ≤ 47
    f := b xor c xor d
    g := (3×i + 5) mod 16
    else if 48 ≤ i ≤ 63
    f := c xor (b or (not d))
    g := (7×i) mod 16

    temp := d
    d := c
    c := b
    b := b + leftrotate((a + f + k[i] + w[g]) , r[i])
    a := temp

    //Aggiunge questa parte di hash al risultato
    h0 := h0 + a
    h1 := h1 + b
    h2 := h2 + c
    h3 := h3 + d

    var int digest := h0 append h1 append h2 append h3
    //(expressed as little-endian)

    //Definizione della funzione "leftrotate"
    leftrotate (x, c)
    return (x <> (32-c));

  6. Message Digest: L’output dell’algoritmo è l’hash finale,ottenuto a partire dal LSB (byte meno importante) della word A seguito da b ,c e terminante con il byte più importante di D.Fonti:

Algoritmo RSA: il procedimento matematico

Crittografia

L’algoritmo RSA è uno delgi algoritmi di cifratura asimmetrica(cioè che utilizza due chiavi) più utilizzati, soprattutto per l’impegno computazionale richiesto alla sua decodificazione. Per questo motivo è generalmente ritenuto un algoritmo sicuro.
In questo articolo mi concentrerò nel procedimento matematico alla base di RSA.
Continua a leggere Algoritmo RSA: il procedimento matematico