28 #include <net-snmp/net-snmp-config.h> 29 #include <net-snmp/net-snmp-includes.h> 32 #include "../misc/openvas_logging.h" 34 #include "../misc/plugutils.h" 46 snmp_get (
struct snmp_session *session,
const char *oid_str,
char **result)
48 struct snmp_session *ss;
49 struct snmp_pdu *query, *response;
50 oid oid_buf[MAX_OID_LEN];
51 size_t oid_size = MAX_OID_LEN;
54 ss = snmp_open (session);
57 snmp_error (session, &status, &status, result);
60 query = snmp_pdu_create (SNMP_MSG_GET);
61 read_objid (oid_str, oid_buf, &oid_size);
62 snmp_add_null_var (query, oid_buf, oid_size);
63 status = snmp_synch_response (ss, query, &response);
64 if (status != STAT_SUCCESS)
66 snmp_error (ss, &status, &status, result);
72 if (response->errstat == SNMP_ERR_NOERROR)
74 struct variable_list *vars = response->variables;
75 size_t res_len = 0, buf_len = 0;
77 netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID,
78 NETSNMP_DS_LIB_QUICK_PRINT, 1);
79 sprint_realloc_value ((u_char **) result, &buf_len, &res_len, 1,
80 vars->name, vars->name_length, vars);
81 snmp_free_pdu (response);
84 *result = g_strdup (snmp_errstring (response->errstat));
85 snmp_free_pdu (response);
104 snmpv3_get (
const char *peername,
const char *username,
const char *authpass,
105 int authproto,
const char *privpass,
int privproto,
106 const char *oid_str,
char **result)
108 struct snmp_session session;
113 assert (authproto == 0 || authproto == 1);
117 setenv (
"MIBS",
"", 1);
118 init_snmp (
"openvas");
119 snmp_sess_init (&session);
120 session.version = SNMP_VERSION_3;
121 session.peername = (
char *) peername;
122 session.securityName = (
char *) username;
123 session.securityNameLen = strlen (session.securityName);
126 session.securityLevel = SNMP_SEC_LEVEL_AUTHPRIV;
128 session.securityLevel = SNMP_SEC_LEVEL_AUTHNOPRIV;
131 session.securityAuthProto = usmHMACMD5AuthProtocol;
132 session.securityAuthProtoLen = USM_AUTH_PROTO_MD5_LEN;
136 session.securityAuthProto = usmHMACSHA1AuthProtocol;
137 session.securityAuthProtoLen = USM_AUTH_PROTO_SHA_LEN;
139 session.securityAuthKeyLen = USM_AUTH_KU_LEN;
140 if (generate_Ku(session.securityAuthProto, session.securityAuthProtoLen,
141 (u_char *) authpass, strlen (authpass),
142 session.securityAuthKey, &session.securityAuthKeyLen)
145 *result = g_strdup (
"generate_Ku: Error");
152 session.securityPrivProto = usmAESPrivProtocol;
153 session.securityPrivProtoLen = USM_PRIV_PROTO_AES_LEN;
157 session.securityPrivProto = usmDESPrivProtocol;
158 session.securityPrivProtoLen = USM_PRIV_PROTO_DES_LEN;
160 session.securityPrivKeyLen = USM_PRIV_KU_LEN;
162 (session.securityAuthProto, session.securityAuthProtoLen,
163 (
unsigned char *) privpass, strlen(privpass),
164 session.securityPrivKey, &session.securityPrivKeyLen)
167 *result = g_strdup (
"generate_Ku: Error");
172 return snmp_get (&session, oid_str, result);
187 snmpv1v2c_get (
const char *peername,
const char *community,
const char *oid_str,
188 int version,
char **result)
190 struct snmp_session session;
195 assert (version == SNMP_VERSION_1 || version == SNMP_VERSION_2c);
197 setenv (
"MIBS",
"", 1);
198 snmp_sess_init (&session);
199 session.version = version;
200 session.peername = (
char *) peername;
201 session.community = (u_char *) community;
202 session.community_len = strlen (community);
204 return snmp_get (&session, oid_str, result);
215 proto_is_valid (
const char *proto)
217 if (strcmp (proto,
"tcp") && strcmp (proto,
"udp") && strcmp (proto,
"tcp6")
218 && strcmp (proto,
"udp6"))
232 array_from_snmp_result (
int ret,
char *result)
240 memset (&v, 0,
sizeof (v));
245 memset (&v, 0,
sizeof v);
255 nasl_snmpv1v2c_get (
lex_ctxt *lexic,
int version)
257 const char *proto, *community, *oid_str;
258 char *result = NULL, peername[2048];
265 if (!proto || !community || !oid_str)
266 return array_from_snmp_result (-2,
"Missing function argument");
267 if (port < 0 || port > 65535)
268 return array_from_snmp_result (-2,
"Invalid port value");
269 if (!proto_is_valid (proto))
270 return array_from_snmp_result (-2,
"Invalid protocol value");
272 g_snprintf (peername,
sizeof (peername),
"%s:%s:%d", proto,
274 ret = snmpv1v2c_get (peername, community, oid_str, version, &result);
275 return array_from_snmp_result (ret, result);
281 return nasl_snmpv1v2c_get (lexic, SNMP_VERSION_1);
287 return nasl_snmpv1v2c_get (lexic, SNMP_VERSION_2c);
293 const char *proto, *username, *authpass, *authproto, *oid_str;
294 const char *privpass, *privproto;
295 char *result = NULL, peername[2048];
296 int port, ret, aproto, pproto = 0;
306 if (!proto || !username || !authpass || !oid_str || !authproto)
307 return array_from_snmp_result (-2,
"Missing function argument");
308 if (port < 0 || port > 65535)
309 return array_from_snmp_result (-2,
"Invalid port value");
310 if (!proto_is_valid (proto))
311 return array_from_snmp_result (-2,
"Invalid protocol value");
312 if ((privpass && !privproto) || (!privpass && privproto))
313 return array_from_snmp_result (-2,
"Missing privproto or privpass");
314 if (!strcasecmp (authproto,
"md5"))
316 else if (!strcasecmp (authproto,
"sha1"))
319 return array_from_snmp_result (-2,
"authproto should be md5 or sha1");
322 if (!strcasecmp (privproto,
"des"))
324 else if (!strcasecmp (privproto,
"aes"))
327 return array_from_snmp_result (-2,
"privproto should be des or aes");
330 g_snprintf (peername,
sizeof (peername),
"%s:%s:%d", proto,
332 ret = snmpv3_get (peername, username, authpass, aproto, privpass, pproto,
334 return array_from_snmp_result (ret, result);
union st_a_nasl_var::@9 v
char * get_str_var_by_name(lex_ctxt *, const char *)
char * plug_get_host_ip_str(struct arglist *desc)
int add_var_to_list(nasl_array *a, int i, const anon_nasl_var *v)
tree_cell * alloc_typed_cell(int typ)
long int get_int_var_by_name(lex_ctxt *, const char *, int)
struct arglist * script_infos