Суть идеи: Начинаем брутить либо полным перебором, либо по словарику, либо как только вылавливается первый пароль, ему ставится в соответсвие конкретная маска из стандартных типов ?d?l?s?u с привязкой знакоместо=набор символов и брут уходит в ветку отработки этой конкретной маски. После отработки маски, маска сохраняется в память для дальнейшего сравнения. Далее брут продолжается по основной первичной атаке, как только пароль находится, ему снова ставится в соответсвие маска, если она уже есть в памяти (т.е. по ней уже брутилось) - пропускаем и не уходим в ветку брута по этой маске, если маска новая - то уходим в отработку брута по ней и т.д. К чему такой алгоритм? Актуально для дампов, где использована генерка паролей по маскам, да и вообще многие маски более популярны, чем другие, смысл алгоритма: как бы насщупывание аналогичных паролей в общем хэшлисте, как правило состоящем из дампов, которые могут вполне возможно быть полностью отдельными ветками! (т.е. иметь конкретную маску - общие закономерности). Метод опробован на распредбруте 2011года (и будет использован в этом году тоже), т.е. были сгенерерированы маски, на основе часто/либо наоборот редкопопадающихся в словаре реалпассов и был неплохой выхлоп. Идея требует доработки, пока описал то что пришло в голову, ну а название фрактальный - типо из-за рекурсии... :wink: P.S. Идею можно развить вплоть до генерации паролей по принципу дерева-фрактала, а не проходить линейно прямым перебором, только надо подумать над реализацией такого алгоритма на примере генерации словаря, на досуге займусь этим. Думаю можно взять большой список реалпасов и прикинуть его структуру в виде дерева, ветвящегося по опред. правилам. Идея фрактального анализа отчасти была использована в PasswordsPro при гибридной атаке с правилами замены символов на конкретных знакоместах в пароле. В EGB пока такой атаки мы не имеем, только слева и справа можем что-то приставлять к слову, но не менять его само внутри. Дальнешее развитие идеи: Берём большой словарь реалпасов и вычисляем матожидание для каждого символа на конкретном знакоместе, у каких-то символов на каких-то конкретных местах оно будет выше - это и есть стволы куста, а далее уже идём по веткам. На определённом этапе можно пересчитать матожидания в уже сбрутившихся паролях и подстроить соответсвенно алгоритм дальнейшей генерации паролей, т.е. получаем алгоритм с обратной связью, когда выход влияет на вход, т.е. как бы "ватаскивам сами себя за волосы" Хотя конечно понятно что выход на вход на самом деле никак не влияет (физически) но природа всей нашей вселенной нам говорит о том что всё взаимосвязано и всё взаимопроникающе Это из той оперы, что если подавать на вход хэшфункции её выход т.е. хэш, то вконце концов всё множество значений должно быть пройдено. Проскочила мысля, попробую сформулировать: "динамически растущий набор символов, имеющий предел" для конкретного знакоместа в слове. 8) рождает динамические пользовательские маски. Если набор расширяется за счёт прибавки нового знака, то набор остаётся тем же, но если он в корне меняется, то мы вынуждены обозначить его новой переменной и маска уже будет новая. тут вопросы остаются чтоб не допустить пересечение веток кустов (это лишняя работа). P.S. В голове уже оформляется потихоньку одна из возможных идей алгоритма генерации дерева паролей. Предлагаю обсудить алгоритм формирования дерева паролей, на основе идей фрактала и рекурсии. Т.е. вся идея вкраце: 1. берём большой словарь реалпассов, чистим от хэшей, хэшей с солью, всего что больше 15-16 символов. 2. Считаем матожидания символов в нём, в зависимости от знакоместа. 3. Формируем пользовательские наборы символов. 4. Начинаем брут по пользовательской маске из этих пользовательских наборов, для каждого знакоместа будет свой набор (т.е. маска будет ?1?2?3?4?5?6 и т.д.). где ?N - свой индивидуальный набор символов для конкретного знакоместа с максимальными матожиданиями. 5. как только набирается критическая величина сбрученных паролей, либо брут по маске окончательно пройден, начинаем вновь анализировать полученный словарь и возвращаемся к этапу 2.
Идея уже поднималась, причем вами же) Но она работоспособна и это хорошо, буду рад помочь чем смогу И надо будет учитывать целесообразность брута по маске к найденному пассу, если он займет лет 5 то его нид пропускать, но это формальность)
Это понятно, поэтому и динамические наборы символов будут ограниченной длинны, кроме того брут по конкретной маске можно ограничить задавшись параметром типа кол. найденных паролей за сутки.
Генератор пользовательских наборов символов почти готов, сейчас скоро уже выложу. Сейчас пока тестирую. Точнее он был готов ранее, сейчас дорабатываю, задавшись параметрами: Длинна чарсета и колличество чарсетов (1-36 максимум в EGB, соответсвенно теоритически максимальная длина слова 36 символов), ещё можно ограничивать чарсеты по самому матожиданию конкретного символа, ну а в идиале конечно надо задаваться приемлемым временем временем брута и его скоростью, и уже из этого генерить и длины пользовательских чарсетов и их количество, в соответсвии с матожиданием символов в зависимости от знакоместа в слове (пароле).
Для этого надо построить сначала хорошую модель дерева паролей, а в свою очередь для этого нам надо много реалпассов, для получения релевантных матожиданий. В принципе результат может быть в итоге одинаков, но есть одно но: в случае линейного перебора мы просто скачем по точкам веток без всякого релевантного алгоритма (т.е. в как бы в одномерном пространстве - линейно) и маршрут пути никак не меняется во время собсвенно самого брута. В фрактальном же переборе мы нащупываем путь по мере продвижения, если ветка (маска) долгое время не даёт результатов, то отказываемся от неё перепрыгивая на другую, т.е. у нас есть пространство для манёвра и оно как минимум 2-х мерно уже, можно и сделать его трёхменым, подстравивая наборы пользовательских символов во время самого брута динамически. Тут, повторюсь нужен алгоритм не допускающий пересечений подмножеств, ибо повторная работа только тратит лишнее время. Т.е. благодаря фрактальной генерации паролей, хотелось бы достичь нелинейной скорости нахождения паролей, благодаря технике "насщупывания" релевантных масок и отказа от не релевантных.
по поводу 2х последних пунктов думаю если попробовать завязать это все на нейросети или генетического алгоритма то в принципе как я думаю можно будет сделать что бы прога после обучения сама определяла маску для каждого хеша, ток здесь будет больше проблем с составлением самого алгоритма и программированием его
Угу, направление верное - инструмент нейросети, ассоциативно- адаптивный алгоритм, но это в будущем высоко и далеко пока, МЫ на земном плане займёмся конкретной реализацией тут и сейчас! Ну что анализатор вроде готов, смотрите картинку по небольшому словарику реалрассов: Code: D:\Dict\statistic2>cmd /k join.exe ------------------------------------------------------------------- File -> pass.txt, size - 15917476 bytes Start, wait please... Statistics pass.txt computed... Words:1400000 Progress:▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 100% CustomCharsetSet0=samdbc1ptklrfgjneh2wvi0zo38H74y596xuqSMABDTPLKCRGF CustomCharsetSet1=aoeiurlhns1c20dmtb9k34f5yp876jwgvzxqA├рEOUIRLS.HBT CustomCharsetSet2=rnaslemtidoc10bkugp2hfv3y9j54z8w76xq ARNSLEMTDCBPG CustomCharsetSet3=aeiotnrls1hdk2umc0g3b4p95768yfvzjwxqA_Eр- ISRTNOU. CustomCharsetSet4=aei1onrslt20kmud983y5ch476bgpfjvzwxq_A E-YS├BRNOLM CustomCharsetSet5=ae1in0o2rs93lt84567dumkchybgpfvzwjx_ [email protected]рLTO CustomCharsetSet6=1a0e29no8l3i7rs654tdkmuchybgfpvzjwxq_@A-. ERSNOLIT CustomCharsetSet7=102a9e387564lonsirtdmkuchybgfpvzxwj@q_AE.- NSRDC!L CustomCharsetSet8=102e893a7654insrotlmkduchgb@yfpvzxjw_!.qAE- рSNLOD CustomCharsetSet9=102a93r87e564inosmltk@ducfhybgvpzxwj._q!A S-ERрLOD [email protected]_q!EARS-NKDTL [email protected]_SCB CustomCharsetSetC=ailr.mH1e09@2837n56suo4tbdckfyhvgxzpwjqR_DAENCIZOK CustomCharsetSetD=alir.ume091@82375n64sobtdcfkyvxhgzwpjqDEXIASFMOLQB CustomCharsetSetE=r.lsauime@0189327654bdocnftkxvyhgzwpqDSTjEFWBGUQXO CustomCharsetSetF=ru.hlaim@be1092658734dcfnostxkvygz\ pw_jAFрq&EDC,# CustomCharsetSetG=ur.klia@mbe01239d8756fc4otsnxyhg wpvjzAqFB,'╨ED-!: CustomCharsetSetH=iur.lamed904512b3c867fotsnxkgh ywEBApv,zqFCПDK;-?R CustomCharsetSetI=lur.ai561d02ec8734f9btoxsnmk phygFBDAzEvт'wC,j!в╨ю CustomCharsetSetJ=lur.i6b31e42c5f0d8a97otsxmn hyg;AjFDpB-Cz,wPkЧEqT/ CustomCharsetSetK=eurl.ca31205db94678fotxms ingABCwyhp;zDEП*,kF?j!&' CustomCharsetSetL=ru.07814936ead2bf5cxosmt ilADngBCvE&pтy,wFhвqQjk#( CustomCharsetSetM=ru56137d892b04efac.ms oiADtwFBgC#hnylkЧ-vEp,z=)/L* CustomCharsetSetN=u7d8ef21639c054abroi slACwEDtFpm,Пng.kzx=By?hтXvZq CustomCharsetSetO=f73ce2615ab8490dutDosCEiB ngFwmphlrт.yA,;kvвzjX-LK CustomCharsetSetP=2d19b867fa5c0e34 roEsCABFDmnlzЧw.i-tph,&qygvHxZuRJ CustomCharsetSetQ=03e69fc21ab8d754AFC rEBtonwgDslПmh.kpiu?y#,ZzPq(-v CustomCharsetSetR=f2e7d514863cb9a0DCoEhFtB; тrAsgp=yvil/,mnTSвxw.k*O CustomCharsetSetS=840cdba127f53e69DEAtBCF srlgnЧ&-phowvi*HzG.Jx/$Yy, CustomCharsetSetT=80da924f7351c6ebBrEDCtFsA o#Пi;g/py?uSkl.wROTHjnK, CustomCharsetSetU=39a80275b6c4ef1dCFBA DErlтsuhntвiygxOpR/wozYv^m!TN CustomCharsetSetV=e96b0138a7c245dfAED FotBgCЧ[email protected]/U CustomCharsetSetW=1: f5723908c4a6dMgqhbPm'*?ik!D`+ejtwFKoR.s[BHLWuz^ CustomCharsetSetX=908172364e5faCi[Yhvbugp"LPG#jJt/ASF;@?K>UMlnry}sE{ CustomCharsetSetY=9102845736eafiojhH!z'Ygs}WtG+x#Vd>FCbu/cvq$@*LpDwR CustomCharsetSetZ=0195623847dabelf&txjnpПgcsvo?r ihk'y@wuCд°Z┐(qDB)z D:\Dict\statistic2> Чем левее символ в наборе символов, тем выше его матожидание. Вот с другими параметрами: максимальная длина чарсета 50, максимум чарсетов 16 Code: D:\Dict\statistic2>cmd /k join.exe ------------------------------------------------------------------- File -> pass.txt, size - 14349293 bytes Start, wait please... Statistics pass.txt computed... Words:1310000 Progress:▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 100% CustomCharsetSet0=smadbc1ptklrfgjnhe2wvi0zo387y4596xquHSMABDTPLKCRGF CustomCharsetSet1=aoeiurlhns1c20dmt9bk34f5yp876jwgvzxqA├рEOUIRLSHBTN CustomCharsetSet2=rnaslemtidoc10bkugp2hfv3y9jw548z76xq ARNSLMETDCBPG CustomCharsetSet3=aeiotnrls1dk2humc0g34bp95678yfvzjwxqAEрI_S R-NTOUL CustomCharsetSet4=aei1onrsl20tkmu9d835chy476bgpfjvzwxqA_ EY-├SBRONLM CustomCharsetSet5=ae1in0o2rs93lt84567dumkchybgpfvzwjx q_A@E-SRN.рLTO CustomCharsetSet6=10a2e9on83ir7sl654tdmkuchygbpfvzjwxq@AE RSN_OLITрU CustomCharsetSet7=102a9e387546onsirltmdkuhycgbpfzvxwj@qAEN SRDC!.LMO CustomCharsetSet8=1023987ea654insrotlmkduchg@ybfpzvjxw!qAE.р SN-LO_R CustomCharsetSet9=10239a875e64rinosmltkduchyfgbpzvxwj.q!@ASE RрLONKD CustomCharsetSetA=a10ei2938rn7l65s4otkdmuyhcgb.fzvpxwjq!@EARSNKTLIOD CustomCharsetSetB=i1l0er92a3876ns5.4toudkymhcgbfxzvpwqjRAEINDLSHCOPT CustomCharsetSetC=lr.10e9238ua7n6ts54oidkycmhxgfbvzwpjqRDNAEIZHOKQSC CustomCharsetSetD=.ru01e9283a7n65s4toidlyckgmhfbvzwpxqjDXIESMQOZLAUR CustomCharsetSetE=ru01e893276an54sotdilcymfhbkgzwvxpqTSDWFGUQBOHXEjK CustomCharsetSetF=u1e703s96r825a4ntdmyolgihfkvzxcb.qpр! №*wj*A;ъэ-#F D:\Dict\statistic2>
Реализация: http://narod.ru/disk/45345536001.add7df5e3f50ff75bde586a12d0da1ba/statistic5.rar.html (исходник в комплекте) PHP: <?php $ipArray = array_map("trim", file("join.ini")); $file_1 = trim($ipArray[1]); // имя файла со списком релевантных паролей $charset_len = trim($ipArray[4]); // длинна чарсета $charset_col = trim($ipArray[7]); // колличество чарсетов, нет смысла писать больше чем максимальная длина слова в словаре $size1 = filesize($file_1); $max_charset_col=0; echo "-------------------------------------------------------------------\r\n"; echo "--------------CustomCharSet Mask Generator by -=lebed=--v.03-------\r\n"; echo "-------------------------------------------------------------------\r\n"; echo "File -> $file_1, size - $size1 bytes\r\n"; echo "Start, wait please...\r\n"; $f_1=fopen($file_1,"r"); if (!$f_1) {echo "Не найден 1 файл словаря.!\r\n"; exit();} echo "Statistics ".$file_1." computed...\r\n"; $n=0; while (feof($f_1)!='TRUE') { $n=$n+1; $word1=trim(fgets($f_1),"\r\n"); $chars=preg_split('//', $word1, -1, PREG_SPLIT_NO_EMPTY); $word_len=count($chars); if ($word_len>$max_charset_col) $max_charset_col=$word_len; for ($i=0; $i < $word_len; $i++) { $counter[$i]["$chars[$i]"]=$counter[$i]["$chars[$i]"]+1; } if ($n==10000) { $m=$m+10000;$n=0; $pr=ceil(100*ftell($f_1)/$size1); $p=ceil($pr/4); $bar=substr('ІІІІІІІІІІІІІІІІІІІІІІІІІ', 1, $p).substr('°°°°°°°°°°°°°°°°°°°°°°°°°',1,25-$p); echo "Words:".($m+$n)." Progress:".$bar." ".$pr."%\r"; } } $m=$m+10000;$n=0; $pr=ceil(100*ftell($f_1)/$size1); $p=ceil($pr/4); $bar=substr('ІІІІІІІІІІІІІІІІІІІІІІІІІ', 1, $p).substr('°°°°°°°°°°°°°°°°°°°°°°°°°',1,25-$p); echo "Words:".($m+$n)." Progress:".$bar." ".$pr."%\r\n"; if ($charset_col>$max_charset_col) $charset_col=$max_charset_col; for ($i=0; $i < $charset_col; $i++) { if ($i>9) $j=chr($i+55); else $j=$i; arsort($counter[$i], SORT_NUMERIC); reset($counter[$i]); $s=''; while (list($key, $val) = each($counter[$i])) { $s=$s.$key; } echo "CustomCharsetSet".$j."=".substr($s,0,$charset_len)."\r\n"; //print_r ($counter[$i]); } ?> P.S. За код не бейте - сырой. реализует пункты 2-3 Есть идея ещё раскрасить каждый символ цветов в завиимости от значения его матожидания.
Новая версия! добавил: 1. вычиcление матожидания для каждого символа на конкретном знакоместе; 2. ввывод в файлы CustomCharSet_N абсолютного колличества упоминаний символов (для справки). 3. переменную отсечения для удаления символов в чарсете с матожиданием ниже порогового. скачать: http://narod.ru/disk/45367962001.a8adb72fc138b45799623fbb88092f14/statistic5.rar.html Пример работы: Параметры генерации: Максимальная длинна чарсета 52 -------------------------------- Колличество чарсетов (1-36) 16 -------------------------------- Минимальное матожидание для попадания символа в чарсет в % 2 Code: D:\Dict\statistic2>cmd /k join.exe ------------------------------------------------------------------- --------------CustomCharSet Mask Generator by -=lebed=--v.03------- ------------------------------------------------------------------- File -> pass.txt, size - 56566 bytes Start, wait please... Statistics pass.txt computed... Words:10000 Progress:▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 100% CustomCharsetSet0=aefcd1bjAkphg2SsPi40Mlm675 9KrR CustomCharsetSet1=0a1eo32uUirhl7dsAbc95t4n8f6 CustomCharsetSet2=90anlsro31etim7cd2bN856pgfhk4uj CustomCharsetSet3=a1i32eon0cks75lhmtr498d6ugNb CustomCharsetSet4=daeo10352yt7nil46sr98pfcYuhmkb CustomCharsetSet5=ca17t3er2046895nifslbomRdAuhpkF CustomCharsetSet6=3ae102or69n784i5lbtdschRAkf CustomCharsetSet7=910n2ae863o4i7r5cmgblstdNuk CustomCharsetSet8=41a02356gn78ec9itorspkdlGbAu CustomCharsetSet9=9130e25a7l648isokutncdLgrbm CustomCharsetSetA=be312709586as4orlindkct CustomCharsetSetB=ae132065r987on4silbtdkfcRm CustomCharsetSetC=5103ea7492r68bdckfnh CustomCharsetSetD=9a21e3047685dfbricn CustomCharsetSetE=a310e6d297458bfcrnso CustomCharsetSetF=b75490dc12a83e6sfn D:\Dict\statistic2> словарик там тестовый вложен (не очищен и не релевантен). В текущей разработке: подсчёт примерно общего времени, необходимого на брут по пользовательской маске при опред скорости брута в EGB.
не много не в тему но все же, я тут подумал а если сравнивать не строки при бруте а байты то есть последовательность бай с последовательностью байт хеша byte[] crak == byte[] hash? на выходе получим конечно крокозябру но впринципе же без разницы что показывает главное что из этого набора байтов получится нужный хеш и тем более геннерировать байт последовательность будет проще чем перебирать слова, или не?
Ни хрена не понял, но если ты про корреляцию между символом (байтом) в пароле, с байтом в его хэше то её нет, она нулевая...
Я не вижу разницы при кодировке ASCII между байтом - кодом символа и самим символом. Набор байт или набор символов - разницы нету, речь сейчас об алгоритме генерации множества слов, подаваемых на вход функции хэширования. Либо я не понял чём речь.
Добавил параметр скорости брута и вычисление необходмого времени на прохождение маски из пользовательских чарсетов скачать: http://narod.ru/disk/45374533001.b6284348725c1a730ed19b07f8c1610d/statistic5.rar.html пример работы: Максимальная длинна чарсета 128 -------------------------------- Колличество чарсетов (1-36) 10 -------------------------------- Минимальное матожидание для попадания символа в чарсет в % 3 -------------------------------- скорость брута в Млн. пасс/сек. 100 Code: D:\Dict\statistic2>cmd /k join.exe ------------------------------------------------------------------- --------------CustomCharSet Mask Generator by -=lebed=--v.03------- ------------------------------------------------------------------- File -> pass.txt, size - 11373399 bytes Start, wait please... Statistics pass.txt computed... Words:930000 Progress:▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 100% CustomCharsetSet0=scamplbtdfr1kgwehnji CustomCharsetSet1=aoeihurl0123c9 CustomCharsetSet2=anrelstmoicdpbuhkg CustomCharsetSet3=aeiontlsrc1h2kup3dm04 CustomCharsetSet4=eaoinrlsthm1cyuk2d0 CustomCharsetSet5=aeniortsl120c3m49h5pu87d6 CustomCharsetSet6=aeoi1nrslt02ch3mdu98kp4 CustomCharsetSet7=ea1oni20rl3st985476chm CustomCharsetSet8=1ea02oinr3lst987546ch CustomCharsetSet9=1e02ao93875i46nrlst ------------------------------------------------------------------- All words:10150018956000, all time hashcrack:2days ------------------------------------------------------------------- D:\Dict\statistic2> Получается для прохождения всех релевантных десятисимвольников требуется 2-е суток на GPU.
Слу, можно сделать так что бы оно корректировало длину этого чарсета пользовательского добавляя символы в чарсеты пока маска находится в диапазоне по времени заданному. Тоесть: по длине чарсеты 6х6х6х6х6х6х6х6 (например) видим что времени мало занимает, начинаем добавлять: 7х7х7х6х6х6х6х6 7х7х7х7х6х6х6х6 8х7х7х7х7х6х6х6 и так далее, вы поняли Можно для начала сделать брутер на ПХП, коль вы его так любите Если испытания успешны -> делаем что то солиднее
Ну ты понял мою идею, я вот сейчас заметил, я сгенерил маски (ну свои по словарику) 512 шт. и поставил на брут, на некоторых выхлоп был малый, но на некоторых полезло очень даже неплохо (1 пасс в сек находится на хэшлисте из 16 млн.), т.е. вот их в первую очередь и надо брутить. Ну и собственно дело не в брутере - он есть уже и не один, дело в алгоритме подачи паролей на вход, в зависимости от выхлопа. Динамический аддаптивный чарсет - это было бы круто, т.е те символы матожидание которых уменьшается убираем из чарсета, тех что растёт - добавляем!
Это понятно, но вот ты пишешь что если выхлоп идет плохой, надо переключатся НО сколько было раз когда выхлоп как раз был в конце диапазона маски) жалко пропускать пассы.
Хм.. да теперь у нас маски из пользовательских наборов!, из символов с наибольшим матожиданием, т.е. я сомневаюсь, что в конце когда будут подставлятся символы с наименьшим матожиданием мы увиидим лавину паролей (на самом деле скорее всего тупняк полный). Т.е. алгоритм расчитан как каз на съём большого объёма пассов в начале, а потом уже выхлоп будет идти медленнее и медленее ибо символы в паролях всё более и более редкие будут использоваться! Я бручу сейчас не по релевантным пользовательским маскам из пользовательских чарсетов, а просто по маскам из стандартных чарсетов, прохождение каждой из которых не более 2-х часов занимает на GPU. вот к примеру: - попал на "золотую жилу" на конце z9 - соответственно растёт матожидание z на 9 позиции и 9 на 10-той, логично сделать их фиксацию и пробрутить 8-ми символьники фактически по пользовательской маске. (что собственно и уже происходит автоматом в egb)