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

Telnet服务器

开发平台:

Unix_Linux

  1. /* Nessuslib -- the Nessus Library
  2.  * Copyright (C) 1998 - 2003 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.  * Plugutils -- plugin-specific stuff
  19.  */
  20. #define EXPORTING
  21. #include <includes.h>
  22. #include "comm.h"
  23. #include "harglists.h"
  24. #include "diff.h"
  25. #include "rand.h"
  26. #include "services.h"
  27. #include "store.h"
  28. /* want version stuff */
  29. #include "libvers.h"
  30. #include "scanners_utils.h"
  31. #undef DEBUG_DIFF_SCAN
  32. char *nessuslib_version()
  33. {
  34.   static char vers[255];
  35.   strncpy(vers, VERSION, sizeof(vers) - 1);
  36.   vers[sizeof(vers) - 1 ] = '';
  37.   return vers;
  38. }
  39. ExtFunc
  40. void nessus_lib_version(major, minor, rev)
  41.  int * major, *minor, *rev;
  42. {
  43.  *major = NL_MAJOR;
  44.  *minor = NL_MINOR;
  45.  *rev   = NL_REV;
  46. }
  47. #ifdef USE_PTHREADS
  48. ExtFunc 
  49. int nessuslib_pthreads_enabled()
  50. {
  51.  int enabled = 1;
  52.  return(enabled);
  53. }
  54. #endif
  55. /*
  56.  * Escapes n and r properly. The resulting string
  57.  * is copied in another buffer.
  58.  */
  59. ExtFunc char * 
  60. addslashes(in)
  61. char * in;
  62. {
  63.  char * ret;
  64.  char * out = malloc(strlen(in) * 2 + 1);
  65.  bzero(out, strlen(in) * 2 + 1);
  66.  ret = out;
  67.  while(in[0])
  68.  {
  69.   if(in[0] == '\')
  70.   {
  71.    out[0] = '\'; out++;
  72.    out[0] = '\'; out++;
  73.   }
  74.   else if(in[0] == 'n')
  75.   {
  76.    out[0] = '\'; out++;
  77.    out[0] = 'n'; out++;
  78.   }
  79.   else if(in[0] == 'r')
  80.   {
  81.     out[0] = '\'; out++;
  82.     out[0] = 'r';  out++;
  83.   }
  84.   else {
  85.   out[0] = in[0];
  86.   out++;
  87.   }
  88.   in++;
  89.  }
  90.  return realloc(ret, strlen(ret) + 1);
  91. }
  92. /*
  93.  * Replaces escape codes (n, r) by the real value
  94.  * The resulting string is stored in another buffer
  95.  */
  96. ExtFunc char * 
  97. rmslashes(in)
  98.  char * in;
  99. {
  100.  char * out = malloc(strlen(in) + 1);
  101.  char * ret = out;
  102.  bzero(out, strlen(in) + 1);
  103.  while(in[0])
  104.  {
  105.   if(in[0] == '\')
  106.   {
  107.    switch(in[1])
  108.    {
  109.     case 'r' :
  110.       out[0] = 'r';
  111.       in++;
  112.       break;
  113.     case 'n' :
  114.       out[0] =  'n';
  115.       in++;
  116.       break;
  117.     case '\' :
  118.       out[0] = '\';
  119.       in++;
  120.       break;
  121.     default :
  122.       fprintf(stderr, "Unknown escape sequence '\%c'n", in[1]);
  123.    }
  124.   }
  125.   else out[0] = in[0];
  126.   in++;
  127.   out++;
  128.  }
  129.  return realloc(ret, strlen(ret) + 1);
  130. }
  131. ExtFunc
  132. void plug_set_version(desc, version)
  133.  struct arglist * desc;
  134.  const char* version;
  135. {
  136.  arg_add_value(desc, "VERSION", ARG_STRING, strlen(version), estrdup((char*)version));
  137. }
  138. ExtFunc 
  139. char * _plug_get_version(desc)
  140.  struct arglist * desc;
  141. {
  142.  return arg_get_value(desc, "VERSION");
  143. }
  144. ExtFunc 
  145. char * plug_get_version(struct arglist * desc)
  146. {
  147.  return store_fetch_version(desc);
  148. }
  149. ExtFunc
  150. void plug_set_path(desc, path)
  151.  struct arglist * desc;
  152.  const char * path;
  153. {
  154.  arg_add_value(desc, "PATH", ARG_STRING, strlen(path), estrdup((char*)path));
  155. }
  156. ExtFunc 
  157. char * _plug_get_path(struct arglist * desc)
  158. {
  159.  return arg_get_value(desc, "PATH");
  160. }
  161. ExtFunc 
  162. char * plug_get_path(desc)
  163.  struct arglist * desc;
  164. {
  165.  return _plug_get_path(desc);
  166. }
  167. ExtFunc
  168. void plug_set_fname(desc, filename)
  169.  struct arglist * desc;
  170.  const char * filename;
  171. {
  172.  arg_add_value(desc, "FILENAME", ARG_STRING, strlen(filename), estrdup(filename));
  173. }
  174. ExtFunc 
  175. char * _plug_get_fname(struct arglist * desc)
  176. {
  177.  return arg_get_value(desc, "FILENAME");
  178. }
  179. ExtFunc 
  180. char * plug_get_fname(desc)
  181.  struct arglist * desc;
  182. {
  183.  return _plug_get_fname(desc);
  184. }
  185. ExtFunc
  186. void plug_set_id(desc, id)
  187.  struct arglist * desc;
  188.  int id;
  189. {
  190.  arg_add_value(desc, "ID", ARG_INT, sizeof(int), (void*)id);
  191. }
  192. ExtFunc int
  193. _plug_get_id(desc)
  194.  struct arglist * desc;
  195. {
  196.  return (int)arg_get_value(desc, "ID");
  197. }
  198. ExtFunc int
  199. plug_get_id(struct arglist * desc)
  200. {
  201.  return _plug_get_id(desc); /* Never cached */
  202. }
  203. ExtFunc
  204. void plug_set_cve_id(desc, id)
  205.  struct arglist * desc;
  206.  char * id;
  207. {
  208.  char * old = arg_get_value(desc, "CVE_ID");
  209.  if(old != NULL)
  210.  {
  211.   old = erealloc(old, strlen(old) + strlen(id) + 3);
  212.   strcat(old, ", ");
  213.   strcat(old, id);
  214.   arg_set_value(desc, "CVE_ID", strlen(old), old);
  215.  }
  216.  else
  217.   arg_add_value(desc, "CVE_ID", ARG_STRING, strlen(id), estrdup(id));
  218. }
  219. ExtFunc char *
  220. _plug_get_cve_id(desc)
  221.  struct arglist * desc;
  222. {
  223.  return arg_get_value(desc, "CVE_ID");
  224. }
  225. ExtFunc char * plug_get_cve_id(struct arglist * desc)
  226. {
  227.  return store_fetch_cve_id(desc);
  228. }
  229. ExtFunc
  230. void plug_set_bugtraq_id(desc, id)
  231.  struct arglist * desc;
  232.  char * id;
  233. {
  234.  char * old = arg_get_value(desc, "BUGTRAQ_ID");
  235.  if(old != NULL)
  236.  { 
  237.   old = erealloc(old, strlen(old) + strlen(id) + 3);
  238.   strcat(old, ", ");
  239.   strcat(old, id);
  240.   arg_set_value(desc, "BUGTRAQ_ID", strlen(old), old);
  241.  }
  242.  else
  243.   arg_add_value(desc, "BUGTRAQ_ID", ARG_STRING, strlen(id), estrdup(id));
  244. }
  245. ExtFunc char * _plug_get_bugtraq_id(desc)
  246.  struct arglist * desc;
  247. {
  248.  return arg_get_value(desc, "BUGTRAQ_ID");
  249. }
  250. ExtFunc char * plug_get_bugtraq_id(struct arglist * desc)
  251. {
  252.  return store_fetch_bugtraq_id(desc);
  253. }
  254. ExtFunc
  255. void plug_set_xref(desc,name, value)
  256.  struct arglist * desc;
  257.  char * name, * value;
  258. {
  259.  char * old = arg_get_value(desc, "XREFS");
  260.  if(old != NULL)
  261.  { 
  262.   old = erealloc(old, strlen(old) + strlen(name) + strlen(value) + 4);
  263.   strcat(old, ", ");
  264.   strcat(old, name);
  265.   strcat(old, ":");
  266.   strcat(old, value);
  267.   arg_set_value(desc, "XREFS", strlen(old), old);
  268.  }
  269.  else 
  270.   {
  271.   char * str;
  272.   
  273.   str = emalloc(strlen(name) + strlen(value) + 2);
  274.   strcat(str, name);
  275.   strcat(str, ":");
  276.   strcat(str, value);
  277.   arg_add_value(desc, "XREFS", ARG_STRING, strlen(str), str);
  278.   }
  279. }
  280. ExtFunc char * _plug_get_xref(desc)
  281.  struct arglist * desc;
  282. {
  283.  return arg_get_value(desc, "XREFS");
  284. }
  285. ExtFunc char * plug_get_xref(struct arglist * desc)
  286. {
  287.  return store_fetch_xref(desc);
  288. }
  289. ExtFunc
  290. void plug_set_family(desc, family, language)
  291.  struct arglist * desc; 
  292.  const char * family;
  293.  const char * language;
  294. {
  295.   char * s_language;
  296.   struct arglist * prefs = arg_get_value(desc, "preferences");
  297.   
  298.   s_language = arg_get_value(prefs,"language");
  299.   if(s_language && language)
  300.    {
  301.     if(!strcmp(s_language, language))
  302.     {
  303.     if(family)
  304.     arg_add_value(desc, "FAMILY", ARG_STRING,
  305.      strlen(family), estrdup(family));
  306.     }
  307.    }
  308.   else if(family)
  309.     {
  310.      if(!arg_get_value(desc, "FAMILY"))
  311.       arg_add_value(desc, "FAMILY", ARG_STRING,
  312.      strlen(family), estrdup(family));
  313.     }
  314. }
  315. ExtFunc
  316. char * _plug_get_family(desc)
  317.  struct arglist * desc;
  318. {
  319.  return arg_get_value(desc, "FAMILY");
  320. }
  321. ExtFunc
  322. char * plug_get_family(desc)
  323.  struct arglist * desc;
  324. {
  325.  return store_fetch_family(desc);
  326. }
  327. ExtFunc
  328. void plug_require_key(desc, keyname)
  329.  struct arglist * desc;
  330.  const char * keyname;
  331. {
  332.  struct arglist * keys;
  333.  if(keyname)
  334.  {
  335.   keys = arg_get_value(desc, "required_keys");
  336.   if(!keys)
  337.   {
  338.    keys = emalloc(sizeof(struct arglist));
  339.    arg_add_value(desc, "required_keys", ARG_ARGLIST, -1, keys);
  340.   }
  341.   arg_add_value(keys, keyname,  ARG_INT, 0, (void*)1);
  342.  }
  343. }
  344. ExtFunc 
  345. struct arglist * _plug_get_required_keys(desc)
  346.  struct arglist * desc;
  347. {
  348.  return arg_get_value(desc, "required_keys");
  349. }
  350. ExtFunc 
  351. struct arglist * plug_get_required_keys(desc)
  352.  struct arglist * desc;
  353. {
  354.  return _plug_get_required_keys(desc);
  355. }
  356. ExtFunc
  357. void plug_exclude_key(desc, keyname)
  358.  struct arglist * desc;
  359.  const char * keyname;
  360. {
  361.  struct arglist * keys;
  362.  if(keyname)
  363.  {
  364.   keys = arg_get_value(desc, "excluded_keys");
  365.   if(!keys)
  366.   {
  367.    keys = emalloc(sizeof(struct arglist));
  368.    arg_add_value(desc, "excluded_keys", ARG_ARGLIST, -1, keys);
  369.   }
  370.   arg_add_value(keys, keyname, ARG_INT, 0, (void*)1);
  371.  }
  372. }
  373. ExtFunc
  374. struct arglist * _plug_get_excluded_keys(desc)
  375.  struct arglist * desc;
  376. {
  377.  return arg_get_value(desc, "excluded_keys");
  378. }
  379. ExtFunc
  380. struct arglist * plug_get_excluded_keys(desc)
  381.  struct arglist * desc;
  382. {
  383.  return _plug_get_excluded_keys(desc);
  384. }
  385. ExtFunc 
  386. void plug_require_port(desc, portname)
  387.  struct arglist * desc;
  388.  const char * portname;
  389. {
  390.  struct arglist * ports;
  391.  
  392.  if(portname != NULL)
  393.  {
  394.   ports = arg_get_value(desc, "required_ports");
  395.   if(!ports)
  396.   {
  397.    ports = emalloc(sizeof(struct arglist));
  398.    arg_add_value(desc, "required_ports", ARG_ARGLIST, -1, ports);
  399.   }
  400.   
  401.   arg_add_value(ports, portname, ARG_INT, 0, (void*)1);
  402.  }
  403. }
  404. ExtFunc
  405. struct arglist * _plug_get_required_ports(desc)
  406.  struct arglist * desc;
  407. {
  408.  return arg_get_value(desc, "required_ports");
  409. }
  410. ExtFunc
  411. struct arglist * plug_get_required_ports(desc)
  412.  struct arglist * desc;
  413. {
  414.  return _plug_get_required_ports(desc);
  415. }
  416. ExtFunc 
  417. void plug_require_udp_port(desc, portname)
  418.  struct arglist * desc;
  419.  const char * portname;
  420. {
  421.  struct arglist * ports;
  422.  
  423.  if(portname != NULL)
  424.  {
  425.   ports = arg_get_value(desc, "required_udp_ports");
  426.   if(!ports)
  427.   {
  428.    ports = emalloc(sizeof(struct arglist));
  429.    arg_add_value(desc, "required_udp_ports", ARG_ARGLIST, -1, ports);
  430.   }
  431.   
  432.    arg_add_value(ports, portname, ARG_INT, 0, (void*)1);
  433.  }
  434. }
  435. ExtFunc 
  436. struct arglist * _plug_get_required_udp_ports(desc)
  437.  struct arglist * desc;
  438. {
  439.  return arg_get_value(desc, "required_udp_ports");
  440. }
  441. ExtFunc 
  442. struct arglist * plug_get_required_udp_ports(desc)
  443.  struct arglist * desc;
  444. {
  445.  return _plug_get_required_udp_ports(desc);
  446. }
  447.  
  448. ExtFunc
  449. void plug_set_dep(desc, depname)
  450.  struct arglist * desc;
  451.  const char * depname;
  452. {
  453.  struct arglist * deps;
  454.  if(depname)
  455.  {
  456.   deps = arg_get_value(desc, "DEPENDENCIES");
  457.   if(!deps){
  458.    deps = emalloc(sizeof(struct arglist));
  459.    arg_add_value(desc, "DEPENDENCIES", ARG_ARGLIST, -1, deps);
  460.    }
  461.   arg_add_value(deps, depname, ARG_STRING, 0, estrdup(""));
  462.  }
  463. }
  464. ExtFunc
  465. struct arglist * _plug_get_deps(desc)
  466.  struct arglist * desc;
  467. {
  468.  return arg_get_value(desc, "DEPENDENCIES");
  469. }
  470. ExtFunc
  471. struct arglist * plug_get_deps(desc)
  472.  struct arglist * desc;
  473. {
  474.  return _plug_get_deps(desc);
  475. #if 0
  476.  return store_fetch_dependencies(desc);
  477. #endif
  478. }
  479. ExtFunc
  480. void plug_set_timeout(desc, timeout)
  481.  struct arglist * desc; 
  482.  int timeout;
  483. {
  484.     arg_add_value(desc, "TIMEOUT", ARG_INT, sizeof(int), (void *)timeout);
  485. }
  486. ExtFunc
  487. int _plug_get_timeout(desc)
  488.  struct arglist * desc;
  489. {
  490.  return (int)arg_get_value(desc, "TIMEOUT");
  491. }
  492. ExtFunc
  493. int plug_get_timeout(desc)
  494.  struct arglist * desc;
  495. {
  496.  return _plug_get_timeout(desc);
  497. #if 0
  498.  return store_fetch_timeout(desc);
  499. #endif
  500. }
  501. ExtFunc
  502. void plug_set_launch(desc, launch)
  503.  struct arglist * desc;
  504.  int launch;
  505. {
  506.   if(arg_set_value(desc, "ENABLED", sizeof(int), (void *)launch))
  507.   {
  508.    arg_add_value(desc, "ENABLED", ARG_INT, sizeof(int), (void *)launch);
  509.   }
  510. }
  511. ExtFunc
  512. int plug_get_launch(desc)
  513.  struct arglist * desc;
  514. {
  515.   return((int)arg_get_value(desc, "ENABLED"));
  516. }
  517. ExtFunc
  518. void plug_set_name(desc, name, language)
  519.  struct arglist * desc; 
  520.  const char * name; 
  521.  const char * language;
  522. {
  523.  char * s_language;
  524.  struct arglist * prefs = arg_get_value(desc, "preferences");
  525.   
  526.   s_language = arg_get_value(prefs,"language");
  527.   if(s_language && language)
  528.    {
  529.     if(!strcmp(s_language, language))
  530.     {
  531.     if(name)
  532.     arg_add_value(desc, "NAME", ARG_STRING,
  533.      strlen(name), estrdup(name));
  534.     }
  535.    }
  536.   else if(name)
  537.   {
  538.     if(!arg_get_value(desc, "NAME"))
  539.      arg_add_value(desc, "NAME", ARG_STRING,
  540.      strlen(name), estrdup(name));
  541.   }
  542. }
  543. ExtFunc
  544. char * _plug_get_name(desc)
  545.  struct arglist * desc;
  546. {
  547.  return arg_get_value(desc, "NAME");
  548. }
  549. ExtFunc
  550. char * plug_get_name(desc)
  551.  struct arglist * desc;
  552. {
  553.  return _plug_get_name(desc);
  554.  /*return store_fetch_name(desc);*/
  555. }
  556. ExtFunc
  557. void plug_set_summary(desc, summary,language)
  558.  struct arglist * desc;
  559.  const char * summary;
  560.  const char * language;
  561. {
  562.  char * s_language;
  563.  struct arglist * prefs = arg_get_value(desc, "preferences");
  564.   
  565.   s_language = arg_get_value(prefs,"language");
  566.   if(s_language && language)
  567.    {
  568.     if(!strcmp(s_language, language))
  569.     {
  570.     if(summary)
  571.     arg_add_value(desc, "SUMMARY", ARG_STRING,
  572.      strlen(summary), estrdup(summary));
  573.     }
  574.    }
  575.   else if(summary)
  576.   {
  577.     if(!arg_get_value(desc, "SUMMARY"))
  578.      arg_add_value(desc, "SUMMARY", ARG_STRING,
  579.      strlen(summary), estrdup(summary));
  580.   }
  581. }
  582. ExtFunc
  583. char * _plug_get_summary(desc)
  584.  struct arglist * desc;
  585. {
  586.  return arg_get_value(desc, "SUMMARY");
  587. }
  588. ExtFunc
  589. char * plug_get_summary(desc)
  590.  struct arglist * desc;
  591. {
  592.  return store_fetch_summary(desc);
  593. }
  594. ExtFunc
  595. void plug_set_description(desc, description,language)
  596.  struct arglist * desc;
  597.  const char * description;
  598.  const char * language;
  599. {
  600.   char * s_language;
  601.  struct arglist * prefs = arg_get_value(desc, "preferences");
  602.   
  603.   s_language = arg_get_value(prefs,"language");
  604.   if(s_language && language)
  605.    {
  606.     if(!strcmp(s_language, language))
  607.     {
  608.     if(description)
  609.     arg_add_value(desc, "DESCRIPTION", ARG_STRING,
  610.      strlen(description), estrdup(description));
  611.     }
  612.    }
  613.   else if(description)
  614.   {
  615.     if(!arg_get_value(desc, "DESCRIPTION"))
  616.      arg_add_value(desc, "DESCRIPTION", ARG_STRING,
  617.      strlen(description), estrdup(description));
  618.   }
  619. }
  620. ExtFunc
  621. char * _plug_get_description(desc)
  622.  struct arglist * desc;
  623. {
  624.  return arg_get_value(desc, "DESCRIPTION");
  625. }
  626. ExtFunc
  627. char * plug_get_description(desc)
  628.  struct arglist * desc;
  629. {
  630.  return store_fetch_description(desc);
  631. }
  632. ExtFunc
  633. void plug_set_copyright(desc, copyright,language)
  634.  struct arglist * desc;
  635.  const char * copyright;
  636.  const char * language;
  637. {
  638.  char * s_language;
  639.  struct arglist * prefs = arg_get_value(desc, "preferences");
  640.   
  641.   s_language = arg_get_value(prefs,"language");
  642.   if(s_language && language)
  643.    {
  644.     if(!strcmp(s_language, language))
  645.     {
  646.     if(copyright)
  647.     arg_add_value(desc, "COPYRIGHT", ARG_STRING,
  648.      strlen(copyright), estrdup(copyright));
  649.     }
  650.    }
  651.   else if(copyright)
  652.   {
  653.     if(!arg_get_value(desc, "COPYRIGHT"))
  654.      arg_add_value(desc, "COPYRIGHT", ARG_STRING,
  655.      strlen(copyright), estrdup(copyright));
  656.   }
  657. }
  658. ExtFunc
  659. char * _plug_get_copyright(desc)
  660.  struct arglist * desc;
  661. {
  662.  return arg_get_value(desc, "COPYRIGHT");
  663. }
  664. ExtFunc
  665. char * plug_get_copyright(desc)
  666.  struct arglist * desc;
  667. {
  668.  return store_fetch_copyright(desc);
  669. }
  670. ExtFunc
  671. void plug_set_category(desc, category)
  672.  struct arglist * desc;
  673.  int category;
  674. {
  675.        arg_add_value(desc, "CATEGORY", ARG_INT, sizeof(int), (void *)category);
  676. }
  677. ExtFunc
  678. int _plug_get_category(desc)
  679.  struct arglist * desc;
  680. {
  681.  return (int)arg_get_value(desc, "CATEGORY"); /* We don't cache this one */
  682. }
  683. ExtFunc
  684. int plug_get_category(desc)
  685.  struct arglist * desc;
  686. {
  687.  return _plug_get_category(desc);
  688. }
  689. ExtFunc
  690. void plug_add_host(desc, hostname)
  691.  struct arglist * desc;
  692.  struct arglist * hostname;
  693. {
  694. struct arglist * h;
  695. h = arg_get_value(desc, "HOSTNAME");
  696. if(!h)arg_add_value(desc, "HOSTNAME", ARG_ARGLIST, sizeof(hostname), hostname);
  697. else arg_set_value(desc, "HOSTNAME", sizeof(hostname), hostname);
  698. }
  699. ExtFunc
  700. void host_add_port_proto(args, portnum, state, proto)
  701.  struct arglist * args;
  702.  int portnum;
  703.  int state;
  704.  char * proto;
  705. {
  706.  char port_s[255];
  707.  
  708.  snprintf(port_s, sizeof(port_s), "Ports/%s/%d", proto, portnum);
  709.  plug_set_key(args, port_s, ARG_INT, (void*)1);
  710. }
  711. ExtFunc
  712. void host_add_port(hostdata, portnum, state)
  713.  struct arglist * hostdata;
  714.  int portnum;
  715.  int state;
  716. {
  717.  host_add_port_proto(hostdata, portnum, state, "tcp");
  718. }
  719. ExtFunc
  720. void host_add_port_udp(hostdata, portnum, state)
  721.  struct arglist * hostdata;
  722.  int portnum;
  723.  int state;
  724. {
  725.  host_add_port_proto(hostdata, portnum, state, "udp");
  726. }
  727.   
  728. int port_in_ports(port, ports, s, e)
  729. u_short port, * ports;
  730. int s, e;
  731. {
  732.  int mid = (s+e)/2;
  733.  if(s==e)return(port == ports[e]);
  734.  if(port > ports[mid])return(port_in_ports(port, ports, mid+1, e));
  735.  else return(port_in_ports(port, ports, s, mid));
  736. }
  737.  
  738. static int
  739. unscanned_ports_as_closed(prefs)
  740.  struct arglist * prefs;
  741. {
  742.  char * unscanned;
  743.  unscanned = arg_get_value(prefs, "unscanned_closed");
  744.  if(unscanned && !strcmp(unscanned, "yes"))
  745.   return 0;
  746.  else
  747.   return 1;
  748. }
  749.            
  750. ExtFunc
  751. int kb_get_port_state_proto(kb, prefs, portnum, proto)
  752.  struct kb_item ** kb;
  753.  struct arglist * prefs;
  754.  int portnum;
  755.  char * proto;
  756.  char port_s[255];
  757.  unsigned short * range;
  758.  char * prange = (char*)arg_get_value(prefs, "port_range");
  759.  int num;
  760.  if(!proto)
  761.   proto = "tcp";
  762.   
  763.  /* Check that we actually scanned the port */
  764.  
  765.  if(!strcmp(proto, "tcp") && kb_item_get_int(kb, "Host/scanned") <= 0){
  766. return unscanned_ports_as_closed(prefs);
  767. }
  768.  else if(!strcmp(proto, "udp") && kb_item_get_int(kb, "Host/udp_scanned") <= 0)
  769.        {
  770.         return 1;
  771.       }
  772.       
  773.       
  774.  range = (u_short*)getpts(prange, &num);
  775.  if( range == NULL ){
  776.   return(1);
  777. }
  778.  if(!port_in_ports(portnum, range, 0, num)){
  779.        return unscanned_ports_as_closed(prefs);
  780.        }
  781.  
  782.  /* Ok, we scanned it. What is its state ? */
  783.  
  784.  snprintf(port_s, sizeof(port_s), "Ports/%s/%d", proto, portnum);
  785.  if(kb_item_get_int(kb, port_s) > 0 )
  786.     return 1;
  787.   else
  788.    return 0;
  789. }
  790. ExtFunc
  791. int host_get_port_state_proto(plugdata, portnum, proto)
  792.  struct arglist * plugdata;
  793.  int portnum;
  794.  char * proto;
  795.  struct kb_item ** kb = plug_get_kb(plugdata);
  796.  struct arglist * prefs = arg_get_value(plugdata, "preferences");
  797.  
  798.  return kb_get_port_state_proto(kb, prefs, portnum, proto);
  799. }
  800. ExtFunc
  801. int host_get_port_state(plugdata, portnum)
  802.  struct arglist * plugdata;
  803.  int portnum;
  804. {
  805.  return(host_get_port_state_proto(plugdata, portnum, "tcp"));
  806. }
  807. ExtFunc
  808. int host_get_port_state_udp(plugdata, portnum)
  809.  struct arglist * plugdata;
  810.  int portnum;
  811. {
  812.  return(host_get_port_state_proto(plugdata, portnum, "udp"));
  813. }
  814. ExtFunc
  815. const char * plug_get_hostname(desc)
  816.  struct arglist * desc;
  817. {
  818.  struct arglist * hinfos = arg_get_value(desc, "HOSTNAME");
  819.  if(hinfos)return((char*)arg_get_value(hinfos, "NAME"));
  820.  else return(NULL);
  821. }
  822. ExtFunc
  823. const char * plug_get_host_fqdn(desc)
  824.  struct arglist * desc;
  825. {
  826.  struct arglist * hinfos = arg_get_value(desc, "HOSTNAME");
  827.  if(hinfos)return((char*)arg_get_value(hinfos, "FQDN"));
  828.  else return(NULL);
  829. }
  830. ExtFunc
  831. struct in_addr * plug_get_host_ip(desc)
  832.  struct arglist * desc;
  833. {
  834.  struct arglist * hinfos = arg_get_value(desc, "HOSTNAME");
  835.  if(hinfos)return((struct in_addr*)arg_get_value(hinfos, "IP"));
  836.  else return(NULL);
  837. }
  838. static void 
  839. mark_successful_plugin(desc)
  840.  struct arglist * desc;
  841. {
  842.  int id = plug_get_id(desc);
  843.  char data[512];
  844.  
  845.  bzero(data, sizeof(data));
  846.  snprintf(data, sizeof(data), "Success/%d", id);
  847.  plug_set_key(desc, data, ARG_INT,(void*)1);
  848. }
  849. static void
  850. mark_post(desc, action, content)
  851.  struct arglist * desc;
  852.  char * action;
  853.  char * content;
  854. {
  855.  char entry_name[255];
  856.  
  857.  if(strlen(action) > (sizeof(entry_name) - 20))
  858.   return;
  859.   
  860.  snprintf(entry_name, sizeof(entry_name), "SentData/%d/%s", plug_get_id(desc), action);
  861.  plug_set_key(desc, entry_name, ARG_STRING, content);
  862. }
  863.  
  864.  
  865. /* Pluto 24.6.00: reduced to one, and left the orig in place */
  866. void 
  867. proto_post_wrapped(desc, port, proto, action, what)
  868.  struct arglist * desc;
  869.  int port;
  870.  const char * proto;
  871.  const char * action;
  872.  const char * what;
  873. {
  874.  char *t;
  875.  char * buffer;
  876.  int soc;
  877.  char * naction;
  878.  int len;
  879.  ntp_caps* caps = arg_get_value(desc, "NTP_CAPS");
  880.  char * cve;
  881.  char * bid;
  882.  char * xref;
  883.  int do_send = 1;
  884.  int i;
  885.  char ack;
  886.  int n = 0, e, l;
  887.   
  888.     
  889.  if( action == NULL )action = plug_get_description(desc);
  890.  
  891.  
  892.  cve = plug_get_cve_id(desc);
  893.  bid = plug_get_bugtraq_id(desc);
  894.  xref = plug_get_xref(desc);
  895.  
  896.  if( action == NULL )
  897.   return;
  898.  len = strlen(action) + 1;
  899.  if(cve != NULL)
  900.   len += strlen(cve) + 20;
  901.  if(bid != NULL)
  902.    len += strlen(bid) + 20;
  903.  if(xref != NULL )
  904.   len += strlen(xref) + 20;
  905.  if( caps == NULL )
  906.   return;
  907.  
  908.  naction = emalloc(len+1);
  909.  strncpy(naction, action, strlen(action));
  910.  strcat(naction, "n");
  911.  if( cve != NULL && cve[0] != '')
  912.         {
  913.  strcat(naction, "CVE : ");
  914.  strcat(naction, cve);
  915.  strcat(naction, "n");
  916.  }
  917.  
  918.  if( bid != NULL && bid[0] != '' )
  919.   {
  920.  strcat(naction, "BID : ");
  921.  strcat(naction, bid);
  922.  strcat(naction, "n");
  923.  }
  924.  if( xref != NULL && xref[0] != '' )
  925.   {
  926. strcat(naction, "Other references : ");
  927. strcat(naction, xref);
  928. strcat(naction, "n");
  929. }
  930.  
  931.  if( caps->escape_crlf == 0 )
  932.    while((t=strchr(naction, 'n'))||(t=strchr(naction, 'r')))t[0]=';';
  933.  else
  934.   {
  935.    char * old = naction;
  936.    len -= strlen(naction);
  937.    naction = addslashes(naction);
  938.    len += strlen(naction);
  939.    efree(&old);
  940.   }
  941.   
  942.  for(i=0;naction[i];i++)
  943.  {
  944.    if(!isprint(naction[i]))
  945.       naction[i] = ' ';
  946.  }
  947.  buffer = emalloc( 1024 + len );
  948.  if(caps->ntp_11) {
  949.    char idbuffer[32];
  950.    const char *svc_name = nessus_get_svc_name(port, proto);
  951.    if (caps->scan_ids) { 
  952.      if (plug_get_id(desc) == 0) {
  953.        *idbuffer = '';
  954.      } else {
  955.        int id = plug_get_id(desc);
  956.        snprintf(idbuffer, sizeof(idbuffer), "<|> %d ", id);
  957.      }
  958.    } else {
  959.      *idbuffer = '';
  960.  }
  961.   if(port>0){
  962.      snprintf(buffer, 1024 + len, 
  963.      "SERVER <|> %s <|> %s <|> %s (%d/%s) <|> %s %s<|> SERVERn",
  964.      what,
  965.         plug_get_hostname(desc),
  966.      svc_name,
  967.      port, proto, naction, idbuffer);
  968.     
  969.    } else
  970.      snprintf(buffer, 1024 + len, 
  971.      "SERVER <|> %s <|> %s <|> general/%s <|> %s %s<|> SERVERn",
  972.      what,
  973.         plug_get_hostname(desc), 
  974.      proto, naction, idbuffer);
  975.  } else {
  976.    snprintf(buffer, 1024 + len, "SERVER <|> %s <|> %s <|> %d:%s <|> SERVERn", 
  977.    what,
  978.    plug_get_hostname(desc), port, naction);
  979.  }
  980.  
  981.  
  982. mark_post(desc, what, action); 
  983. soc = (int)arg_get_value(desc, "SOCKET");
  984. internal_send(soc, buffer, INTERNAL_COMM_MSG_TYPE_DATA);
  985.  
  986.  /*
  987.   * Mark in the KB that the plugin was sucessful
  988.   */
  989.  mark_successful_plugin(desc);
  990.  efree(&buffer);
  991.  efree(&naction);
  992.  return;
  993. }
  994. /* Pluto end */
  995. ExtFunc
  996. void proto_post_hole(desc, port, proto, action)
  997.  struct arglist * desc;
  998.  int port;
  999.  const char * proto;
  1000.  const char * action;
  1001. {
  1002.   proto_post_wrapped(desc, port, proto, action, "HOLE");
  1003.   return;
  1004. }
  1005. ExtFunc
  1006. void post_hole(desc, port, action)
  1007.  struct arglist * desc;
  1008.  int port;
  1009.  const char * action;
  1010. {
  1011.   proto_post_hole(desc, port, "tcp", action);
  1012. ExtFunc
  1013. void post_hole_udp(desc, port, action)
  1014.  struct arglist * desc;
  1015.  int port;
  1016.  const char * action;
  1017. {
  1018.  proto_post_hole(desc, port, "udp", action);
  1019. }
  1020. ExtFunc
  1021. void post_info(desc, port, action)
  1022.  struct arglist * desc;
  1023.  int port;
  1024.  const char * action;
  1025. {
  1026.   proto_post_info(desc, port, "tcp", action);
  1027. ExtFunc
  1028. void post_info_udp(desc, port, action)
  1029.  struct arglist * desc;
  1030.  int port;
  1031.  const char * action;
  1032. {
  1033.  proto_post_info(desc, port, "udp", action);
  1034. }
  1035. ExtFunc
  1036. void proto_post_info(desc, port, proto, action)
  1037.  struct arglist * desc;
  1038.  int port;
  1039.  const char * proto;
  1040.  const char * action;
  1041. {
  1042.   proto_post_wrapped(desc, port, proto, action, "INFO");
  1043.   return;
  1044. }
  1045.  
  1046. ExtFunc
  1047. void post_note(desc, port, action)
  1048.  struct arglist * desc;
  1049.  int port;
  1050.  const char * action;
  1051. {
  1052. #if 0
  1053.   fprintf(stderr, "Post_note: port = %d action = %sn", port, action);
  1054. #endif
  1055.   proto_post_note(desc, port, "tcp", action);
  1056.      
  1057. ExtFunc
  1058. void post_note_udp(desc, port, action)
  1059.  struct arglist * desc;
  1060.  int port;
  1061.  const char * action;
  1062. {
  1063.  proto_post_note(desc, port, "udp", action);
  1064. }
  1065.    
  1066. ExtFunc
  1067. void proto_post_note(desc, port, proto, action)
  1068.  struct arglist * desc;
  1069.  int port;
  1070.  const char * proto;
  1071.  const char * action;
  1072. {
  1073.   /*
  1074.    * Backward compatibility. We only use the notes if the remote
  1075.    * client accepts them
  1076.    */
  1077.   char * allow_notes = get_preference(desc, "ntp_client_accepts_notes");
  1078.   if(allow_notes && !strcmp(allow_notes, "yes")) 
  1079.    proto_post_wrapped(desc, port, proto, action, "NOTE");
  1080.   else
  1081.    proto_post_wrapped(desc, port, proto, action, "INFO");
  1082.  return;
  1083.  
  1084.  
  1085. ExtFunc
  1086. char * get_preference(desc, name)
  1087.  struct arglist *desc;
  1088.  const char * name;
  1089. {
  1090.  struct arglist * prefs;
  1091.  prefs = arg_get_value(desc, "preferences");
  1092.  if(!prefs)return(NULL);
  1093.  return((char *)arg_get_value(prefs, name));
  1094. }
  1095. ExtFunc
  1096. void _add_plugin_preference(prefs, p_name, name, type, defaul)
  1097.  struct arglist *prefs;
  1098.  const char * p_name;
  1099.  const char * name;
  1100.  const char * type;
  1101.  const char * defaul;
  1102. {
  1103.  char * pref;
  1104.  char * cname;
  1105.  int len;
  1106.  
  1107.  
  1108.  
  1109.  cname = estrdup(name);
  1110.  len = strlen(cname);
  1111.  while(cname[len-1]==' ')
  1112.  {
  1113.   cname[len-1]='';
  1114.   len --;
  1115.  }
  1116.  if(!prefs || !p_name)
  1117.    {
  1118.      efree(&cname);
  1119.      return;
  1120.    }
  1121.  pref = emalloc(strlen(p_name)+10+strlen(type)+strlen(cname));
  1122.  sprintf(pref, "%s[%s]:%s", p_name, type, cname);
  1123.  if ( arg_get_value(prefs, pref) == NULL )
  1124.   arg_add_value(prefs, pref, ARG_STRING, strlen(defaul), estrdup(defaul));
  1125.  efree(&cname);
  1126.  efree(&pref);
  1127. }
  1128. void add_plugin_preference(desc, name, type, defaul)
  1129.  struct arglist *desc;
  1130.  const char * name;
  1131.  const char * type;
  1132.  const char * defaul;
  1133. {
  1134.  struct arglist * prefs = arg_get_value(desc, "PLUGIN_PREFS");
  1135.  char pref[1024];
  1136.  
  1137.  
  1138.  if(prefs == NULL)
  1139.   {
  1140.    prefs = emalloc(sizeof(struct arglist));
  1141.    arg_add_value(desc, "PLUGIN_PREFS", ARG_ARGLIST, -1, prefs);
  1142.   }
  1143.  
  1144.  snprintf(pref, sizeof(pref), "%s/%s", type, name);
  1145.  arg_add_value(prefs, pref, ARG_STRING, strlen(defaul), estrdup(defaul));
  1146. }
  1147. ExtFunc char * 
  1148. get_plugin_preference(desc, name)
  1149.   struct arglist * desc;
  1150.   const char * name;
  1151. {
  1152.  struct arglist * prefs = arg_get_value(desc, "preferences");
  1153.  char * plug_name = plug_get_name(desc);
  1154.  char * cname = estrdup(name);
  1155.  int len;
  1156.  
  1157.  len = strlen(cname);
  1158.  
  1159.  while(cname[len-1]==' ')
  1160.  {
  1161.   cname[len-1]='';
  1162.   len --;
  1163.  }
  1164.  
  1165.  
  1166.  if(!prefs)
  1167.    {
  1168.      efree(&cname);
  1169.      return NULL;
  1170.    }
  1171.   
  1172.  while(prefs->next)
  1173.  {
  1174.   char * a= NULL, *b = NULL;
  1175.   int c = 0;
  1176.   char * t = prefs->name;
  1177.   
  1178.   a = strchr(t, '[');
  1179.   if(a)b=strchr(t, ']');
  1180.   if(b)c=(b[1]==':');
  1181.   
  1182.   if(c)
  1183.   {
  1184.    b+=2*sizeof(char);
  1185.    if(!strcmp(cname, b)){
  1186.     int old = a[0];
  1187.     a[0] = 0;
  1188. if(!strcmp(t, plug_name)){
  1189. a[0] = old;
  1190. efree(&cname);
  1191. return(prefs->value);
  1192. }
  1193. a[0] = old;
  1194. }
  1195.   }
  1196.   prefs = prefs->next;
  1197.  }
  1198.  efree(&cname);
  1199.  return(NULL);
  1200. }
  1201. ExtFunc const char * 
  1202. get_plugin_preference_fname(desc, filename)
  1203.  struct arglist * desc;
  1204.  const char * filename;
  1205. {
  1206.  struct arglist * globals = arg_get_value(desc, "globals");
  1207.  harglst * trans;
  1208.  if(!globals) 
  1209.   return NULL;
  1210.   
  1211.  trans = arg_get_value(globals, "files_translation");
  1212.  if(!trans)
  1213.   return NULL;
  1214.  
  1215.  return harg_get_string(trans, filename);
  1216. }
  1217. void * plug_get_fresh_key(args, name, type)
  1218.  struct arglist * args;
  1219.  char * name;
  1220.  int * type;
  1221. {
  1222.  struct arglist * globals = arg_get_value(args, "globals");
  1223.  int soc = (int)arg_get_value(globals, "global_socket");
  1224.  int e;
  1225.  char * buf = NULL;
  1226.  int bufsz = 0;
  1227.  int msg;
  1228.  
  1229.  if ( name == NULL || type == NULL ) return NULL;
  1230.  *type = -1;
  1231.  e = internal_send(soc, name, INTERNAL_COMM_MSG_TYPE_KB|INTERNAL_COMM_KB_GET);
  1232.  if(e < 0){
  1233.         fprintf(stderr, "[%d] plug_get_fresh_key:internal_send(%d): %sn",getpid(), soc,name, strerror(errno));
  1234. goto err;
  1235. }
  1236.  internal_recv(soc, &buf, &bufsz, &msg); 
  1237.  if ( ( msg & INTERNAL_COMM_MSG_TYPE_KB ) == 0  )
  1238.  {
  1239.         fprintf(stderr, "[%d] plug_get_fresh_key:internal_send(%d): Unexpected message %d",getpid(), soc, msg);
  1240. goto err;
  1241.  }
  1242.  if ( msg & INTERNAL_COMM_KB_ERROR ) return NULL;
  1243.  if ( msg & INTERNAL_COMM_KB_SENDING_STR )
  1244.  {
  1245.   char * ret = estrdup(buf);
  1246.   *type = ARG_STRING;
  1247.   efree(&buf);
  1248.   return ret;
  1249.  } 
  1250.  else if ( msg & INTERNAL_COMM_KB_SENDING_INT )
  1251.  {
  1252.   int ret;
  1253.   *type = ARG_INT;
  1254.   ret = atoi(buf);
  1255.   efree(&buf);
  1256.   return (void*)ret;
  1257.  }
  1258. err:
  1259.  if ( buf != NULL )efree(&buf);
  1260.  return NULL; 
  1261. static void plug_set_replace_key(args, name, type, value, replace)
  1262.  struct arglist * args;
  1263.  char * name;
  1264.  int type;
  1265.  void * value;
  1266.  int replace;
  1267. {
  1268.  struct kb_item ** kb = plug_get_kb(args);
  1269.  struct arglist * globals = arg_get_value(args, "globals");
  1270.  int soc = (int)arg_get_value(globals, "global_socket");
  1271.  char * str = NULL;
  1272.  int msg;
  1273.  
  1274.  
  1275. #ifdef DEBUG
  1276.  printf("set key %s -> %dn", name, value);
  1277. #endif 
  1278.  
  1279.  if( name == NULL || value == NULL )return;
  1280.  
  1281.  switch(type)
  1282.  {
  1283.   case ARG_STRING :
  1284.    kb_item_add_str(kb, name, value);
  1285.    value = addslashes(value);
  1286.    str = emalloc(strlen(name)+strlen(value)+10);
  1287.    sprintf(str, "%d %s=%s;n", ARG_STRING, name, (char *)value);
  1288.    efree(&value);
  1289.    break;
  1290.   case ARG_INT :
  1291.    kb_item_add_int(kb, name, (int)value);
  1292.    str = emalloc(strlen(name)+20);
  1293.    sprintf(str, "%d %s=%d;n", ARG_INT, name, (int)value);
  1294.    break;
  1295.  }
  1296.  if(str)
  1297.  {
  1298.    int e;
  1299.    if ( replace != 0 )
  1300.     msg = INTERNAL_COMM_MSG_TYPE_KB|INTERNAL_COMM_KB_REPLACE;
  1301.    else
  1302.     msg = INTERNAL_COMM_MSG_TYPE_KB;
  1303.    e = internal_send(soc, str, msg);
  1304.     if(e < 0){
  1305.         fprintf(stderr, "[%d] plug_set_key:internal_send(%d)['%s']: %sn",getpid(), soc,str, strerror(errno));
  1306. }
  1307.    efree(&str);
  1308.   }
  1309. ExtFunc void plug_set_key(args, name, type, value)
  1310.  struct arglist * args;
  1311.  char * name;
  1312.  int type;
  1313.  void * value;
  1314. {
  1315.  plug_set_replace_key(args, name, type, value, 0);
  1316. }
  1317. ExtFunc void plug_replace_key(args, name, type, value)
  1318.  struct arglist * args;
  1319.  char * name;
  1320.  int type;
  1321.  void * value;
  1322. {
  1323.  plug_set_replace_key(args, name, type, value, 1);
  1324. }
  1325. ExtFunc void
  1326. scanner_add_port(args, port, proto)
  1327.  struct arglist * args;
  1328.  int port;
  1329.  char * proto;
  1330. {
  1331.  ntp_caps* caps = arg_get_value(args, "NTP_CAPS");
  1332.  char * buf;
  1333.  const char *svc_name = nessus_get_svc_name(port, proto);
  1334.  const char * hn = plug_get_hostname(args);
  1335.  int len;
  1336.  int soc;
  1337.  struct arglist * globs;
  1338.  int do_send = 1;
  1339.  static int confirm = -1;
  1340.  
  1341.  if(confirm < 0)
  1342.  {
  1343.   struct arglist * globals = arg_get_value(args, "globals");
  1344.   if(globals)confirm = (int)arg_get_value(globals, "confirm");
  1345.  }
  1346.  /*
  1347.   * Diff scan stuff : if the port was known to be open,
  1348.   * there is no need to report it again.
  1349.   */
  1350.  if(arg_get_value(args, "DIFF_SCAN"))
  1351.  {
  1352.    char port_s[255];
  1353.    snprintf(port_s, sizeof(port_s), "Ports/%s/%d", proto, port);
  1354.    if(kb_item_get_int(plug_get_kb(args), port_s) > 0) do_send = 0;
  1355.  }
  1356.  host_add_port_proto(args, port, 1, proto);
  1357.  
  1358.  len = 255 + (hn ? strlen(hn):0) + strlen(svc_name);
  1359.  buf = emalloc(len);
  1360.  if(caps != NULL && caps->ntp_11)
  1361.   snprintf(buf, len, "SERVER <|> PORT <|> %s <|> %s (%d/%s) <|> SERVERn",
  1362.   hn,svc_name, port, proto);
  1363.  else
  1364.   {
  1365.    if(!strcmp(proto, "tcp"))
  1366.      snprintf(buf, len, "SERVER <|> PORT <|> %s <|> %d <|> SERVERn",
  1367.    hn, port);
  1368.   }
  1369.    
  1370.  if(do_send)
  1371.  {
  1372.   soc = (int)arg_get_value(args, "SOCKET");
  1373.   internal_send(soc, buf, INTERNAL_COMM_MSG_TYPE_DATA);
  1374.  }
  1375.  efree(&buf);
  1376. }
  1377. struct kb_item ** plug_get_kb(struct arglist * args)
  1378. {
  1379.  return (struct kb_item**)arg_get_value(args, "key");
  1380. /*
  1381.  * plug_get_key() may fork(). We use this signal handler to kill
  1382.  * its son in case the process which calls this function is killed
  1383.  * itself
  1384.  */
  1385. #ifndef NESSUSNT
  1386. static int _plug_get_key_son = 0;
  1387. static void 
  1388. plug_get_key_sighand_term(int sig)
  1389. {
  1390.  int son = _plug_get_key_son;
  1391.  
  1392.  if(son != 0)
  1393.  {
  1394.   kill(son, SIGTERM);
  1395.   _plug_get_key_son = 0;
  1396.  }
  1397.  _exit(0);
  1398. }
  1399. static void
  1400. plug_get_key_sigchld(int sig)
  1401. {
  1402.  int status;
  1403.  wait(&status);
  1404. }
  1405. static void
  1406. sig_n(int signo, void (*fnc)(int) )
  1407. {
  1408.  #ifdef HAVE_SIGACTION
  1409.   struct sigaction sa;
  1410.   sa.sa_handler = fnc;
  1411.   sa.sa_flags = 0;
  1412.   sigemptyset(&sa.sa_mask);
  1413.   sigaction(signo, &sa, (struct sigaction *) 0);
  1414. #else
  1415.   signal(signo, fnc);
  1416. #endif
  1417. }
  1418. static void
  1419. sig_term( void (*fcn)(int) )
  1420. {
  1421.  sig_n(SIGTERM, fcn);
  1422. }
  1423. static void
  1424. sig_alarm( void (*fcn)(int) )
  1425. {
  1426.  sig_n(SIGALRM, fcn);
  1427. }
  1428. static void 
  1429. sig_chld( void(*fcn)(int) )
  1430. {
  1431.  sig_n(SIGCHLD, fcn);
  1432. }
  1433. #endif
  1434. void * 
  1435. plug_get_key(args, name, type)
  1436.  struct arglist * args;
  1437.  char * name;
  1438.  int * type;
  1439. {
  1440.  struct kb_item ** kb = plug_get_kb(args);
  1441.  struct kb_item * res = NULL;
  1442.  int sockpair[2];
  1443.  int upstream = 0;
  1444.  char * buf = NULL;
  1445.  int bufsz = 0;
  1446.  
  1447.  
  1448.  if ( type != NULL )
  1449. *type = -1;
  1450.  
  1451.  
  1452.  if( kb == NULL )
  1453.     return NULL;
  1454.  res = kb_item_get_all(kb, name);
  1455.  
  1456.  if ( res == NULL ) 
  1457.     return NULL;
  1458.  if ( res->next == NULL ) /* No fork - good */
  1459.  {
  1460.   void * ret;
  1461.   if(res->type == KB_TYPE_INT)
  1462.     {
  1463.     if( type != NULL ) *type = ARG_INT;
  1464.     ret   = (void*)res->v.v_int;
  1465.     }
  1466.   else
  1467.     {
  1468.     if(type != NULL)*type = ARG_STRING;
  1469.     ret   = (void*)res->v.v_str;
  1470.     } 
  1471.   kb_item_get_all_free(res);
  1472.   return ret;
  1473.  }
  1474.  
  1475.  
  1476.  /* More than  one value - we will fork() then */
  1477.  sig_chld(plug_get_key_sigchld);
  1478.  while( res != NULL )
  1479.  {
  1480.   pid_t pid;
  1481.   socketpair(AF_UNIX, SOCK_STREAM, 0, sockpair);
  1482.   if ( (pid = fork()) == 0 )
  1483.   {
  1484.    int tictac = 0;
  1485.    int old, soc;
  1486.    struct arglist * globals, * preferences = NULL;
  1487.   
  1488.    close(sockpair[0]);  
  1489.    globals = arg_get_value(args, "globals");  
  1490.    old = (int)arg_get_value(globals, "global_socket");
  1491.    close(old);
  1492.    soc = dup2(sockpair[1], 4);
  1493.    close(sockpair[1]);
  1494.    arg_set_value(globals, "global_socket", sizeof(int), (void*)soc);
  1495.    arg_set_value(args, "SOCKET", sizeof(int), (void*)soc);
  1496.    if ( globals != NULL ) preferences = arg_get_value(globals, "preferences");
  1497.    if ( preferences != NULL )
  1498.    { 
  1499.     char * to = arg_get_value(preferences, "plugins_timeout");
  1500.     if ( to != NULL )  tictac = atoi(to);
  1501.    }
  1502.    srand48(getpid() + getppid() + time(NULL));
  1503.  
  1504.    sig_term(_exit);
  1505.    sig_alarm(_exit);
  1506.    alarm(120);
  1507.    if ( res->type == KB_TYPE_INT )
  1508.    {
  1509.     int old_value = res->v.v_int;
  1510.      kb_item_rm_all(kb, name); 
  1511.      kb_item_add_int(kb, name, old_value);
  1512.     if ( type != NULL )*type = ARG_INT;
  1513.     return (void*)old_value;
  1514.    }
  1515.    else
  1516.    {
  1517.     char * old_value = estrdup(res->v.v_str);
  1518.     kb_item_rm_all(kb, name); 
  1519.     kb_item_add_str(kb, name, old_value);
  1520.     if ( type != NULL ) *type = ARG_STRING;
  1521.     efree(&old_value);
  1522.     return kb_item_get_str(kb, name);
  1523.    }
  1524.   }
  1525.   else if(pid < 0)
  1526.       {
  1527.        fprintf(stderr, "nessus-libraries:libnessus:plugutils.c:plug_get_key(): fork() failed : %s", strerror(errno));       
  1528.        return NULL;
  1529.       }
  1530.   else
  1531.       {
  1532.       int e;
  1533.       int status;
  1534.       struct arglist * globals, * preferences = NULL;
  1535.   
  1536.       globals = arg_get_value(args, "globals");  
  1537.       upstream = (int)arg_get_value(globals, "global_socket");
  1538.       close(sockpair[1]);
  1539.       _plug_get_key_son = pid;
  1540.       sig_term(plug_get_key_sighand_term);
  1541.       for(;;)
  1542.       {
  1543.       fd_set rd;
  1544.       struct timeval tv;
  1545.       int type;
  1546.       do {
  1547.       tv.tv_sec = 0;
  1548.       tv.tv_usec = 100000;
  1549.       FD_ZERO(&rd);
  1550.       FD_SET(sockpair[0], &rd);
  1551.       e = select ( sockpair[0] + 1, &rd, NULL, NULL, &tv);
  1552.       } while ( e < 0 && errno == EINTR );
  1553.       
  1554.       if ( e > 0 )
  1555.       {
  1556.        e = internal_recv(sockpair[0], &buf, &bufsz, &type);
  1557.        if (e < 0 || ( type & INTERNAL_COMM_MSG_TYPE_CTRL ) )
  1558. {
  1559.          e = waitpid(pid,&status,WNOHANG);
  1560.          _plug_get_key_son = 0;
  1561.          close(sockpair[0]);
  1562.          sig_term(_exit);
  1563.  break;
  1564. }
  1565.        else internal_send(upstream, buf, type);
  1566.       }
  1567.      }
  1568.      }
  1569.    res = res->next;
  1570.    }
  1571.    internal_send(upstream, NULL, INTERNAL_COMM_MSG_TYPE_CTRL | INTERNAL_COMM_CTRL_FINISHED);
  1572.    exit(0);
  1573. }
  1574. /*
  1575.  * Don't always return the first open port, otherwise
  1576.  * we might get bitten by OSes doing active SYN flood
  1577.  * countermeasures. Also, avoid returning 80 and 21 as
  1578.  * open ports, as many transparent proxies are acting for these...
  1579.  */
  1580. ExtFunc unsigned int
  1581. plug_get_host_open_port(struct arglist * desc)
  1582. {
  1583.  struct kb_item ** kb = plug_get_kb(desc);
  1584.  char * t;
  1585.  int port = 0;
  1586.  struct kb_item * res, *k;
  1587.  int open21 = 0, open80 = 0;
  1588. #define MAX_CANDIDATES 16
  1589.  u_short candidates[MAX_CANDIDATES];
  1590.  int num_candidates = 0;
  1591.  
  1592.  k = res = kb_item_get_pattern(kb, "Ports/tcp/*");
  1593.  if ( res == NULL ) 
  1594.     return 0;
  1595.  else 
  1596.     {
  1597.      int ret;
  1598.      char * s;
  1599.  
  1600.      for(;;)
  1601.      {
  1602.       s = res->name + sizeof("Ports/tcp/") - 1;
  1603.       ret = atoi(s);
  1604.       if ( ret == 21 ) open21 = 1;
  1605.       else if ( ret == 80 ) open80 = 1;
  1606.       else  {
  1607.                 candidates[num_candidates++] = ret;
  1608.                 if ( num_candidates >= MAX_CANDIDATES ) break;
  1609.     }
  1610.       res = res->next;
  1611.       if ( res == NULL ) break;
  1612.      }
  1613.      kb_item_get_all_free(k);
  1614.      if ( num_candidates != 0 )
  1615.        return candidates[lrand48() % num_candidates];
  1616.      else  
  1617.           if (open21) return 21;
  1618.      else  
  1619.           if (open80) return 80;
  1620.      else  
  1621.           return 0;
  1622.     }
  1623.  /* Not reachable */
  1624.  return 0;
  1625. }
  1626.        
  1627.  
  1628. /*
  1629.  * Those brain damaged functions should probably be in another file
  1630.  * They are use to remember who speaks SSL or not
  1631.  */
  1632.    
  1633. ExtFunc
  1634. void plug_set_port_transport(args, port, tr)
  1635.      struct arglist * args;
  1636.      int port, tr;
  1637. {
  1638.   char s[256];
  1639.   snprintf(s, sizeof(s), "Transports/TCP/%d", port);
  1640.   plug_set_key(args, s, ARG_INT, (void*)tr);
  1641. }
  1642. ExtFunc
  1643. int plug_get_port_transport(args, port)
  1644.      struct arglist * args;
  1645.      int port;
  1646. {
  1647.   char s[256];
  1648.   int trp;
  1649.   
  1650.   snprintf(s, sizeof(s), "Transports/TCP/%d", port);
  1651.   trp = kb_item_get_int(plug_get_kb(args), s);
  1652.   if (trp >= 0)
  1653.     return trp;
  1654.   else 
  1655.     return NESSUS_ENCAPS_IP; /* Change this to 0 for ultra smart SSL negotiation, at the expense
  1656.                                 of possibly breaking stuff */
  1657. }
  1658. ExtFunc
  1659. const char* plug_get_port_transport_name(args, port)
  1660.      struct arglist * args;
  1661.      int port;
  1662. {
  1663.   return get_encaps_name(plug_get_port_transport(args, port));
  1664. }
  1665. #ifdef HAVE_SSL
  1666. static void
  1667. plug_set_ssl_item(args, item, itemfname)
  1668.  struct arglist * args;
  1669.  char * item;
  1670.  char * itemfname;
  1671. {
  1672.  char s[256];
  1673.  snprintf(s, sizeof(s), "SSL/%s", item);
  1674.  plug_set_key(args, s, ARG_STRING, itemfname);
  1675. }
  1676. ExtFunc void
  1677. plug_set_ssl_cert(args, cert)
  1678.  struct arglist * args;
  1679.  char * cert;
  1680. {
  1681.  plug_set_ssl_item(args, "cert", cert);
  1682. }
  1683. ExtFunc void 
  1684. plug_set_ssl_key(args, key)
  1685.  struct arglist * args;
  1686.  char * key;
  1687. {
  1688.  plug_set_ssl_item(args, "key", key);
  1689. }
  1690. ExtFunc void
  1691. plug_set_ssl_pem_password(args, key)
  1692.  struct arglist * args;
  1693.  char * key;
  1694. {
  1695.  plug_set_ssl_item(args, "password", key);
  1696. }
  1697. ExtFunc void
  1698. plug_set_ssl_CA_file(args, key)
  1699.  struct arglist * args;
  1700.  char * key;
  1701. {
  1702.  plug_set_ssl_item(args, "CA", key);
  1703. }
  1704. #else
  1705. ExtFunc  void
  1706. plug_set_ssl_cert(args, cert)
  1707.  struct arglist * args;
  1708.  char * cert;
  1709. {
  1710.  fprintf(stderr, "plug_set_ssl_cert(): not implementedn");
  1711. }
  1712. ExtFunc void
  1713. plug_set_ssl_key(args, key)
  1714.  struct arglist * args;
  1715.  char * key;
  1716. {
  1717.  fprintf(stderr, "plug_set_ssl_key(): not implementedn");
  1718. }
  1719. #endif /* HAVE_SSL */
  1720. ExtFunc char *
  1721. find_in_path(name, safe)
  1722.      char *name;
  1723.      int safe;
  1724. {
  1725.   char *buf = getenv("PATH"), *pbuf, *p1, *p2;
  1726.   static char cmd[MAXPATHLEN];
  1727.   int len = strlen(name);
  1728.   
  1729.   if (len >= MAXPATHLEN)
  1730.     return NULL;
  1731. #if 0
  1732.   /* Proposed by Devin Kowatch 
  1733.      If it's already an absolute path take it as is */
  1734.   if (name[0] == '/' && access(name, X_OK) == 0)
  1735.     return name; /* Invalid: we should remove everything after the last / */
  1736. #endif
  1737.   if (buf == NULL) /* Should we use a standard PATH here? */
  1738.     return NULL;
  1739.   pbuf = buf;
  1740.   while (*pbuf != '')
  1741.     {
  1742.       for (p1 = pbuf, p2 = cmd; *p1 != ':' && *p1 != ''; )
  1743. *p2 ++ = *p1 ++;
  1744.       *p2 = '';
  1745.       if (*p1 == ':')
  1746. p1 ++;
  1747.       pbuf = p1;
  1748.       if (p2 == cmd) /* :: found in $PATH */
  1749. strcpy(cmd, ".");
  1750.       if (cmd[0] != '/' && safe)
  1751. continue;
  1752.       if (p2 - cmd + 1 + len >= MAXPATHLEN)
  1753. /* path too long: cannot be reached */
  1754. continue;
  1755.       sprintf(p2, "/%s", name);
  1756.       if (access(cmd, X_OK) == 0)
  1757. {
  1758.   struct stat st;
  1759.   if (stat(cmd, &st) < 0)
  1760.     perror(cmd);
  1761.   else if (S_ISREG(st.st_mode))
  1762.     {
  1763.       *p2 = '';
  1764. #if 0
  1765.       fprintf(stderr, "find_in_path: %s found in %sn", name, cmd);
  1766. #endif
  1767.       return cmd;
  1768.     }
  1769. }
  1770. #if 0
  1771.   fprintf(stderr, "find_in_path: No %sn", cmd);
  1772. #endif
  1773.     }
  1774.   return NULL;
  1775. }
  1776. ExtFunc int 
  1777. is_shell_command_present(name)
  1778.  char * name;
  1779. {
  1780.   return find_in_path(name, 0) != NULL;
  1781. }
  1782. ExtFunc int shared_socket_register ( struct arglist * args, int fd, char * name )
  1783. {
  1784.  int soc; 
  1785.  int type;
  1786.  unsigned int opt_len = sizeof(type);
  1787.  int e;  
  1788.  soc = (int)arg_get_value(args, "SOCKET");
  1789.  if ( fd_is_stream(fd) )
  1790.   fd = nessus_get_socket_from_connection(fd);
  1791.  e = getsockopt(fd, SOL_SOCKET, SO_TYPE, &type, &opt_len);
  1792.  if ( e < 0 )
  1793.  {
  1794.   fprintf(stderr, "shared_socket_register(): Not a socket! - %sn", strerror(errno));
  1795.   return -1;
  1796.  }
  1797.  internal_send(soc, name, INTERNAL_COMM_MSG_SHARED_SOCKET|INTERNAL_COMM_SHARED_SOCKET_REGISTER);
  1798.  internal_send(soc, NULL, INTERNAL_COMM_MSG_SHARED_SOCKET|INTERNAL_COMM_SHARED_SOCKET_DORECVMSG);
  1799.  send_fd(soc, fd);
  1800.  return 0;
  1801. }
  1802. ExtFunc int shared_socket_acquire ( struct arglist * args, char * name )
  1803. {
  1804.  int soc; 
  1805.  char * buf = NULL;
  1806.  int bufsz = 0;
  1807.  int msg;
  1808.  soc = (int)arg_get_value(args, "SOCKET");
  1809.  /* Wait forever until SHARED_SOCKET_ACQUIRE is true */
  1810.  for ( ;; )
  1811.  {
  1812.  if ( internal_send(soc, name, INTERNAL_COMM_MSG_SHARED_SOCKET|INTERNAL_COMM_SHARED_SOCKET_ACQUIRE) < 0 ) break;
  1813.  if ( internal_recv(soc, &buf, &bufsz, &msg) < 0 ) break;
  1814.  if ( ( msg & INTERNAL_COMM_MSG_SHARED_SOCKET) == 0 )
  1815. {
  1816.  fprintf(stderr, "[%d] shared_socket_acquire(): unexpected message - %dn", getpid(), msg);
  1817.  return -1;
  1818. }
  1819.   if ( msg & INTERNAL_COMM_SHARED_SOCKET_ERROR )
  1820.  return -1;
  1821.   else if ( msg & INTERNAL_COMM_SHARED_SOCKET_BUSY )
  1822.  sleep(1);
  1823.   else if ( msg & INTERNAL_COMM_SHARED_SOCKET_DORECVMSG )
  1824.   {
  1825.    int fd = recv_fd(soc);
  1826.    return fd;
  1827.   }
  1828.  }
  1829.  /* Unreachable */
  1830.  return -1;
  1831. }
  1832.  
  1833. ExtFunc int shared_socket_release ( struct arglist * args, char * name )
  1834. {
  1835.  int soc; 
  1836.  soc = (int)arg_get_value(args, "SOCKET");
  1837.  return internal_send(soc, name, INTERNAL_COMM_MSG_SHARED_SOCKET|INTERNAL_COMM_SHARED_SOCKET_RELEASE);
  1838. }
  1839. ExtFunc int shared_socket_destroy ( struct arglist * args, char * name )
  1840. {
  1841.  int soc; 
  1842.  soc = (int)arg_get_value(args, "SOCKET");
  1843.  return internal_send(soc, name, INTERNAL_COMM_MSG_SHARED_SOCKET|INTERNAL_COMM_SHARED_SOCKET_DESTROY);
  1844. }