ec_main.c
上传用户:nilegod
上传日期:2007-01-08
资源大小:220k
文件大小:13k
源码类别:

网络截获/分析

开发平台:

C/C++

  1. /*
  2.     ettercap -- a ncurses-based sniffer/interceptor utility for switched LAN
  3.     Copyright (C) 2001  ALoR <alor@users.sourceforge.net>, NaGA <crwm@freemail.it>
  4.     This program is free software; you can redistribute it and/or modify
  5.     it under the terms of the GNU General Public License as published by
  6.     the Free Software Foundation; either version 2 of the License, or
  7.     (at your option) any later version.
  8.     This program is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.     GNU General Public License for more details.
  12.     You should have received a copy of the GNU General Public License
  13.     along with this program; if not, write to the Free Software
  14.     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  15. */
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <unistd.h>
  19. #include <string.h>
  20. #include <sys/ioctl.h>
  21. #include "include/ec_main.h"
  22. #include "include/ec_error.h"
  23. #include "include/ec_inet.h"
  24. #include "include/ec_simple.h"
  25. #include "include/ec_signal.h"
  26. #ifdef HAVE_GETOPT_H
  27. #include <getopt.h>
  28. #else
  29. #include "missing/getopt.h"
  30. #endif
  31. #ifdef HAVE_NCURSES
  32.     #include "include/ec_interface.h"
  33. #endif
  34. #ifdef DEBUG
  35.    #include "include/ec_debug.h"
  36. #endif
  37. // global variables
  38. char *program_argv0;
  39. HOST *Host_In_LAN = NULL;        // ec_main.h
  40. int number_of_hosts_in_lan;
  41. CONNECTION *Conn_Between_Hosts = NULL;       // ec_main.h
  42. int number_of_connections;
  43. HOST Host_Source;
  44. HOST Host_Dest;
  45. char *Execute_Plugin;
  46. OPTIONS Options;
  47. int pipe_with_illithid;
  48. int pipe_with_illithid_data;
  49. int pipe_inject_stod[2];
  50. int pipe_inject_dtos[2];
  51. char active_dissector = 1;    // ec_main.h
  52. // protos...
  53. void Main_Usage(void);
  54. void Main_Interactive(void);
  55. void Main_Normal(void);
  56. void Main_CheckForRun(void);
  57. void Main_ParseParameters(char *first, char *second, char *third, char *fourth);
  58. //-----------------------------------
  59. int main(int argc, char *argv[])
  60. {
  61.    int c;
  62.    static struct option long_options[] = {
  63.       { "help", no_argument, NULL, 'h' },
  64.       { "version", no_argument, NULL, 'v' },
  65.       { "simple", no_argument, NULL, 'N' },
  66.       { "list", no_argument, NULL, 'l' },
  67.       { "arpsniff", no_argument, NULL, 'a' },
  68.       { "sniff", no_argument, NULL, 's' },
  69.       { "macsniff", no_argument, NULL, 'm' },
  70.       { "iface", required_argument, NULL, 'i' },
  71.       { "netmask", required_argument, NULL, 'n' },
  72.       { "check", no_argument, NULL, 'c' },
  73.       { "plugin", required_argument, NULL, 'p' },
  74.       { "hexview", no_argument, NULL, 'x' },
  75.       { "silent", no_argument, NULL, 'z' },
  76.       { "udp", no_argument, NULL, 'u' },
  77.       { "fingerprint", no_argument, NULL, 'f' },
  78.       { "linktype", no_argument, NULL, 't' },
  79.       { "collect", no_argument, NULL, 'C' },
  80.       { "broadping", no_argument, NULL, 'b' },
  81.       { 0 , 0 , 0 , 0}
  82.    };
  83.    program_argv0 = argv[0];
  84. #ifdef DEBUG
  85.    Debug_Init();
  86.    Debug_msg("Main");
  87. #endif
  88.    Main_CheckForRun();     // it is ok ?
  89.    Signal_SigBuster();     // signal masking
  90. #ifdef PERMIT_PLUGINS
  91.    while ((c = getopt_long (argc, argv, "hvNlasmci:p:xzuftCbn:",long_options, (int *)0)) != EOF) {
  92. #else
  93.    while ((c = getopt_long (argc, argv, "hvNlasmci:xzuftCbn:",long_options, (int *)0)) != EOF) {    // no plugin
  94. #endif
  95.       switch (c) {
  96.          case 'h':
  97.             Main_Usage();
  98.          break;
  99.          case 'v':
  100.             fprintf(stdout,"%sn",VERSION);
  101.             exit(0);
  102.          break;
  103.          case 'N':   Options.normal = 1;     break;
  104.          case 'l':   Options.list = 1;       break;
  105.          case 'a':   Options.arpsniff = 1;   break;
  106.          case 's':   Options.sniff = 1;      break;
  107.          case 'm':   Options.macsniff = 1;   break;
  108.          case 'c':   Options.check = 1;      break;
  109.          case 'x':   Options.hexview = 1;    break;
  110.          case 'z':   Options.silent = 1;     break;
  111.          case 'u':   Options.udp = 1;        break;
  112.          case 'f':   Options.finger = 1;     break;
  113.          case 't':   Options.link = 1;       break;
  114.          case 'C':   Options.collect = 1;    break;
  115.          case 'b':   Options.broadping = 1;    break;
  116. #ifdef PERMIT_PLUGINS
  117.          case 'p':
  118.             Options.plugin = 1;
  119.             Execute_Plugin = strdup(optarg);
  120.          break;
  121. #endif
  122.          case 'i':
  123.             strncpy(Options.netiface, optarg, 10);
  124.          break;
  125.          case 'n':
  126.             strncpy(Options.netmask, optarg, 16);
  127.          break;
  128.          case ':': // missing parameter
  129.             Main_Usage();
  130.          break;
  131.          case '?': // unknown option
  132.             Main_Usage();
  133.          break;
  134.       }
  135.    }
  136.    Main_ParseParameters(argv[optind], argv[optind+1], argv[optind+2], argv[optind+3]);
  137.    if (!strcmp(Options.netiface, ""))        // set the default interface
  138.       if (Inet_FindIFace(Options.netiface) == -1)
  139.          Error_msg("No suitable Network Interface found !!");
  140.    if ( Inet_CorrectIface(Options.netiface) < 0)
  141.       Error_msg("Network Interface %s is invalid !!", Options.netiface);
  142.    if (Options.normal)
  143.       Main_Normal();
  144.    else
  145.       Main_Interactive();
  146. return 0;
  147. }
  148. void Main_Usage(void)
  149. {
  150. #ifdef DEBUG
  151.    Debug_msg("Main_Usage");
  152. #endif
  153.    fprintf (stdout, "n33[01m33[1m%s %s (c) 2001 %s33[0mnn", PROGRAM, VERSION, AUTHORS);
  154.    fprintf (stdout, "nUsage: %s [OPTION] [HOST:PORT] [HOST:PORT] [MAC] [MAC]nn", PROGRAM);
  155.    fprintf (stdout, "  -N, --simple                 NON interactive mode (without ncurses)nn");
  156.    fprintf (stdout, "  -z, --silent                 silent mode (no arp storm on start up)nn");
  157.    fprintf (stdout, "  -b, --broadping              broadcast ping instead of arp storm on start upnn");
  158.    fprintf (stdout, "  -u, --udp                    sniff only udp connection (default is tcp)nn");
  159.    fprintf (stdout, "  -a, --arpsniff               arp based sniffing (must specify two host)n");
  160.    fprintf (stdout, "                               in silent mode : must specify two IP and two MACn");
  161.    fprintf (stdout, "                                    i.e.: ettercap -za IP IP MAC MACnn");
  162.    fprintf (stdout, "  -s, --sniff                  ip based sniffingn");
  163.    fprintf (stdout, "                               you can specify null ip that means ALL hostsnn");
  164.    fprintf (stdout, "  -m, --macsniff               mac based sniffing (must specify two host)n");
  165.    fprintf (stdout, "                               in silent mode : must specify two MAC addressn");
  166.    fprintf (stdout, "                                    i.e.: ettercap -zm MAC MACnn");
  167.    fprintf (stdout, "  -l, --list                   list all hosts in the lannn");
  168.    fprintf (stdout, "  -f, --fingerprint HOST       do OS fingerprinting on HOSTnn");
  169.    fprintf (stdout, "  -C, --collect                collect users and passwords onlyn");
  170.    fprintf (stdout, "                               this options must be used with a sniffing methodn");
  171.    fprintf (stdout, "                                    Es: ettercap -NCzsnn");
  172.    fprintf (stdout, "  -x, --hexview                display data in hex modenn");
  173.    fprintf (stdout, "  -i, --iface IFACE            network interface to be usednn");
  174.    fprintf (stdout, "  -n, --netmask NETMASK        the netmask used to scan the lannn");
  175.    fprintf (stdout, "  -c, --check                  check for other poisoners in the LANnn");
  176.    fprintf (stdout, "  -t, --linktype               am I in a switched LAN or not ?nn");
  177. #ifdef PERMIT_PLUGINS
  178.    fprintf (stdout, "  -p, --plugin [name]          run the "name" plugin ("list" for available ones)nn");
  179. #endif
  180.    fprintf (stdout, "  -v, --version                print versionnn");
  181.    fprintf (stdout, "  -h, --help                   print this helpnn");
  182.    fprintf (stdout, "n");
  183.    exit (0);
  184. }
  185. void Main_Interactive(void)
  186. {
  187. #ifdef HAVE_NCURSES
  188.    struct winsize  ws = {0, 0, 0, 0};
  189. #endif
  190. #ifdef DEBUG
  191.    Debug_msg("Main_Interactive");
  192. #endif
  193. #ifdef HAVE_NCURSES
  194.    ioctl(0, TIOCGWINSZ, &ws);          // syscall for the window size
  195.    if ( (ws.ws_row < 25) || (ws.ws_col < 80) )
  196.       Error_msg("Screen must be at least 25x80 !!");
  197.    if (!Options.silent) printf("Building host list for netmask %s, please wait...n", Inet_MySubnet());
  198.    number_of_hosts_in_lan = Inet_HostInLAN();
  199.    Interface_InitTitle(Host_In_LAN[0].ip, Host_In_LAN[0].mac, Inet_MySubnet());
  200.    Interface_InitScreen();
  201.    Interface_Run();
  202. #else
  203.    #ifdef DEBUG
  204.       Debug_msg("Ncurses not supported -- turning to non interactive mode...");
  205.    #endif
  206.    Main_Normal();
  207. #endif
  208. #ifdef DEBUG
  209.    Debug_msg("Main_Interactive_END");
  210. #endif
  211. }
  212. void Main_Normal(void)
  213. {
  214. #ifdef DEBUG
  215.    Debug_msg("Main_Normal");
  216. #endif
  217.    printf ("n33[01m33[1m%s %s (c) 2001 %s33[0mnn", PROGRAM, VERSION, AUTHORS);
  218.    printf ("Your IP: %s with MAC: %s on Iface: %sn", Inet_MyIPAddress(), Inet_MyMACAddress(), Options.netiface);
  219.    if (Options.list || Options.check || Options.arpsniff || Options.sniff  || Options.macsniff || Options.link)
  220.    {
  221.       if (!Options.silent) printf("Building host list for netmask %s, please wait...n", Inet_MySubnet());
  222.       number_of_hosts_in_lan = Inet_HostInLAN();
  223.    }
  224.    if (Options.list)
  225.       Simple_HostList();
  226.    if (Options.check)
  227.       Simple_CheckForPoisoner();
  228.    if (Options.link)
  229.       Simple_CheckForSwitch();
  230.    if (Options.finger)
  231.       Simple_FingerPrint();
  232. #ifdef PERMIT_PLUGINS
  233.    if (Options.plugin)
  234.       Simple_Plugin();
  235. #endif
  236.    if (Options.arpsniff || Options.sniff  || Options.macsniff)
  237.       Simple_Run();
  238.    printf("n");
  239. #ifdef DEBUG
  240.    Debug_msg("Main_Normal_END");
  241. #endif
  242. exit(0);
  243. }
  244. void Main_CheckForRun(void)
  245. {
  246. #ifdef DEBUG
  247.    Debug_msg("Main_CheckForRun");
  248. #endif
  249. #ifdef PERMIT_SUID
  250.    if (geteuid() != 0)
  251.       Error_msg("Sorry EUID %d, must be EUID = 0 to run %s !!", geteuid(), PROGRAM);
  252. #else
  253.    if (getuid() != 0)
  254.       Error_msg("Sorry UID %d, must be root to run %s !!", getuid(), PROGRAM);
  255. #endif
  256. }
  257. void Main_ParseParameters(char *first, char *second, char *third, char *fourth)
  258. {
  259. #ifdef DEBUG
  260.    Debug_msg("Main_ParseParameters");
  261. #endif
  262. #define R(a,b,c) (a & b) | ((a ^ b) & c)     // returns true if more than one was selected
  263.    if ( R(Options.arpsniff, Options.sniff, Options.macsniff) )
  264.       Error_msg("Please select only one sniffing method !!nn");
  265.    if (Options.silent && Options.broadping)
  266.       Error_msg("Please select only one start up method !!nn");
  267.    if (Options.silent)
  268.    {
  269.       if (Options.macsniff)
  270.       {
  271.          int i=0;
  272.          if (first)
  273.          {
  274.             i++;
  275.             sscanf(first, "%17s", Host_Dest.mac);
  276.             if (second)
  277.             {
  278.                i++;
  279.                sscanf(second, "%17s", Host_Source.mac);
  280.             }
  281.          }
  282.          if (i < 2) Error_msg("Please specify both source and destination MAC !!");
  283.       }
  284.       if (Options.arpsniff)
  285.       {
  286.          int i=0;
  287.          if (first)
  288.          {
  289.             i++;
  290.             sscanf(first, "%128[^:]:%d", Host_Dest.name, &Host_Dest.port);
  291.             if (second)
  292.             {
  293.                i++;
  294.                sscanf(second, "%128[^:]:%d", Host_Source.name, &Host_Source.port);
  295.                if (third)
  296.                {
  297.                   i++;
  298.                   sscanf(third, "%17s", Host_Dest.mac);
  299.                   if (fourth)
  300.                   {
  301.                      i++;
  302.                      sscanf(fourth, "%17s", Host_Source.mac);
  303.                   }
  304.                }
  305.             }
  306.          }
  307.          if (i < 4) Error_msg("Please specify both source and destination IP and MAC !!");
  308.       }
  309.       if (Options.sniff || Options.plugin)
  310.       {
  311.          if (first)
  312.          {
  313.             sscanf(first, "%128[^:]:%d", Host_Dest.name, &Host_Dest.port);
  314.             if (second) sscanf(second, "%128[^:]:%d", Host_Source.name, &Host_Source.port);
  315.          }
  316.       }
  317.       if (Options.check)   Error_msg("You can't check for poisoners in silent mode !!");
  318.       if (Options.list)    Error_msg("You can't make the list in silent mode !!");
  319.    }
  320.    else // !silent
  321.    {
  322.       if (first)
  323.       {
  324.          sscanf(first, "%128[^:]:%d", Host_Dest.name, &Host_Dest.port);
  325.          if (second) sscanf(second, "%128[^:]:%d", Host_Source.name, &Host_Source.port);
  326.       }
  327.       if (Options.arpsniff || Options.macsniff )
  328.          if ( (!strcmp(Host_Source.name, "")) || (!strcmp(Host_Dest.name, "")) )
  329.             Error_msg("Please specify both source and destination host !!");
  330.    }
  331.    if (strcmp(Host_Source.name, ""))
  332.       strcpy(Host_Source.ip, Inet_NameToIp(Host_Source.name));
  333.    if (strcmp(Host_Dest.name, ""))
  334.       strcpy(Host_Dest.ip, Inet_NameToIp(Host_Dest.name));
  335. #ifdef DEBUG
  336.    Debug_msg("Main_ParseParameters - name - [%s][%s]", Host_Dest.name, Host_Source.name);
  337.    Debug_msg("Main_ParseParameters -  IP  - [%s][%s]", Host_Dest.ip, Host_Source.ip);
  338.    Debug_msg("Main_ParseParameters -  MAC - [%s][%s]", Host_Dest.mac, Host_Source.mac);
  339. #endif
  340. }
  341. /* EOF */