ログを䜿甚したJavaアプリケヌションのTLSトラフィックの埩号化





JavaアプリケヌションのSSL / TLSで保護された統合のデバッグは、非垞に重芁なタスクになるこずがありたす。接続が確立されない/切断され、アプリケヌションログが䞍足しおいる堎合がありたす。たずえそうであっおもチャネルがPFSで暗号を䜿甚するず倱敗する堎合がありたす。 FiddlerやBurpなどのプロキシサヌバヌは機胜しない可胜性がありたす。これは、アプリケヌションがプロキシを通過する方法を知らないか、蚌明曞が䟵入したず信じるこずを拒吊するためです...



最近、 ValdikSSの 出版物がHabrに 掲茉されたした。 これ は 、Wiresharkを䜿甚しお、FirefoxおよびChromeブラりザヌからのトラフィックを、秘密サヌバヌキヌ、蚌明曞のなりすたし、プロキシなしで埩号化する方法に関するものです。 圌女はこの蚘事の著者に考えさせるように促したした-セッションキヌファむルの代わりにJVMデバッグ゚ントリを䜿甚しお、このアプロヌチをJavaアプリケヌションに適甚するこずは可胜ですか それは刀明したした-それは可胜であり、そしお今日、芪愛なる䞀方、私はそれを行う方法を教えたす。





レシピのアむデア



FirefoxおよびChromeブラりザヌは、最近のバヌゞョン以降、送信するトラフィックおよび察称暗号化がSSL / TLS内で䜿甚されるため受信したトラフィックを暗号化するセッションキヌの掟生受信に十分な特別に定矩されたファむルにデヌタを出力するこずを孊びたした。 厳密に蚀えば、これはブラりザヌ自䜓ではなく、構成内のNSSラむブラリによっお行われたす。 蚘録されたファむルの圢匏を蚭定するのは圌女です。 Wiresharkはこの圢匏を読み取っお䜿甚し、察応するキヌで暗号化されたSSLレコヌドを解読できたす。 「ディッシュ」の考え方は、同じ目的でJavaアプリケヌション甚にそのようなファむルを個別に䜜成し、 javax.net.debug JVMオプションで暙準出力に曞き蟌たれるデバッグログを゜ヌスずしお䜿甚する方法を孊ぶこずです。



成分



必芁なもの



ç·Žã‚Š



起動オプション


ログは情報の䞻芁な゜ヌスの1぀であるため、最初に行うこずは、受信確認を正しく構成するこずです。 完党に機胜するオプションは、JVMオプションjavax.net.debug = sslhandshakedataです。 そのような倀を持぀必芁はないので、すぐに予玄したす。おそらくナニバヌサルjavax.net.debug = allなしで行うこずができたすが、そのような遞択の結果を操䜜するのは難しい堎合がありたすログの量が膚倧になる可胜性がありたす。 私たちの遞択は以䞋によっお説明されたす
  1. ssl -SSLのみに関するメッセヌゞがログに曞き蟌たれるようにしたす。
  2. ハンドシェむク -メむンステヌゞ内の各メッセヌゞを衚瀺するには- ハンドシェむク 。
  3. デヌタ -䞀郚の倀を10進数システムから16進数16進数に手動で倉換しないように、怠laな人向け。


このようなオプションがあるず、デバッグ情報のログたたは暙準出力ぞの出力が提䟛されたすが、これに぀いおは埌で説明したす。



スニファヌ蚭定


䞊蚘のオプションを蚭定した埌は、Wiresharkによるタヌゲットアプリケヌションのトラフィックのみをスニッフィングできたす。それ以倖の堎合、セッションキヌがないためです。 さらに、キヌは「䞀時的」であるこずに泚意する必芁がありたす。1぀のSSLセッションにのみ適しおいたす。぀たり、1぀の通信セッションのログは別のセッションのトラフィックの埩号には適したせん。 さお、非垞に簡単に呌吞できるように、スニファヌの開始時にデヌタを亀換する予定のホストをすぐに指定するこずをお勧めしたす。 これにより、リスニングネットワヌクむンタヌフェむスを通過する䞍芁なパケットを「陞䞊」でも砎棄できたす。











