Реклама на Tenec

Сбор информации 2

Xaker

КОЧЕВНИК
Регистрация
10.04.17
Сообщения
11
Реакции
25
Баллы
27
Информации на прошлом этапе было собрано достаточно. Теперь мы будем активно работать с сайтом. Много следить в логах, использовать кул-хацкерские программы, сканерочки, парсерки и прочие веселые программки.

Общая схема того, что мы будем делать на данном этапе такая:



Ничего страшного, все довольно просто. Мы пойдем по списку:

  • Определение CMS
  • Определение тем, плагинов, модулей, компонентов
  • Поиск уязвимостей в CMS и плагинах
  • Сканирование директорий
  • Краулер
  • Обход mod_rewrite (и аналогов этого модуля)
  • Сбор параметров (Get, Post, Cookie, Headers)

Поиск и эксплуатацию уязвимостей оставим для следущих уроков, а пока мы занимаемся исключительно сбором информации.

Активный сбор информации.

1. Определение CMS. Пробуем определить используемую CMS (или CMSки, ведь никто не запрещает использовать несколько CMS на одном домене). Если используется распространенный движок, то определить это можно с вероятностью в 99%.

Если вам в лом самим определять CMS, можете воспользоваться сервисами:






Можно использовать плагин для браузера - wappalyzer.

Очень удобно, сразу видно движок, язык, js-фреймворки и т.д.:

Определяет больше двух сотен движков. Плагин не всегда работает точно. Например, попробуйте зайти с включенным плагином wappalayzer на эту страничку - Если вас интересует, как этот плагин определяет движки, посмотрите исходник:



Вы поймете, что анализируются:

  • http-заголовки (в том числе cookie)
  • meta-теги
  • подключаемые скрипты (<script src='blabla'>)
  • пути к файлам (картинкам, таблицам стилей и т.д.)
  • комментарии в html-коде
  • прочее (по регуляркам) в html-коде ("Powered by ...", "MegaSuperCMS")
  • URL (/index.php?showtopic=666 - явно сатанинский форум, /?p=1488 - нс-бложик)

Для точного определения CMS нужно также проверять:

robots.txt - в данном текстовике указаны папки и файлы которые нужно/не нужно индексировать. Файл либо лежит в корне сайта, либо его вообще нет. Выглядит примерно так:

Наметанный глаз мигом определит WordPress. Ненаметанный метнется по адресу /wp-login.php и опять таки определит WordPress.

Админ-панель - Определить адрес админки можно внимательно изучив файл robots.txt или проверив все распространенные пути к админкам (руками или софтом - об этом чуть далее). К примеру, вход в админку Joomla!:



Joomla 1.5

  • Joomla.
  • WordPress.
  • Drupal.
  • DLE.
  • Любая другая CMS -

Файлы и Папки. CMS можно определить по наличию/отсутствию некоторых файлов и папок. Например, в большинстве CMS есть файлы с названиями типа Changelog.htm, readme.txt, config.example и подобными. Скачиваем распространенные движки, изучаем структуру файлов и папок, пробуем найти интересные файлы/папки на изучаемом сайте.

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

Просто потренируйтесь - устанавливайте разные движки, ставьте разные шаблоны, плагины. После небольшой практики, вы сможете определять движок взглянув одним (прищуренным) глазом на главную страницу.

В результате, после выполнения всех вышеописанных проверок, возможны 3 варианта:

  • CMS определена, исходники можно изучить.
  • CMS определена, но нет возможности изучить исходники.
  • CMS не определена.

2. Определение тем/плагинов/модулей/компонентов. Если мы работаем с одной из распространненых CMS, то мы можем проверить еще и модули/плаигны. Для этого можно быстренько набыдлокодить свой убер-скрипт либо воспользоваться существующим софтом (к примеру для скана плагинов WP):



Разумеется, этот пункт относится только к популярным движкам (wp, joomla, drupal и подобным), а не студийным поделкам сумрачных гениев.

