hacktricks/mobile-pentesting/android-app-pentesting/install-burp-certificate.md

13 KiB

Instalar Certificado Burp

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

En una Máquina Virtual

En primer lugar, necesitas descargar el certificado Der de Burp. Puedes hacer esto en Proxy --> Options --> Import / Export CA certificate

Exporta el certificado en formato Der y vamos a transformarlo a una forma que Android pueda entender. Ten en cuenta que para configurar el certificado de burp en la máquina Android en AVD necesitas ejecutar esta máquina con la opción -writable-system.
Por ejemplo, puedes ejecutarlo así:

{% code overflow="wrap" %}

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

{% endcode %}

A continuación, para configurar el certificado de Burp, haga lo siguiente:

{% code overflow="wrap" %}

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

{% endcode %}

Una vez que la máquina haya terminado de reiniciarse, el certificado de Burp estará en uso por ella.

Usando Magisc

Si rooteaste tu dispositivo con Magisc (quizás un emulador) y no puedes seguir los pasos anteriores para instalar el certificado de Burp porque el sistema de archivos es de solo lectura y no puedes volver a montarlo como de escritura, hay otra forma.

Explicado en este video, debes:

  1. Instalar un certificado CA: Simplemente arrastra y suelta el certificado Burp DER cambiando la extensión a .crt en el móvil para que se guarde en la carpeta de Descargas y ve a Instalar un certificado -> Certificado CA
  • Verifica que el certificado se haya almacenado correctamente yendo a Credenciales de confianza -> USUARIO
  1. Hacerlo de confianza del sistema: Descarga el módulo de Magisc MagiskTrustUserCerts (un archivo .zip), arrástralo y suéltalo en el teléfono, ve a la aplicación de Magisc en el teléfono a la sección Módulos, haz clic en Instalar desde almacenamiento, selecciona el módulo .zip y una vez instalado reinicia el teléfono:
  • Después de reiniciar, ve a Credenciales de confianza -> SISTEMA y verifica que el certificado de Postswigger esté allí

Post Android 14

Cambios:

  • Hasta ahora, los certificados CA de confianza del sistema se encontraban en /system/etc/security/cacerts/. En un emulador AOSP estándar, estos podían modificarse directamente con acceso root con una configuración mínima, teniendo efecto en todas partes de inmediato.
  • En Android 14, los certificados CA de confianza del sistema generalmente se encontrarán en /apex/com.android.conscrypt/cacerts, y todo /apex es inmutable.
  • Esa ruta de cacerts de APEX no se puede volver a montar como de escritura; los remontajes simplemente fallan. De hecho, incluso si desmontas toda la ruta desde una shell de root, las aplicaciones aún pueden leer tus certificados sin problemas.
  • La técnica alternativa de montar un directorio tmpfs encima tampoco funciona; aunque esto significa que ls /apex/com.android.conscrypt/cacerts podría no devolver nada (o cualquier otra cosa que desees), las aplicaciones seguirán viendo los mismos datos originales.
  • Debido a que el montaje de /apex se realiza explícitamente con propagación PRIVADA, todos los cambios en los montajes dentro de la ruta /apex nunca se comparten entre procesos.

Esto lo hace el proceso init que inicia el sistema operativo, que luego inicia el proceso Zygote (con un nuevo espacio de nombres de montaje copiado del padre, por lo que incluye su propio montaje privado de /apex), que a su vez inicia cada proceso de aplicación cada vez que se inicia una aplicación en el dispositivo (que a su vez copia ese mismo montaje privado de /apex).

Remontar puntos de montaje de forma recursiva

  • Puedes remontar /apex manualmente, eliminando la propagación PRIVADA y haciéndolo de escritura (irónicamente, parece que eliminar por completo la propagación privada se propaga en todas partes).
  • Copias todo el contenido de /apex/com.android.conscrypt en otro lugar.
  • Luego desmontas por completo /apex/com.android.conscrypt, eliminando el montaje de solo lectura que proporciona inmutablemente este módulo.
  • Luego copias el contenido nuevamente, para que se encuentre en el montaje de /apex directamente, donde se puede modificar (debes hacer esto rápidamente, ya que aparentemente puedes ver bloqueos de lo contrario).
  • Esto debería tener efecto de inmediato, pero recomiendan matar system_server (reiniciar todas las aplicaciones) para que todo vuelva a un estado consistente.
# 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"

Montaje de enlace a través de NSEnter

  • Primero, necesitamos configurar un directorio escribible en algún lugar. Para facilitar la compatibilidad con el enfoque existente, estoy haciendo esto con un montaje tmpfs sobre el directorio de certificados del sistema no-APEX (que aún está presente):
mount -t tmpfs tmpfs /system/etc/security/cacerts
  • Luego, coloca los certificados de CA que te interesen en este directorio (por ejemplo, es posible que desees copiar todos los valores predeterminados del directorio de certificados de CA /apex/com.android.conscrypt/cacerts/ existente) y establece los permisos y las etiquetas SELinux adecuadamente.
  • Luego, usa nsenter para ingresar al espacio de nombres de montaje de Zygote y monta este directorio sobre el directorio APEX:
nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- \
/bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts

El proceso Zygote genera cada aplicación, copiando su espacio de nombres de montaje para hacerlo, por lo que esto asegura que todas las aplicaciones recién lanzadas (todo lo que se inicie a partir de ahora) lo utilizarán.

  • Luego, usa nsenter para ingresar al espacio de nombres de cada aplicación que ya se está ejecutando y haz lo mismo:
nsenter --mount=/proc/$APP_PID/ns/mnt -- \
/bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts

Alternativamente, si no te importa la experiencia de usuario incómoda, deberías poder hacer el montaje de enlace en init mismo (PID 1) y luego ejecutar stop && start para reiniciar suavemente el sistema operativo, recreando todos los espacios de nombres y propagando tus cambios en todas partes (pero personalmente me importa la reinicialización incómoda, así que estoy ignorando completamente esa ruta).

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