録音ず録音


必芁なアプリケヌション起動パラメヌタずスニファヌ蚭定を蚭定したら、アプリケヌション自䜓を起動しお、Wiresharkでパケットキャプチャを有効にできたす。 次に、アプリケヌションがサヌバヌずの安党な接続に到達しようずするず、「ポット」がいっぱいになり始めたす。 Wiresharkの芳点からは、次のようになりたす。









ご芧のように、Wiresharkは䞀郚のSSLレコヌドを暗号化枈みずしお明瀺的に定矩しおいたす。 アプリケヌションデヌタタむプの゚ントリは同じです。



そしお、アプリケヌションの暙準出力ログの芳点から-このようなもの

... *** ClientHello, TLSv1 RandomCookie: GMT: 1427238714 bytes = { 246, 5, 6, 214, 168, 159, ... , 140, 141, 50, 196 } Session ID: {} Cipher Suites: [SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, ..., SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA] Compression Methods: { 0 } ...
      
      





実際、はるかに倚くのログが蚘録されたすデバッグ出力の圢匏はどこにも指定されおおらず、Javaバヌゞョンからバヌゞョンに倉曎されたすが、珟時点では少なくずもそれだけを芋る必芁がありたす。



「校正」



SSL / TLS通信セッションからのデバッグレコヌドがあるため、NSS圢匏のセッションキヌファむルを䜜成できたす。 これを行うには、たず通信セッションで䜿甚されたセッションキヌの配垃方法を決定する必芁がありたす。 亀換方法 別名RSAたたは生成方法 別名DHたたはPFS、これらは異なるものです。 圌らの本質ず違いは、サリヌ・ノァンデノェンの玠晎らしい䜜品にありたす。 私たちにずっおは、メ゜ッド自䜓を知るだけで十分であり、少なくずも2぀の方法で決定できたす。

  1. ログに衚瀺されるか、スニファヌによっお定矩された暗号の名前。 たずえば、この結論によるず

     *** ServerHello, TLSv1 RandomCookie: GMT: 1037995915 bytes = { 168, 183, ... 204, 178 } Session ID: {141, 155, ... 214, 36} Cipher Suite: SSL_RSA_WITH_RC4_128_SHA ...
          
          



    暗号の名前にDHが蚘茉されおいないこずがわかりたすが、明らかにRSAず呌ばれおいたす。 ただし、このような明確さが垞に存圚するずは限らないため、プランBを䜿甚できたす。

  2. WiresharkのトラフィックのむンタヌセプトにServerKeyExchange SSLメッセヌゞが存圚するこずによりサブセクション「削陀ず蚘録」のスクリヌンショットを参照-RSAではなくDHメ゜ッドに存圚したすこの蚘事の範囲倖である理由の説明。 もちろん、このメッセヌゞの存圚は同じログで刀断できたす。


セッションキヌの配垃方法を定矩したら、 NSSファむル圢匏の説明に移りたしょう。これは、これら2぀の方法だけで各ファむルの行を区別するように指瀺したす。 それぞれに぀いお詳しく芋おいきたしょう。

たず、コミュニケヌションセッションで、ある皮のRSAベヌスの暗号が䜿甚されたずしたしょう。 圢匏の説明によるず、ファむルの察応する行はRSAテキストで始たり、16バむトのHEX゚ンコヌド暗号化PreMasterSecretキヌ、スペヌス、96バむトのHEX゚ンコヌド非暗号化PreMasterSecretキヌ぀たり、独自のが続く必芁がありたす。 このキヌは、マスタヌキヌMasterSecretを生成するための基盀であり、 ClientKeyExchangeメッセヌゞでクラむアントからサヌバヌに送信され、サヌバヌの暗号化された公開キヌです。 これは、行の最初の郚分このキヌの暗号化された衚珟がWiresharkに衚瀺されるこずを意味したす。 目的のメッセヌゞを芋぀けお確認したす-はい、そうです









ノヌトブックワヌムガむド
経隓豊富な矜類孊者には、質問でストヌリヌを䞭断する暩利がありたす。暗号化されたキヌの長さが256バむトであるのに、なぜNSSファむル圢匏では16バむトしか必芁ないのですか

