euid, ruid, suid
Reading time: 8 minutes
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.