
やる気
Starbucksアプリにクレジットを与える価値があります-それは素晴らしいことです。 私は(少なくとも)1日1回使用します。 コーヒー、 Spotify 80sプレイリスト 、他の人とのライブチャットを回避する機能など、優れたモバイルサービスに必要なものがすべて揃っています。 米国でのスターバックスの事業の20%が現在携帯電話を介して行われているため、私は自分の好みが明らかに一人ではありません。
Slackとコーヒーボタンの 統合に加えて、サードパーティの開発者向けにAPIを公開した場合に実装できる他の多くの統合があります。 彼女は開発者向けのTwitterアカウントと(パスワードで保護された)Webサイトの両方を持っているため、明らかにこの方向に動いています。
しかし、私は待つことができなかったため、問題を自分の手に委ねることにしました。
簡単ではなかった
スターバックスはクラックするのが難しいことが判明しました。 「openapi.starbucks.com」というURLにもかかわらず、アプリケーションによって行われた呼び出しの分析を開始する前に、深刻なジャングルを通り抜けなければなりませんでした。 他の支払い処理アプリケーションと同様に、スターバックスは、アプリケーションで使用されるAPIを不正使用から保護するために多くのセキュリティ対策を講じています。 それらのいくつかを次に示します。
- SSL証明書のピン留め
- 携帯電話の属性の フィンガープリントを作成して、スマートフォンを使用しているかどうかを確認します
- AES、256ビットキー、および擬似ランダム初期化ベクトルを使用して、この指紋を暗号化します
- 現在のタイムスタンプでクエリに署名する
ネットワーク要求の監視
開始するには、Starbucksアプリケーションとそのサーバー間で交換されるリクエストとレスポンスを監視する方法が必要でした。 通常、私はCharles (またはmitmproxy )でiPhoneをセットアップするだけで十分でした。
しかし、今回は違います! アプリケーションは証明書の固定を使用しているため、通常どおり、要求を傍受できませんでした。 代わりに、古いAndroid携帯電話を掘り下げ、 ルート権限を取得し 、 Xposedというフレームワークをインストールし、最後に実行中のアプリケーションに統合してSSLピニングを無効にする拡張機能をインストールする必要がありました。

ムアハハ
開始後、Charlesプロキシを使用してリクエストの表示を開始できました。 ただし、すべてのリクエストを簡単に再現できるわけではないため、これはかなり誤った希望であることが判明しました。 ただし、たとえば、最寄りの店舗、メニュー、カード残高などの基本情報を要求することはできました。

最寄りの店舗に関するクエリの結果。 今、あなたは私が働いている場所を知っています。 おっと
「簡単です」と思ったのですが、「プロキシサーバーに接続して注文した後、リクエストを再生するだけです!」
しかし、ありません。
判明したように、スターバックスのアクセストークンは1時間しか有効ではないため、携帯電話で使用されているトークンをそのまま使用することはできません。 これにより、特定の困難が生じます...
ログイン
アプリケーションで使用されるOAuthエンドポイントは、トークンを発行する前に3つのパラメーターをチェックします。
- クエリ文字列パラメーターはsigです。 セキュリティ研究者のRyan Pickrenは、これがクライアントキー、クライアントシークレットキー、および現在のUNIXタイムスタンプであり、 連結され、MD5ハッシュ関数によって駆動されることを発見しました 。
- フォームパラメータは「deviceFingerprint」です。 これは、さまざまなbase64エンコードデバイス属性とAES-256暗号化のリストです。 また、現在の時刻とデバイスのアップタイムが指紋に含まれるため、定期的に変更されます。
- X-Cbt HTTPヘッダー。 別のbase64エンコードされた秘密キー文字列。
私は自分でそれらのいくつかを形成しようとし始めました。 ジェイルブレイクしたiPhoneを使用してdeviceFingerprintを作成するために使用する暗号化キーを取得し、Starbucksアプリ内のフレームワークを解読することができました。 しばらくの間、 Hopperでフレームワークを研究していた私は、最終的にApple CCCrypt関数の呼び出しを追跡することができました。

www.youtube.com/watch?v=o8ZnCT14nRc
次に、SBXDataフレームワーク(以前にジェイルブレイクした電話で解読したフレームワーク)を急いで作成したアプリケーションにリンクし、 Fishhookを使用してこの機能を自分の実装に再割り当てしました。 これにより、キーと関連パラメーターをコンソールにアップロードできました。

同様に、「X-Cbt」ヘッダーの生成方法を見つけることができました。 簡潔にするために、このタスクはあなたにお任せします:)
おわりに
ログイン要求から指紋に署名して指紋を削除できた後、すべてを小さなNode.jsモジュールに統合しました。これにより、Starbucks APIの基本機能の一部を使用できます。 良いニュース:GitHubに(ほとんど) ここに投稿されています!
出来上がり! プログラム可能なコーヒー。