3. Ищем уязвимости в CMS. Первым делом идем на bug-трекеры. Чекаем CMS на сайтах:










Стоит особенно отметить 1337day (наследник милворма):



И exploit-db:



Если сплойт не пашет, то внимательно изучите исходник, есть шанс, что в сплойте допущена ошибка (по старой хэккерной традиции). Также очень часто бывает, что исходники движка нельзя найти, а сплойт под движок - легко.

Если ничего в паблике не нашлось, идем на страницы разработчиков и внимательно читаем changelog. Какие ошибки были исправлены, когда, обязательно обращаем внимание на патчи связанные с безопасностью.

4. Сканер директорий. После того как мы узнали CMS (или не узнали), мы натравливаем на сайт сканер директорий - DirBuster.



DirBuster многопоточен, кроссплатформенен, красив и умен. Скачать можно по ссылке - Благодаря сканеру директорий, мы можем найти:

  • WYSIWIG-редакторы
  • файловые менеджеры
  • phpmyadmin (и аналоги)
  • скрипты статистики
  • старые версии скриптов (index.php.old и т.д.)
  • бекапы
  • многое другое

Обыкновенно, сторонние скрипты подключают "as is", не беспокоясь о возможных уязвимостях. В общем никогда не забывайте пользоваться сканером директорий, даже если CMS определена и плагины успешно найдены. Может быть в забытой кодерами папке "/upload_old/new1/new11/new1111/old/upload.php" вас ждет форма заливки файлов без проверки на расширения и прочие условности.

5. Сбор параметров. После того как мы просканировали директории и файлы, необходимо узнать все точки входа.

Образно говоря, если бы мы грабили квартиру, то сначала проверили бы все двери, окна, замки, затем выбрали самую уязвимую цель (открытая форточка, фанерная дверь, китайский замок), затем мы бы начали использовать отмычки(или другой инструмент), чтобы попасть внутрь.

В хаке сайтов все то же самое - находим все точки входа в приложение (Get, post, cookie, заголовки приложения), затем ищем уязвимые параметры и пытаемся их экплуатировать (только если домушник пихает отмычки в замок, мы пихаем кавычки и скобки в формочки или строку браузера).

Для автоматизированного сбора страниц прекрасно подойдет Burp Suite (шикарная утилита, с которой вы скоро не будете расставаться).

  • Скачать burp-suite -
  • Справка по burp-suite -

В обязательном порядке установите и ознакомьтесь со справкой. Это настоящий швейцарский нож для веб-приложений. И одна из его возможностей как раз позволяет собрать все страницы и все формы с сайта:



Запускаем спайдер, и он парсит все страницы со скоростью бешеной курицы, с горящими перьями.

Но не стоит скидывать со счетов и ручной анализ.

6. Обход mod_rewrite. Сейчас все повернулись на всяких seo-фишках. И многие юзают mod_rewrite (и подобные вещи), что сделать из некрасивой ссылки вида:



Получать такие ссылки:



К счастью, у нас не будет возникать проблем со сбором Post и Сookie параметров. Итак, чтобы обойти ЧПУ (человеко-подобный урл) нам нужно:

1. Узнать имя скрипта.

2. Узнать параметры скрипта.

3. Узнать принимаемые параметром значения.

Я бы конечно с радостью расписал все что нужно делать, но лучше всего написали тут - Правда скрипт, упоминаемый в статье, уже удалили или перенесли. Но мы его заботливо сохранили для будущих поколений:

Код:
<?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>';

?>
Возможно, что сейчас информация про обход mod_rewrite кажется для вас лишней. Если будет нужно - вернетесь к данному материалу позже. А пока просто отметьте для себя, что можно успешно ломать сайты и с ЧПУ.

В принципе со сбором информации мы закончили. Если на прошлом этапи мы собирали общую информацию, то тут мы занимались исключительно веб-приложением. Узнали CMS, модули, искали сплоиты, просканировали директории и файлы, собрали все точки входа.

 
пусть будет) не лишняя)

 
добавь если есть что

 
tgygjygj

 
Сверху