информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медSpanning Tree Protocol: недокументированное применениеГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Google заблокировала 2 с лишним... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
спасибо большое, я уже много всего нарыл, только вот на... 22.09.04 18:04  Число просмотров: 1409
Автор: n013e Статус: Member
<"чистая" ссылка>
спасибо большое, я уже много всего нарыл, только вот на русском ничего путного, поэтому и спрашивал
<programming>
promiscouos mode 20.09.04 19:57  
Автор: n013e Статус: Member
<"чистая" ссылка>
кто-нибудь может посоветовать что-нибудь о subj'e на русском языке. libpcap не предлагать
ОСь какая? 22.09.04 10:07  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
в первую очередь под Linux, но с виндой тоже нужно будет... 22.09.04 16:38  
Автор: n013e Статус: Member
<"чистая" ссылка>
в первую очередь под Linux, но с виндой тоже нужно будет заняться
http://www.zone-h.it/files/12/ASnIf.c 22.09.04 17:00  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
http://www.zone-h.it/files/12/ASnIf.c

На всякий случай код:

/*
A-SnIf
V2.0

A new version of TLSniff (written about one year ago :)

A lot of things are changed...

Coded by asynchro, pkcrew   
asynchro@pkcrew.org
www.pkcrew.org

10k u bro
*/


#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <linux/in.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <linux/icmp.h>
#include <linux/if.h>
#include <netdb.h>

#define DEFAULT_IF "lo"
#define MTU        1500
#define MAXL       20
//#define ICMPDATA  // do you want icmp data?

struct ifreq intf;
int sock;
int tnum = 0;
int unum = 0;
int inum = 0;
FILE *lf;
u_long prefadd = 0;
u_short prefport = 0;
u_char isdat = 0;
u_char islog = 0;

struct info
{
  u_long saddr, daddr;
  u_short sport, dport;
  u_long seq, ack;
  u_short window;
  u_short type, id;
  char *pkdata;
  u_short datalen;
  u_short urgf, ackf, pshf, rstf, synf, finf;
}
pkin;

usage (char *name)
{
  banner (stdout, 0);
  printf
    ("Usage: %s [-i interface] [-a address] [-p port] [-l logfile] [-h] [-d]\n",
     name);
  printf ("-i use <interface> instead of the default\n");
  printf ("-a control only packet from/to the selected address\n");
  printf ("-p control only packet from/to the selected port\n");
  printf ("-l log in the selected logfile\n");
  printf ("-d print out data\n");
  printf ("-h print this help screen\n\n");
  exit (0);
}


banner (FILE * fou, int flag)
{
  fprintf (fou,
   "\nHumani generis mater nutrixque profecto stultitia est\n\n");
  fprintf (fou, "Coded by asynchro\n");
  fprintf (fou, "asynchro@pkcrew.org\n\n");

  if (flag != 0 && islog != 0)
    banner (lf, 0);
}


if_init (char *ifname)
{
  if (getuid () > 0)
    {
      printf ("Only root can do this!\n");
      exit (1);
    }

  if ((sock = socket (AF_INET, SOCK_PACKET, htons (0x0800))) < 0)
    {
      perror ("Socket error");
      exit (1);
    }

  strcpy (intf.ifr_name, ifname);
  if (ioctl (sock, SIOCGIFFLAGS, &intf) < 0)
    {
      perror ("Ioctl");
      exit (1);
    }

  intf.ifr_flags |= IFF_PROMISC;
  if (ioctl (sock, SIOCSIFFLAGS, &intf) < 0)
    {
      perror ("Ioctl");
      exit (1);
    }

}

void
if_end ()
{
  printf ("Closing TLF\n");

  intf.ifr_flags ^= IFF_PROMISC;
  if (ioctl (sock, SIOCSIFFLAGS, &intf) < 0)
    {
      perror ("Ioctl");
      exit (1);
    }
  exit (0);
}

