69 lines
2.0 KiB
Plaintext
69 lines
2.0 KiB
Plaintext
|
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
|
||
|
|