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

181 lines
13 KiB
Markdown
Raw Normal View History

# Instalar Certificado Burp
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
## 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**_
![](<../../.gitbook/assets/image (367).png>)
**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" %}
```bash
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" %}
```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 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 escribible, hay otra forma.
Explicado en [**este video**](https://www.youtube.com/watch?v=qQicUW0svB8), 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`
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="164"><figcaption></figcaption></figure>
* Verifica que el certificado se haya almacenado correctamente yendo a `Credenciales de confianza` -> `USUARIO`
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="334"><figcaption></figcaption></figure>
2. **Hacerlo de confianza del sistema**: Descarga el módulo de Magisc [MagiskTrustUserCerts](https://github.com/NVISOsecurity/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:
<figure><img src="../../.gitbook/assets/image (2) (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 verifica que el certificado de Postswigger esté allí
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1).png" alt="" width="314"><figcaption></figcaption></figure>
## 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 escribible; 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](https://cs.android.com/android/platform/superproject/main/+/main:system/core/init/mount\_namespace.cpp;l=97;drc=566c65239f1cf3fcb0d8745715e5ef1083d4bd3a) **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](https://en.wikipedia.org/wiki/Booting\_process\_of\_Android\_devices#Zygote) (con un nuevo espacio 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** cuando se lanza una aplicación en el dispositivo (cada uno de ellos copia ese mismo montaje privado de `/apex`).
### Remontar recursivamente los puntos de montaje
* Puedes remontar `/apex` manualmente, eliminando la propagación PRIVADA y haciéndolo escribible (irónicamente, parece que eliminar por completo la propagación privada _sí_ 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 de vuelta, para que viva en el montaje de `/apex` directamente, donde se puede modificar (debes hacer esto rápidamente, ya que [aparentemente](https://infosec.exchange/@g1a55er/111069489513139531) 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.
```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 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):
```bash
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:
```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 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:
```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 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).
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>