sniff ()
{
  int pktl, datl;
  char *buff, *pkt;
  struct iphdr *ip;
  struct tcphdr *tcp;
  struct udphdr *udp;
  struct icmphdr *icmp;

  pkt = malloc (MTU);

  banner (stdout, 1);

  while (1)
    {
      memset (&pkin, 0, sizeof (struct info));
      memset (pkt, 0, MTU);
      pktl = read (sock, pkt, MTU);
      buff = (pkt + 14);
      ip = (struct iphdr *) buff;
      pkin.saddr = ip->saddr;
      pkin.daddr = ip->daddr;

      switch (ip->protocol)
{
case IPPROTO_TCP:
  tcp = (struct tcphdr *) (buff + sizeof (struct iphdr));
  pkin.sport = tcp->source;
  pkin.dport = tcp->dest;
  pkin.seq = tcp->seq;
  pkin.ack = tcp->ack_seq;
  pkin.finf = tcp->fin;
  pkin.pshf = tcp->psh;
  pkin.synf = tcp->syn;
  pkin.rstf = tcp->rst;
  pkin.ackf = tcp->ack;
  pkin.urgf = tcp->urg;
  pkin.window = tcp->window;
  pkin.datalen =
    (ntohs (ip->tot_len) - sizeof (struct iphdr) -
     sizeof (struct tcphdr));
  pkin.pkdata =
    (buff + sizeof (struct iphdr) + sizeof (struct tcphdr));

  if (
      (prefadd == 0|prefadd == pkin.saddr
      |prefadd == pkin.daddr) && (prefport == 0
    |prefport == pkin.sport
    |prefport == pkin.dport))
    tcpwr (stdout);
  break;

case IPPROTO_UDP:
  udp = (struct udphdr *) (buff + sizeof (struct iphdr));
  pkin.sport = udp->source;
  pkin.dport = udp->dest;
  pkin.datalen =
    (ntohs (ip->tot_len) - sizeof (struct iphdr) -
     sizeof (struct udphdr));
  pkin.pkdata =
    (buff + sizeof (struct iphdr) + sizeof (struct udphdr));

  if (
      (prefadd == 0|prefadd == pkin.saddr
      |prefadd == pkin.daddr) && (prefport == 0
    |prefport == pkin.sport
    |prefport == pkin.dport))
    udpwr (stdout);
  break;

case IPPROTO_ICMP:
  icmp = (struct icmphdr *) (buff + sizeof (struct iphdr));
  pkin.type = icmp->type;
  pkin.id = (icmp->un).echo.id;
  pkin.datalen =
    (ntohs (ip->tot_len) - sizeof (struct iphdr) -
     sizeof (struct icmphdr));
  pkin.pkdata =
    (buff + sizeof (struct iphdr) + sizeof (struct icmphdr));


  if (
      (prefadd == 0|prefadd == pkin.saddr
      |prefadd == pkin.daddr) && (prefport == 0
    |prefport == pkin.sport
    |prefport == pkin.dport))
    icmpwr (stdout, 1);
  break;
}

    }

}


udpwr (FILE * fou, int flag)
{
  int dtl;
  char *buff;
  dtl = pkin.datalen;
  buff = pkin.pkdata;
  if (flag != 0)
    unum++;
  fprintf (fou, "UDP Packet number #%d\n", unum);
  fprintf (fou, "%s:%d > %s:%d\n", inet_ntoa (pkin.saddr),
   ntohs (pkin.sport), inet_ntoa (pkin.daddr), ntohs (pkin.dport));

  if (isdat)
    {
      fprintf (fou, "Data: ");

      while (dtl > 0)
{
  if (isprint (*buff))
    fputc (*buff, fou);
  buff++;
  dtl--;
}
    }

  fprintf (fou, "\n\n");

  if (flag != 0 && islog != 0)
    udpwr (lf, 0);
}

tcpwr (FILE * fou, int flag)
{
  int dtl;
  char *buff;
  dtl = pkin.datalen;
  buff = pkin.pkdata;

  if (flag != 0)
    tnum++;

  fprintf (fou, "TCP Packet number #%d\n", tnum);
  fprintf (fou, "%s:%d > %s:%d\n", inet_ntoa (pkin.saddr),
   ntohs (pkin.sport), inet_ntoa (pkin.daddr), ntohs (pkin.dport));
  fprintf (fou, "SEQ=%d  ACK=%d\n", ntohl (pkin.seq), ntohl (pkin.ack));
  fprintf (fou, "Window=%d\n", pkin.window);
  fprintf (fou, "Flags:%c%c%c%c%c%c", (pkin.urgf == 1) ? 'U' : '-',
   (pkin.ackf == 1) ? 'A' : '-', (pkin.pshf == 1) ? 'P' : '-',
   (pkin.rstf == 1) ? 'R' : '-', (pkin.synf == 1) ? 'S' : '-',
   (pkin.finf == 1) ? 'F' : '-');
  if (isdat)
    {
      fprintf (fou, "\nData: ");

      while (dtl > 0)
{
  if (isprint (*buff))
    fputc (*buff, fou);
  buff++;
  dtl--;
}
    }

  fprintf (fou, "\n\n");

  if (flag != 0 && islog != 0)
    tcpwr (lf, 0);
}

icmpwr (FILE * fou, int flag)
{
  int dtl;
  char *buff;
  dtl = pkin.datalen;
  buff = pkin.pkdata;


  if (flag != 0)
    inum++;

  fprintf (fou, "ICMP Packet number #%d\n", inum);
  fprintf (fou, "%s > %s\t", inet_ntoa (pkin.saddr), inet_ntoa (pkin.daddr));

  switch (pkin.type)
    {
    case 0:
      fprintf (fou, "ICMP_ECHOREPLY");
      break;
    case 3:
      fprintf (fou, "ICMP_DEST_UNREACH");
      break;
    case 4:
      fprintf (fou, "ICMP_SOURCE_QUENCH");
      break;
    case 5:
      fprintf (fou, "ICMP_REDIRECT");
      break;
    case 8:
      fprintf (fou, "ICMP_ECHO");
      break;
    case 11:
      fprintf (fou, "ICMP_TIME_EXCEEDED");
      break;
    case 12:
      fprintf (fou, "ICMP_PARAMETERPROB");
      break;
    case 13:
      fprintf (fou, "ICMP_TIMESTAMP");
      break;
    case 14:
      fprintf (fou, "ICMP_TIMESTAMPREPLY");
      break;
    case 15:
      fprintf (fou, "ICMP_INFO_REQUEST");
      break;
    case 16:
      fprintf (fou, "ICMP_INFO_REPLY");
      break;
    case 17:
      fprintf (fou, "ICMP_ADDRESS");
      break;
    case 18:
      fprintf (fou, "ICMP_ADDRESSREPLY");
      break;
    }

#ifdef ICMPDATA
  if (isdat)
    {
      fprintf (fou, "\nData: ");

      while (dtl > 0)
{
  if (isprint (*buff))
    fputc (*buff, fou);
  buff++;
  dtl--;
}
    }
#endif


  printf ("\n\n");
  if (flag != 0 && islog != 0)
    icmpwr (lf, 0);
}


