annuncio

Comprimi
Ancora nessun annuncio.

[C project] ip sniffer.

Comprimi
X
 
  • Filtro
  • Ora
  • Visualizza
Elimina tutto
nuovi messaggi

    [C project] ip sniffer.

    codice:
    /*
    A-SnIf
    V2.0
    
    A new version of TLSniff (written about one year ago :)
    
    A lot of things are changed...
    
    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 ();
    }
    questa è la versione di un ip sniffer scritto in C, da asynchro, della pkcrew. E' molto utile a chi vuole iniziare a cimentarsi nella programmazione di un software con caratteristiche simili.
    certo, non sarà mai come quelli che girano in rete, ma è pur sempre un buon sorgente. Dopotutto, studiarlo fà capire molte cose!

    #2
    Riferimento: [C project] ip sniffer.

    dubito che qui qualcuno si cimenti nella programmazione C applicata all'hacking ^^ però alla fine il sorgente può sempre servire...
    First and Last Name: Mirko Calabrese
    WebSite: www.mirkocalabrese.com
    E-Mail: mirkocalabrese@gmail.com
    InfoLine: +39 3485913455
    Security Officer, Webmaster and Programmer...

    Commenta


      #3
      Riferimento: [C project] ip sniffer.

      beh, c'è gente (rara trovarla) come te, a cui può servire! xD

      Commenta

      Sto operando...
      X