scanners_utils.c
上传用户:tjescc
上传日期:2021-02-23
资源大小:419k
文件大小:5k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. /* Nessuslib -- the Nessus Library
  2.  * Copyright (C) 1998 Renaud Deraison
  3.  *
  4.  * This library is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU Library General Public
  6.  * License as published by the Free Software Foundation; either
  7.  * version 2 of the License, or (at your option) any later version.
  8.  *
  9.  * This library is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.  * Library General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU Library General Public
  15.  * License along with this library; if not, write to the Free
  16.  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  *
  18.  * scanners_utils -- scanner-plugins-specific stuff
  19.  */
  20. #define EXPORTING
  21. #include <includes.h>
  22. #include "comm.h"
  23. #include "services.h"
  24.  
  25. /*
  26.  * Sends the status of an action
  27.  */
  28. ExtFunc
  29. int 
  30. comm_send_status(globals, hostname, action,curr,max)
  31.   struct arglist * globals;
  32.   char * hostname;
  33.   char * action;
  34.   int curr, max;
  35. {
  36.  struct arglist * prefs = arg_get_value(globals,"preferences");
  37.  char * pref = arg_get_value(prefs, "ntp_short_status");
  38.  int short_status;
  39.  ntp_caps* caps = arg_get_value(globals, "ntp_caps");
  40.  int soc = (int)arg_get_value(globals, "global_socket");
  41.  char buffer[2048];
  42.  int e, n = 0, l, ack;
  43.  fd_set rd, wr;
  44.  struct timeval tv;
  45.  
  46.  
  47.  if (soc < 0 || soc > 1024) 
  48.   return -1;
  49.  
  50.  
  51.  if(strlen(hostname) > (sizeof(buffer) - 50))
  52.   return -1;
  53.   
  54.  if(pref && !strcmp(pref, "yes"))
  55.   short_status = 1;
  56.  else
  57.   short_status = 0;
  58.    
  59.   if(caps->ntp_11)
  60.     {
  61.     if(short_status)
  62.       {
  63.       snprintf(buffer, sizeof(buffer), "s:%c:%s:%d:%dn", action[0], hostname, curr, max);
  64.       }
  65.     else
  66.      snprintf(buffer, sizeof(buffer),
  67. "SERVER <|> STATUS <|> %s <|> %s <|> %d/%d <|> SERVERn",
  68. hostname, action, curr, max);
  69.     }
  70.   else
  71.    snprintf(buffer, sizeof(buffer), "SERVER <|> STAT <|> %s <|> %d/%d <|> SERVERn",
  72.       hostname, curr, max);
  73.       
  74.       
  75.  internal_send(soc, buffer, INTERNAL_COMM_MSG_TYPE_DATA);
  76.  
  77.  return 0;
  78. }
  79. /*
  80.  * 0 is considered as the biggest number, since it
  81.  * ends our string
  82.  */
  83. int qsort_compar(const void* a, const void* b)
  84. {
  85.  u_short *aa = (u_short*)a;
  86.  u_short *bb = (u_short*)b;
  87.  if(*aa==0)return(1);
  88.  else if(*bb==0)return(-1);
  89.  else return(*aa-*bb);
  90. }
  91. /*
  92.  * getpts()
  93.  * 
  94.  * This function is (c) Fyodor <fyodor@dhp.com> and was taken from
  95.  * his excellent and outstanding scanner Nmap
  96.  * See http://www.insecure.org/nmap/ for details about 
  97.  * Nmap
  98.  */
  99.  
  100. /* Convert a string like "-100,200-1024,3000-4000,60000-" into an array 
  101.    of port numbers*/
  102. unsigned short *getpts(char *origexpr, int * len) {
  103. int exlen;
  104. char *p,*q;
  105. unsigned short *tmp, *ports;
  106. int i=0, j=0,start,end;
  107. char *expr;
  108. char *mem;
  109. char * s_start, * s_end;
  110. static unsigned short * last_ret = NULL;
  111. static char * last_expr = NULL;
  112. static int last_num;
  113.  if(strcmp(origexpr, "default") == 0)
  114.  {
  115.  if ( last_expr != NULL )
  116.    efree(&last_expr);
  117.    if ( last_ret != NULL )
  118.   efree(&last_ret);
  119.     last_expr = estrdup(origexpr);
  120.     last_ret  = get_tcp_svcs(&last_num);
  121.  if ( len != NULL )
  122.   *len = last_num;
  123.  return last_ret;
  124. }
  125.  expr = estrdup(origexpr);
  126.  exlen = strlen(origexpr);
  127.  mem = expr;
  128. if( last_expr != NULL)
  129. {
  130.  if(strcmp(last_expr, expr) == 0)
  131.   {
  132.   if(len != NULL)*len = last_num;
  133.   efree(&mem);
  134.   return last_ret;
  135.  }
  136.  else
  137.  { 
  138.   efree(&last_expr);
  139.   efree(&last_ret);
  140.  }
  141. }
  142. ports = emalloc(65536 * sizeof(short));
  143. for(;j < exlen; j++) 
  144.   if (expr[j] != ' ') expr[i++] = expr[j]; 
  145. expr[i] = '';
  146. if((s_start = strstr(expr, "T:")) != NULL)
  147. {
  148.  expr = &(s_start[2]);
  149. }
  150. if((s_end = strstr(expr, "U:")) != NULL)
  151. {
  152.    if(s_end[-1] == ',')
  153.      s_end --;
  154.  s_end[0] = '';
  155. }
  156. exlen = i;
  157. i=0;
  158. while((p = strchr(expr,','))) {
  159.   *p = '';
  160.   if (*expr == '-') {start = 1; end = atoi(expr+ 1);}
  161.   else {
  162.     start = end = atoi(expr);
  163.     if ((q = strchr(expr,'-')) && *(q+1) ) end = atoi(q + 1);
  164.     else if (q && !*(q+1)) end = 65535;
  165.   }
  166.   if(start  < 1)start = 1;
  167.   if(start > end){
  168. efree(&mem);
  169. return NULL;
  170. }
  171.   for(j=start; j <= end; j++) 
  172.     ports[i++] = j;
  173.   expr = p + 1;
  174. }
  175. if (*expr == '-') {
  176.   start = 1;
  177.   end = atoi(expr+ 1);
  178. }
  179. else {
  180.   start = end = atoi(expr);
  181.   if ((q =  strchr(expr,'-')) && *(q+1) ) end = atoi(q+1);
  182.   else if (q && !*(q+1)) end = 65535;
  183. }
  184. if(start < 1) start = 1;
  185. if (start > end) {
  186. efree(&mem);
  187. return NULL;
  188. }
  189. for(j=start; j <= end; j++) 
  190.   ports[i++] = j;
  191. ports[i++] = 0;
  192.   
  193.   
  194.   qsort(ports, i, sizeof(u_short), qsort_compar);
  195.   tmp = realloc(ports, i * sizeof(short));
  196.   if(len != NULL)*len = i - 1;
  197.   efree(&mem);
  198.   
  199.   last_ret = tmp;
  200.   last_expr = estrdup(origexpr);
  201.   last_num =  i - 1;
  202.   return tmp;
  203. }