Το προφίλ μας στο Google Plus
4

MD5 reversing, the not-so-brutal way!

Για μάλλον ευνόητους λόγους, τα password των χρηστών δεν αποθηκεύονται ποτέ με τη μορφή απλού κειμένου. Τα διάφορα λειτουργικά συστήματα χρησιμοποιούν πάντα κάποιον αλγόριθμο κρυπτογράφησης και για τη συγκεκριμένη δουλειά (συνήθως τον MD5, Message-Digest algorithm 5). Έτσι, αν καταφέρει κανείς να πάρει το αρχείο με τα password ενός συστήματος, θα καταλήξει με τις κρυπτογραφημένες εκδοχές των passwords κι όχι με τα ίδια. Συγκεκριμένα, θα καταλήξει να έχει τα λεγόμενα MD5 hashes των passwords του συστήματος.

Όπως αντιλαμβάνεστε, τα κρυπτογραφημένα passwords δεν μπορούν να αξιοποιηθούν άμεσα. O επίδοξος εισβολέας, λοιπόν, θα πρέπει να βρει τα strings από τα οποία προέκυψαν τα MD5 hashes. Με άλλα λόγια, θα πρέπει να κάνει αυτό που ονομάζουμε MD5 reversing. Αν αναρωτιέστε πώς μπορεί να γίνει κάτι τέτοιο, είναι απόλυτα φυσιολογικό. Στο κάτω-κάτω, οι αλγόριθμοι κρυπτογράφησης είναι ειδικά κατασκευασμένοι ώστε να είναι πρακτικά αδύνατη η αντιστροφή τους. Έτσι έχουν τα πράγματα και η λύση που έχει δοθεί στο πρόβλημα είναι εξαιρετικά πιο απλή: Ο εισβολέας δημιουργεί μια τεράστια λίστα με τα πιθανά passwords και τα κρυπτογραφεί ένα προς ένα, κατά MD5. Αν εντοπίσει κάποιο από τα δικά του MD5 hashes μέσα στο αρχείο με τα κλεμμένα, έχει μόλις ανακαλύψει το αντίστοιχο password: Είναι το string εκείνο, από το οποίο προέκυψε το συγκεκριμένο MD5 hash.

Προφανώς, η συγκεκριμένη λύση στο πρόβλημα της αντιστροφής του MD5 αποτελεί μια ακόμα εφαρμογή της τεχνικής bruteforce: Για την επίτευξη του στόχου μας καταφεύγουμε σε πολλές κι απανωτές δοκιμές, έως ότου να τα καταφέρουμε. Θα μπορούσαμε, λοιπόν, να κατασκευάσουμε ένα script που θα αυτοματοποιεί τη συγκεκριμένη διαδικασία. Αυτό το script θα δεχόταν ως παράμετρο ένα αρχείο με τα πιθανά passwords, καθώς και το MD5 hash το οποίο θέλουμε να αντιστρέψουμε. Αν και η ιδέα ενός τέτοιου προγράμματος είναι απλή, έχει ένα σοβαρότατο μειονέκτημα. Ο αλγόριθμος MD5 είναι εξαιρετικά ευαίσθητος στις μεταβολές των string εισόδου. Δείτε για παράδειγμα το MD5 hash του string “deltaHacker” (χωρίς τα εισαγωγικά):

MD5(deltaHacker) = 97ca6358750b815846375f0a59cda67f

Δείτε τώρα και το MD5 hash του string “deltahacker” (επίσης χωρίς τα εισαγωγικά), όπου η μόνη διαφορά με το προηγούμενο είναι το κεφαλαίο “H” που τώρα είναι πεζό:

MD5(deltahacker) = 25eedde82fd31567af32126e9de5640f

Όπως βλέπετε, τα δύο strings είναι εντελώς διαφορετικά.

Καταλαβαίνουμε, λοιπόν, ότι για να βρούμε το συνθηματικό που αντιστοιχεί σε κάποιο MD5 hash θα έπρεπε να τροφοδοτήσουμε το πρόγραμμά μας με μια *τεράστια* λίστα πιθανών password. Κι όταν λέμε τεράστια, το εννοούμε!

