/etc/passwd – /etc/shadow και john the ripper

ΣΗΜΕΙΩΣΗ: ΑΥΤΗ Η ΔΗΜΟΣΙΕΥΣΗ ΕΧΕΙ ΓΙΝΕΙ ΠΑΝΩ ΑΠΟ ΕΝΑ ΧΡΟΝΟ ΠΡΙΝ!

Εισαγωγή

Στον παρακάτω οδηγό θα προσπαθήσω να δώσω μια, όσο γίνεται πιο απλή, εξήγηση των περιεχομένων αυτών των δυο σημαντικών (για την ασφάλεια και σωστή λειτουργία του συστήματος) αρχείων, καθώς θα παρουσιάσω και μια μέθοδο ελέγχου των κωδικών των χρηστών του συστήματος. Λέγοντας «μέθοδο ελέγχου» εννοώ κατά πόσον οι κωδικοί αυτοί είναι τόσο ισχυροί ώστε να μην σπάνε εύκολα.
Έναν τέτοιο έλεγχο θα μπορούσε να κάνει ένας διαχειριστής (admin – root) ενός Linux συστήματος, όταν αυτό διαθέτει πολλούς χρήστες, ώστε να βρει (και να επισημάνει) κάποια αδυναμία στους κωδικούς αυτών(των χρηστών).
Ως διανομή επίδειξης θα χρησιμοποιήσουμε το Ubuntu Linux, περιμένω όμως ο συγκεκριμένος οδηγός να λειτουργεί εξίσου καλά και σε άλλες διανομές Linux.


 

Περιεχόμενα

  1. Επεξήγηση του /etc/passwd
  2. Επεξήγηση του /etc/shadow
  3. John the Ripper και έλεγχος κωδικών
  4. Σημειώσεις


 

Επεξήγηση του /etc/passwd

πίσω στα περιεχόμενα →
Το αρχείο passwd είναι ένα αρχείο ρυθμίσεων το οποίο περιέχει σημαντικές πληροφορίες για τους λογαριασμούς όλων των χρηστών του συστήματος. Το αρχείο αυτό το χρησιμοποιούν κάποιες εφαρμογές ώστε να πάρουν πληροφορίες οι οποίες χρειάζονται (σχετικά με τον χρήστη). Γι’ αυτό το λόγο το passwd έχει δικαιώματα ανάγνωσης από όλους.
Φυσικά ένα τέτοιο αρχείο δεν θα μπορούσε να έχει ως ιδιοκτήτη κάποιον άλλο εκτός από τον χρήστη root, ο οποίος είναι και ο μοναδικός που έχει δικαιώματα εγγραφής/τροποποίησης του αρχείου.
Για να δούμε τα δικαιώματα του αρχείου μπορούμε να τρέξουμε μια από τις παρακάτω εντολές:

ls -l /etc/passwd 
stat -c %a,%n /etc/passwd

Δείγμα εξόδου:
tutorial1

Για να δούμε τα περιεχόμενα του αρχείου, τα οποία θα εξηγήσουμε, μπορούμε να χρησιμοποιήσουμε τον less pager.

less /etc/passwd

Βγαίνουμε με το πλήκτρο q(uit).
Δείγμα εξόδου:
tutorial2

Διαβάζουμε τα περιεχόμενα ως γραμμές και όχι ως στήλες.
Το συγκεκριμένο αρχείο αποτελείται από επτά τμήματα τα οποία χωρίζονται μεταξύ τους με την άνω-κάτω τελεία (colon) :
Πάμε να δούμε τα τμήματα αυτά ένα προς ένα, αρχίζοντας από αριστερά.
1. Όνομα χρήστη(username): Εδώ αναφέρει το όνομα του χρήστη στον οποίο ανήκει ο λογαριασμός.
2. Κωδικός χρήστη(password): Εδώ αναφέρει αν ο χρήστης έχει κωδικό. Δεν αναφέρει τον πραγματικό του κωδικό βέβαια, αλλά το (x) δείχνει ότι υπάρχει κωδικός και είναι αποθηκευμένος και κρυπτογραφημένος στο αρχείο /etc/shadow (που θα δούμε παρακάτω).
3. UID: Γίνεται αναφορά στο UID (User IDentifier). Κάθε χρήστης έχει διαφορετικό UID.
4. GID: Παρόμοιο με το UID, GID=Group IDentifier. Δηλώνει τον αναγνωριστικό αριθμό του group στο οποίο ανήκει ο χρήστης (ή το οποίο ανήκει στον χρήστη). Μπορούμε να δούμε τα groups στο αρχείο /etc/group.
5. Σχόλιο(comment field): Το σχόλιο δηλώνει (συνήθως) σε ποιόν ανήκει ο λογαριασμός. Μπορεί όμως να είναι διαφορετικό από το όνομα χρήστη (username) και να αναφέρει κάτι άλλο.
6. Προσωπικός κατάλογος χρήστη(user home directory): Δηλώνει την τοποθεσία του προσωπικού καταλόγου του χρήστη.
7. Κέλυφος(shell): Δηλώνει το κέλυφος το οποίο χρησιμοποιεί ο χρήστης.