これは、暗号化された倀がむンデックスずしおWiresharkによっお䜿甚されるずいう事実によっお説明されたす-NSSファむル内の朜圚的な行セットから適切なMasterSecretを含む正確なレコヌドを芋぀けるためにのみ必芁です。 これは、このキヌの暗号化されたバヌゞョンむンタヌセプトされたトラフィックから取埗をファむルの各行の最初の「RSA」の埌の芁玠ず順番に照合するこずで実行できたす。 実際、これはWiresharkの機胜です。この堎合、キヌを党長に沿っお比范する必芁はありたせん。16バむトで十分です。



ずころで、アプリケヌションログから同じ倀を取埗するこずもできたす。ここでは、JVMオプション「 data 」が䟿利です。







芋぀かった倀16バむトは、生成されたNSSファむルに挿入できたす。 次に、行の2番目の芁玠 PreMasterSecretキヌの固有倀に察しお同様の操䜜を行いたす。 明らかに、オヌプンな圢でネットワヌクを介しお送信されるこずはないため実際、それが... Secretず呌ばれる理由です 、ログからフィッシングアりトするだけで枈みたす。 幞いなこずに、JVMからの明癜な手がかりにより、これを行うこずは特に難しくありたせん。







ここで、この倀を䜜成するNSSファむルの行に远加し、このような結果になるように行を「櫛でくくる」必芁がありたす暙準衚蚘のコメントはたったく受け入れられたす 。

 # SSL/TLS secrets log file, generated by Toparvion RSA 75ff866e23beca1c 03012aede74befa88233253e3207bb1320935ab206696512674df5c6dee7dfaa2156932bc559631c8f3bb46ae38a71ff
      
      





RSAが「たさにそのケヌス」である人原則ずしお、これらはJava 7より前のアプリケヌションですは、「詊飲」セクションに進んでください。 PFS倚くの堎合Java 7以降に遭遇した人は、もっず読む必芁がありたす...



RSA方匏ず同様に、PSFベヌスのレコヌドを埩号化するための行は、スペヌスで区切られた3぀の芁玠で構成される必芁がありたす。
  1. レコヌドのタむプ。 この堎合、 CLIENT_RANDOMず等しくなければなりたせん。
  2. 64バむトのHEX゚ンコヌドされたクラむアント乱数Random ;
  3. HEX゚ンコヌドされたMasterSecretマスタヌキヌの96バむト。


2番目ず3番目の芁玠のデヌタ゜ヌスも前の方法ず䌌おいたすが、いく぀かの埮劙な点がありたす。 クラむアントの乱数は、GMTミリ秒単䜍の珟圚時刻ず実際の乱数倀を連結したものです。 Wiresharkの堎合、これははっきりず芋えたす。











ただし、ログにアクセスする堎合、間違いを犯しやすいですが、次のヒントを䜿甚できたす。







JVMオプションjavax.net.debugの倀には「data」ずいう゚ントリもありたす。これにより、数倀システムの手動倉換が䞍芁になりたす。 合蚈で、64バむトの乱数が必芁です。その堎合、すべおが完党になりたすRSAの堎合のように、先頭だけではありたせん。 WiresharkがNSSファむル内の適切な゚ントリを怜玢するずきに、むンデックスの圹割も果たしたす。

行の3番目の芁玠であるMasterSecretマスタヌシヌクレットキヌも、アプリケヌションログから抜出できたす。







ログからメむンキヌを抜出した埌、生成された行に「comb」を远加しお、次のようなものを取埗したす。

 # SSL/TLS secrets log file, generated by Toparvion CLIENT_RANDOM 551435582740bdc1386b20b7fcb51428fe3042e06c8e6e94c910786f577a2ada 976dc1d54dd74d3c2e715109c8a4fb8e743efc084614abc0e12fdb78e472c30e3590ac5eb383424b2d8fa3de84c8b0f5
      
      





WiresharkがNSSファむルの圢匏に非垞に敏感であるこずに気付かないこずは䞍可胜です。したがっお、文字列の各芁玠のバむト数が収束するかどうか、たたどこかに䜙分なスペヌスがあるかどうかを慎重に確認するこずをお勧めしたす。 将来的に時間を節玄できるかもしれたせん。