Ευτυχώς για μάς, αν θελήσουμε ποτέ να αντιστρέψουμε ένα MD5 hash έχουμε μια καλύτερη μέθοδο ν’ ακολουθήσουμε. Υπάρχουν αρκετές δικτυακές βάσεις δεδομένων, στις οποίες έχουν αποθηκευτεί τεράστιες λίστες πιθανών passwords *μαζί* με τα αντίστοιχα MD5 hashes. Έτσι, το μόνο που έχουμε να κάνουμε είναι να αναζητήσουμε σε αυτές τις βάσεις το MD5 hash το οποίο θέλουμε να αντιστρέψουμε. Aν το βρούμε σε κάποια, θα μάθουμε αμέσως και το αντίστοιχο password, δηλαδή το αρχικό string που έδωσε το συγκεκριμένο MD5 hash. Αυτή η διαδικασία περιλαμβάνει σαφώς λιγότερες αναζητήσεις κι ελέγχους σε σχέση με το τυφλό bruteforce και θα μπορούσαμε να την πραγματοποιήσουμε χειροκίνητα. Ωστόσο, καθώς αγαπάμε ιδιαίτερα την Python και δεν χάνουμε ευκαιρία να τη χρησιμοποιήσουμε, αποφασίσαμε να γράψουμε ένα σχετικό script (είναι διαθέσιμο στο http://pypi.python.org/pypi/md5cracker/1.0.0):

#!/usr/bin/python
#reverse online md5 cracker by Dr@G 
import urllib,re,sys
from re import search
from socket import *

try:
    user_hash= raw_input('Enter Hash:~# ')
    print 'http://md5.gromweb.com/'
    readurl=urllib.urlopen('http://md5.gromweb.com/query/'+user_hash)
    response=readurl.read()
    print user_hash+'::'+ response
    
    print 'http://md5.hashcracking.com/'
    readurl=urllib.urlopen('http://md5.hashcracking.com/search.php?md5='+user_hash)
    response=readurl.read()
    manipulated_response=response.split()
    mrid=len(manipulated_response)-1
    print user_hash+'::'+ manipulated_response[mrid]
    
    print 'http://md5.thekaine.de/'
    readurl=urllib.urlopen('http://md5.thekaine.de/?hash='+user_hash)
    response=readurl.read()
    line=re.compile('<td colspan="2"><br><br><b>'+'\S+'+'\s+'+'\S+'+'\s+')
    found_s=line.search(response).group()
    password_=found_s[27:-25]
    print user_hash+'::'+ password_
    
    print 'http://md5.my-addr.com/'
    values_p=urllib.urlencode({'md5':user_hash})
    readurl=urllib.urlopen("http://md5.my-addr.com/md5_decrypt-md5_cracker_online/md5_decoder_tool.php",values_p)
    response=readurl.read()
    line=re.compile('Hashed string'+'\S+'+'\s+'+'\S+'+'\s+'+'\S+')
    found_response=line.search(response).group()
    list_found_response=found_response.split()
    password_=list_found_response[2][:-6]
    print user_hash + '::' + password_
    
    print 'http://md5.net/'
    values_p=urllib.urlencode({'hash':user_hash})
    readurl=urllib.urlopen("http://www.md5.net/cracker.php",values_p)
    response=readurl.read()
    match = search (r'<input type="text" id="hash" size="32" value="[^"]*"/>', response)
    password_=match.group().split('"')[7]
    print user_hash + '::' + password_
    
    print 'http://hashchecker.com/'
    values_p=urllib.urlencode({'search_field':user_hash})
    readurl=urllib.urlopen("http://hashchecker.com/index.php?_sls=search_hash",values_p)
    response=readurl.read()
    line=re.compile('Your md5 hash is :'+'\S+'+'\s+'+'\S+'+'\s+'+'\S+')
    found_response=line.search(response).group()
    list_found_response=found_response.split()
    password_=list_found_response[6][3:-4]
    print user_hash + '::' + password_
    
except:
    pass

Όταν εκτελούμε το συγκεκριμένο script, ζητά αρχικά να του δώσουμε το MD5 hash που θέλουμε να αντιστρέψουμε. Ας δούμε τι θα γίνει αν το εκτελέσουμε και του δώσουμε το hash “21232f297a57a5a743894a0e4a801fc3” (χωρίς τα εισαγωγικά, παράδειγμα εκτέλεσης σε BackTrack Linux):

root@bt:~# python md5cracker.py
Enter Hash:~# 21232f297a57a5a743894a0e4a801fc3
http://md5.gromweb.com/
21232f297a57a5a743894a0e4a801fc3::admin
http://md5.hashcracking.com/
21232f297a57a5a743894a0e4a801fc3::admin
http://md5.thekaine.de/
21232f297a57a5a743894a0e4a801fc3::not
http://md5.my-addr.com/
21232f297a57a5a743894a0e4a801fc3::admin
http://md5.net/
21232f297a57a5a743894a0e4a801fc3::admin
http://hashchecker.com/
21232f297a57a5a743894a0e4a801fc3::admin

Όπως βλέπετε, το προγραμματάκι μας βρήκε το συγκεκριμένο hash σε πέντε βάσεις δεδομένων και, ταυτόχρονα, ανακάλυψε τη λέξη από την οποία παράγεται (admin). Αν το MD5 hash προερχόταν από το αρχείο με τους κωδικούς ενός μηχανήματος, αυτή τη στιγμή θα ζητωκραυγάζαμε και φυσικά θα ενημερώναμε σχετικά τον υπεύθυνο διαχειριστή.

Δομή και λειτουργία του κώδικα
Το script ξεκινά με την ενσωμάτωση των απαραίτητων βιβλιοθηκών. Στη συνέχεια, ζητάει από το χρήστη να δώσει το προς αντιστροφή MD5 hash. Για το σκοπό αυτό χρησιμοποιείται η συνάρτηση raw_input και το string που εισαγάγει ο χρήστης καταχωρείται στη μεταβλητή user_hash. Στη συνέχεια, το πρόγραμμα αναζητά το συγκεκριμένο hash σε έξι βάσεις δεδομένων. Αυτές οι αναζητήσεις γίνονται διαδοχικά και με την ίδια λογική: Το πρόγραμμα στέλνει το hash και διαβάζει την απάντηση του server. Εξετάζοντας την απάντηση κι ελέγχοντας αν περιλαμβάνει συγκεκριμένες λέξεις ή μοτίβα χαρακτήρων, το πρόγραμμα συμπεραίνει αν η αναζήτηση ήταν επιτυχής ή όχι και τυπώνει τα αντίστοιχα μηνύματα.

Αν και η γενική λογική που ακολουθεί το πρόγραμμα είναι πάντα ίδια για όλες τις βάσεις, η υλοποίηση της ίδιας της αναζήτησης διαφέρει! Βλέπετε, κάθε βάση δεδομένων διαθέτει στην ιστοσελίδα της μια διαφορετική φόρμα για την εισαγωγή του προς αντιστροφή MD5 hash. Επιπρόσθετα, οι φόρμες αναζήτησης των βάσεων στηρίζονται ενίοτε και σε διαφορετικούς μηχανισμούς. Σε ορισμένες βάσεις το προς αντιστροφή hash μεταφέρεται με τη μέθοδο POST, ενώ σε κάποιες άλλες με τη μέθοδο GET. Κατά συνέπεια, το πρόγραμμά μας δεν θα μπορούσε να στέλνει με τον ίδιο τρόπο το MD5 hash σε *κάθε* βάση δεδομένων. Εξάλλου, εκτός από τον τρόπο αποστολής των δεδομένων, οι βάσεις διαφοροποιούνται κι ως προς τη μορφή των απαντήσεων που επιστρέφουν. Επομένως, το πρόγραμμα θα πρέπει κάθε φορά να ελέγχει για την παρουσία διαφορετικών λέξεων, ώστε να συμπεράνει αν μια αναζήτηση ήταν επιτυχής ή όχι. Με λίγα λόγια, ενώ η συμπεριφορά του προγράμματος παραμένει σταθερή, η λειτουργία του είναι προσαρμοσμένη στη συμπεριφορά της εκάστοτε βάσης δεδομένων. Τέλος, αν σας αρέσει η Python αλλά και το συγκεκριμένο script, θα σας προτείναμε να βρείτε πρόσθετες βάσεις δεδομένων και να επεκτείνεται τον κώδικα κατάλληλα, ώστε να ψάχνει και σ’ αυτές. Καλή τύχη στις αναζητήσεις και περιμένουμε ν’ ακούσουμε για τα κατορθώματά σας!

4 Responses to “MD5 reversing, the not-so-brutal way!”

  1. user | 05/10/2012 at 16:53

    Σε salted MD5 hashes η παραπάνω τεχνική αποτυγχάνει

  2. mara | 26/05/2013 at 22:37

    Τρέχω το script.. με το hash που βλέπετε… και λαμβάνω το παρακάτω output…
    δε συνεχίζει.. σταματά εκεί.. έχετε καμιά ιδέα γιατί μπορεί να συμβαίνει αυτό??
    Ευχαριστώ!!

    Enter Hash:~# 298117cc4678b68d44b32138cd86df35
    http://md5.gromweb.com/
    298117cc4678b68d44b32138cd86df35::
    http://md5.hashcracking.com/
    298117cc4678b68d44b32138cd86df35::returned.
    http://md5.thekaine.de/

  3. doctor_g | 27/05/2013 at 12:31

    Αγαπητή @mara

    Tο συγκεκριμένο script δεν υπολογίζει όλα τα MD5, μας δίνει μια ιδέα για το πως μπορούμε να επικοινωνήσουμε με διάφορα MD5 reverse sites όπως http://md5.gromweb.com/ , http://md5.hashcracking.com/ , http://md5.thekaine.de/ κλπ. Με αυτό τον τρόπο η αντιστροφή του MD5 γίνεται online απομακρυσμένα σε άλλους υπολογιστές και όχι στο δικό μας υπολογιστή. Εμείς απλά, μόλις γίνει ο υπολογισμός του MD5 συλλέγουμε την απόκριση ( response ) και την παρουσιάζουμε στο χρήστη. Για να γίνει ακόμη αποτελεσματικότερο το συγκεκριμένο script πρέπει να βελτιωθεί σε πολλά επίπεδα. Για παράδειγμα, πρέπει να προστεθούν περισσότερα sites με δυνατότητες online reverse MD5 cracking. Επιπρόσθετα, θα μπορούσε να προστεθεί η δυνατότητα υπολογισμού salted MD5 Hashes όπως έγραψε και ο πρώτος χρήστης ( @user ) . Προσπάθησε να βελτιώσεις το script προσθέτοντας περισσότερα reverse MD5 sites.

    Με τιμή Dr@G

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων