summaryrefslogtreecommitdiffstats
path: root/scripts/broadcast-wake-on-lan.nse
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/broadcast-wake-on-lan.nse')
-rw-r--r--scripts/broadcast-wake-on-lan.nse68
1 files changed, 68 insertions, 0 deletions
diff --git a/scripts/broadcast-wake-on-lan.nse b/scripts/broadcast-wake-on-lan.nse
new file mode 100644
index 0000000..54e69f8
--- /dev/null
+++ b/scripts/broadcast-wake-on-lan.nse
@@ -0,0 +1,68 @@
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local string = require "string"
+
+description = [[
+Wakes a remote system up from sleep by sending a Wake-On-Lan packet.
+]]
+
+---
+-- @usage
+-- nmap --script broadcast-wake-on-lan --script-args broadcast-wake-on-lan.MAC='00:12:34:56:78:9A'
+--
+-- @output
+-- Pre-scan script results:
+-- | broadcast-wake-on-lan:
+-- |_ Sent WOL packet to: 10:9a:dd:a8:40:24
+--
+-- @args broadcast-wake-on-lan.MAC The MAC address of the remote system to wake up
+-- @args broadcast-wake-on-lan.address The broadcast address to which the WoL packet is sent.
+--
+
+author = "Patrik Karlsson"
+license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
+categories = {"broadcast", "safe"}
+
+local MAC = stdnse.get_script_args("broadcast-wake-on-lan.MAC")
+local address = stdnse.get_script_args("broadcast-wake-on-lan.address")
+
+prerule = function()
+ -- only run if we are ipv4 and have a MAC
+ return (MAC ~= nil and nmap.address_family() == "inet")
+end
+
+-- Creates the WoL packet based on the remote MAC
+-- @param mac string containing the MAC without delimiters
+-- @return packet string containing the raw packet
+local function createWOLPacket(mac)
+ return "\xff\xff\xff\xff\xff\xff" .. string.rep(stdnse.fromhex(mac), 16)
+end
+
+local function fail (err) return stdnse.format_output(false, err) end
+
+action = function()
+
+ local MAC_hex
+ if ( MAC:match("%x%x:%x%x:%x%x:%x%x:%x%x:%x%x") ) then
+ MAC_hex = MAC:gsub(":", "")
+ elseif( MAC:match("%x%x%-%x%x%-%x%x%-%x%x%-%x%x%-%x%x") ) then
+ MAC_hex = MAC:gsub("-", "")
+ else
+ return fail("Failed to process MAC address")
+ end
+
+ local host = { ip = address or "255.255.255.255" }
+ local port = { number = 9, protocol = "udp" }
+ local socket = nmap.new_socket("udp")
+
+ -- send two packets, just in case
+ for i=1,2 do
+ local packet = createWOLPacket(MAC_hex)
+ local status, err = socket:sendto(host, port, packet)
+ if ( not(status) ) then
+ return fail("Failed to send packet")
+ end
+ end
+ return stdnse.format_output(true, ("Sent WOL packet to: %s"):format(MAC))
+end
+