From 13be028eb16564ec8060d01d7cf877f6aea88116 Mon Sep 17 00:00:00 2001 From: dmiller Date: Thu, 20 Jun 2024 20:14:31 +0000 Subject: [PATCH] nse_dnet: try raw Ethernet sends if raw sockets don't work, e.g. Windows --- nse_dnet.cc | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/nse_dnet.cc b/nse_dnet.cc index 3514ac557..f92d30e24 100644 --- a/nse_dnet.cc +++ b/nse_dnet.cc @@ -228,9 +228,18 @@ static int ip_open (lua_State *L) { nse_dnet_udata *udata = (nse_dnet_udata *) nseU_checkudata(L, 1, DNET_METATABLE, "dnet"); udata->sock = nmap_raw_socket(); - if (udata->sock == -1) - return luaL_error(L, "failed to open raw socket: %s (errno %d)", - socket_strerror(socket_errno()), socket_errno()); + if (udata->sock == -1) { + if (o.scriptTrace()) + { + log_write(LOG_STDOUT, "%s: failed to open raw socket: %s (errno %d)", SCRIPT_ENGINE, + socket_strerror(socket_errno()), socket_errno()); + } + // If possible, we'll try to use Ethernet headers to send packets, but not + // if the user specified --send-ip + if (o.sendpref == PACKET_SEND_IP_STRONG) { + return luaL_error(L, "Unable to open raw IP socket."); + } + } if (o.scriptTrace()) { log_write(LOG_STDOUT, "%s: raw IP socket open\n", SCRIPT_ENGINE); @@ -264,7 +273,9 @@ static int ip_send (lua_State *L) char dev[16]; int ret; - if (udata->sock == -1) + // If possible, we'll try to use Ethernet headers to send packets, but not + // if the user specified --send-ip + if (udata->sock == -1 && o.sendpref == PACKET_SEND_IP_STRONG) return luaL_error(L, "raw socket not open to send"); packet = luaL_checklstring(L, 2, &packetlen); @@ -349,11 +360,12 @@ static int ip_send (lua_State *L) ret = send_ip_packet(udata->sock, ð, &dst, (u8 *) packet, packetlen); } else { usesock: -#ifdef WIN32 - if (strlen(dev) > 0) - win32_fatal_raw_sockets(dev); -#endif - ret = send_ip_packet(udata->sock, NULL, &dst, (u8 *) packet, packetlen); + if (udata->sock == -1) { + return luaL_error(L, "raw socket not open to send"); + } + else { + ret = send_ip_packet(udata->sock, NULL, &dst, (u8 *) packet, packetlen); + } } if (ret == -1) return nseU_safeerror(L, "error while sending: %s (errno %d)",