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

13 KiB

Instalar Certificado Burp

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

Em uma Máquina Virtual

Primeiro, você precisa baixar o certificado Der do Burp. Você pode fazer isso em Proxy --> Options --> Import / Export CA certificate

Exporte o certificado no formato Der e vamos transformá-lo em uma forma que o Android será capaz de entender. Note que para configurar o certificado burp na máquina Android em AVD você precisa executar esta máquina com a opção -writable-system.
Por exemplo, você pode executá-lo assim:

{% 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 %}

Em seguida, para configurar o certificado do Burp, faça o seguinte:

{% 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 %}

Uma vez que a máquina terminar de reiniciar, o certificado do Burp estará em uso por ela!

Usando Magisc

Se você fez root no seu dispositivo com Magisc (talvez um emulador) e não consegue seguir os passos anteriores para instalar o certificado do Burp porque o sistema de arquivos é somente leitura e você não pode remontá-lo como gravável, há outra maneira.

Explicado neste vídeo, você precisa:

  1. Instalar um certificado CA: Basta arrastar e soltar o certificado DER do Burp alterando a extensão para .crt no celular para que ele seja armazenado na pasta Downloads e vá para Instalar um certificado -> Certificado CA
  • Verifique se o certificado foi armazenado corretamente indo para Credenciais confiáveis -> USUÁRIO
  1. Torná-lo confiável pelo sistema: Baixe o módulo Magisc MagiskTrustUserCerts (um arquivo .zip), arraste e solte no celular, vá para o aplicativo Magics no celular na seção Módulos, clique em Instalar a partir do armazenamento, selecione o módulo .zip e uma vez instalado, reinicie o celular:
  • Após reiniciar, vá para Credenciais confiáveis -> SISTEMA e verifique se o certificado do Postswigger está lá

Pós Android 14

Mudanças:

  • Até agora, os certificados CA confiáveis pelo sistema ficavam em /system/etc/security/cacerts/. Em um emulador AOSP padrão, eles poderiam ser modificados diretamente com acesso root com uma configuração mínima, tendo efeito imediato em todos os lugares.
  • No Android 14, os certificados CA confiáveis pelo sistema geralmente ficarão em /apex/com.android.conscrypt/cacerts, e todo o /apex é imutável.
  • Esse caminho de certificados do APEX não pode ser remontado como gravável - as remontagens simplesmente falham. Na verdade, mesmo que você desmonte todo o caminho de um shell root, os aplicativos ainda podem ler seus certificados normalmente.
  • A técnica alternativa de montar um diretório tmpfs por cima também não funciona - mesmo que isso signifique que ls /apex/com.android.conscrypt/cacerts possa retornar nada (ou qualquer outra coisa que você queira), os aplicativos ainda verão os mesmos dados originais.
  • Porque a montagem /apex é explicitamente montada com propagação PRIVADA, para que todas as alterações nas montagens dentro do caminho /apex nunca sejam compartilhadas entre processos.

Isso é feito pelo processo init, que inicia o sistema operacional, que então inicia o processo Zygote (com um novo namespace de montagem copiado do pai, incluindo sua própria montagem privada /apex), que por sua vez inicia cada processo de aplicativo sempre que um aplicativo é lançado no dispositivo (que por sua vez copia a mesma montagem privada /apex).

Remontando recursivamente os pontos de montagem

  • Você pode remontar /apex manualmente, removendo a propagação PRIVADA e tornando-o gravável (ironicamente, parece que remover completamente a propagação privada propaga em todos os lugares)
  • Você copia todo o conteúdo de /apex/com.android.conscrypt para outro lugar
  • Em seguida, desmonta completamente /apex/com.android.conscrypt - removendo a montagem somente leitura que fornece imutavelmente este módulo
  • Em seguida, copie o conteúdo de volta, para que ele fique dentro da montagem /apex diretamente, onde pode ser modificado (você precisa fazer isso rapidamente, pois aparentemente você pode ver falhas caso contrário)
  • Isso deve ter efeito imediato, mas eles recomendam matar o system_server (reiniciar todos os aplicativos) para que tudo volte a um 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"

Montagem de bind através do NSEnter

  • Primeiro, precisamos configurar um diretório gravável em algum lugar. Para facilitar a compatibilidade com a abordagem existente, estou fazendo isso com uma montagem tmpfs sobre o diretório de certificados do sistema não-APEX (ainda presente):
mount -t tmpfs tmpfs /system/etc/security/cacerts
  • Em seguida, coloque os certificados CA de interesse neste diretório (por exemplo, você pode querer copiar todos os padrões do diretório de certificados CA /apex/com.android.conscrypt/cacerts/ existente) e defina as permissões e rótulos SELinux apropriadamente.
  • Em seguida, use nsenter para entrar no namespace de montagem do Zygote e monte este diretório sobre o diretório APEX:
nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- \
/bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts

O processo Zygote inicia cada aplicativo, copiando seu namespace de montagem para fazer isso, garantindo que todos os aplicativos recém-iniciados (tudo iniciado a partir de agora) usem isso.

  • Em seguida, use nsenter para entrar no namespace de cada aplicativo já em execução e faça o mesmo:
nsenter --mount=/proc/$APP_PID/ns/mnt -- \
/bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts

Alternativamente, se você não se importar com a experiência do usuário desajeitada, você deve ser capaz de fazer a montagem de bind no init em si (PID 1) e, em seguida, executar stop && start para reiniciar suavemente o sistema operacional, recriando todos os namespaces e propagando suas alterações em todos os lugares (mas pessoalmente eu me importo com a reinicialização desajeitada, então estou ignorando completamente essa rota).

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