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

12 KiB

Instalar Certificado de Burp

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

En una Máquina Virtual

Primero que nada 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 un formato 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 %}

Luego, para configurar el certificado de Burp haz:

{% 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 termine de reiniciar, ¡el certificado de Burp estará en uso por ella!

Usando Magisc

Si has rooteado 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 escribible, hay otra manera.

Explicado en este video necesitas:

  1. Instalar un certificado CA: Simplemente arrastra y suelta el certificado DER de Burp 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
  • Comprueba que el certificado se almacenó correctamente yendo a Credenciales de confianza -> USUARIO
  1. Hacerlo confiable por el Sistema: Descarga el módulo de Magisc MagiskTrustUserCerts (un archivo .zip), arrastra y suelta en el teléfono, ve a la aplicación Magics 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 comprueba que el certificado de Postswigger está allí

Post Android 14

Cambios:

  • Hasta ahora, los certificados CA confiables por el sistema vivían en /system/etc/security/cacerts/. En un emulador AOSP estándar, estos podían ser modificados directamente con acceso root con una configuración mínima, tomando efecto inmediatamente en todas partes.
  • En Android 14, los certificados CA confiables por el sistema generalmente vivirán en /apex/com.android.conscrypt/cacerts, y todo /apex es inmutable.
  • Esa ruta de cacerts de APEX no puede ser remontada como reescribible - los remontajes simplemente fallan. De hecho, incluso si desmontas toda la ruta desde una shell 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 signifique que ls /apex/com.android.conscrypt/cacerts podría no retornar nada (o cualquier otra cosa que te guste), las aplicaciones aún verán los mismos datos originales.
  • Porque el montaje de /apex es explícitamente montado con propagación PRIVADA, de modo que todos los cambios en los montajes dentro de la ruta /apex nunca se comparten entre procesos.

Eso es hecho por el proceso init que inicia el SO, que luego lanza el proceso Zygote (con un nuevo espacio de nombres de montaje copiado del padre, así incluyendo su propio montaje /apex privado), que a su vez inicia cada proceso de aplicación cada vez que se lanza una aplicación en el dispositivo (quienes a su vez entonces copian ese mismo montaje /apex privado).

Remontando recursivamente puntos de montaje

  • Puedes remontar /apex manualmente, eliminando la propagación PRIVADA y haciéndolo escribible (irónicamente, parece que eliminar completamente la propagación privada se propaga por todas partes)
  • Copias todo el contenido de /apex/com.android.conscrypt en otro lugar
  • Luego desmontas completamente /apex/com.android.conscrypt - eliminando el montaje de solo lectura que proporciona inmutablemente este módulo
  • Luego copias el contenido de vuelta, para que viva directamente en el montaje de /apex, donde puede ser modificado (necesitas hacer esto rápidamente, ya que aparentemente puedes ver fallos de lo contrario)
  • Esto debería tomar efecto inmediatamente, pero recomiendan matar system_server (reiniciando 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 vinculado a través de NSEnter

  • Primero, necesitamos configurar un directorio con permisos de escritura en algún lugar. Para una fácil 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 colocas los certificados CA que te interesan en este directorio (por ejemplo, podrías querer copiar todos los predeterminados del directorio existente de certificados CA /apex/com.android.conscrypt/cacerts/) y establecer los permisos y etiquetas SELinux de manera apropiada.
  • Luego, usa nsenter para entrar 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 de ahora en adelante) utilizarán esto.

  • Luego, usa nsenter para entrar al espacio de nombres de montaje de cada aplicación que ya está en ejecución 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 incómoda experiencia de usuario, deberías poder hacer el montaje vinculado 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 el incómodo reinicio, así que estoy ignorando esa ruta por completo).

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: