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

185 lines
12 KiB
Markdown
Raw Normal View History

# Instalar Certificado de Burp
<details>
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Otras formas de apoyar a HackTricks:
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
## 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**_
![](<../../.gitbook/assets/image (367).png>)
**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" %}
```bash
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" %}
```bash
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**](https://www.youtube.com/watch?v=qQicUW0svB8) 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`
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="164"><figcaption></figcaption></figure>
* Comprueba que el certificado se almacenó correctamente yendo a `Credenciales de confianza` -> `USUARIO`
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="334"><figcaption></figcaption></figure>
2. **Hacerlo confiable por el Sistema**: Descarga el módulo de Magisc [MagiskTrustUserCerts](https://github.com/NVISOsecurity/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:
<figure><img src="../../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="345"><figcaption></figcaption></figure>
* Después de reiniciar, ve a `Credenciales de confianza` -> `SISTEMA` y comprueba que el certificado de Postswigger está allí
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt="" width="314"><figcaption></figcaption></figure>
## 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](https://cs.android.com/android/platform/superproject/main/+/main:system/core/init/mount\_namespace.cpp;l=97;drc=566c65239f1cf3fcb0d8745715e5ef1083d4bd3a) **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](https://en.wikipedia.org/wiki/Booting\_process\_of\_Android\_devices#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 _sí_ 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](https://infosec.exchange/@g1a55er/111069489513139531) 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
```bash
# 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):
```bash
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:
```bash
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:
```bash
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).
<details>
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Otras formas de apoyar a HackTricks:
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>