27 #include "../misc/plugutils.h" 31 #include <gvm/base/logging.h> 32 #include <net-snmp/net-snmp-config.h> 33 #include <net-snmp/net-snmp-includes.h> 45 snmp_get (
struct snmp_session *session,
const char *oid_str,
char **result)
47 struct snmp_session *ss;
48 struct snmp_pdu *query, *response;
49 oid oid_buf[MAX_OID_LEN];
50 size_t oid_size = MAX_OID_LEN;
53 ss = snmp_open (session);
56 snmp_error (session, &status, &status, result);
59 query = snmp_pdu_create (SNMP_MSG_GET);
60 read_objid (oid_str, oid_buf, &oid_size);
61 snmp_add_null_var (query, oid_buf, oid_size);
62 status = snmp_synch_response (ss, query, &response);
63 if (status != STAT_SUCCESS)
65 snmp_error (ss, &status, &status, result);
71 if (response->errstat == SNMP_ERR_NOERROR)
73 struct variable_list *vars = response->variables;
74 size_t res_len = 0, buf_len = 0;
76 netsnmp_ds_set_boolean (NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT,
78 sprint_realloc_value ((u_char **) result, &buf_len, &res_len, 1,
79 vars->name, vars->name_length, vars);
80 snmp_free_pdu (response);
83 *result = g_strdup (snmp_errstring (response->errstat));
84 snmp_free_pdu (response);
103 snmpv3_get (
const char *peername,
const char *username,
const char *authpass,
104 int authproto,
const char *privpass,
int privproto,
105 const char *oid_str,
char **result)
107 struct snmp_session session;
112 assert (authproto == 0 || authproto == 1);
116 setenv (
"MIBS",
"", 1);
117 init_snmp (
"openvas");
118 snmp_sess_init (&session);
119 session.version = SNMP_VERSION_3;
120 session.peername = (
char *) peername;
121 session.securityName = (
char *) username;
122 session.securityNameLen = strlen (session.securityName);
125 session.securityLevel = SNMP_SEC_LEVEL_AUTHPRIV;
127 session.securityLevel = SNMP_SEC_LEVEL_AUTHNOPRIV;
130 session.securityAuthProto = usmHMACMD5AuthProtocol;
131 session.securityAuthProtoLen = USM_AUTH_PROTO_MD5_LEN;
135 session.securityAuthProto = usmHMACSHA1AuthProtocol;
136 session.securityAuthProtoLen = USM_AUTH_PROTO_SHA_LEN;
138 session.securityAuthKeyLen = USM_AUTH_KU_LEN;
139 if (generate_Ku (session.securityAuthProto, session.securityAuthProtoLen,
140 (u_char *) authpass, strlen (authpass),
141 session.securityAuthKey, &session.securityAuthKeyLen)
144 *result = g_strdup (
"generate_Ku: Error");
151 session.securityPrivProto = usmAESPrivProtocol;
152 session.securityPrivProtoLen = USM_PRIV_PROTO_AES_LEN;
156 session.securityPrivProto = usmDESPrivProtocol;
157 session.securityPrivProtoLen = USM_PRIV_PROTO_DES_LEN;
159 session.securityPrivKeyLen = USM_PRIV_KU_LEN;
160 if (generate_Ku (session.securityAuthProto, session.securityAuthProtoLen,
161 (
unsigned char *) privpass, strlen (privpass),
162 session.securityPrivKey, &session.securityPrivKeyLen)
165 *result = g_strdup (
"generate_Ku: Error");
170 return snmp_get (&session, oid_str, result);
185 snmpv1v2c_get (
const char *peername,
const char *community,
const char *oid_str,
186 int version,
char **result)
188 struct snmp_session session;
193 assert (version == SNMP_VERSION_1 || version == SNMP_VERSION_2c);
195 setenv (
"MIBS",
"", 1);
196 snmp_sess_init (&session);
197 session.version = version;
198 session.peername = (
char *) peername;
199 session.community = (u_char *) community;
200 session.community_len = strlen (community);
202 return snmp_get (&session, oid_str, result);
213 proto_is_valid (
const char *proto)
215 if (strcmp (proto,
"tcp") && strcmp (proto,
"udp") && strcmp (proto,
"tcp6")
216 && strcmp (proto,
"udp6"))
230 array_from_snmp_result (
int ret,
char *result)
238 memset (&v, 0,
sizeof (v));
243 memset (&v, 0,
sizeof v);
253 nasl_snmpv1v2c_get (
lex_ctxt *lexic,
int version)
255 const char *proto, *community, *oid_str;
256 char *result = NULL, peername[2048];
263 if (!proto || !community || !oid_str)
264 return array_from_snmp_result (-2,
"Missing function argument");
265 if (port < 0 || port > 65535)
266 return array_from_snmp_result (-2,
"Invalid port value");
267 if (!proto_is_valid (proto))
268 return array_from_snmp_result (-2,
"Invalid protocol value");
270 g_snprintf (peername,
sizeof (peername),
"%s:%s:%d", proto,
272 ret = snmpv1v2c_get (peername, community, oid_str, version, &result);
273 return array_from_snmp_result (ret, result);
279 return nasl_snmpv1v2c_get (lexic, SNMP_VERSION_1);
285 return nasl_snmpv1v2c_get (lexic, SNMP_VERSION_2c);
291 const char *proto, *username, *authpass, *authproto, *oid_str;
292 const char *privpass, *privproto;
293 char *result = NULL, peername[2048];
294 int port, ret, aproto, pproto = 0;
304 if (!proto || !username || !authpass || !oid_str || !authproto)
305 return array_from_snmp_result (-2,
"Missing function argument");
306 if (port < 0 || port > 65535)
307 return array_from_snmp_result (-2,
"Invalid port value");
308 if (!proto_is_valid (proto))
309 return array_from_snmp_result (-2,
"Invalid protocol value");
310 if ((privpass && !privproto) || (!privpass && privproto))
311 return array_from_snmp_result (-2,
"Missing privproto or privpass");
312 if (!strcasecmp (authproto,
"md5"))
314 else if (!strcasecmp (authproto,
"sha1"))
317 return array_from_snmp_result (-2,
"authproto should be md5 or sha1");
320 if (!strcasecmp (privproto,
"des"))
322 else if (!strcasecmp (privproto,
"aes"))
325 return array_from_snmp_result (-2,
"privproto should be des or aes");
328 g_snprintf (peername,
sizeof (peername),
"%s:%s:%d", proto,
330 ret = snmpv3_get (peername, username, authpass, aproto, privpass, pproto,
332 return array_from_snmp_result (ret, result);
struct script_infos * script_infos
char * get_str_var_by_name(lex_ctxt *, const char *)
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)
union st_a_nasl_var::@4 v
char * plug_get_host_ip_str(struct script_infos *desc)