Εγκατάσταση πιστοποιητικού Burp

Tip

Μάθε & εξασκήσου στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθε & εξασκήσου στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθε & εξασκήσου στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Περιηγήσου στον πλήρη κατάλογο HackTricks Training για τα assessment tracks (ARTA/GRTA/AzRTA) και στο Linux Hacking Expert (LHE).

Υποστήριξε το HackTricks

Proxy σε επίπεδο συστήματος μέσω ADB

Ρυθμίστε έναν παγκόσμιο HTTP proxy ώστε όλες οι εφαρμογές να δρομολογούν την κίνηση μέσω του interceptor σας (Burp/mitmproxy):

# Set proxy (device/emulator must reach your host IP)
adb shell settings put global http_proxy 192.168.1.2:8080

# Clear proxy
adb shell settings put global http_proxy :0

Συμβουλή: Στο Burp, bind τον listener σας στο 0.0.0.0 ώστε οι συσκευές στο LAN να μπορούν να συνδεθούν (Proxy -> Options -> Proxy Listeners).

Σε Virtual Machine

Πρώτα απ’ όλα πρέπει να κατεβάσετε το πιστοποιητικό Der από το Burp. Μπορείτε να το κάνετε στο Proxy –> Options –> Import / Export CA certificate

Export the certificate in Der format and lets transform it to a form that Android is going to be able to understand. Note that in order to configure the burp certificate on the Android machine in AVD you need to run this machine with the -writable-system option.
Για παράδειγμα μπορείτε να τη τρέξετε ως εξής:

C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system

Στη συνέχεια, για να configure burps certificate do:

openssl x509 -inform DER -in burp_cacert.der -out burp_cacert.pem
CERTHASHNAME="`openssl x509 -inform PEM -subject_hash_old -in burp_cacert.pem | head -1`.0"
mv burp_cacert.pem $CERTHASHNAME #Correct name
adb root && sleep 2 && adb remount #Allow to write on /syste
adb push $CERTHASHNAME /sdcard/ #Upload certificate
adb shell mv /sdcard/$CERTHASHNAME /system/etc/security/cacerts/ #Move to correct location
adb shell chmod 644 /system/etc/security/cacerts/$CERTHASHNAME #Assign privileges
adb reboot #Now, reboot the machine

Μόλις η μηχανή ολοκληρώσει την επανεκκίνηση το πιστοποιητικό Burp θα χρησιμοποιείται από αυτήν!

Χρήση του Magisk

Εάν rooted your device with Magisk (ίσως ένας emulator), και can’t follow τα προηγούμενα steps για να εγκαταστήσετε το Burp cert επειδή το filesystem is read-only και δεν μπορείτε να το remount writable, υπάρχει ένας άλλος τρόπος.

Εξηγείται στο this video: πρέπει να κάνετε:

  1. Install a CA certificate: Απλώς drag&drop το DER Burp certificate αλλάζοντας την επέκταση σε .crt στο κινητό ώστε να αποθηκευτεί στον φάκελο Downloads και πηγαίνετε σε Install a certificate -> CA certificate
  • Ελέγξτε ότι το πιστοποιητικό αποθηκεύτηκε σωστά πηγαίνοντας σε Trusted credentials -> USER
  1. Make it System trusted: Κατεβάστε το Magisk module MagiskTrustUserCerts (ένα .zip αρχείο), drag&drop it στο τηλέφωνο, ανοίξτε την εφαρμογή Magisk στο τηλέφωνο στην ενότητα Modules, πατήστε Install from storage, επιλέξτε το .zip module και μόλις εγκατασταθεί reboot το τηλέφωνο:
  • Μετά την επανεκκίνηση, πηγαίνετε σε Trusted credentials -> SYSTEM και ελέγξτε ότι το Postswigger cert είναι εκεί

Alternative: AlwaysTrustUserCerts (Android 7-16 Beta)

Αν βρίσκεστε σε Android 14+ (ή σε παλαιότερες συσκευές που έχουν λάβει Conscrypt Mainline ενημερώσεις και πλέον χρησιμοποιούν /apex/com.android.conscrypt/cacerts), το Magisk module AlwaysTrustUserCerts αυτοματοποιεί το bind-mounting που απαιτείται για system trust. Κατοπτρίζει τα user CAs στο system trust και εισάγει mounts στα namespaces του Zygote/app ώστε οι εφαρμογές να βλέπουν τα πιστοποιητικά χωρίς χειροκίνητη εργασία με nsenter.

  1. Εγκαταστήστε πρώτα το Burp CA ως πιστοποιητικό user.
  2. Εγκαταστήστε το module και κάντε reboot.
  3. Εάν το module προσφέρει επιλογή, προτιμήστε --rbind όταν κάνετε mount το /system/etc/security/cacerts μέσα στο /apex/com.android.conscrypt/cacerts για να εξασφαλίσετε ότι τα nested mounts (από άλλα modules) είναι ορατά.