Ας πάρουμε ως παράδειγμα τον χρήστη nicktux όπως φαίνεται στην εικόνα. Βάσει των παραπάνω γνωρίζουμε ότι:

  • username = nicktux, password = set, UID = 1000, GID = 1000, Comment = nicktux, Shell = /bin/bash

Δεν προτείνεται να κάνουμε επεξεργασία σε αυτό το αρχείο απευθείας. Υπάρχουν εντολές που μπορούν να επεξεργαστούν αυτό το αρχείο, όπως πχ η εντολή usermod.

 

Επεξήγηση του /etc/shadow

πίσω στα περιεχόμενα →
Το αρχείο /etc/shadow μπορεί να θεωρηθεί σημαντικότερο του /etc/passwd και αυτό διότι περιέχει τους πραγματικούς κωδικούς των χρηστών, ακόμη και αν αυτοί βρίσκονται σε κρυπτογραφημένη μορφή.
Αυτό μπορούμε να το καταλάβουμε γρήγορα ρίχνοντας μια ματιά στα δικαιώματα του αρχείου και κάνοντας μια σύγκριση με το /etc/passwd.

ls -l /etc/shadow 
stat -c %n,%a /etc/shadow

Δείγμα εξόδου:
shadow
Βλέπουμε ότι δικαιώματα ανάγνωσης έχει μόνον ο χρήστης root και όσοι χρήστες ανήκουν στο group shadow.
Για να διαβάσουμε τα περιεχόμενα του αρχείου, θα πρέπει να αποκτήσουμε πρώτα δικαιώματα root και έπειτα να χρησιμοποιήσουμε (πάλι) τον less pager. Οπότε χρησιμοποιούμε πρώτα την εντολή:

sudo -i

και έπειτα

less /etc/shadow

Δείγμα εξόδου:
shadow2
Αυτή τη φορά έχουμε οκτώ (αντί για επτά) διαφορετικά πεδία, τα οποία όμως πάλι χωρίζονται μεταξύ τους με την άνω-κάτω τελεία :

nicktux:$6$K7WD.uDG$UCeJzOna5tbn47tHVLtp573tc8eUC01r6RN0bm0ImBpMzObjTDcCga8BC15hqhnaddnscFnpuiresJ51GNEJl0:16673:0:99999:7:::


1. Όνομα χρήστη(username): Εδώ αναφέρει το όνομα του χρήστη στον οποίο ανήκει ο λογαριασμός. Είναι εκείνο που πρέπει να χρησιμοποιηθεί για να γίνει εισαγωγή στο σύστημα.
2. Κωδικός(password): Εδώ βλέπουμε τον πραγματικό κωδικό, βέβαια σε κρυπτογραφημένη μορφή. Έχει κι αυτός την δική του εξήγηση(θα το δούμε παρακάτω)
3. Τελευταία αλλαγή κωδικού: Δείχνει πότε έγινε η τελευταία αλλαγή κωδικού, βάσει του UNIX ημερολογίου το οποίο ξεκινάει από την 1η-Ιανουαρίου-1970. Από τότε δηλαδή, πόσες μέρες έχουν περάσει από την τελευταία αλλαγή.
4. Ελάχιστος αριθμός ημερών: Δηλώνει πόσες μέρες πρέπει να περάσουν για να μπορεί ο χρήστης να αλλάξει κωδικό.
5. Εγκυρότητα κωδικού: Δηλώνει για πόσες μέρες ο κωδικός του χρήστη είναι έγκυρος. Μετά το πέρας των ημερών αυτών, ο χρήστης δεν θα μπορεί να εισέλθει πλέον στο σύστημα.
6. Εκκίνηση περιόδου προειδοποίησης: Αυτό το πεδίο δηλώνει σε πόσες μέρες ο χρήστης θα ξεκινήσει να λαμβάνει προειδοποιήσεις για την λήξη του κωδικού του.
7. Αδράνεια λογαριασμού: Δείχνει τον αριθμό των ημερών μετά το πέρας των οποίων ο λογαριασμός του χρήστη θα αδρανοποιηθεί.
8. Χρόνος αδράνειας λογαριασμού: Δείχνει πόσες μέρες έχουν περάσει (βάσει του UNIX ημερολογίου) από τότε που ο λογαριασμός έχει απενεργοποιηθεί.


 

