Install Burp Certificate

htARTE(HackTricks AWS Red Team Expert) でAWSハッキングをゼロからヒーローまで学ぶ

HackTricksをサポートする他の方法:

仮想マシン上

まず、BurpからDer証明書をダウンロードする必要があります。これは Proxy --> Options --> Import / Export CA certificate で行うことができます。

Der形式で証明書をエクスポートし、Androidが理解できる形式に変換する必要があります。AVDのAndroidマシンにBurp証明書を構成するには、このマシンを**-writable-systemオプションで実行**する必要があります。 たとえば、次のように実行できます:

C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system

次に、Burpの証明書を設定するには

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

マシンが再起動を完了すると、burp証明書がそれによって使用されます!

Magiscを使用する

Magiscでデバイスをroot化した場合(おそらくエミュレーター)、ファイルシステムが読み取り専用でリマウントできないため、以前の手順に従うことができない場合は、別の方法があります。

このビデオで説明されているように、次の手順を実行する必要があります:

  1. CA証明書をインストール:DER Burp証明書を.crtに変更してモバイルにドラッグ&ドロップするだけで、ダウンロードフォルダに保存され、証明書のインストール -> CA証明書に移動します

  • 証明書が正しく保存されたことを確認するには、信頼された資格情報 -> ユーザーに移動します

  1. システム信頼済みにする:MagiscモジュールMagiskTrustUserCerts(.zipファイル)をダウンロードし、それを電話にドラッグ&ドロップし、電話のMagicsアプリに移動してモジュールセクションに移動し、ストレージからインストールをクリックし、.zipモジュールを選択してインストールしたら、電話を再起動します:

  • 再起動後、信頼された資格情報 -> システムに移動し、Postswigger証明書がそこにあることを確認します

Android 14以降

最新のAndroid 14リリースでは、システム信頼済みの証明機関(CA)証明書の取り扱いに重要な変更が観察されています。以前は、これらの証明書は**/system/etc/security/cacerts/に格納され、root権限を持つユーザーがアクセスして変更できる状態でしたが、Android 14では、保存場所が/apex/com.android.conscrypt/cacertsに移動されました。これは/apex**パス内のディレクトリであり、その性質上変更できません。

APEX cacertsパスを書き込み可能にリマウントしようとする試みは失敗します。システムはそのような操作を許可しません。ディレクトリを一時的なファイルシステム(tmpfs)でアンマウントしたりオーバーレイしたりしても、不変性を回避することはできません。ファイルシステムレベルでの変更に関わらず、アプリケーションは元の証明書データにアクセスし続けます。これは、**/apexマウントがPRIVATE伝播で構成されているためであり、/apex**ディレクトリ内の変更が他のプロセスに影響を与えないようにしています。

Androidの初期化にはinitプロセスが関与し、オペレーティングシステムの起動時にZygoteプロセスも開始されます。このプロセスは、新しいマウント名前空間を持つZygoteプロセスを起動し、このディレクトリへの変更を他のプロセスから分離します。

ただし、**/apexディレクトリ内のシステム信頼済みCA証明書を変更する必要がある場合の回避策が存在します。これには、/apexを手動でリマウントしてPRIVATE伝播を削除し、書き込み可能にする必要があります。このプロセスには、/apex/com.android.conscryptの内容を別の場所にコピーし、/apex/com.android.conscryptディレクトリをアンマウントして読み取り専用制約を解除し、その後、/apex**内の元の場所に内容を復元する必要があります。このアプローチは、システムクラッシュを回避するために迅速な対応が必要です。これらの変更がシステム全体に適用されるようにするためには、system_serverを再起動することをお勧めします。これにより、すべてのアプリケーションが再起動され、システムが一貫した状態になります。

# 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"

NSEnterを介したバインドマウント

  1. 書き込み可能ディレクトリの設定: 最初に、既存の非-APEXシステム証明書ディレクトリにtmpfsをマウントして書き込み可能ディレクトリを確立します。次のコマンドを使用してこれを実現します:

mount -t tmpfs tmpfs /system/etc/security/cacerts
  1. CA証明書の準備: 書き込み可能ディレクトリのセットアップに続いて、使用するCA証明書をこのディレクトリにコピーする必要があります。これには、デフォルトの証明書を/apex/com.android.conscrypt/cacerts/からコピーすることが含まれる場合があります。これらの証明書の権限とSELinuxラベルを適切に調整することが重要です。

  2. Zygote用のバインドマウント: nsenterを利用して、Zygoteのマウント名前空間に入ります。 Androidアプリケーションを起動する責任があるプロセスであるZygoteは、今後起動されるすべてのアプリケーションが新しく構成されたCA証明書を利用するようにするために、この手順が必要です。使用されるコマンドは次のとおりです:

nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts

これにより、開始されるすべての新しいアプリが更新されたCA証明書のセットアップに従うようになります。

  1. 実行中のアプリに変更を適用する: 既に実行中のアプリケーションに変更を適用するには、nsenterを再度使用して各アプリの名前空間に個別に入り、同様のバインドマウントを行います。必要なコマンドは次のとおりです:

nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
  1. 代替手段 - ソフト再起動: 代替手法は、init プロセス(PID 1)での bind マウントを実行し、stop && start コマンドでオペレーティングシステムをソフト再起動する方法です。このアプローチは、変更をすべてのネームスペースに伝播させ、実行中の各アプリケーションを個別に対処する必要がないため、一般的に好まれません。ただし、再起動の手間がかかるため、この方法は一般的に好まれません。

参考文献

ゼロからヒーローまでのAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricks をサポートする他の方法:

Last updated