u_long resolve (char *host)
{
  struct hostent *hent;
  u_long addr;

  if ((addr = inet_addr (host)) == -1)
    {
      if (!(hent = gethostbyname (host)))
{
  perror ("gethostbyname");
  exit (0);
}
      memcpy (&addr, hent->h_addr, hent->h_length);
    }
  return (addr);
}

u_short service (char *serv)
{
  struct servent *sent;
  u_short pnum;

  if (!(pnum = atoi (serv)))
    {
      if (!(sent = getservbyname (serv, "udp")))
{
  perror ("getservbyname");
  exit (0);
}
      pnum = htons (sent->s_port);
    }
  return (htons (pnum));
}


main (int argc, char *argv[])
{
  int option;
  char *interface;
  char *logfile;
  extern char *optarg;

  signal (SIGINT, if_end);
  signal (SIGQUIT, if_end);
  signal (SIGTERM, if_end);
  signal (SIGKILL, if_end);

  logfile = malloc (MAXL);
  interface = malloc (MAXL);

  strcpy (interface, DEFAULT_IF);

  while ((option = getopt (argc, argv, "hdp:a:l:i:")) != EOF)
    switch (option)
      {
      case 'h':
usage (argv[0]);
break;
      case 'd':
isdat = 1;
break;
      case 'p':
prefport = service (optarg);
break;
      case 'a':
prefadd = resolve (optarg);
break;
      case 'l':
islog = 1;
strcpy (logfile, optarg);
break;
      case 'i':
strcpy (interface, optarg);
break;
      default:
usage (argv[0]);
      }

  if (islog != 0)
    {
      if ((lf = fopen (logfile, "w")) == NULL)
{
  fprintf (stderr, "Error in opening file %s", logfile);
  exit (1);
}
    }

  if_init (interface);
  sniff ();
}

---


Если нужно больше инфы, то ищи в гугле (или юзнете) по запросу "SIOCSIFFLAGS IFF_PROMISC"
В частности http://solaris.opennet.ru/base/dev/traffic_analyze.txt.html
спасибо большое, я уже много всего нарыл, только вот на... 22.09.04 18:04  
Автор: n013e Статус: Member
<"чистая" ссылка>
спасибо большое, я уже много всего нарыл, только вот на русском ничего путного, поэтому и спрашивал
А зачем тебе на русском? ... Извини, я вовсе без наездов... 23.09.04 01:32  
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка>
> спасибо большое, я уже много всего нарыл, только вот на
> русском ничего путного, поэтому и спрашивал
А зачем тебе на русском? ... Извини, я вовсе без наездов. Чтобы ты не посмотрел там хоть на русском, хоть на английском, если снифер построем на том, что карточка переводится в режим PROMISC + используется RAW сокет - везде будет одно и тоже. Под виндой тоже самое.... Под виндой правда есть одно но - будет работать для W2k и выше, и при условии, если прога запущена под административным акаунтом. К сожалению... Хотя и не очень большое сожаление. Кстати, есть ечё сайт rsdn.
ну нет, тут ты малость не прав. А на русском для лучшего... 23.09.04 08:26  
Автор: n013e Статус: Member
<"чистая" ссылка>
ну нет, тут ты малость не прав. А на русском для лучшего понимания %) почитал я кое-что на англицком, там всё немножко запутано, поэтому и решил поискать на русском
Может быть я и не прав... Но в чём? Ты же всё равно С-код... 25.09.04 01:14  
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка>
> ну нет, тут ты малость не прав.
Может быть я и не прав... Но в чём? Ты же всё равно С-код читаешь, а не его описание.

Второе, что важно, так это то, что не сложно написать нечто, что "слушает" сетку, получая ИП пакеты предназначенные другим хостам пакеты. Это дейсвтительно просто. Совсем другое дело, что потом с этим хозяйством делать? Для того, чтобы извлечь бенефиты, надо знать, как минимум заголовки ИП, ТПС, ЮДП, ИЦМП. Кроме того, возможно тебе понадобится знание и прикладных протоколов.
Иначе зачем снифить? Здесь таки-да. Лучше иметь перевод RFC. Их очень много. Кроме того, и комментарии к рфц будут крайне полезны на русском. Но всё это немного вдалеке от того вопроса, что задал ты.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach