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

网络截获/分析

开发平台:

C/C++

  1. /*
  2.     shadow -- ettercap plugin -- simple port scan
  3.     Copyright (C) 2001  NaGoR
  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 <stdlib.h>
  17. #include <fcntl.h>
  18. #include <time.h>
  19. #include <sys/time.h>
  20. #include <unistd.h>
  21. #include "../../src/include/ec_main.h"
  22. #include "../../src/include/ec_plugins.h"
  23. #include "../../src/include/ec_inet_structures.h"
  24. #include "../../src/include/ec_inet.h"
  25. #include "../../src/include/ec_inet_forge.h"
  26. #include "../../src/include/ec_decodedata.h"
  27. char Ettercap_Version[] = VERSION;                       // required -- for compatibility
  28. char PlugIn_Info[] = "A very simple SYN/TCP port scanner";
  29. short PlugIn_Version = 8;
  30. #define SYN_SEQ 6969
  31. // global data...
  32. int IPS, IPD, port_index=0;
  33. int *PORTREP;
  34. // ---------------------------
  35. void Parse_packet(char *buffer)
  36. {
  37.    IP_header  *ip;
  38.    TCP_header *tcp;
  39.    ip = (IP_header *) (buffer+ETH_HEADER);
  40.    if (ip->source_ip==IPD && ip->dest_ip==IPS && ip->proto==IPPROTO_TCP)
  41.    {
  42.       tcp = (TCP_header *) ((int)ip + ip->h_len * 4);
  43.       if ( (tcp->flags & TH_SYN) && (tcp->flags & TH_ACK) )
  44.       {
  45.          int i;
  46.          for (i=0; i<port_index; i++)
  47.              if (ntohs(tcp->source)==PORTREP[i]) break;
  48.          if (i==port_index)
  49.          {
  50.             PORTREP[i]=ntohs(tcp->source);
  51.             port_index++;
  52.          }
  53.       }
  54.    }
  55. }
  56. void PlugIn_Start(char**argv)
  57. {
  58.     int i, sock, MTU, startP, finP, OldIndex=0;
  59.     unsigned short PORTS, IP_ID;
  60.     unsigned char MACS[6];
  61.     unsigned char MACD[6];
  62.     char numero[10];
  63.     char *pck_to_send;
  64.     TIME_DECLARE;
  65.     if (!strcmp(Host_Dest.ip,""))
  66.     {
  67.       Plugin_Output("Please select a Dest...n");
  68.       return;
  69.     }
  70.     if (!strcmp(Host_Dest.ip, Inet_MyIPAddress()))
  71.     {
  72.        Plugin_Output("nThis plugin doesn't work on myself !!n");
  73.        return;
  74.     }
  75.     Plugin_Output("nStarting Port: ");
  76.     Plugin_Input(numero, 10, P_BLOCK);
  77.     startP = atoi(numero);
  78.     Plugin_Output("Stopping Port: ");
  79.     Plugin_Input(numero, 10, P_BLOCK);
  80.     finP = atoi(numero);
  81.     if (startP>finP)
  82.     {
  83. Plugin_Output("nStopping Port must be greater than Starting Portn");
  84. return;
  85.     }
  86.     IPD = inet_addr(Host_Dest.ip);
  87.     sock = Inet_OpenRawSock(Options.netiface);
  88.     Inet_GetIfaceInfo(Options.netiface, &MTU, MACS, (unsigned long *)&IPS, 0);
  89.     memcpy(MACD, Inet_MacFromIP(inet_addr(Host_Dest.ip)), 6);
  90.     PORTREP = (int *)malloc((finP-startP+10)*sizeof(int));
  91.     memset(PORTREP,0,(finP-startP+10)*sizeof(int));
  92.     srand(time(0));
  93.     IP_ID = PORTS = rand()%(0xFFFE)+1;
  94.     pck_to_send = (char *)Inet_Forge_packet(MTU);
  95.     Inet_Forge_ethernet( pck_to_send, MACS, MACD, ETH_P_IP );
  96.     Inet_Forge_ip( pck_to_send + ETH_HEADER, IPS, IPD, TCP_HEADER, IP_ID++, 0, IPPROTO_TCP);
  97.     for (i=startP; i<=finP; i++)
  98.     {
  99.        Inet_Forge_tcp( pck_to_send + ETH_HEADER + IP_HEADER, PORTS, i,  SYN_SEQ, 0, TH_SYN, 0, 0);
  100.        Inet_SendRawPacket(sock, pck_to_send, ETH_HEADER + IP_HEADER + TCP_HEADER );
  101.        if (!(i%5)) usleep(500);
  102.     }
  103.     Plugin_Output("nnScanning %s  %d -> %d ...nn",Host_Dest.ip, startP, finP);
  104.     fcntl(sock, F_SETFL, O_NONBLOCK);
  105.     TIME_START;
  106.     do
  107.     {
  108.         Inet_GetRawPacket(sock, pck_to_send, MTU, NULL);
  109.         Parse_packet(pck_to_send);
  110.         TIME_FINISH;
  111.         for (;OldIndex<port_index; OldIndex++)
  112.         {
  113.           char *desc;
  114.           desc = strdup(Decodedata_GetType('T', PORTREP[OldIndex], PORTREP[OldIndex]));
  115.           Plugin_Output("Open Port: %4d/tcp %sn", PORTREP[OldIndex], desc);
  116.         }
  117.     } while (TIME_ELAPSED < 2);
  118.     Inet_Forge_packet_destroy( pck_to_send );
  119.     free(PORTREP);
  120.     close(sock);
  121. }
  122. /* EOF */