Статьи Брутальная простота

Discussion in 'Статьи' started by fYt, 9 Feb 2007.

  1. fYt

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

    Joined:
    11 Jan 2007
    Messages:
    54
    Likes Received:
    36
    Reputations:
    7
    Брутальная простота

    Из этой статьи Вы подчерпнёте полезную информацию относительно того, как следует обходиться с разнообразными дампами бд. В частности, дампами форумов. А кто ещё совсем маленький и неопытный, узнает много всего интересного и познавательного - в бруте ничего сложного нет, нужно только не промахиваться мимо кнопочек. Я дам несколько действенных советов относительно брута хэшей и посоветую тем кто недопёр сам, что и как брутить. И также экслюзивно для читатейлей журнала и специально для журнала Xakepy.ry выложу скрипт, написанный для работы с базами. Оговорюсь, что для успешного применения всего, описанного ниже, понадобятся следующие инструменты:

    - PHP 4.3.3 и выше
    - Passwords Pro, есть такой программ полезный
    - руки и голова в полном боекомплекте

    Итак, допустим Вы каким-то образом заполучили дамп базы данных. И причём не один :-D (нет и не два), а целую кучу. Упустим каким именно образом. Пусть это будут дампы форумов. Причём дампы таблицы пользователей (ну а что ещё то надо? ). При обретении сего полезного кладезя данных перед Вами сразу встаёт один из двух возможных путей:

    а) кудаб загнать всё это добро
    б) чем бы разложить все эти кучи одинаковых баз данных по полочкам для дальнейшего
    1) брута админских, асечных, и мыльных паролей
    2) сортировки по мыльным базам в зависимости от содержания сайта/форума (мало ли Вы злобный спамер или крабер).


    Ни для кого думаю не является открытием, что пароль на форуме и пароль на мыле или номере аськи совпадает у 70% пользователей. Ведь тогда надо для каждого форума придумывать новый отдельный пароль, а их надо записывать или запоминать, а это так лениииво.. Что можно получить от асек и мыл? Ну пфф, кто ещё не догадался, перечислю:

    - сами базы мыл, особенно если на форуме зарегистрировано много пользователей, можно использовать/загнать как базы для спама, причём тематические (ясно что на автомобильном форуме в основном будут регистрироваться люди, которым интересна данная тема).
    - сбрученные мыла можно использовать/загнать под спам (именно для отправки спама через них), только было бы неплохо проверить сначала их на предмет валидности (около 15-20% всё равно отсеятся). Но многопоточный скрипт для проверки мыл пардон я Вам выкладывать не буду, уж простите ;-)
    - сбрученные 6-7знаки можно использовать самому, как понравится, либо отдать в асечный магазин. Проверять аси можно IPDBrute (asechka.ru в downloads), нужно иметь только список проксей (Forum Proxy Leecher) и свободное время.
    - сбрученные 8-9 знаки бывают порой очень даже красивые (xy, xyz, как вам 222272222?%) ), т.н. слоны, их тоже можно использовать или отдать в магаз/продать. Остальные же 9знаки также можно выложить/загнать под флуд.

    Вот сколько перспектив перед Вами открывается =). Однако вернёмся к написанному выше. С пунктом а) думаю Вы сами решите как быть, если Вам самим влом разбираться с базами, а по второму пункту я продолжу повествование дальше. Не правда ли, было бы крайне неплохо привести все имеющиеся дампы в вид всего пары файлов со всеми хэшами для дальнейшей отправки на брут в ПассворсПро, причём отсортировать всё по роду вашей деятельности (аськи, мыла, пассы админов), убирая всё лишнее, имея возможность выбрать, в каком порядке всё сортировать. Ведь не разбирать же всё вручную!

    Специально и экслюзивно, только для Вас и только сегодня (аплодисменты и крики на заднем плане) - универсальный скрипт для разбора баз данных! (слова тонут в овациях)

    Code:
    <?
    
    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ xxx ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    /*                    
    /*     Forum Dump Parser v0.2 (FDPv0.2)       
    /*         by Re@ctor          
    /*     http://truenet.net.ru/security/        
    /*                    
    /*                    
    /*    Скрипт предназначен для частного использования и позволяет      
    /* привести имеющиеся дампы баз данных в единый удобный формат для    
    /* дальнейшего анализа в программе Passwords Pro, либо просто     
    /* в списки для других программ.            
    /*                    
    /*   Скрипт запрещается использовать в корыстных целях и автор не    
    /* несёт ответственности за возможный ущерб, причинённый от исполь-   
    /* зования данного скрипта.             
    /*                    
    /*   Скрипт запрещается использовать в противозаконных целях, либо    
    /* целях, ведущих к умышленному или неумышленному нарушению законода- 
    /* тельства Российской Федерации.            
    /*                    
    /*    Хорошего дня и доброго насроения!;-)       
    /*    Помните про существование TrueNET! =)       
    /*                    
    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ xxx ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
    
    ###### 1. выходной формат файлов ######
    # для брута, формат Passwords Pro
    #$sort = array('username','password','salt'); # пользователи
    #$sort = array('email','password','salt'); # мыльники
    $sort = array('icq','password','salt'); # аськи
    # помните, что формат PPro - имя:хэш:сальт:расшифр.пароль:комментарий
    # поэтому надо писать от 2 до 3 значений, т.к. меньше или больше
    # будет воспринято неверно программой.
    
    # просто базы
    #$sort = array('email'); # e-mail
    #$sort = array('icq'); # icq
    
    ###### 2. формирование строк ######
    $delim = "¤"; # разделитель между значениями
    $br = "\n"; # чем заканчивать строку (\n - перенос строки)
    
    ###### 3. промежуточный вывод ######
    $makefiles = 1; # делать ли отдельные файлы для каждого дампа
    $ext = "txt"; # расширение выходного файла этих файлов
    
    ###### 4. параметры сбора информации ######
    $site = 1; # если $makefiles = 0;, то получать сведения о сайте
    # из титла и мета-тегов (необоходимо подключение к сети) и записывать в начало файла
    # ( удобно при составлении тематических спам-баз )
    # формат файла должен быть префиксАДРЕС_САЙТАрасширение, где префикс и расширение любые
    $site_prefix = ''; # если $site=1, указать префикс файлов
    $site_ext = '.sql'; # если $site=1, указать расширение файлов
    $convert = 0; # конвертировать полученный текст в win-1251, если оно не в нём (отключить при багах)
    
    ###### 5. общий файл с данными ######
    $hashmake = 1; # делать ли единый файл со всеми хэшами
    $hash_filename = '!PasswordsPro.Hashes'; # имя файла с хэшами
    
    ###### 6. выборка из дампов админов в отдельный файл ######
    $admins = 1; # сделать файл с хэшами админов дампов
    $admin_pass = 'password'; # имя ячейки с хэшем пароля
    $admin_salt = 'salt'; # имя ячейки с салом пароля
    $admin_comment = array('username','email','icq'); # то что будет в комментарии в полях пассворс-про
    $admin_filename = '!admin.PasswordsPro.Hashes';
    
    ###### 7. (WARNING!) имя первой ячейки в таблице ######
    $firstintable = 'userid'; # название первой ячейки в таблице (важно!)
    
    ini_set("max_execution_time","86400");
    set_time_limit(0);
    
    function make($value) { return preg_replace("'\'(.*?)\''i",'\\1',$value); }
    function checksalt($salt) { if(strlen($salt)>3) return str_replace(array("\\\\",'\"',"\'"),array("\\",'"',"'"),$salt); else return $salt; }
    function koi($txt) { return convert_cyr_string($txt,'k','w'); }
    function iso($txt) { return convert_cyr_string($txt,'i','w'); }
    function myau() { echo "\n\nDone!;-D\n\nNice day. Visit http://truenet.net.ru/ !\n\n"; }
    
    $d=opendir('.');
    while(($e=readdir($d))!=false) {
    if($e=='.'||$e=='..'||$e==$admin_filename||$e==$hash_filename||$e==$argv[0]) continue;
    if(is_file($e)) {
     if($makefiles==1)$f = fopen("$e.$ext","w+");
     echo "[+] $e (".filesize($e)." bytes)\n";
     $file = file($e);
     
     foreach($file as $a) {
      $tmp = explode(' ',$a); $tablesuf=$tmp[1];
      if(!$vars) { if($tablesuf==$firstintable) { $vars[]=array('name'=>$firstintable,'num'=>0); } continue; }
      foreach(array_unique(array_merge($sort,$admin_comment)) as $s) {
       if($tablesuf==$s) { $vars[]=array('name'=>$s,'num'=>count($vars)); $y=1; }
      }
      if(!$y) $vars[]='b'; else unset($y);
      if(strstr($a,'PRIMARY KEY')) break;
     }
     
     foreach($file as $a) {
      if(strstr($a,"INSERT INTO")) {
       $tmp = preg_replace("'INSERT INTO (.*?) VALUES\((.*?)\);'i",'\\2',$a);
       $values = explode(',',$tmp);
       foreach($values as $v) { $m[] = str_replace(array("\r","\n"),'',$v); }
       foreach($sort as $s) {
        if(!$vars) { echo "[!] Can't get table values from $e =[\n"; break; } else foreach($vars as $v) {
         if($admins==1&&$hashmake==0&&$makefiles==0) {
          if(!$tr) $tr[]=$e;
          if($v['name']==$admin_pass) $tr[]=make($m[$v['num']]);
          elseif($v['name']==$admin_salt) $tr[]=checksalt(make($m[$v['num']]));
          foreach($admin_comment as $comm) if($comm==$v['name']) $comment[] = make($m[$v['num']]);
          $admok=1;
         } else {
          if($s==$v['name']) {
           if($s=='salt') $tm[] = checksalt(make($m[$v['num']])); 
           else $tm[] = make($m[$v['num']]);
          }
          if($admins==1&&!$admok) {
           if(!$tr) $tr[]=$e;
           if($v['name']==$admin_pass) $tr[]=make($m[$v['num']]);
           elseif($v['name']==$admin_salt) $tr[]=checksalt(make($m[$v['num']]));
           foreach($admin_comment as $comm) if($comm==$v['name']) $comment[] = make($m[$v['num']]);
          }
         }
        }
        if($admok==1) break; $admok=2;
       }
       if($tm[0])$globhash[]=$towrite[]=@implode($tm,$delim); if($admins==1)if($tr[0])$odmen[]=@implode($tr,$delim).$delim.$delim.@implode($comment,', ');
       unset($tr); unset($m); unset($tm); unset($comment);
       if($admok==1) break;
      }
     }
     if($makefiles==1) {
      if($site==1) {
       $host = preg_replace("'$site_prefix(.*?)$site_ext'i",'\\1',$e);
       echo "[:] connecting to $host..\n";
       $fp = fsockopen($host,80,&$errno,&$errstr,5);
       if(!$fp) echo "[:] Error connecting $host ($errno - $errstr)\n";
       fputs($fp,"GET / HTTP/1.0\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en)\r\nHost: $host\r\nAccept-Language: ru\r\nAccept-Charset: windows-1251, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1\r\n\r\n");
       while(!feof($fp)) {
        $tmp=fgets($fp,1000);
        if(preg_match("'charset='i",$tmp)||!$schar) {
         $ch=preg_replace("'(.*?)charset=(.*?)\r\n'i",'\\2',$tmp);
         if(preg_match("'koi8-r'i",$ch)) $koi=1;
         elseif(preg_match("'iso8859-5'i",$ch)) $iso=1; $schar=1;
        }
        elseif(preg_match("'<title>(.*?)</title>'i",$tmp)) {
         $title=preg_replace("'(.*?)<title>(.*?)</title>(.*?)'i",'\\2',$tmp);
         echo "[:] TITLE ok..\n";
        }
        elseif(preg_match("'<meta (.*?)keywords(.*?)>'i",$tmp)) {
         $kiwords=preg_replace("'(.*?)<meta (.*?)content=(\"|\')(.*?)(\"|\')(.*?)>(.*?)'i",'\\4',$tmp);
         echo "[:] KEYWORDS ok..\n";
        }
        elseif(preg_match("'<meta (.*?)description(.*?)>'i",$tmp)) {
          $descr=preg_replace("'(.*?)<meta (.*?)content=(\"|\')(.*?)(\"|\')(.*?)>(.*?)'i",'\\4',$tmp);
          echo "[:] DESCRIPTION ok..\n";
        }
        elseif(preg_match("'</head>'i",$tmp)||preg_match("'<body'i",$tmp)) break;
       }
       fclose($fp);
       if($koi||$convert==1) { $title=koi($title); $kiwords=koi($kiwords); $descr=koi($descr); }
       if($iso||$convert==1) { $title=iso($title); $kiwords=iso($kiwords); $descr=iso($descr); }
       $info="Site: $host\nTitle: $title\nDescription: $descr\nKeywords: $kiwords\n\n"; $title=$host=$descr=$kiwords='';
      }
      echo "[~] sorting and writing hashes in $e.$ext..\n"; @asort($towrite); fwrite($f,$info.@implode($towrite,$br)); fclose($f); unset($info);
     }
     unset($vars); unset($file); unset($towrite); unset($admok);
    }
    }
    if($hashmake==1) { echo "[*] sorting & writing all hashes..\n"; @asort($globhash); $f = fopen($hash_filename,"w+");fwrite($f,@implode($globhash,$br));fclose($f);}
    if($admins==1) { echo "[*] sorting & writing admin hashes..\n"; @asort($odmen); $f = fopen($admin_filename,"w+"); fwrite($f,@implode($odmen,$br)); fclose($f);}
    
    myau();
    ?>
    
    Возможности скрипта следующие:

    - анализ всех дампов в директории (достаточно только побросать файлы в директорию и запустить скрипт)
    - универсальность анализа данных - Вам надо всего лишь задать требуемые поля таблицы
    - сортировка в удобном вам виде - по нужным полям и в нужном порядке
    - генерирование отдельных файлов с каждого дампа и одного файла со всеми хэшами/мылами/etc
    - выборка из дампов только админов (если таблица форумная или движковая)
    - статистика по дампам (автоматический коннект к сайту и сбор информации по титлу и кейвордам) - удобно если баз много, а проверять каждый сайт лениво;

    Ограничения:

    - скрипт рассчитан на дампы с одной таблицей. То есть дампы с множеством таблиц будут обработаны некорректно. Потрудитесь отделить нужную таблицу в отдельный файл, сохранив структуру дампа. (либо возмозможна поставка более полной версии скрипта по определённой договорённости )
    - скрипт рассчитан на дампы одного движка. То есть если в директории будут валяться дампы от других движков, они не будут обработаны корректно. Однако вам ничего не мешает разложить дампы разных движков в разные папки и поправить конфиг для каждой из них.
    - для успешной обработки вы должны понимать что такое дамп бд и синтаксис sql, чтобы правильно заполнить настройки скрипта. По умолчанию скрипт настроен на vBulletin, для других форумов конечно настройки будут чуть другие.

    Теперь относительно самих настроек. Они условно разделены на 7 частей.

    1. В первой части вы должны раскомментировать одино из возможных значений, либо вписать то что требуется вам. В скрипте уже есть 5возможных вариантов. Не забывайте, что для Passwords Pro формат должен быть из трёх значений. Какие значения туда вписывать? Для этого потребуется открыть одну из баз данных и посмотреть на начало дампа, где делается таблица. Очерёдность в дампах не имеет значения, скрипт сам найдёт какое название ячейки соответствует тому или иному значения в таблице. Об этом в примере ниже
    2. Во второй вы можете задать чем разделять значения и строки. Сейчас объясню почему разделитель там не :, далее прочтите внимательно, так как надо будет изменить настройки PPro. Имеется небольшая проблема с генерацией файлов с salt и Passwords Pro с дефолтными настройками. По дефолту разделителем стоит двоеточие (. Однако никто не мешает нам его заменить. Но вот незадача, в salt есть все возможные символы, и что не ставь, всё равно какой-нибудь сальт будет отчетвертован как разделитель.
    Чего же в salt нету? Правильно, символов в юникоде. Поэтому разделителем выбран именно ¤, с ним всё будет обработано правильно. Следует заменить в программе стандартное двоеточие на этот символ (копипаст), и всё.
    3. Далее. В третьей части вы можете выбрать, делать ли для каждого дампа отдельный файл, в котором будут отсортированные значения. То есть например для каждого site.com.sql, site2.com.sql будут сформированы site.com.sql.txt и тд. Данную опцию следует включать, если формируются базы мыл. При включённой этой опции можно задействовать опцию $site, о которой ниже.
    4. Четвёртая категория позволяет включить возможность сбора данных по сайту, с которого сделан дамп. Скрипт коннектится к сайту и вписывает в файл его титл и мета-теги. Здесь необходимо задать, с чего начинается файл дампа, и чем заканчивается, при условии, что в имени файла фигурирует адрес сайта. То есть например, если файл имеет вид dump_www.site.com.sql, то следует вписать $site_prefix = 'dump_', и $site_ext = '.sql'. Всё сохраняется в кодировке win-1251. Можно включить перекодировку символов, если отчёты получаются нечитаемые. Однако эта часть скрипта у меня получилось не очень действенной, поэтому лучше не включать (удалять было жалко). Скрипт анализирует заголовки, выданные сервером, и если кодировка документа русская, но отлична от win-1251, конвертирует его в неё.
    5. В пятой части задаём, делать ли общий файл со всеми этими данными. Удобно, если надо собрать всё со всех файлов и отсортировать.
    6. Шестая часть - если требуется лишь выбрать пароли админов в отдельный файл. При этом надо указать Поля пароля и salt (второй если нету оставить пустым), а также можно добавить поля комментариев. Комментарии только для формата PasswordsPro!
    7. В последней части необходимо указать название первой ячейки в таблице. Конечно можно было сделать более универсально, однако пардон, сейчас это уже лениво (со всеми улучшениями в более полной версии контактируйте лично, если Вы заинтересованы - договоримся).

    Приведу пример.
    Допустим есть дамп такого вида:

    Code:
    DROP TABLE IF EXISTS user;
    CREATE TABLE dmf_user (
    userid int(10) unsigned NOT NULL auto_increment,
    usergroupid smallint(5) unsigned NOT NULL,
    membergroupids varchar(250) NOT NULL,
    ...
    KEY birthday_search (birthday_search)
    );
    
    INSERT INTO user VALUES('1','6','','0',....
    
    Смотрим на первое значение после Create table - это userid, вписываем его в $firstintable параметр. Смотрим далее по дампу, что нам надо, вписываем в массив $sort. Остальное в принципе по вкусу. Далее запускаем скрипт как "php fdp.php", он выполняется и у нас получаются аккуратно сформированные файлы по дампам.

    Отлично. Теперь пара рекомендаций относительно брута. Брут можно разделить на несколько этапов:
    1. Предварительная атака. Заключается в проверке простых комбинаций типа aaa, 123, qwerty и тд. На этом этапе находится около 10-15% всех паролей (пользователи часто регаются "лишь бы регнуться", поэтому простые пароли не редкость)
    2. Атака полным перебором ПО ЦИФРАМ (от 1 до 7 цифр). Цифровые пароли очень распространены и на этом этапе сбручиваются 15-30%, хоть брут происходит достаточно долго.
    3. Атака по словарям (можно пропустить и сразу проводить гибридную атаку, если есть время). Загружаем все имеющиеся словари без разбору (ставим этот набор текущим) и брутим. Здесь сбручивается ещё где-то 5-10%. Всё зависит от качества английских словарей, так как простые слова типа hitman, hunter, warez и тд очень популярны. Атака занимает чуть меньше, чем полным перебором по цифрам (конечно если словарей у вас не на 400 и выше метров)
    4. Гибридная атака по словарям. Достаточно действенный вид атаки, если есть время, и при успешном составлении правил позволяет сбрутить тоже около 5-10%. Отличие её от обычной атаки в том, что помимо проверки самого слова, его можно изменить (перевести в верхний/нижний регистр/всех символов, обратить слово или дублировать, добавить в начало или конец символы). Самое главное - не увлечься, или атака может проводиться ужасно долго. Из правил рекомендую следующие :) нужно, если только не была проведена простая атака по словарям):
    5. Комбинированная атака. Последняя часть атаки может быть очень долгой, выявляет около 2-3% паролей, не более, и позволяет сбрутить "мастодонтов" с более сложными паролями. Заключается в сочетании словарей. Например словарь с английскими словами можно скрестить с цифровым словарём, чтобы получалось что-нибудь типа admin055, 3warez и так далее. В настройках первыми набором словарей грузим то, что будет началом слов, вторым - с чем будет сочетаться. Данную атаку нужно применять только если "ну очень надо", так как длиться она долго и занимается много процессорного времени. К томуже следует применять смекалку и знать состав всех своих словарей, чтобы успешно сочетать слова в них. Крайне не рекомендую большие словари по 20-30 метров для этого дела - можно просто состариться раньше.

    Скорость брута зависит, во-первых, от мощности машины: мой старенький Pentium3-450/224Mb(128+64+32) работает со скоростью 160 паролей в секунду и кушает ~90метров словарей(~10000100 паролей) за ~17 часов. Более мощный Sempron2800+(up1750MHz)/512Mb на тех же словарях работает со скоростью 450 п/с и лопает словари где-то за 6 часов. Я конечно ещё хотел посмотреть на скорость брута на моём старом AMD K5-166/64Mb, но это будет слишком смешно %).

    Автор: reActor ( rea.ctor.net.ru).

    Из-за того что стоит ограничение, статья выложена не полностью. Думаю ссылки на словари и составление правил для гибридной атаки не так важны.