euid, ruid, suid
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Μεταβλητές Ταυτοποίησης Χρήστη
ruid: Ο πραγματικός αναγνωριστικός αριθμός χρήστη δηλώνει τον χρήστη που ξεκίνησε τη διαδικασία.euid: Γνωστός ως ο επιχειρησιακός αναγνωριστικός αριθμός χρήστη, αντιπροσωπεύει την ταυτότητα χρήστη που χρησιμοποιείται από το σύστημα για να προσδιορίσει τα δικαιώματα της διαδικασίας. Γενικά, τοeuidαντικατοπτρίζει τοruid, εκτός από περιπτώσεις όπως η εκτέλεση ενός εκτελέσιμου αρχείου SetUID, όπου τοeuidαναλαμβάνει την ταυτότητα του ιδιοκτήτη του αρχείου, παρέχοντας έτσι συγκεκριμένα δικαιώματα λειτουργίας.suid: Αυτός ο αποθηκευμένος αναγνωριστικός αριθμός χρήστη είναι κρίσιμος όταν μια διαδικασία υψηλών δικαιωμάτων (συνήθως εκτελείται ως root) χρειάζεται προσωρινά να παραιτηθεί από τα δικαιώματά της για να εκτελέσει ορισμένα καθήκοντα, μόνο για να ανακτήσει αργότερα την αρχική της ανυψωμένη κατάσταση.
Σημαντική Σημείωση
Μια διαδικασία που δεν λειτουργεί υπό root μπορεί να τροποποιήσει το euid της μόνο για να ταιριάζει με το τρέχον ruid, euid ή suid.
Κατανόηση των Λειτουργιών set*uid
setuid: Αντίθετα με τις αρχικές υποθέσεις, τοsetuidτροποποιεί κυρίως τοeuidπαρά τοruid. Συγκεκριμένα, για τις προνομιούχες διαδικασίες, ευθυγραμμίζει τοruid,euidκαιsuidμε τον καθορισμένο χρήστη, συχνά τον root, εδραιώνοντας αποτελεσματικά αυτούς τους αναγνωριστικούς αριθμούς λόγω του υπερκαλύπτοντοςsuid. Λεπτομερείς πληροφορίες μπορούν να βρεθούν στη σελίδα man του setuid.setreuidκαιsetresuid: Αυτές οι λειτουργίες επιτρέπουν την λεπτομερή προσαρμογή τωνruid,euidκαιsuid. Ωστόσο, οι δυνατότητές τους εξαρτώνται από το επίπεδο προνομίων της διαδικασίας. Για διαδικασίες που δεν είναι root, οι τροποποιήσεις περιορίζονται στις τρέχουσες τιμές τωνruid,euidκαιsuid. Αντίθετα, οι διαδικασίες root ή αυτές με την ικανότηταCAP_SETUIDμπορούν να αναθέσουν αυθαίρετες τιμές σε αυτούς τους αναγνωριστικούς αριθμούς. Περισσότερες πληροφορίες μπορούν να αντληθούν από τη σελίδα man του setresuid και τη σελίδα man του setreuid.
Αυτές οι λειτουργίες σχεδιάστηκαν όχι ως μηχανισμός ασφαλείας αλλά για να διευκολύνουν τη σχεδιασμένη ροή λειτουργίας, όπως όταν ένα πρόγραμμα υιοθετεί την ταυτότητα ενός άλλου χρήστη αλλάζοντας τον επιχειρησιακό του αναγνωριστικό αριθμό.
Είναι σημαντικό να σημειωθεί ότι ενώ το setuid μπορεί να είναι μια κοινή επιλογή για την ανύψωση προνομίων σε root (καθώς ευθυγραμμίζει όλους τους αναγνωριστικούς αριθμούς με τον root), η διάκριση μεταξύ αυτών των λειτουργιών είναι κρίσιμη για την κατανόηση και την παρακολούθηση των συμπεριφορών των αναγνωριστικών χρηστών σε διάφορα σενάρια.
Μηχανισμοί Εκτέλεσης Προγραμμάτων στο Linux
execve Κλήση Συστήματος
- Λειτουργικότητα: Το
execveξεκινά ένα πρόγραμμα, καθορισμένο από το πρώτο επιχείρημα. Δέχεται δύο πίνακες επιχειρημάτων,argvγια τα επιχειρήματα καιenvpγια το περιβάλλον. - Συμπεριφορά: Διατηρεί τον χώρο μνήμης του καλούντος αλλά ανανεώνει τη στοίβα, το σωρό και τα τμήματα δεδομένων. Ο κώδικας του προγράμματος αντικαθίσταται από το νέο πρόγραμμα.
- Διατήρηση Αναγνωριστικού Χρήστη:
ruid,euidκαι πρόσθετοι αναγνωριστικοί αριθμοί ομάδας παραμένουν αμετάβλητοι.- Το
euidμπορεί να έχει λεπτές αλλαγές αν το νέο πρόγραμμα έχει οριστεί το bit SetUID. - Το
suidενημερώνεται από τοeuidμετά την εκτέλεση. - Τεκμηρίωση: Λεπτομερείς πληροφορίες μπορούν να βρεθούν στη σελίδα man του
execve.
system Λειτουργία
- Λειτουργικότητα: Σε αντίθεση με το
execve, τοsystemδημιουργεί μια παιδική διαδικασία χρησιμοποιώντας τοforkκαι εκτελεί μια εντολή μέσα σε αυτήν την παιδική διαδικασία χρησιμοποιώντας τοexecl. - Εκτέλεση Εντολής: Εκτελεί την εντολή μέσω του
shμεexecl("/bin/sh", "sh", "-c", command, (char *) NULL);. - Συμπεριφορά: Καθώς το
execlείναι μια μορφή τουexecve, λειτουργεί παρόμοια αλλά στο πλαίσιο μιας νέας παιδικής διαδικασίας. - Τεκμηρίωση: Περισσότερες πληροφορίες μπορούν να αποκτηθούν από τη σελίδα man του
system.
Συμπεριφορά του bash και sh με SUID
bash:- Έχει μια επιλογή
-pπου επηρεάζει το πώς αντιμετωπίζονται τοeuidκαι τοruid. - Χωρίς
-p, τοbashορίζει τοeuidστοruidαν διαφέρουν αρχικά. - Με
-p, διατηρείται το αρχικόeuid. - Περισσότερες λεπτομέρειες μπορούν να βρεθούν στη σελίδα man του
bash. sh:- Δεν διαθέτει μηχανισμό παρόμοιο με το
-pστοbash. - Η συμπεριφορά σχετικά με τους αναγνωριστικούς αριθμούς χρηστών δεν αναφέρεται ρητά, εκτός από την επιλογή
-i, που τονίζει τη διατήρηση της ισότητας τουeuidκαι τουruid. - Πρόσθετες πληροφορίες είναι διαθέσιμες στη σελίδα man του
sh.
Αυτοί οι μηχανισμοί, διακριτοί στη λειτουργία τους, προσφέρουν μια ευέλικτη γκάμα επιλογών για την εκτέλεση και τη μετάβαση μεταξύ προγραμμάτων, με συγκεκριμένες λεπτομέρειες σχετικά με το πώς διαχειρίζονται και διατηρούνται οι αναγνωριστικοί αριθμοί χρηστών.
Δοκιμή Συμπεριφορών Αναγνωριστικού Χρήστη σε Εκτελέσεις
Παραδείγματα από https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail, ελέγξτε το για περισσότερες πληροφορίες
Περίπτωση 1: Χρήση του setuid με system
Στόχος: Κατανόηση της επίδρασης του setuid σε συνδυασμό με το system και το bash ως sh.
Κώδικας C:
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
system("id");
return 0;
}
Συγκέντρωση και Άδειες:
oxdf@hacky$ gcc a.c -o /mnt/nfsshare/a;
oxdf@hacky$ chmod 4755 /mnt/nfsshare/a
bash-4.2$ $ ./a
uid=99(nobody) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
Ανάλυση:
ruidκαιeuidξεκινούν ως 99 (κανένας) και 1000 (frank) αντίστοιχα.setuidευθυγραμμίζει και τους δύο στο 1000.systemεκτελεί/bin/bash -c idλόγω του symlink από sh σε bash.bash, χωρίς-p, προσαρμόζει τοeuidώστε να ταιριάζει με τοruid, με αποτέλεσμα και οι δύο να είναι 99 (κανένας).
Περίπτωση 2: Χρησιμοποιώντας setreuid με system
C Κώδικας:
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setreuid(1000, 1000);
system("id");
return 0;
}
Συγκέντρωση και Άδειες:
oxdf@hacky$ gcc b.c -o /mnt/nfsshare/b; chmod 4755 /mnt/nfsshare/b
Εκτέλεση και Αποτέλεσμα:
bash-4.2$ $ ./b
uid=1000(frank) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
Ανάλυση:
setreuidορίζει τόσο το ruid όσο και το euid σε 1000.systemκαλεί το bash, το οποίο διατηρεί τα αναγνωριστικά χρηστών λόγω της ισότητας τους, λειτουργώντας αποτελεσματικά ως frank.
Περίπτωση 3: Χρήση setuid με execve
Στόχος: Εξερεύνηση της αλληλεπίδρασης μεταξύ setuid και execve.
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
execve("/usr/bin/id", NULL, NULL);
return 0;
}
Εκτέλεση και Αποτέλεσμα:
bash-4.2$ $ ./c
uid=99(nobody) gid=99(nobody) euid=1000(frank) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
Ανάλυση:
ruidπαραμένει 99, αλλά το euid έχει οριστεί σε 1000, σύμφωνα με την επίδραση του setuid.
Παράδειγμα Κώδικα C 2 (Καλώντας Bash):
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
execve("/bin/bash", NULL, NULL);
return 0;
}
Εκτέλεση και Αποτέλεσμα:
bash-4.2$ $ ./d
bash-4.2$ $ id
uid=99(nobody) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
Ανάλυση:
- Αν και το
euidέχει οριστεί σε 1000 από τοsetuid, τοbashεπαναφέρει το euid σεruid(99) λόγω της απουσίας του-p.
Παράδειγμα Κώδικα C 3 (Χρησιμοποιώντας bash -p):
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
char *const paramList[10] = {"/bin/bash", "-p", NULL};
setuid(1000);
execve(paramList[0], paramList, NULL);
return 0;
}
Εκτέλεση και Αποτέλεσμα:
bash-4.2$ $ ./e
bash-4.2$ $ id
uid=99(nobody) gid=99(nobody) euid=100
Αναφορές
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HackTricks

