モバイルとAPIペンテスト
🔥 Vibe プロンプト
「モバイルアプリをペンテスト:トラフィック傍受、SSLバイパス、ルート検出回避、APIテスト。」
モバイル設定
# Android: Burp Suiteプロキシ
adb push burp-ca.der /sdcard/
adb shell "su -c 'cp /sdcard/burp-ca.der /system/etc/security/cacerts/'"
# iOS: QProxy
# CydiaからQProxyインストール→Burpをプロキシ設定
# Frida: frida -U -f com.target.app -l ssl_bypass.js
Frida SSLバイパス
Java.perform(function() {
var TrustAll = Java.registerClass({
name: 'com.example.TrustAll',
implements: [Java.use('javax.net.ssl.TrustManager')],
methods: {
checkServerTrusted: function() {},
getAcceptedIssuers: function() { return []; }
}
});
var SSLContext = Java.use('javax.net.ssl.SSLContext');
SSLContext.init.implementation = function(k, t, r) {
return this.init(k, [TrustAll.$new()], r);
};
console.log("SSLバイパス成功!");
});
ルート検出バイパス
Java.perform(function() {
var RootBeer = Java.use('com.scottyab.rootbeer.RootBeer');
RootBeer.isRooted.implementation = function() { return false; };
console.log("ルート検出バイパス成功!");
});
APIセキュリティテスト
# 1. レート制限
for i in range(100):
r = requests.post(f"{BASE}/login", json={"user": "admin", "pass": "wrong"})
if r.status_code != 429 and i > 10:
findings.append("ログインにレート制限なし!")
break
# 2. IDOR
r1 = requests.get(f"{BASE}/orders/1", headers={"Authorization": f"Bearer {token}"})
r2 = requests.get(f"{BASE}/orders/2", headers={"Authorization": f"Bearer {token}"})
if r2.status_code == 200 and r1.json()["user_id"] != r2.json()["user_id"]:
findings.append("IDOR: 他ユーザーの注文にアクセス可能!")
モバイルペンテストチェックリスト
| チェック | Android | iOS | |---------|---------|-----| | トラフィック傍受 | Burp + CA証明書 | QProxy + CA証明書 | | SSLピンバイパス | Frida | Frida | | ルート検出回避 | RootBeerフック | AntiSubstrateCrack | | 安全でない保存 | SharedPrefs、SQLite | Keychain、Plist | | ハードコードされた秘密 | APK逆コンパイル | IPA逆コンパイル |
ベストプラクティス
- 実機でテスト(エミュレータ検出多数)
- Fridaでランタイムバイパス
- APK/IPAを逆コンパイルしてシークレット確認
- APIとモバイルアプリを一緒にテスト
- 安全でないデータ保存を確認
- 全エンドポイントのレート制限確認
重要なポイント
- コアコンセプトをしっかり理解する
- ハンズオンコード例で実践する
- 実世界の問題に応用する
- 演習で知識を強化する
さらに学ぶ
- 公式ドキュメント
- GitHubのオープンソースプロジェクト
- コミュニティフォーラムとディスカッション
- 関連コースとチュートリアル