Μη έγκυροι χαρακτήρες

πίσω στα περιεχόμενα →
Αν στο πεδίο του κωδικού δούμε μη έγκυρους χαρακτήρες, όπως αστερίσκο (*) ή θαυμαστικό (!), αυτό σημαίνει ότι ο συγκεκριμένος χρήστης δεν έχει δικαίωμα εισόδου στο σύστημα.
Επιπροσθέτως και συγκεκριμένα αν δούμε θαυμαστικό (!), αυτό σημαίνει ότι ο συγκεκριμένος λογαριασμός είναι κλειδωμένος.

shadow3

Στην παραπάνω εικόνα βλέπουμε ότι ο λογαριασμός του χρήστη root είναι κλειδωμένος.
Αυτό μπορούμε να το πιστοποιήσουμε και με μια άλλη εντολή:

sudo passwd -aS | grep root

Δείγμα εξόδου:
locked
Το (L) δηλώνει ότι ο συγκεκριμένος χρήστης έχει έναν κλειδωμένο κωδικό (λογαριασμό).

 

Ανάλυση του κρυπτογραφημένου κωδικού

πίσω στα περιεχόμενα →
Έχουμε τον κρυπτογραφημένο κωδικό του χρήστη nicktux ο οποίος είναι

$6$K7WD.uDG$UCeJzOna5tbn47tHVLtp573tc8eUC01r6RN0bm0ImBpMzObjTDcCga8BC15hqhnaddnscFnpuiresJ51GNEJl0

Ο κωδικός χωρίζεται και αυτός σε πεδία και ως οριοθέτηση μεταξύ των πεδίων ορίζεται το σύμβολο του δολαρίου ($).

  1. Αλγόριθμος κρυπτογράφησης: Το πρώτο πεδίο
    $6$

    δηλώνει τον αλγόριθμο κρυπτογράφησης. Ο αριθμός 6 συγκεκριμένα δείχνει ότι έχει χρησιμοποιηθεί SHA-512.

  2. Τιμή salt(salt value): Αυτό το πεδίο

    $K7WD.uDG$

    δηλώνει την τιμή salt. Οι τιμές αυτές χρησιμοποιούνται για να κάνουν την κρυπτογράφηση ισχυρότερη. Η τιμή salt δεν περιέχει τα σύμβολα του δολαρίου. Δηλαδή είναι: K7WD.uDG

  3. Κωδικός: Το τρίτο και τελευταίο πεδίο

    $UCeJzOna5tbn47tHVLtp573tc8eUC01r6RN0bm0ImBpMzObjTDcCga8BC15hqhnaddnscFnpuiresJ51GNEJl0

    είναι ο κρυπτογραφημένος κωδικός, του οποίου η κρυπτογράφηση έχει δεχθεί και την τιμή της salt μέσα.

Για να καταλάβουμε λίγο πως λειτουργεί, θα προσπαθήσουμε να δημιουργήσουμε ακριβώς τον ίδιο κρυπτογραφημένο κωδικό, γνωρίζοντας βέβαια τον αποκρυπτογραφημένο, καθώς και το salt value, όπως και τον αλγόριθμο κρυπτογράφησης.

Η εντολή που χρησιμοποιούμε εδώ είναι η παρακάτω:

python -c 'import crypt; print crypt.crypt("PASSWORD", "$ALGORITHM$SALT_VALUE")'

Έχουμε λοιπόν τα εξής στοιχεία:

  • Κωδικός χρήστη nicktux: nicktux@wordpress
  • Αλγόριθμος κρυπτογράφησης: SHA-512 (6)
  • Salt Value: K7WD.uDG

Οπότε:

python -c 'import crypt; print crypt.crypt("nicktux@wordpress", "$6$K7WD.uDG")'

