Example Script: finger
The finger
script is a perfect
example of a short and simple NSE script.
First the information fields are assigned.
A detailed description of what the script
actually does goes in the description
field.
description = [[ Attempts to get a list of usernames via the finger service. ]] author = "Eddie Bell" license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
The categories
field is a table
containing all the categories the script belongs to. These are used for
script selection with the --script
option:
categories = {"default", "discovery", "safe"}
Every good script comes with a sample of its output in an NSEDoc comment.
--- -- @output -- PORT STATE SERVICE -- 79/tcp open finger -- | finger: -- | Welcome to Linux version 2.6.31.12-0.2-default at linux-pb94.site ! -- | 01:14am up 18:54, 4 users, load average: 0.14, 0.08, 0.01 -- | -- | Login Name Tty Idle Login Time Where -- | Gutek Ange Gutek *:0 - Wed 06:19 console -- | Gutek Ange Gutek pts/1 18:54 Wed 06:20 -- | Gutek Ange Gutek *pts/0 - Thu 00:41 -- |_Gutek Ange Gutek *pts/4 3 Thu 01:06
You can use the facilities provided by the nselib (the section called “NSE Libraries”) with require
. Here
we want to use common communication functions and shorter port rules:
require "comm" require "shortport"
We want to run the script against the finger service. So we
test whether it is using the well-known finger port (79/tcp
), or
whether the service is named “finger” based on version
detection results or in the port number's listing
in nmap-services
:
portrule = shortport.port_or_service(79, "finger")
First, the script uses nmap.new_try
to
create an exception handler that will quit the script in case of an
error. Next, it passes control to comm.exchange
,
which handles the network transaction. Here we have asked to wait in the communication exchange until we receive at least 100 lines, wait at least 5 seconds, or until the remote side closes the connection. Any errors are handled by the
try
exception handler. The script returns a string
if the call to comm.exchange()
was successful.
action = function(host, port) local try = nmap.new_try() return try(comm.exchange(host, port, "\r\n", {lines=100, proto=port.protocol, timeout=5000})) end