サーバー(RSA認証スイートの秘密鍵、サーバーアプリまたはプログラムメモリ)またはクライアント(アプリまたはメモリ)のいずれかを制御しない限り、メッセージを復号化できません(まあ、または両方が弱い暗号をネゴシエートしますが、それは別のトピックです)
最も簡単な方法ですが、サーバーとクライアントの両方にとって最も侵襲的で簡単に見つけることができます: ssl/tls man-in-the-middle with fake certs . これはクライアント アプリがサーバー証明書を変更しているため、クライアント アプリは接続を拒否する可能性があります (証明書のピン留め、ハード ピン)。そうでない場合は、サーバーを制御し、ネゴシエートされたキーにアクセスできます。
なんで?
クライアントとサーバーの両方が、クライアントとサーバーのセッション キーのセットを導出する共有マスター シークレットをネゴシエートします (rfc2246 - tls1.0 などの対応する rfc で指定された tls prf を使用)。
とはいえ、サーバーをいじりたくない、またはいじることができず、クライアントプロセスにアクセスできる場合は、メモリからマスターシークレットを抽出し、クライアント/サーバーセッションキーを再計算する方法を見つけることができます. RFC。抽出は、アプリケーションをデバッグするか、メモリ アーティファクトを検索するか、パッチを適用してからプロトコル メッセージを復号化することで実行できます。マスター シークレットは時々再生成されるため、wireshark がキーを再ネゴシエーションに一致させるために、マスター シークレット ネゴシエーションまたは正確な時間につながるクライアントの hello (クライアント ランダム) も追跡する必要があることに注意してください。キーはこのクライアント セッションでのみ有効であり、制限されていない暗号を復号化できますマスター シークレットは、TLS キーのネゴシエーションが終了した後に両当事者が同意する最終的なシークレットであるため、RSA 認証に送信されます。
マスター シークレットを取得し、それをクライアントの hello にマップしたら、それをnss キーログ形式で Wireshark にフィードするだけです。
メモリ内で master_key を見つける方法の例を次に示します
。pymemscrapeは、プロセス メモリ イメージから master_key を見つける方法を示す PoC です。