Информации на прошлом этапе было собрано достаточно. Теперь мы будем активно работать с сайтом. Много следить в логах, использовать кул-хацкерские программы, сканерочки, парсерки и прочие веселые программки.
Общая схема того, что мы будем делать на данном этапе такая:
Ничего страшного, все довольно просто. Мы пойдем по списку:
Поиск и эксплуатацию уязвимостей оставим для следущих уроков, а пока мы занимаемся исключительно сбором информации.
Активный сбор информации.
1. Определение CMS. Пробуем определить используемую CMS (или CMSки, ведь никто не запрещает использовать несколько CMS на одном домене). Если используется распространенный движок, то определить это можно с вероятностью в 99%.
Если вам в лом самим определять CMS, можете воспользоваться сервисами:
Можно использовать плагин для браузера - wappalyzer.
Очень удобно, сразу видно движок, язык, js-фреймворки и т.д.:
Определяет больше двух сотен движков. Плагин не всегда работает точно. Например, попробуйте зайти с включенным плагином wappalayzer на эту страничку -
Вы поймете, что анализируются:
Для точного определения CMS нужно также проверять:
robots.txt - в данном текстовике указаны папки и файлы которые нужно/не нужно индексировать. Файл либо лежит в корне сайта, либо его вообще нет. Выглядит примерно так:
Наметанный глаз мигом определит WordPress. Ненаметанный метнется по адресу /wp-login.php и опять таки определит WordPress.
Админ-панель - Определить адрес админки можно внимательно изучив файл robots.txt или проверив все распространенные пути к админкам (руками или софтом - об этом чуть далее). К примеру, вход в админку Joomla!:
Joomla 1.5
Файлы и Папки. CMS можно определить по наличию/отсутствию некоторых файлов и папок. Например, в большинстве CMS есть файлы с названиями типа Changelog.htm, readme.txt, config.example и подобными. Скачиваем распространенные движки, изучаем структуру файлов и папок, пробуем найти интересные файлы/папки на изучаемом сайте.
Таким способом можно очень точно определить используемый движок и его версию.
Просто потренируйтесь - устанавливайте разные движки, ставьте разные шаблоны, плагины. После небольшой практики, вы сможете определять движок взглянув одним (прищуренным) глазом на главную страницу.
В результате, после выполнения всех вышеописанных проверок, возможны 3 варианта:
2. Определение тем/плагинов/модулей/компонентов. Если мы работаем с одной из распространненых CMS, то мы можем проверить еще и модули/плаигны. Для этого можно быстренько набыдлокодить свой убер-скрипт либо воспользоваться существующим софтом (к примеру для скана плагинов WP):
Разумеется, этот пункт относится только к популярным движкам (wp, joomla, drupal и подобным), а не студийным поделкам сумрачных гениев.
3. Ищем уязвимости в CMS. Первым делом идем на bug-трекеры. Чекаем CMS на сайтах:
Стоит особенно отметить 1337day (наследник милворма):
И exploit-db:
Если сплойт не пашет, то внимательно изучите исходник, есть шанс, что в сплойте допущена ошибка (по старой хэккерной традиции). Также очень часто бывает, что исходники движка нельзя найти, а сплойт под движок - легко.
Если ничего в паблике не нашлось, идем на страницы разработчиков и внимательно читаем changelog. Какие ошибки были исправлены, когда, обязательно обращаем внимание на патчи связанные с безопасностью.
4. Сканер директорий. После того как мы узнали CMS (или не узнали), мы натравливаем на сайт сканер директорий - DirBuster.
DirBuster многопоточен, кроссплатформенен, красив и умен. Скачать можно по ссылке -
Обыкновенно, сторонние скрипты подключают "as is", не беспокоясь о возможных уязвимостях. В общем никогда не забывайте пользоваться сканером директорий, даже если CMS определена и плагины успешно найдены. Может быть в забытой кодерами папке "/upload_old/new1/new11/new1111/old/upload.php" вас ждет форма заливки файлов без проверки на расширения и прочие условности.
5. Сбор параметров. После того как мы просканировали директории и файлы, необходимо узнать все точки входа.
Образно говоря, если бы мы грабили квартиру, то сначала проверили бы все двери, окна, замки, затем выбрали самую уязвимую цель (открытая форточка, фанерная дверь, китайский замок), затем мы бы начали использовать отмычки(или другой инструмент), чтобы попасть внутрь.
В хаке сайтов все то же самое - находим все точки входа в приложение (Get, post, cookie, заголовки приложения), затем ищем уязвимые параметры и пытаемся их экплуатировать (только если домушник пихает отмычки в замок, мы пихаем кавычки и скобки в формочки или строку браузера).
Для автоматизированного сбора страниц прекрасно подойдет Burp Suite (шикарная утилита, с которой вы скоро не будете расставаться).
В обязательном порядке установите и ознакомьтесь со справкой. Это настоящий швейцарский нож для веб-приложений. И одна из его возможностей как раз позволяет собрать все страницы и все формы с сайта:
Запускаем спайдер, и он парсит все страницы со скоростью бешеной курицы, с горящими перьями.
Но не стоит скидывать со счетов и ручной анализ.
6. Обход mod_rewrite. Сейчас все повернулись на всяких seo-фишках. И многие юзают mod_rewrite (и подобные вещи), что сделать из некрасивой ссылки вида:
Получать такие ссылки:
К счастью, у нас не будет возникать проблем со сбором Post и Сookie параметров. Итак, чтобы обойти ЧПУ (человеко-подобный урл) нам нужно:
1. Узнать имя скрипта.
2. Узнать параметры скрипта.
3. Узнать принимаемые параметром значения.
Я бы конечно с радостью расписал все что нужно делать, но лучше всего написали тут -
Возможно, что сейчас информация про обход mod_rewrite кажется для вас лишней. Если будет нужно - вернетесь к данному материалу позже. А пока просто отметьте для себя, что можно успешно ломать сайты и с ЧПУ.
В принципе со сбором информации мы закончили. Если на прошлом этапи мы собирали общую информацию, то тут мы занимались исключительно веб-приложением. Узнали CMS, модули, искали сплоиты, просканировали директории и файлы, собрали все точки входа.
Общая схема того, что мы будем делать на данном этапе такая:
Ничего страшного, все довольно просто. Мы пойдем по списку:
- Определение CMS
- Определение тем, плагинов, модулей, компонентов
- Поиск уязвимостей в CMS и плагинах
- Сканирование директорий
- Краулер
- Обход mod_rewrite (и аналогов этого модуля)
- Сбор параметров (Get, Post, Cookie, Headers)
Поиск и эксплуатацию уязвимостей оставим для следущих уроков, а пока мы занимаемся исключительно сбором информации.
Активный сбор информации.
1. Определение CMS. Пробуем определить используемую CMS (или CMSки, ведь никто не запрещает использовать несколько CMS на одном домене). Если используется распространенный движок, то определить это можно с вероятностью в 99%.
Если вам в лом самим определять CMS, можете воспользоваться сервисами:
-
You must be registered for see links
-
You must be registered for see links
-
You must be registered for see links
-
You must be registered for see links
Можно использовать плагин для браузера - wappalyzer.
Очень удобно, сразу видно движок, язык, js-фреймворки и т.д.:
You must be registered for see links
Если вас интересует, как этот плагин определяет движки, посмотрите исходник:
You must be registered for see links
Вы поймете, что анализируются:
- http-заголовки (в том числе cookie)
- meta-теги
- подключаемые скрипты (<script src='blabla'>
- пути к файлам (картинкам, таблицам стилей и т.д.)
- комментарии в html-коде
- прочее (по регуляркам) в html-коде ("Powered by ...", "MegaSuperCMS")
- URL (/index.php?showtopic=666 - явно сатанинский форум, /?p=1488 - нс-бложик)
Для точного определения CMS нужно также проверять:
robots.txt - в данном текстовике указаны папки и файлы которые нужно/не нужно индексировать. Файл либо лежит в корне сайта, либо его вообще нет. Выглядит примерно так:
Админ-панель - Определить адрес админки можно внимательно изучив файл robots.txt или проверив все распространенные пути к админкам (руками или софтом - об этом чуть далее). К примеру, вход в админку Joomla!:
Joomla 1.5
- Joomla.
You must be registered for see links
- WordPress.
You must be registered for see links
- Drupal.
You must be registered for see links
- DLE.
You must be registered for see links
- Любая другая CMS -
You must be registered for see links
Файлы и Папки. CMS можно определить по наличию/отсутствию некоторых файлов и папок. Например, в большинстве CMS есть файлы с названиями типа Changelog.htm, readme.txt, config.example и подобными. Скачиваем распространенные движки, изучаем структуру файлов и папок, пробуем найти интересные файлы/папки на изучаемом сайте.
Таким способом можно очень точно определить используемый движок и его версию.
Просто потренируйтесь - устанавливайте разные движки, ставьте разные шаблоны, плагины. После небольшой практики, вы сможете определять движок взглянув одним (прищуренным) глазом на главную страницу.
В результате, после выполнения всех вышеописанных проверок, возможны 3 варианта:
- CMS определена, исходники можно изучить.
- CMS определена, но нет возможности изучить исходники.
- CMS не определена.
2. Определение тем/плагинов/модулей/компонентов. Если мы работаем с одной из распространненых CMS, то мы можем проверить еще и модули/плаигны. Для этого можно быстренько набыдлокодить свой убер-скрипт либо воспользоваться существующим софтом (к примеру для скана плагинов WP):
Разумеется, этот пункт относится только к популярным движкам (wp, joomla, drupal и подобным), а не студийным поделкам сумрачных гениев.
3. Ищем уязвимости в CMS. Первым делом идем на bug-трекеры. Чекаем CMS на сайтах:
-
You must be registered for see links
-
You must be registered for see links
-
You must be registered for see links
-
You must be registered for see links
-
You must be registered for see links
-
You must be registered for see links
-
You must be registered for see links
-
You must be registered for see links
Стоит особенно отметить 1337day (наследник милворма):
И exploit-db:
Если сплойт не пашет, то внимательно изучите исходник, есть шанс, что в сплойте допущена ошибка (по старой хэккерной традиции). Также очень часто бывает, что исходники движка нельзя найти, а сплойт под движок - легко.
Если ничего в паблике не нашлось, идем на страницы разработчиков и внимательно читаем changelog. Какие ошибки были исправлены, когда, обязательно обращаем внимание на патчи связанные с безопасностью.
4. Сканер директорий. После того как мы узнали CMS (или не узнали), мы натравливаем на сайт сканер директорий - DirBuster.
DirBuster многопоточен, кроссплатформенен, красив и умен. Скачать можно по ссылке -
You must be registered for see links
Благодаря сканеру директорий, мы можем найти:- WYSIWIG-редакторы
- файловые менеджеры
- phpmyadmin (и аналоги)
- скрипты статистики
- старые версии скриптов (index.php.old и т.д.)
- бекапы
- многое другое
Обыкновенно, сторонние скрипты подключают "as is", не беспокоясь о возможных уязвимостях. В общем никогда не забывайте пользоваться сканером директорий, даже если CMS определена и плагины успешно найдены. Может быть в забытой кодерами папке "/upload_old/new1/new11/new1111/old/upload.php" вас ждет форма заливки файлов без проверки на расширения и прочие условности.
5. Сбор параметров. После того как мы просканировали директории и файлы, необходимо узнать все точки входа.
Образно говоря, если бы мы грабили квартиру, то сначала проверили бы все двери, окна, замки, затем выбрали самую уязвимую цель (открытая форточка, фанерная дверь, китайский замок), затем мы бы начали использовать отмычки(или другой инструмент), чтобы попасть внутрь.
В хаке сайтов все то же самое - находим все точки входа в приложение (Get, post, cookie, заголовки приложения), затем ищем уязвимые параметры и пытаемся их экплуатировать (только если домушник пихает отмычки в замок, мы пихаем кавычки и скобки в формочки или строку браузера).
Для автоматизированного сбора страниц прекрасно подойдет Burp Suite (шикарная утилита, с которой вы скоро не будете расставаться).
- Скачать burp-suite -
You must be registered for see links
- Справка по burp-suite -
You must be registered for see links
В обязательном порядке установите и ознакомьтесь со справкой. Это настоящий швейцарский нож для веб-приложений. И одна из его возможностей как раз позволяет собрать все страницы и все формы с сайта:
Запускаем спайдер, и он парсит все страницы со скоростью бешеной курицы, с горящими перьями.
Но не стоит скидывать со счетов и ручной анализ.
6. Обход mod_rewrite. Сейчас все повернулись на всяких seo-фишках. И многие юзают mod_rewrite (и подобные вещи), что сделать из некрасивой ссылки вида:
You must be registered for see links
Получать такие ссылки:
You must be registered for see links
К счастью, у нас не будет возникать проблем со сбором Post и Сookie параметров. Итак, чтобы обойти ЧПУ (человеко-подобный урл) нам нужно:
1. Узнать имя скрипта.
2. Узнать параметры скрипта.
3. Узнать принимаемые параметром значения.
Я бы конечно с радостью расписал все что нужно делать, но лучше всего написали тут -
You must be registered for see links
Правда скрипт, упоминаемый в статье, уже удалили или перенесли. Но мы его заботливо сохранили для будущих поколений:
Код:
<?php
// defines
ini_set('max_execution_time', 0);
$charset = Array(
'a','b','c','d','e',
'f','g','h','i','j',
'k','l','m','n','o',
'p','q','r','s','t',
'u','v','w','x','y',
'z','-','_');
$wordlist = Array();
$param_file = './params.txt';
$separator = '_';
$words = Array();
$maxlen = $_GET['length'];
$def_length=0;
$site = $_GET['url'];
$count = 0;
$type = $_GET['type'];
$symbol = $_GET['sym'];
$arr = $_GET['arr'];
$max_len_of_url=2048;
function getlen($site_check)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$site_check);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$length = strlen(curl_exec($ch));
curl_close($ch);
return $length;
}
function check($site_check,$from,$to)
{
global $def_length,$words,$site,$symbol;
$curr_len = getlen($site_check);
if ($curr_len<>$def_length)
{
// пытаемся определить нужный нам символ
echo '<b>[+] Find <a href='.$site_check.'>smth</a> Try to detect.</b><br>';
flush();
$site_1 = $site;
$site_2 = $site;
if ($to-1-$from > 0)
{
for ($i=$from;$i<=$to-1;$i++)
{
if ($i<=$from+(($to-$from)/2) - 1)
{$site_1 .= $words[$i].(($arr==1)?'[]':'').'='.$symbol.'&';}
else
{$site_2 .= $words[$i].(($arr==1)?'[]':'').'='.$symbol.'&';}
}
check($site_1 ,$from,(int)($from+(($to-$from)/2)));
check($site_2 ,(int)($from+(($to-$from)/2)),$to);
flush();
}
else
{
echo '<b>[+] Find! <a href='.$site_check.'>'.$site_check.'</a></b><br>';
}
}
}
function recurse($width, $position, $base_string)
{
global $charset,$site_new,$site,$words,$count, $values,$type,$separator,$wordlist,$symbol,$max_len_of_url;
for ($i = 0; $i < count($charset); ++$i)
{
// если длина сообщения меньше требуемой - берем символ и рекурсивно вызываем сами себя
if ($position < $width - 1)
{
recurse($width, $position + 1, $base_string . $charset[$i]);
}
// когда рекурсивные вызовы заканчиваются, возвращаемся на шаг назад по числу символов и выводим
if (!in_array($base_string.$charset[$i],$values))
{
$words[$count] = $base_string.$charset[$i].(($arr==1)?'[]':'');
$count++;
$site_new .= $base_string . $charset[$i].(($arr==1)?'[]':'').'='.$symbol.'&';
}
if ((strlen($site_new)+strlen($base_string)+4)>$max_len_of_url)
{
check($site_new,0,$count);$site_new = $site;$count = 0;
}
}
if (($position == 0) && ($site_new != $site))
{check($site_new,0,$count);}
}
if (empty($_GET['url']) || empty($_GET['length']) || empty($_GET['type']) || empty($_GET['sym']))
{
echo '<b>[+] Use http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?url=<url>&type=<type of attack>&length=<max len>&sym=<parameter value><br> </b>
<b> url examples:</b> <br/> http://site.com/index.php <br/> http://site.com/index.php?param=123 <br/> http://site.com/index.php?param=123%26param2=q <br/>
<b> types of attack:<br/> </b>
1 - only bruteforce<br/>
2 - only wordlist<br/>
3 - word+separator+brute values<br/>
&arr=1 - try [] postfix values<br/>
</b>';
exit;
}
if (strpos($site,'?')>0)
{$site=$site.'&';}
else
{$site=$site.'?';}
$site_new = $site;
// найдем все параметры
preg_match_all("/[\?&]?([^&?=]+)=([a-zA-Z0-9\-_\.%]+)&/",
$site,
$out, PREG_PATTERN_ORDER);
$values = $out[1];
echo '<b>[+] Analyze <a href='.$site.'>'.$site.'</a></b><br>';
flush();
if ($type >=2)
{
$file = fopen($param_file,"r");
if(!file)
{
echo("<b>[+] Error: wordlist not exists - ".$param_file.'</b></br>');
}
else
{
while ($wordlist[] = trim(fgets($file)))
{}
unset ($wordlist[count($wordlist)-1]);
echo "<b>[+] Wordlist loaded...".count($wordlist)." words.</b><br/>";
}
}
// определим дефолтные значения
$def_length = getlen($site);
switch ($type) {
case 1:
recurse($maxlen, 0, '');
break;
case 2:
unset($charset);
$charset[] = '';
for ($j = 0; $j < count($wordlist);$j++)
{
if (!in_array($wordlist[$j],$values))
{
$words[$count] = $wordlist[$j].(($arr==1)?'[]':'');
$count++;
$site_new .= $wordlist[$j].(($arr==1)?'[]':'').'='.$symbol.'&';
}
if ((strlen($site_new)+strlen($base_string)+4)>2048)
{
check($site_new,0,$count);$site_new = $site;$count = 0; //unset ($words); $words = array();// $words = array();
}
}
if ($site_new != $site)
{check($site_new,0,$count);}
break;
case 3:
if (!in_array('',$charset))
{$charset[count($charset)]='';}
for ($j = 0; $j < count($wordlist);$j++)
{recurse($maxlen, 0, $wordlist[$j].$separator);}
break;
}
echo '<b>[+] Done</b><br>';
?>
В принципе со сбором информации мы закончили. Если на прошлом этапи мы собирали общую информацию, то тут мы занимались исключительно веб-приложением. Узнали CMS, модули, искали сплоиты, просканировали директории и файлы, собрали все точки входа.