Επιθυμητό αποτέλεσμα:

$6$K7WD.uDG$UCeJzOna5tbn47tHVLtp573tc8eUC01r6RN0bm0ImBpMzObjTDcCga8BC15hqhnaddnscFnpuiresJ51GNEJl0

Δείγμα εξόδου:
shadow-password

 

John the Ripper και έλεγχος κωδικών

πίσω στα περιεχόμενα →
Το πρόγραμμα John the Ripper (το οποίο το αποκαλούμε σκέτο john για λόγους συντομίας), είναι ένα αρκετά ισχυρό πρόγραμμα αποκρυπτογράφησης κωδικών. Εδώ θα ασχοληθούμε μόνον σε ότι αφορά τους κωδικούς χρηστών του συστήματος, σε σχέση με τα αρχεία /etc/passwd και /etc/shadow που είδαμε παραπάνω.
Το συγκεκριμένο πρόγραμμα έχει πάρα πολλές άλλες δυνατότητες και το διαδίκτυο σφύζει από οδηγούς και τεκμηρίωση σχετικά με το πως μπορείτε να το χρησιμοποιήσετε για κάθε διαφορετικό σκοπό.

Αυτό που πρέπει να κάνουμε κατ’ αρχήν είναι να το εγκαταστήσουμε:

sudo apt-get install -y john

Έπειτα θα συνδυάσουμε τα δυο αρχεία (/etc/passwd και /etc/shadow) και θα αποθηκεύσουμε τα αποτελέσματα σε ένα νέο αρχείο. Γι’ αυτό το σκοπό θα χρησιμοποιήσουμε την εντολή unshadow.

sudo unshadow /etc/passwd /etc/shadow > unshadowed.txt

Το αρχείο unshadowed.txt αποτελείται από τα, κατάλληλα συνδυασμένα ώστε να μπορεί να τα διαβάσει το πρόγραμμα john, περιεχόμενα των /etc/passwd και /etc/shadow. Μπορούμε να το διαβάσουμε με έναν κειμενογράφο.
Αυτό το αρχείο περιέχει όλους τους χρήστες του συστήματος.

Τώρα θα καλέσουμε το πρόγραμμα john με την παράμετρο users:USERNAME ώστε να ξεκινήσει η αποκρυπτογράφηση. Χρησιμοποιούμε αυτή την παράμετρο (-users) γιατί διαφορετικά θα ξεκινήσει να αποκρυπτογραφεί όλους τους χρήστες που περιέχει μέσα το αρχείο unshadowed.txt.
Εμείς εδώ επικεντρώνουμε το ενδιαφέρον μας μόνον στον χρήστη nicktux.

sudo john -users:nicktux unshadowed.txt

Δείγμα εξόδου:john1
Θα πρέπει να γνωρίζουμε ότι το πρόγραμμα John καταναλώνει αρκετή επεξεργαστική ισχύ (CPU).
Στο παραπάνω παράδειγμα χρησιμοποιείται το αρχείο /etc/john/john.conf, το οποίο περιέχει λέξεις και κανόνες, του οποίου τα περιεχόμενα διαβάζει το πρόγραμμα προσπαθώντας να αποκρυπτογραφήσει τον κωδικό.
Εμείς εδώ, για να δείξουμε πως είναι μια επιτυχημένη αποκρυπτογράφηση, θα δημιουργήσουμε ένα δικό μας αρχείο ονόματι wordlist.txt, το οποίο θα περιέχει μέσα τον πραγματικό κωδικό του χρήστη nicktux.

Θα μπορούσαμε να το κάνουμε προσθέτοντας τον πραγματικό κωδικό στο κατάλληλο πεδίο μέσα στο αρχείο /etc/john/john.conf, αλλά προτιμούμε το wordlist.txt για να δείξουμε και αυτή την παράμετρο.
Επίσης, το αρχείο john.conf προτείνεται να το επεξεργάζεστε μόνον αν ξέρετε πολύ καλά τι κάνετε.

wordlist.txt
Έχουμε δημιουργήσει το παραπάνω αρχείο το οποίο περιέχει κάποιες λέξεις κλειδιά. Καλώντας τώρα το πρόγραμμα john με την παράμετρο wordlist:FILE, θα δούμε τα αποτελέσματα.

sudo john -users:nicktux -wordlist:wordlist.txt unshadowed.txt

