75ギガバむトのむンスタント怜玢

このペヌゞの倧量のデヌタのクむック怜玢がどのように実装されたかに぀いおです。 そこで、 PvPGNゲヌムサヌバヌのハッシュパスワヌドを怜玢し、同じハッシュを生成できたす。
怜玢は、モゞュヌルずサヌドパヌティのデヌタベヌスを䜿甚せずに、玔粋なPHPで蚘述されおいたす。 原則ずしお、この方法でボリュヌムを数テラバむトに増やすこずができ、堎所がありたす-速床はこれによっおそれほど苊しむこずはありたせん。

さらに、最初から最埌たで、ブルヌトフォヌス、テヌブルのハッシュの䜜成、゜ヌト、そしお実際の怜玢を含むプロセス党䜓が説明されおいたす。




ブルヌトフォヌス



パスワヌドを怜玢するためのハッシュテヌブルを防ぐには、パスワヌドを䜜成するずきにパスワヌドを゜ルトず混合する必芁がありたす。 しかし、ハッシュのリストがあり、゜ルトがどのように远加されるかを知っおいるので、単玔なパスワヌドは培底的な怜玢で芋぀けるこずができたす。
したがっお、PvPGNのハッシュは゜ルトなしで生成され、倧きなキヌず倀のテヌブルハッシュパスワヌドを生成するずいうアむデアが生たれたした。

Cでのブルヌトフォヌスの最も単玔な䟋を瀺し、MD5ハッシュ怜玢のパスワヌドを゜ヌトしたす。 たた、゜ヌトされおいないテヌブルの生成は、生成されたデヌタをCSVファむルに远加するだけです。

class Program { static bool _isFound = false; static string _findHash; static string _symbols; static int _pass_lenght; static void Main(string[] args) { _findHash = args[0]; //   _pass_lenght = int.Parse(args[1]); //    _symbols = args[2]; //     byte[] data = new byte[_symbols.Length]; Process(data, 0); Console.ReadLine(); } private static string hash; private static byte[] data_trim; private static string pass; //   static void Process(byte[] data, int index) { //     if (index == _pass_lenght) { data_trim = data.TakeWhile((v, idx) => data.Skip(idx).Any(w => w != 0x00)).ToArray(); //     pass = Encoding.ASCII.GetString(data_trim); hash = GetHash(pass); Console.Write("{0} ", pass); if (hash == _findHash) { _isFound = true; Console.WriteLine("\n\nPassword was found!\n\t{0} = {1}", hash, pass); } return; } //    foreach (byte c in _symbols) { if (_isFound) return; data[index] = c; Process(data, index + 1); } } //  md5 hash   static string GetHash(string value) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] output = md5.ComputeHash(Encoding.ASCII.GetBytes(value)); return BitConverter.ToString(output).Replace("-", "").ToLower(); // hex string } } 


゜ヌスリンクの䟋。
実行BruteForce.exe [search_hash] [password_length] [password_characters]


仕分け


結果は、゜ヌトされたデヌタでのみ機胜するバむナリ怜玢になるため、ハッシュでデヌタを゜ヌトする必芁がありたした。
考え盎すこずなく、テスト甚の5 GBのデヌタをコンピュヌタヌのMySQLにむンポヌトしたした。 むンデックスは䜜成されず、ク゚リがCSVぞの゚クスポヌトで゜ヌトを開始したした。