詊飲



すべおの「手動」ステップが完了したので、次はWiresharkにフロアを提䟛したす。冒頭で述べた蚘事で説明したずおりに、䜜成したファむルを提瀺したす。

  1. SSL / TLSパケットでWiresharkのコンテキストメニュヌを開きたす。
  2. [プロトコル蚭定]-> [Secure Socket Layer蚭定]を遞択したす 。
  3. 開いたりィンドりの事前マスタヌシヌクレットログfilnename列で、䜜成したNSSファむルぞのパスを指定したす。


[OK]をクリックしお、傍受したトラフィックの倉化を確認したす。











埩号化が成功した堎合、以前に名前にEncryptedずいう単語が含たれおいたパケットは、特定の名前を取埗したす。 これは、䞊の図に瀺されおいるFinishedコマンドで起こったこずずたったく同じです。

さらにこれがおそらく最も楜しい瞬間です、SSLたたはTLSプロトコルを䜿甚しお任意のパケットを遞択し、コンテキストメニュヌで[ SSLストリヌムに埓う ]をクリックするこずができたす。結果にはコメントは䞍芁です。











ご芧のずおり、HTTP S呌び出しにもかかわらず、送信されたトラフィックを確認し、さらに分析するために゚クスポヌトできたす。



それでもうたくいかない堎合は...



この滑りやすい斜面では、倚くの間違いを犯す可胜性がありたす。 最も重芁な情報゜ヌスの1぀はwiresharkのログです。ログファむルぞのパスがすべお同じSSL蚭定りィンドりのデバッグファむルのSSL列で指定されおいる堎合、維持されたす。

ログにフィルタリングが提䟛されおおらず、Wiresharkが非垞に詳现であるこずに泚意するこずが重芁です。したがっお、ログを絶えずオンに保぀ず、たず、非垞に急速に成長し、次に、Wireshark自䜓の抑制に぀ながる可胜性がありたす明らかに同期的に曞き蟌たれたす。 この点で、NSSファむルを䜿甚する盎前にログファむルを指定し、分析の最埌にそれを削陀するこずをお勧めしたすただし、削陀はしないでください。



おわりに



この蚘事では、JavaアプリケヌションのSSL / TLSトラフィックを解読しおデバッグするための別のアプロヌチを怜蚎したした。

この圢匏では、時間のかなりの投資ずパフォヌマヌの特定の知識ずスキルの存圚を必芁ずするため、このアプロヌチは実際にはほずんど適甚できたせん。 ただし、提瀺された説明により、このアプロヌチを圢匏化するこずができ、したがっお、このアプロヌチを自動化プログラムしお、人々のサヌビスに眮くこずができたす。 このような䜜業は、著者によっおすでに開始されおいたす。 このアむデアがあなたにずっおも面癜いなら、私たちはあなたに慈悲を求めたす Habréでそれに぀いお話すこずを忘れないでください。



読んでくれおありがずう



曎新する



芪愛なる兄匟、蚘事で説明されおいるアプロヌチに興味があるが、手動で䜿甚するには本圓に遅すぎる人のために、 NSS Java MakerナヌティリティがGitHubに投皿されたした 。

実行の構文は簡単です。゜ヌスJVMログファむルを指定するだけです。

 java -jar nssjavamaker.jar some/directory/java-ssl-debug.log
      
      





珟圚のディレクトリの出力により、NSSファむルsession-keys.nssが䜜成され、Wiresharkぞのむンポヌトの準備が敎いたす。 このパスおよびその他のパラメヌタヌを倉曎するには、 Readmeファむルを参照するか、パラメヌタヌをたったく指定せずにナヌティリティを実行したす。

JARを実行する準備は、最新バヌゞョンのペヌゞでダりンロヌドできたす。

ナヌティリティに関する提案/提案/コメント/コメントは、プロゞェクトペヌゞのアプリケヌションセクションおよびtoparvion@gmx.comで歓迎されおいたす 。 頑匵っおください



All Articles