Reverse Engineering σε περιβάλλον Linux, Μέρος 2: Το /proc filesystem
Description: This is issue 34 of Magaz, the Hellenic LinuxMagazine
Keywords: magaz hellenic greek hellas greece hellug linux magazine

Magaz, The Greek Linux Magazine
Τεύχος #34
Περιληπτικά Περιεχόμενα Αναλυτικά Περιεχόμενα Mirrors Links Πληροφορίες Συντάκτες Αναζήτηση Επικοινωνία
- Επόμενο Προηγούμενο Περιεχόμενα ### 4. Το /proc filesystem ### 4.1 Τι είναι το /proc filesystem To /proc είναι ένα εικονικό σύστημα αρχείων το οποίο μας δίνει τη δυνατότητα να πάρουμε πληροφορίες από τις δομές δεδομένων του πυρήνα. Είναι εικονικό με την έννοια ότι τα αρχεία που βλέπουμε δεν έχουν κάποια φυσική υπόσταση (πχ δεν βρίσκονται σε κάποια συσκευή). Τα περισσότερα αρχεία μπορούν να ανοιχτούν μόνο για ανάγνωση. Με ένα "man proc" θα λάβετε ότι πληροφορίες για το /proc θέλετε και δε θέλετε να μάθετε :) ### 4.2 Γενικές πληροφορίες για το σύστημα Στο βασικό κατάλογο /proc υπάρχει ένα πλήθος από αρχεία και καταλόγους. Κάποια από αυτά περιέχουν ολόκληρες δομές πληροφοριών, ενώ άλλα απλώς την τιμή μιας συγκεκριμένης μεταβλητής του πυρήνα. Τα περισσότερα αρχεία έχουν ονόματα που αυτοεξηγούνται. Κάποια κύρια είναι: /proc/<num> (directory) : Οι κατάλογοι που το όνομα τους είναι ένας αριθμός, περιέχουν πληροφορίες για τη διεργασία με τον συγκεκριμένο process id. Θα τους εξετάσουμε αναλυτικά σε λίγο. /proc/self (directory) : Symbolic link στον κατάλογο που περιέχει πληροφορίες για την τρέχουσα διεργασία /proc/ide (directory) : Πληροφορίες για τις συσκευές που είναι συνδεδεμένες στο ide bus. /proc/sys (directory) : Πλήθος πληροφοριών για το σύστημα και τον πυρήνα. /proc/cpuinfo : Πληροφορίες για τον επεξεργαστή μας και τα bugs του :) /proc/filesystems : Λίστα από τα filesystem που υποστηρίζει ο πυρήνας. /proc/meminfo : Πληροφορίες για τη χρήση της μνήμης στο σύστημα σας. /proc/modules : Ποια modules είναι φορτωμένα στον πυρήνα. Αυτό χρησιμοποιεί και η lsmod. /proc/interrupts : Από ποιες συσκευές πηγάζουν τα hardware interrupts. /proc/partitions : Λίστα με όλα τα partitions στον υπολογιστή (άσχετα αν είναι mounted η όχι). /proc/mounts : Λίστα με όλα τα mounted directories. (link στο self/mounts) ### 4.3 Πληροφορίες για μια διεργασία Αν και το /proc filesystem περιέχει τεράστιο όγκο πληροφοριών, αυτές που είναι πραγματικά χρήσιμες για κάποιον που επιδίδεται στο RCE είναι οι πληροφορίες περί διεργασιών. Αυτές βρίσκονται στον κατάλογο με αριθμό (όνομα) το pid της διεργασίας. Ο κατάλογος περιέχει: /cwd (directory link): link στον τρέχον κατάλογο της διεργασίας (current working directory). /fd (directory) : Περιέχει links στα ανοικτά αρχεία της διεργασίας. Πχ το link για το αρχείο με file descriptor 2 είναι fd/2. /root (directory link): link στο root directory του filesystem στο οποίο εκτελείται η διεργασία (συνήθως "/" ). cmdline : Η πλήρης γραμμή εντολής με την οποία κλήθηκε η διεργασία. environ : Λίστα με τις enviroment variables που βλέπει η διεργασία. exe (link) : link στο εκτελέσιμο από το οποίο δημιουργήθηκε η διεργασία. maps : Το memory map της διεργασίας. Για παράδειγμα για την εντολή less:
      Virtual Address   Perm  Offset  Device  INode        Path
      08048000-08060000 r-xp 00000000 03:07 1457441    /usr/bin/less
      08060000-08061000 rw-p 00018000 03:07 1457441    /usr/bin/less
      08061000-0806a000 rwxp 00000000 00:00 0
      40000000-40014000 r-xp 00000000 03:07 615324     /lib/ld-2.3.1.so
      40014000-40015000 rw-p 00014000 03:07 615324     /lib/ld-2.3.1.so
      40026000-40059000 r-xp 00000000 03:07 615315     /lib/libncurses.so.5.3
      40059000-40062000 rw-p 00032000 03:07 615315     /lib/libncurses.so.5.3
      40062000-40063000 rw-p 00000000 00:00 0
      40063000-4018d000 r-xp 00000000 03:07 615327     /lib/libc-2.3.1.so
      4018d000-40192000 rw-p 0012a000 03:07 615327     /lib/libc-2.3.1.so
      40192000-40196000 rw-p 00000000 00:00 0
      40196000-40396000 r--p 00000000 03:07 745906     /usr/lib/locale/locale-archive
      40396000-403c9000 r--p 00507000 03:07 745906     /usr/lib/locale/locale-archive
      bfffc000-c0000000 rwxp ffffd000 00:00 0
Η πρώτη στήλη και η δεύτερη δίνουν το πεδίο εικονικών διευθύνσεων που καταλαμβάνει το segment και τα διακαιώματα του, αντίστοιχα. Η τρίτη είναι το offset στο οποίο βρίσκεται το segment στο αρχείο από το οποίο φορτώθηκε. Οι υπόλοιπες στήλες δίνουν το device major:minor number, το ΙNode και το πλήρες path του αρχείο αυτού. Παρατηρήστε πως όλα τα shared object φορτώνονται στη διεύθυνση 0x40000000 και πάνω. Επιπλέον το τελευταίο segment περιέχει το σωρό. Το γεγονός ότι από default είναι executable (-x- flag) είναι η ρίζα του κακού για τα buffer overflow exploits. mem : Η ίδια η μνήμη της διεργασίας. Διαβάζοντας και γράφοντας στο αρχείο αυτό, προσπελαύνουμε κατευθείαν τη μνήμη της διεργασίας. Προφανώς πρέπει να έχουμε τα κατάλληλα δικαιώματα. mounts : Λίστα με όλα τα mounted directories. (link στο self/mounts) stat : Η κατάσταση της διεργασίας (αλά ps). statm : Πληροφορίες για την κατάσταση της μνήμης. status : Πληροφορίες από τα δύο παραπάνω αρχεία σε πιο ευανάγνωστη μορφή. Οι πιο χρήσιμες (για RCE) από τις παραπάνω πληροφορίες είναι αυτές που δίνονται από τα fd/, map, cmdline και exe. Ειδικά το τελευταίο έχει μια ενδιαφέρουσα χρήση. Ακόμα και αν διαγράψουμε το εκτελέσιμο αρχείο μιας διεργασίας ενώ εκτελείται, μπορούμε να έχουμε πρόσβαση σε αυτό μέσω του exe! Επόμενο Προηγούμενο Περιεχόμενα