 SELECT hash, pass INTO OUTFILE 'd:\\result.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '' LINES TERMINATED BY '\n' FROM hashes ORDER BY hash 


圌には16時間かかりたしたが、その間に、TEMPフォルダヌに16ギガバむトず25ギガバむトの2぀のファむルが䜜成されたした。
しかし、むンデックス数時間䜜成されたを䜿甚しおも、少なくずも゜ヌト䞭にギガバむトが吞収されるため、このオプションは䟝然ずしお私には適しおいない。 テヌブルのサむズが倧きくなるず、ディスクに十分なスペヌスがなくなりたす。

SQLiteでテヌブルを䜜成しようずしたしたが、倧容量向けに蚭蚈されおいないため、動䜜が非垞に遅くなりたした1 GBではハッシュ怜玢に玄6秒かかりたした。 MySQLは高速ですが、どちらの堎合も最終的なサむズには適さず、元のデヌタのほが2倍以䞊でしたむンデックスを合わせお。

ファむル党䜓をメモリにロヌドするこずなくビッグデヌタの゜ヌトに関䞎したこずがないため、最初に登堎したアルゎリズムである「 バブル゜ヌト 」を採甚したした:)。 ファむルが自動的に゜ヌトされるようにCで小さなコヌドを䜜成し、500メガバむトで䞀晩テストを実行したした。 翌日、ファむルはただ゜ヌトされおいたした。 最小レコヌドがファむルの最埌にある堎合、このアルゎリズムでは1行䞋に移動し、そのようなシフトごずにファむル党䜓を最初から最埌たで凊理する必芁があるためです。

私は他の゜ヌト方法、 マヌゞを探し始め、 ピラミッドが適切であるこずが刀明したした。 私はそれらのハむブリッドの実装を開始したしたが、XPからWindowsにデフォルトで付属しおいるsortナヌティリティに関する情報を偶然芋぀けたした。 結局のずころ、圌女は私の仕事に理想的でした どのように機胜するのかわかりたせんが、説明では、1回のパスでファむルを゜ヌトするず説明しおいたす30分で5 GB゜ヌト。 ゜ヌト凊理䞭に、ナヌティリティは元のファむルの重量ず同じだけの远加の空きスペヌスを必芁ずしたす䞀時ファむルの堎合。

しかし、ここではすべおがスムヌズではなかった。 190 GBのファむルを䞊べ替えるず、3倍のスペヌスが必芁になり、䜕かを怜玢しお削陀し、ディスクスペヌスを解攟したした。 さらに、最終的なファむルに奇劙な「アヌティファクト」が珟れたした。


それらはファむルのランダムな郚分で玄10になりたした。 私は数回゜ヌトを開始し、毎回24時間埅機したしたが、䟝然ずしおアヌティファクトが珟れたした。 私はこれがなぜ起こったのか理解しおいたせんでした。私は12 GBのRAM、Win7 x64を持っおいたした。 この間にメモリが「詰たった」ず仮定できたす。 システムを再起動した埌、同じ゜ヌトが初めお成功したした。

怜玢する


今では銬鹿げおいるように思えたすが、以前はファむルの怜玢はファむル党䜓をメモリにロヌドするか、ファむル党䜓を1行ず぀読み取るこずによっおしか実行できないずい぀も思っおいたした。 実際に倧きなファむルでバむナリ怜玢を詊しおみお、それがどれくらい速く動䜜するかを芋お、PHPでさえ、それは私にずっお小さな発芋であるこずが刀明したした。 このような怜玢は、プロセッサをロヌドしたりメモリを消費したりするこずなく、非垞に倧量のデヌタを凊理するのず同じくらい速く動䜜したす。


バむナリ別名バむナリ怜玢は、次の原理で機胜したす。
  1. 配列は2぀に分割され、読み取り䜍眮が䞭倮に移動したす。
  2. 䞭倮にある珟圚の倀は、目的の倀ず比范されたす
  3. desired>の堎合、配列の埌半が取埗されたす。必芁な<current-前半の堎合。
  4. アレむのこの半分で1〜3ステップを実行したす。

そしおもちろん、バむナリ怜玢の䞻な条件は、配列を怜玢キヌで゜ヌトする必芁があるこずです。

ファむルでは、バむナリ怜玢はたったく同じように機胜したす。 fseek関数を䜿甚しおオフセット䜍眮をファむルの䞭倮に移動し、䜍眮を行の先頭に調敎しおレコヌドの䞭倮にヒットした堎合、そこにあるレコヌドを完党に読み取りたす。

1぀のBUTではない堎合は、これで停止するこずができたす...

郹門


PHP_INT_MAXの倀2147483647バむトを超えるファむルは怜玢できたせんでした。 さらに、fseek関数が-1を返す堎合もあれば、すべおが問題ない堎合もありたすが、オフセットはどこで明確ではありたせん。 その結果、必芁なものがたったく読み取られたせん。 バグは明らかではありたせんでしたが、問題を芋぀ける過皋で、バグトラッカヌで情報を芋぀けたした。 PHPドキュメントサむトには、2 GBを超えるファむルを怜玢するfseek関数fseek64関数に関するコメントもありたす。 これは、ファむルの先頭からではなく、反埩によっお珟圚のオフセットから目的の堎所たで読み取るこずになりたす。 しかし、私はチェックしたした、これも機胜したせん。

ファむルを分割する必芁がありたした。 ファむルを砎壊するための適切なナヌティリティが芋぀かりたせんでしたおそらく怜玢は䞍十分でしたが、怜玢の最初のペヌゞには疑わしいむンストヌルしかありたせんでした。 Windowsの兵噚庫では、奇劙なこずに、そのようなナヌティリティはありたせん。 総叞什官では、バむト単䜍で分割するこずは䞍可胜ですが、粟床が必芁でした。
゜ヌスファむルをバむト単䜍で読み取り、指定されたサむズの個別のファむルに順番に配眮する単玔なナヌティリティをCで䜜成したした。

倚分誰かがそれを必芁ずする、 ここから゜ヌスからダりンロヌドしおください 。
実行Split.exe [ファむル] [in_bytes]

圧瞮


たず、゜ヌトされたデヌタを2぀の個別のファむルに分割したした。それらのハッシュずパスワヌドがそれぞれ栌玍されおいる.hash、.passです。 次に、すべおのデヌタを1぀のヘックスに「パック」したした。 数倀はこの方法で最倧2回たで簡単にパックされ、各倀の長さが固定されおいるため、欠萜しおいるギャップに0xFが远加されたす。

圧瞮の実行方法ず怜玢の実行方法は、次の䟋で明確にわかりたすハッシュ0dd5eac5b02376a456907c705c6f6fb0b5ff67cfのパスワヌドを探しおいたす。


0D D5 EAハッシュの最初の6文字。 この方法ではハッシュが重耇したすが、それほど倚くはありたせん。 そしお、パスワヌドはすべお保存されおいるため、1000のパスワヌドからでも、元のハッシュを非垞に迅速に埩元できたす。

70 FF -70がここにパックされたす。これは、0dd5eaで始たるハッシュのdigits.passファむルに含たれるパスワヌドの数です。

59 99 95 68 FF FF FF-番号59999568がここにパックされたす。これは、digits.passファむル内のパスワヌドの読み取り開始䜍眮です。

11a19a90 -digits.passファむル内の70個のパスワヌドの読み取りを開始する䜍眮。 次のように蚈算されたす59999568 * 5すでに圧瞮されおいるパスワヌドの長さ、バむト単䜍= 29999784016進数に倉換

84 04 05 38 8F 8F-番号840405388がここにパックされおいたす。これは、目的のハッシュに察応するパスワヌドです

次に、ファむルの最埌でパスワヌドが切り捚おられず、PHP_INT_MAX2147483647-2147483647パスワヌドサむズバむトを超えないように、.passファむルを分割したす。
.hashファむルの最倧サむズは185 MBであり、砎損する必芁はありたせんでした。


実際、怜玢は.hashファむルでのみ実行され、パスワヌドのみが.passからファむル内の特定の䜍眮からロヌドされたす。 しかし、これはこの蚘事の䞻芁なトピックを吊定するものではありたせん。生デヌタで速床を確認したした。

すべおの未加工ファむルの重量は260 GBで、圧瞮埌は70 GBになりたした。 このサむズには、文字の付いた数字から1〜6文字のパスワヌドず、7〜10文字のパスワヌドが含たれたす。数字のみ、合蚈で玄135億のパスワヌドです。 その埌、1億語の単語を远加したした。 その結果、実際のP​​vPGNサヌバヌからのパスワヌドの玄90を芋぀ける必芁がありたす93.5は以前のPvPGNサヌバヌから芋぀かりたした。

少しの最適化


1人の優秀な人がPvPGNハッシュ関数をPHPからJavaScriptに移怍したしたテヌブル甚に250 GBのスペヌスを持぀仮想サヌバヌも提䟛したした。

さたざたなハッシュ実装のパフォヌマンス枬定を行いたした。


harpywar.pvpgn.pl/?do=hashをダりンロヌドするず、さたざたな蚀語の実装を利甚できたす
明らかに、Cが最速です。 Firefoxはスクリプトの実行䞭にハングしたすが、すべおのブラりザヌで速床はほが同じです。

PHPが原因で怜玢が遅くなりたした。 そのため、テスト盎埌に、このリ゜ヌス集䞭型タスクをブラりザヌでクラむアントに送信するこずにしたした。 さらに、クラむアントの堎合、これは完党に目に芋えたせん-平均しお、1回の怜玢ク゚リに぀き1,000個以䞋のハッシュを生成するのにかかりたす。 すでに少しだったものをやり盎す必芁がありたした。芋぀かったパスワヌドは、JSON配列でクラむアントに枡され、ブラりザでパスワヌドを繰り返し、ハッシュを生成したす。 生成されたハッシュが怜玢されたハッシュず䞀臎する堎合、パスワヌドは芋぀かったず芋なされたす。
スクリヌンショットでこれがどのように機胜するかの倧たかなしかし明確な䟋ただ圧瞮されおいないファむルがありたす


たずめ


倧芏暡なデヌタセット、たたはタヌンキヌ゜リュヌションを怜玢する他の方法がおそらくありたす。 しかし、特定のタスクのために、私の実装は非垞に高速で、非垞に重芁なこず-非垞にコンパクトであるこずが刀明したした。 バックグラりンドの生成ずテヌブルの䞊べ替えを含め、これに玄1週間を費やしたした。

ブルヌトフォヌスコヌドが䞊列化されおGPUに移怍されるず、非垞に倚くの文字を含むパスワヌドが比范的迅速に゜ヌトされるため、これはおそらく䜕かを䜜成するのに最適な䟋ではありたせん。
しかし、その過皋で倚くの知識ず経隓を埗たので、それらを共有したいず思いたした。

曎新する

-興味のある人のためにPHPの゜ヌスをレむアりトしたしたが、テヌブルファむルがなければ、その調査は面癜くないかもしれたせん index.php 、 hashcrack.class.php 。

-䟋ずしお、ファむル内のバむナリ怜玢を䜿甚しお、倧きなログのデヌタをスラむスするこずができたす特定の日付の「開始」ず「終了」の統蚈を分析する必芁がある堎合

-私はトヌタルコマンダヌでミスを犯したした-それを利甚しお、バむト単䜍でファむルを正確に分割するこずができたす Joshua5が提案。

-さたざたなデヌタベヌスの機胜にあたり詳しくないため、怜玢に時間がかかりたした。
Alexey Pechnikovは、SQLiteではパフォヌマンスが非垞に高くなる可胜性があるず蚀っおいたすが、テヌブルでは「fts4」を䜿甚する必芁がありたした。 MySQLにはおそらく䌌たようなものがありたす。

-以䞋のコメントには、デヌタを敎理しお怜玢する方法に関するアむデアがありたす。

-webhamsterからのコメントは、このトピックで瀺したかったこずを完党に反映しおいたす

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


All Articles