Μάθετε πώς να δημιουργήσετε ένα Magisk module

Δείτε https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437

Μετά το Android 14

Στην τελευταία έκδοση Android 14 έχει παρατηρηθεί σημαντική αλλαγή στον τρόπο χειρισμού των system-trusted Certificate Authority (CA) certificates.

Σημείωση: Ορισμένες συσκευές με Android 12/13 που έλαβαν ενημερώσεις Conscrypt Mainline ήδη χρησιμοποιούν /apex/com.android.conscrypt/cacerts. Εάν αυτός ο κατάλογος υπάρχει στη συσκευή σας, πρέπει να χρησιμοποιήσετε την ίδια τεχνική APEX injection που περιγράφεται παρακάτω.

Προηγουμένως, αυτά τα πιστοποιητικά ήταν αποθηκευμένα στο /system/etc/security/cacerts/, προσβάσιμα και τροποποιήσιμα από χρήστες με δικαιώματα root, γεγονός που επέτρεπε την άμεση εφαρμογή σε όλο το σύστημα. Ωστόσο, με το Android 14, η τοποθεσία αποθηκεύτηκε στο /apex/com.android.conscrypt/cacerts, έναν κατάλογο εντός της διαδρομής /apex, ο οποίος είναι κατά κανόνα αμετάβλητος.

Οι προσπάθειες να remount το APEX cacerts path ως writable αποτυγχάνουν, καθώς το σύστημα δεν το επιτρέπει. Ακόμη και οι προσπάθειες να απομονώσετε ή να επικάλυψης τον κατάλογο με ένα προσωρινό filesystem (tmpfs) δεν παρακάμπτουν την αμεταβλητότητα· οι εφαρμογές συνεχίζουν να προσπελάζουν τα αρχικά δεδομένα πιστοποιητικών ανεξάρτητα από αλλαγές στο επίπεδο του filesystem. Αυτή η ανθεκτικότητα οφείλεται στο ότι το mount του /apex έχει ρυθμιστεί με PRIVATE propagation, εξασφαλίζοντας ότι οποιεσδήποτε τροποποιήσεις εντός του καταλόγου /apex δεν επηρεάζουν άλλες διεργασίες.

Η εκκίνηση του Android περιλαμβάνει τη διεργασία init, η οποία, κατά την εκκίνηση του λειτουργικού, ξεκινά επίσης τη διεργασία Zygote. Αυτή η διεργασία είναι υπεύθυνη για την εκκίνηση των διεργασιών εφαρμογών με ένα νέο mount namespace που περιλαμβάνει ένα ιδιωτικό mount για το /apex, απομονώνοντας έτσι τις αλλαγές σε αυτόν τον κατάλογο από άλλες διεργασίες.

Παρόλα αυτά, υπάρχει μια λύση για όσους χρειάζονται να τροποποιήσουν τα system-trusted CA certificates εντός του καταλόγου /apex. Αυτή περιλαμβάνει το χειροκίνητο remount του /apex για την αφαίρεση της PRIVATE propagation, καθιστώντας το writable. Η διαδικασία περιλαμβάνει την αντιγραφή του περιεχομένου του /apex/com.android.conscrypt σε άλλη τοποθεσία, την αποπροσάρτηση του /apex/com.android.conscrypt για να εξαλειφθεί ο περιορισμός μόνο για ανάγνωση, και στη συνέχεια την επανατοποθέτηση του περιεχομένου στην αρχική θέση εντός του /apex. Αυτή η προσέγγιση απαιτεί γρήγορη ενέργεια για να αποφευχθούν κρασάρισματα του συστήματος. Για να εξασφαλιστεί η εφαρμογή των αλλαγών σε όλο το σύστημα, συνιστάται η επανεκκίνηση του system_server, κάτι που ουσιαστικά επανεκκινεί όλες τις εφαρμογές και επαναφέρει το σύστημα σε συνεπή κατάσταση.

# Create a separate temp directory, to hold the current certificates
# Otherwise, when we add the mount we can't read the current certs anymore.
mkdir -p -m 700 /data/local/tmp/tmp-ca-copy