Δείγμα εξόδου:
john2
Βλέπουμε ότι ο κωδικός αποκρυπτογραφήθηκε.
Μπορούμε επίσης να χρησιμοποιήσουμε την παράμετρο –show σε συνδυασμό με το αρχείο unshadowed.txt για να δούμε τον κωδικό.

sudo john --show unshadowed.txt

Δείγμα εξόδου:
johnshow
Αν προσέξουμε το αποτέλεσμα θα δούμε ότι είναι ίδιο με τα περιεχόμενα του αρχείου /etc/passwd, που αφορούν τον χρήστη nicktux, με μια διαφορά: Το (x) έχει αντικατασταθεί πλέον από τον πραγματικό κωδικό.

 

Σημειώσεις

πίσω στα περιεχόμενα →

  • Το αρχείο /etc/passwd είναι ένα σημαντικό αρχείο του συστήματος. Έχει δικαιώματα ανάγνωσης από όλους και δικαιώματα τροποποίησης μόνον από τον χρήστη root. Περιέχει επτά πεδία που χωρίζονται μεταξύ τους με άνω-κάτω τελεία.
  • Το αρχείο /etc/shadow περιέχει σημαντικά στοιχεία για τους χρήστες του συστήματος. Τόσο σημαντικά ώστε να απαγορεύεται η ανάγνωσή του σε όλους, εκτός των διαχειριστών. Περιέχει οκτώ πεδία που χωρίζονται μεταξύ τους με άνω-κάτω τελεία.
  • Το πρόγραμμα John The Ripper(john) μπορεί να χρησιμοποιηθεί για να ελεγχθεί η ισχύς(αντοχή) ενός κωδικού σε ενδεχόμενη επίθεση.
  • Πρωταρχικές πηγές όλων των παραπάνω είναι οι σελίδες τεκμηρίωσης οι οποίες μπορούν να διαβαστούν με την εντολή man.
    man passwd
    man 5 passwd
    man 5 shadow
    man unshadowed
    man crypt
    man john
    

Γνωρίζω ότι τον συγκεκριμένο οδηγό θα μπορούσα να τον έχω σπάσει σε τρεις ξεχωριστούς, προτίμησα όμως να τον γράψω ως έναν διότι θεωρώ πως είναι πιο αποτελεσματικός, μιας και όλα στα οποία αναφέρεται έχουν μια κάποια σχέση μεταξύ τους.

2 thoughts on “/etc/passwd – /etc/shadow και john the ripper

  1. Ωραία τα λες, μπράβο σου! :)
    Αν μπορούσες πάντως να μας έκανες μια ακόμη ανάλυση ενός κρυπτογραφημένου κωδικού όσο πιο αναλυτικά γίνεται θα βοηθούσε…

    Όπως επίσης αν μπορούσες να μας έδινες και μερικές επεξηγήσεις για το τι είναι το αλγόριθμο κρυπτογράφησης, πως με τον αριθμό 6 καταλαβαίνεις ότι χρησιμοποιεί SHA-512 και τι είναι η τιμή salt .

    Ευχαριστώ πάρα πολύ. :)

    1. Θα σου δώσω 3 link αν θέλεις να ξεκινήσεις το διάβασα περί αυτών που είπες. Είναι τα βασικά, η αρχή που λένε, αλλά είναι ένα μέρος για να ξεκινήσεις.
      1) Salt Value
      https://en.wikipedia.org/wiki/Salt_(cryptography)
      2) Secure Hash Algorithm
      https://en.wikipedia.org/wiki/Secure_Hash_Algorithm
      3) Crypt(3) man page
      http://man7.org/linux/man-pages/man3/crypt.3.html
      Στο παραπάνω γράφει και τον πίνακα με τις αντιστοιχίες πχ SHA-512 (6) , MD5 (1) …κλπ.

Συμβάλετε κι εσείς με ένα σχόλιο

Εισάγετε τα παρακάτω στοιχεία ή επιλέξτε ένα εικονίδιο για να συνδεθείτε:

Λογότυπο WordPress.com

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό WordPress.com. Αποσύνδεση / Αλλαγή )

Φωτογραφία Twitter

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Twitter. Αποσύνδεση / Αλλαγή )

Φωτογραφία Facebook

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Facebook. Αποσύνδεση / Αλλαγή )

Φωτογραφία Google+

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Google+. Αποσύνδεση / Αλλαγή )

Σύνδεση με %s