Automating Android + MITMProxy, Injecting the Proxy Cert

I've created a bash script to get, and then inject an MITMProxy cert into an Android Emulator This presumably works with an actual device, but untested as I don't currently have one. This process assumes that you have a running Android emulator, the adb tools installed, and a MITMProxy running. It will grab the cert from the proxy, use it to create the file needed, and insert it into the Android device.

#!/bin/bash

proxyhost="127.0.0.1"
proxyport="8080"

# if this script fails, do not leave a pem file (the wrong one!) for other processes to use
rm mitmproxy-ca-cert.pem 2> /dev/null

show_help(){
  echo "Get Cert file from proxy, create and inject cert hash into attached android device."
  echo ""
  echo "No arguments supplied"
  echo "Usage: $0 [-h proxyhost] [-p proxyport]"
  echo "Defaults to $proxyhost:$proxyport"
}

# loop through the command line options
while getopts "h:p:?" opt; do
      case $opt in
        h)  proxyhost=$OPTARG
            ;;
        p)  proxyport=$OPTARG
            ;;
        \?)
            show_help
            exit 1
            ;;
      esac
done
shift $((OPTIND -1))

# get the pem from the proxy server
echo "Downloading Cert (pem) file from url http://mitm.it/cert/pem on proxy $proxyhost:$proxyport"
curl --proxy $proxyhost:$proxyport mitm.it/cert/pem > mitmproxy-ca-cert.pem

# get the hash of the pem file for use as the file name to put on the android device
echo "Setting CERT_HASH"
CERT_HASH="$(openssl x509 -inform PEM -subject_hash_old -in mitmproxy-ca-cert.pem | head -1)"
echo "CERT_HASH=$CERT_HASH"

# export the PEM data into the file
echo "Exporting pem data to file $CERT_HASH.0"
openssl x509 -inform PEM -text -in mitmproxy-ca-cert.pem -out /dev/null >> $CERT_HASH.0

# get root on android
# note: this does not work on google PLAY (prod) images, only google API (debug) images
adb root
adb remount

# put the new cert info on the android device
echo "adb push $CERT_HASH.0 /system/etc/security/cacerts/"
adb push $CERT_HASH.0 /system/etc/security/cacerts/
echo "adb shell 'chmod 644 /system/etc/security/cacerts/$CERT_HASH.0'"
adb shell "chmod 644 /system/etc/security/cacerts/$CERT_HASH.0"
echo "adb shell 'ls -l /system/etc/security/cacerts/$CERT_HASH.0'"
adb shell "ls -l /system/etc/security/cacerts/$CERT_HASH.0"
echo "rebooting..."
adb reboot