# Copy out the existing certificates
cp /apex/com.android.conscrypt/cacerts/* /data/local/tmp/tmp-ca-copy/

# Create the in-memory mount on top of the system certs folder
mount -t tmpfs tmpfs /system/etc/security/cacerts

# Copy the existing certs back into the tmpfs, so we keep trusting them
mv /data/local/tmp/tmp-ca-copy/* /system/etc/security/cacerts/

# Copy our new cert in, so we trust that too
mv $CERTIFICATE_PATH /system/etc/security/cacerts/

# Update the perms & selinux context labels
chown root:root /system/etc/security/cacerts/*
chmod 644 /system/etc/security/cacerts/*
chcon u:object_r:system_file:s0 /system/etc/security/cacerts/*

# Deal with the APEX overrides, which need injecting into each namespace:

# First we get the Zygote process(es), which launch each app
ZYGOTE_PID=$(pidof zygote || true)
ZYGOTE64_PID=$(pidof zygote64 || true)
# N.b. some devices appear to have both!

# Apps inherit the Zygote's mounts at startup, so we inject here to ensure
# all newly started apps will see these certs straight away:
for Z_PID in "$ZYGOTE_PID" "$ZYGOTE64_PID"; do
if [ -n "$Z_PID" ]; then
nsenter --mount=/proc/$Z_PID/ns/mnt -- \
/bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
fi
done

# Then we inject the mount into all already running apps, so they
# too see these CA certs immediately:

# Get the PID of every process whose parent is one of the Zygotes:
APP_PIDS=$(
echo "$ZYGOTE_PID $ZYGOTE64_PID" | \
xargs -n1 ps -o 'PID' -P | \
grep -v PID
)

# Inject into the mount namespace of each of those apps:
for PID in $APP_PIDS; do
nsenter --mount=/proc/$PID/ns/mnt -- \
/bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts &
done
wait # Launched in parallel - wait for completion here

echo "System certificate injected"

Bind-mounting μέσω NSEnter

  1. Ρύθμιση εγγράψιμου καταλόγου: Αρχικά, δημιουργείται ένας εγγράψιμος κατάλογος με την προσάρτηση ενός tmpfs επάνω στον υπάρχοντα non-APEX κατάλογο πιστοποιητικών συστήματος. Αυτό επιτυγχάνεται με την ακόλουθη εντολή:
mount -t tmpfs tmpfs /system/etc/security/cacerts
  1. Προετοιμασία CA Certificates: Μετά τη ρύθμιση του καταλόγου με δικαιώματα εγγραφής, τα CA certificates που πρόκειται να χρησιμοποιηθούν πρέπει να αντιγραφούν σε αυτόν τον κατάλογο. Αυτό μπορεί να περιλαμβάνει την αντιγραφή των προεπιλεγμένων πιστοποιητικών από /apex/com.android.conscrypt/cacerts/. Είναι απαραίτητο να προσαρμόσετε τα δικαιώματα και τις ετικέτες SELinux αυτών των πιστοποιητικών ανάλογα.
  2. Bind Mounting for Zygote: Χρησιμοποιώντας nsenter, εισέρχεται κανείς στο mount namespace του Zygote. Το Zygote, ως η διεργασία υπεύθυνη για την εκκίνηση των Android εφαρμογών, απαιτεί αυτό το βήμα για να διασφαλιστεί ότι όλες οι εφαρμογές που θα ξεκινούν από εδώ και πέρα θα χρησιμοποιούν τα πρόσφατα ρυθμισμένα CA certificates. Η εντολή που χρησιμοποιείται είναι:

Συμβουλή: Εάν το /system/etc/security/cacerts περιέχει nested mounts (συνηθισμένο με Magisk modules), χρησιμοποιήστε --rbind αντί για --bind ώστε αυτά τα mounts να προωθηθούν στα app namespaces.

nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
# If /system/etc/security/cacerts includes nested mounts, prefer --rbind
nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --rbind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts

Αυτό διασφαλίζει ότι κάθε νέα εφαρμογή που ξεκινά θα συμμορφώνεται με την ενημερωμένη ρύθμιση των πιστοποιητικών CA.

  1. Εφαρμογή αλλαγών σε τρέχουσες εφαρμογές: Για να εφαρμόσετε τις αλλαγές σε ήδη εκτελούμενες εφαρμογές, το nsenter χρησιμοποιείται ξανά για να εισέλθετε στο namespace κάθε εφαρμογής ξεχωριστά και να εκτελέσετε ένα παρόμοιο bind mount. Η απαραίτητη εντολή είναι:
nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
  1. Εναλλακτική Προσέγγιση - Soft Reboot: Μια εναλλακτική μέθοδος περιλαμβάνει την εκτέλεση του bind mount στη διαδικασία init (PID 1), ακολουθούμενη από ένα soft reboot του λειτουργικού συστήματος με τις εντολές stop && start. Αυτή η προσέγγιση θα εφαρμόσει τις αλλαγές σε όλα τα namespaces, αποφεύγοντας την ανάγκη να ασχολείστε ξεχωριστά με κάθε εκτελούμενη app. Ωστόσο, αυτή η μέθοδος γενικά προτιμάται λιγότερο λόγω της ενόχλησης της επανεκκίνησης.

Αναφορές

Tip

Μάθε & εξασκήσου στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθε & εξασκήσου στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθε & εξασκήσου στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Περιηγήσου στον πλήρη κατάλογο HackTricks Training για τα assessment tracks (ARTA/GRTA/AzRTA) και στο Linux Hacking Expert (LHE).

Υποστήριξε το HackTricks