NMAP:网络探索和安全审计手册 附录A-F

附录A HTTP、HTTP 管道和网络抓取配置选项

本附录包括负责协议 HTTP、HTTP 管道和网络爬行的 NSE 库的配置选项。

HTTP 用户代理

有些数据包过滤产品会阻止使用 Nmap 默认 HTTP 用户代理的请求。您可以通过设置参数 http.useragent 使用不同的 HTTP 用户代理:

$ nmap -p80 --script http-methods --script-args http.useragent="Mozilla 42" <target>

HTTP 管道

有些网络服务器允许在单个数据包中封装多个 HTTP 请求。这可能会加快 NSE HTTP 脚本的执行速度,建议在网络服务器支持的情况下使用。默认情况下,HTTP 库会尝试管道式处理 40 个请求,并根据 Keep-Alive 头信息,根据流量情况自动调整请求数量。

$ nmap -p80 --script http-methods --script-args http.pipeline=25 <target>

此外,还可以使用参数 http.max-pipeline,设置添加到管道中的 HTTP 请求的最大数量。如果设置了脚本参数 http.pipeline,该参数将被忽略:

$nmap -p80 --script http-methods --script-args http.max-pipeline=10 <target>

配置 NSE 库 httpspider

脚本 http-unsafe-output-escaping 和 http-phpself-xss 依赖于 httpspider 库。可以对该库进行配置,以增加其覆盖范围和整体行为。

例如,该库默认只抓取 20 个页面,但对于较大的网站,我们可以相应地设置参数 httpspider.maxpagecount:

$nmap -p80 --script http-phpself-xss --script-args httpspider.maxpagecount=200 <target>

另一个有趣的参数是 httpspider.insidehost,它可以将网络爬虫限制在指定主机上。默认情况下是打开的,但你可以使用以下命令禁用这一行为:

$nmap -p80 --script http-phpself-xss --script-args httpspider.withinhost=false <target>

我们还可以设置要覆盖的目录的最大深度。默认情况下,这个值只有 3,所以如果你发现网络服务器有深度嵌套的文件,特别是当实现了诸如 /blog/5/news/comment/ 这样的漂亮 URL 时,我建议你使用以下命令更新这个库参数:

$nmap -p80 --script http-phpself-xss --script-args http spider.maxdepth=10 <target>

该库的官方文档可在 http://nmap.org/nsedoc/lib/httpspider.html。

附录B 暴力破解密码审核选项

本附录包括 Nmap 脚本引擎支持的暴力破解密码选项。这些配置选项有时是在脚本内部配置的,因此您可能不需要调整它来查找弱凭据。但是,为了进行更全面的测试,我们至少需要使用自定义字典,如后面所示。

使用暴力密码审计脚本时,要使用不同的用户名和密码列表,请设置参数 userdb 和 passdb:

$ nmap --script <brute force script> --script-args userdb=/var/usernames.txt,passdb=/var/passwords.txt <target>

要在找到一个有效账户后退出,请使用参数 brute.firstOnly:

$ nmap--script <brute force script> --script-args brute.firstOnly <target>

默认情况下,暴力引擎 (unpwdb) 使用 Nmap 的定时模板设置以下超时限制:

  • -T3,T2,T1: 10 分钟
  • -T4: 5 分钟
  • -T5: 3 分钟强力密码审计选项

要设置不同的超时限制,请使用参数 unpwdb.timelimit。要无限期运行,请将其设置为 0:

$ nmap --script <brute force script> --script-args unpwdb.timelimit=0 <target>
$ nmap --script <brute force script> --script-args unpwdb.timelimit=60m <target>

暴力模式

暴力库支持不同的模式,可改变攻击中使用的组合。可用的模式有

  • user: 在这种模式下,userdb 中列出的每个用户,passdb 中的每个密码都会被尝试,如下所示:
$ nmap --script <brute force script> --script-args brute.mode=user <target>
  • pass: 在此模式下,对于 passdb 中列出的每个密码,都将尝试 userdb 中的每个用户,如下所示:
$ nmap --script <brute force script> --script-args brute.mode=pass <target>
  • creds: 该模式需要额外的参数 brute.creditfile,如下所示:
$ nmap--script <brute force script> --script-args brute.mode=creds,brute.credfile=./creds.txt <target>

要确保每个密码只能猜一次,请使用参数 brute.unique。默认情况下,它是启用的,将其设置为 false 则禁用:

$ nmap --script <brute force script> --script-args brute.unique=false

<target>

要设置尝试失败后的重试次数,请使用参数 brute.retries。默认值为 3:

$ nmap --script <brute force script> --script-args brute.retries=1 <target>

要尝试使用用户名作为密码,请使用参数 brute.useraspass。默认值为 true。我们有以下代码

$ nmap --script <brute force script> --script-args brute.useraspass=false <target>

要尝试猜测空密码,请使用参数 brute.emptypass。默认值为假,因此可能会漏掉空密码:

$ nmap --script <brute force script> --script-args brute.emptypass=true <target>

要设置登录尝试之间的延迟时间,请使用参数 brute.delay。默认值为 0:

$ nmap --script <brute force script> --script-args brute.delay=1s <target>

在使用 Redis 等只需要密码的服务时,请使用参数 brute.passonly。默认值为 false:

$ nmap --script <brute force script> --script-args brute.passonly=true <target>

附录C NSE 调试

本附录包括 Nmap 脚本引擎的调试和错误处理。

调试 NSE 脚本

如果发生意外情况,打开调试以获取更多信息。Nmap 使用标志 -d 进行调试,您可以设置 0 到 9 之间的任意整数:

$ nmap -p80 --script http-google-email -d4 <target>

异常处理

nmap 库为 NSE 脚本提供了一种异常处理机制,旨在帮助处理网络 I/O 任务。

nmap 库中的异常处理机制与预期的一样有效。我们将需要监控异常的代码封装在 nmap.try() 调用中。函数返回的第一个值表示完成状态。如果返回 false 或 nil,则第二个返回值必须是错误字符串。成功执行中的其余返回值可根据需要设置和使用。由 nmap.new_try() 定义的 catch 函数将在出现异常时执行。

以下示例是脚本 mysql-vuln-cve2012-2122.nse( http://nmap.org/nsedoc/scripts/mysql-vuln-cve2012-2122.html) 的代码片段。在该脚本中,如果套接字处于打开状态,catch 函数将执行一些简单的垃圾收集操作:

local catch = function() socket:close() end
 local try = nmap.new_try(catch)
 …
 try( socket:connect(host, port) )
 response = try( mysql.receiveGreeting(socket) )

NSE 库 nmap 的官方文档可在 http://nmap.org/nsedoc/lib/nmap.html 上找到。

附录D 其他输出选项

本附录包括 Nmap 支持的输出格式选项。

以所有格式保存输出

Nmap 支持别名选项 -oA ,可将扫描结果保存为所有可用格式: normal、XML 和 grepable。生成的文件扩展名为 .nmap、.xml 和 .grep:

$ nmap -oA scanme scanme.nmap.org

运行前面的命令相当于运行下面的命令:

$ nmap -oX scanme.xml -oNscanme.nmap -oG scanme.grep scanme.nmap.org

附加 Nmap 输出日志

默认情况下,使用任何输出选项时,Nmap 都会覆盖日志文件: (-oN、-oX、-oG 和 -oS)。要追加结果而不是覆盖它们,请使用 --append-output 指令,如以下命令所示:

$ nmap --append-output -oN existing.log scanme.nmap.org

对于 XML 文件,Nmap 不会重建树形结构。如果您打算解析或处理结果,我建议您不要使用此选项,除非您愿意手动修复或分割文件。

在输出日志中包含调试信息

Nmap 在正常 (-oN) 和可 grep 模式 (-oG) 下保存输出时不包括调试信息,例如警告和错误。要使 Nmap 包括这些信息,请使用 --log-errors 指令,如下面命令所示:

$ nmap -A -T4 -oN output.txt --log-errors scanme.nmap.org

包括端口或主机状态的原因

要使 Nmap 包括端口被标记为打开或关闭的原因,以及主机被标记为存活的原因;使用选项 --reason 如下面的命令所示:

$ nmap --reason <target>

选项 --reason 将使 Nmap 包括决定端口和主机状态的数据包类型。我们有以下示例:

$ nmap --reason scanme.nmap.org Nmap scan report for scanme.nmap.org (74.207.244.221)
 Host is up, received echo-reply (0.12s latency).
 Not shown: 96 closed ports
 Reason: 96 resets
 PORT STATE SERVICE REASON
 22/tcp open sshsyn-ack
 25/tcp filtered smtp no-response
 80/tcp open http syn-ack
 646/tcp filtered ldp no-response
 Nmap done: 1 IP address (1 host up) scanned in 3.60 seconds

冗余模式下的操作系统检测

使用以下命令,在 "详细 "模式下使用操作系统检测功能查看更多主机信息,如用于空闲扫描的 IP ID 序列号:

# nmap -O -v <target>

附录E Lua 简介

本附录试图作为 Lua 编程基本概念的参考。本节是我的另一本出版物《精通 Nmap 脚本引擎》的一部分。如果您有兴趣了解更多有关 NSE 开发的信息,我建议您也阅读这本书。

流量控制结构

Lua 中实现了一些经典的控制结构,例如 if-then 条件语句、几种不同的循环类型以及 break 和 continue 函数。让我们简要回顾一下这些结构。

条件语句--if、then、elseif

if-then 条件语句评估表达式,如果为真,则执行代码块:

 if status.body then
 --Do something
 end

Lua 还支持使用关键字 elseif 的 else-if 条件语句:

 if status.body then
 --Do something
 elseif
 --Do something else
 end

If-then 语句必须以结束符关键字 end 结束。

循环 - while

while 循环在其他编程语言中也有类似的作用:

 local x = 1
 while(x<1337)
 print x
 x = x + 1
 end

While 循环必须以终止符关键字 end 结束。

循环 - repeat

重复循环运行正文,直到设定条件为真:

 done = false
 repeat
 --Do something
 until done

循环 - for

有两种循环格式: 一种用于迭代数字索引,另一种用于处理迭代器。请参见以下代码:

 for x = 1,1337 do
 print(x)
 end

步数(可以是负数)可以通过向循环语句传递第三个参数来设置:

 for x = 1337,1,-1 do
 print(x)
 end

输出结果如下

 1337
 1336
 1335
 …
 1

For 循环必须以终止符关键字 end 结束。

迭代器函数 pairs() 允许迭代指定表格的键和值:

 t = {}
 t[“nmap”] = “FTW”
 t[1337] = “b33r”
 for index, value in pairs(t) do
 print(index, value)
 end

上述代码段将产生以下输出结果:

 nmap, ftw
 1337, b33r

迭代器 pairs() 返回的项目不保证按数字顺序排列。如果需要返回按数字键排序的值,请使用函数 ipairs():

 a = {}
 a[2] = “FTW”
 a[1] = “NMAP “
 for i, val in ipairs(a) do
 print(i,val)
 end

输出结果如下

 1, NMAP
 2, FTW

数据类型

Lua 有以下基本数据类型:

  • Number: 用于存储整数和双浮点数
  • String: 这将存储字节序列
  • Boolean: 它有两个值--假和真
  • Table: 它存储的关联数组可用于表示多种数据结构
  • Function: 函数对象
  • Nil: 这表示数据类型或变量缺少值
  • Userdata: 这就暴露了 C 对象(或其他非 Lua 对象)的值。
  • Thread: 独立的执行线程。

字符串处理

Lua 的字符串库支持大量方便的字符串操作。在编写 NSE 脚本时,字符串显然会被频繁使用,因为它们代表了一个字节序列。让我们回顾一下最常用的字符串处理函数。

角色类别

字符类是模式中使用的特殊运算符。我们在匹配或减去子串时会用到它们,因此在复习模式和字符串操作时请记住它们。字符类如下:

.All characters
%aLetters
%cControl characters
%dDigits
%lLower case letters
%pPunctuation characters
%sSpace characters
%uUpper case letters
%wAlphanumeric characters
%xHexadecimal digits
%zNull (0x90)

Magic characters

以下字符在模式中具有特殊功能:

( )Define captures
.Any character
%Escape character for magic characters and nonalphanumeric characters
+Repetition operator
-Repetition operator
*Repetition operator
?Repetition operator
[Define sets
^Represent the complement of the set
$Represent the end of a string

Patterns

模式用于匹配字符串,功能非常强大。可以将其视为 Lua 中的简化正则表达式。字符类和捕获与模式结合使用,允许程序员执行高级匹配、字符串替换和提取。

例如,表示空字节 (0x90) 的字符类是 %z。要删除缓冲区中的所有空字节,我们可以采用如下方法:

 buffer = io.read()
 buffer = string.gsub(buffer, “%z”, “”) --This will remove all null
 bytes from the buffer

比方说,我们要匹配一个包含版本号的字符串,其格式如下:

 Version 1.21

匹配模式如下:

 Version%s%d%p%d%d

而前面的模式将匹配如下字符串:

 Version 1.21
 Version 8,32
 Version 4!20

我们可以使用方括号创建字符集。字符集将匹配括号内的任何字符:

  print(string.match(“Nmap”, “[mn]ap”))
  map
  print(string.match(“Hakin9 sucks!”, “Hackin[g9]”))
  Hakin9
 
  print(string.match("Error code:52c", "%d%d[0-9,abc]"))
  52c

在 Lua 内部,模式只不过是字符串,因此同样的规则也适用于它们。

Captures

捕获用括号分隔,用于从匹配模式中提取信息。以下示例是脚本 http-majordomo2-dir-traversal 中的一个片段。它使用捕获来存储通过安全漏洞获取的远程文件内容(如果发现匹配):

local _, _, rfile_content = string.find(response.body, '<pre>(.*)
<!%-%- Majordomo help_foot format file %-%->') 

重复运算符

根据操作符的不同,下列重复操作符会以不同的方式影响前一个字符或字符集。该函数允许我们匹配未知长度的字符串。

? Optional

  • Zero or more times, as many times as possible
  • At least one time, as many times as possible
  • Zero or more times, a few times as possible

举例如下

 > print(string.match("52c111d111", "[0-9,abc]+"))
 52c111
 > print(string.match("XX", "[0-9,abc]?XX"))
 XX
 > print(string.match("1XX", "[0-9,abc]?XX"))
 1XX
 > print(string.match("dXX", "[0-9,abc]?XX"))
 XX

连接

要连接字符串,请使用操作符 ..:

local c = “Hey “
local b = c..”nmaper!”
print(b)

输出结果如下

Hey nmaper!

字符串到数字(反之亦然)的转换由 Lua 自动完成。

查找子字符串

在很多情况下,您需要知道某个字符串是否是另一个字符串对象的子串,例如,匹配网络请求的响应。在以下函数的帮助下,我们可以通过几种不同的方式用 Lua 来实现这一目的:

string.find(s, pattern [, init [, plain]])
string.match(s, pat)
string.gmatch(s, pat)

函数 string.find 返回字符串出现的开始和结束位置,如果未找到,则返回 nil。当我们需要查找一个字符串并需要位置偏移时,应使用该函数:

print(string.find("hello", "ello"))
2 5

另一方面,如果不需要位置索引,可以使用函数 string.match,如下所示:

If string.match(resp.body, "root:") then
--Do something here
end

string.find 和 string.match 只对字符串的第一次出现有效。如果有多个字符串出现,则必须使用 string.gmatch(g 代表全局)来获取找到的对象的迭代器:

> for i in string.gmatch("a1b2c3d4e5f6","%d") do print(i) end

输出结果如下

1
2
3
4
5
6

字符串重复

要使用 Lua 来连接 n 次字符串 s,我们可以使用函数 string.rep:

string.rep(string, number)

例如

> print(string.rSee the following example:ep("a", 13))
aaaaaaaaaaaaa

字符串长度

要确定字符串的长度,请使用函数 string.len:

string.len(string)

请看下面的示例:

> print(string.rep("A", 10))
AAAAAAAAAA

格式化字符串

我们可以用给定的格式和变量创建字符串。与使用多个连接运算符相比,这不仅节省了时间,还能生成更好的代码(更易于阅读):

string.format(string, arg1, arg2, …)

请看下面的示例:

--Here both strings are equal but the second one is much easier to
readlocal string1 = "hey "..var1..":"
local string2 = string.format("hey %:", var1)

分割和连接字符串

虽然没有拆分和连接字符串的内置函数,但 NSE 函数库 stdnse 可以解决这个问题:

stdnse.strjoin(delimeter, list)
stdnse.strsplit(pattern, text)

请看下面的例子:

local stdnse = require “stdnse”
…
Local csv_str = “a@test.com,b@foo.com,c@nmap.org”
local csv_to_emails = stdnse.strsplit(“,”, emails)
for email in pairs(csv_to_emails) do
print(email)
end

输出结果如下

a@test.com
b@foo.com
c@nmap.org

常用数据结构

在 Lua 中,您将使用数据类型表来实现所有数据结构。这种数据类型具有存储函数和动态分配等多种强大功能。希望在了解了一些常见的数据结构后,你会发现自己爱上了它们的灵活性。

表非常方便,可以让我们非常高效地实现字典、集合、列表和数组等数据结构。表的初始化可以是空的,也可以带有一些值:

T1={} --empty table
T2={"a","b","c"}

整数索引或哈希键可用于分配或取消引用表中的值。需要注意的一点是,我们可以在同一个表中同时使用这两种类型:

t={}
t[1] = "hey "
t["nmap"] = "hi " --This is valid

要获取表格中存储的元素数量,可以在前面加上 # 操作符:

if #users>1 then
print(string.format("There are %d user(s) online.", #users))
--Do something else
end

请记住,# 操作符只计算整数索引的条目,并不确定。如果使用的是非线性整数索引,则需要遍历表来获取项的数量:

function tlength(t)
local count =0
for _ in pairs(t)do count = count +1end
return count
end

数组

使用带有整数索引的表可以简单地实现数组。表的大小不需要在开始时声明,可以根据需要扩大:

a={}
for i=1,10 do
a[i] = 0
end

另一个例子如下:

a = {4,5,6}
print(a[1]) --will print 4
print(a[3]) --will print 6
a[5] = 9 --This assignment is valid.
print(a[5]) --This will print 9

链接列表

由于表可以存储对其他表的引用,因此我们可以通过指定一个字段作为下一个链接引用,以非常简单的方式实现链表:

linked_list = nil
contactA = { name="Paulino Calderon", num=123456789 }
contactB = { name="John Doe", num=1111111 }
contactC = { name="Mr T", num=123 }
linked_list = {data = contactA, ptr = linked_list }
linked_list = {data = contactB, ptr = linked_list }
linked_list = {data = contactC, ptr = linked_list }
local head = linked_list
while head do
print(string.format("%s:%s", head.data["name"],
head.data[“num”])head =
head.ptr
end

输出结果如下

Mr T:123
John Doe:1111111
Paulino Calderon:123456789

设置

集合通常用于查找表,由于我们可以在 Lua 中使用哈希键作为索引,因此查找可以在恒定时间内高效执行:

set={}
items = { "2013-02-01", "2013-02-02", "2013-02-03" }
for _, key in pairs(items)
doset[key]=true
end
--To look up a key, we simply access the field.
if set["2013-02-01"] then
print("Record found.")
end

队列

先进先出队列也只需几行源代码即可实现:

--Initializes a new queue
--@return Index table
function queue_new ()
return {head = 0, tail = -1}
end
--Adds element to the queue
--Inserts are FIFO
--@param queue Queue
--@param value Value of new element
function queue_add (queue, value)
local last = queue.tail + 1
queue.tail = last
queue[last] = value
end
--Removes element from queue
--Deletions are FIFO
--@param queue Queue
--@return True if operation was succesfull
--@return Error string
function queue_remove (queue)
local first = queue.head
if first > queue.tail then
return false, "Queue is empty"
end
local value = queue[first]
queue[first] = nil
queue.head = first + 1
return true, value
end
--Returns true if queue is empty
--@param queue Queue
--@return True if given queue is empty
function queue_is_empty(queue)
if queue.head > queue.tail then
return true
end
return false
end

自定义数据结构

表格还可用于表示许多其他自定义数据结构。一些 NSE 脚本使用存储在文件中的表作为数据库。表还可以引用其他表,甚至存储函数,这在数据建模时非常方便。

输入/输出操作

Lua 中的文件操作可以在隐式或显式文件描述符上完成。我们将重点使用显式文件描述符来执行大部分操作。

如果我们使用隐式文件描述符,默认情况下,Lua 将分别使用 stdin 和 stdout。或者,我们可以使用 io.output 和 io.input 设置输出和输入描述符。

模式

可使用以下文件模式:

r阅读模式。
w写入模式。
a追加模式.
r+更新模式。该模式保留现有数据.
w+更新模式。该模式会删除任何现有数据.
a+追加更新模式。该模式保留现有数据,只允许在文件末尾添加数据。

打开文件

如果成功,函数 io.open 会返回一个文件描述符:

file = io.open (filename [, mode])

失败时,它将返回 nil 和相应的错误信息(与大多数 Lua 函数一样)。

读取文件

要使用显式文件描述符读取文件,请使用函数 io.read:

file = io.open(filename)
val = file:io.read("%d")

有一个名为 io.lines 的函数会将文件名作为参数,并返回一个迭代器来遍历文件名的每一行。该函数可以帮助我们以新行列为单位处理文件:

for line in io.lines(filename) do
if string.match(line, "<password>(.*)</password>") then
… --Do something here
end
end

写入文件

函数 io.write 接收 n 个字符串参数,并将其写入相应的文件描述符:

io.write(args,…)

请看下面的例子:

local filename
str1 = "hello "
str2 = "nmaper"
file = io.open (filename [, mode])
file:write(str1, str2)

关闭文件

完成后,应使用函数 io.close 关闭文件以释放文件描述符:

io.close ([file])

套接程序

例程允许协同多任务处理,是 Lua 的一个非常有趣的方面。请记住,例程不是线程。当你需要不同的工作者使用相同的上下文时,使用例程可以帮助你节省时间,而且它产生的代码更容易阅读,因此也更容易维护。

创建一个例程

要创建一个 coroutine,请使用函数 coroutine.create。该函数仅创建 coroutine,但并不实际执行:

local nt = coroutine.create(function()
print("w00t!")
end)

执行例行程序

要执行一个 coroutine,可使用函数 coroutine.resume:

coroutine.resume(<coroutine>)

您还可以将参数传递给 coroutine 函数,作为 coroutine.resume 函数的附加参数:

local nt = coroutine.create(function(x, y, z)
print(x,y,z)
end) 
coroutine.resume(nt, 1, 2, 3)

输出结果如下

1,2,3

有一个名为 coroutine.wrap 的函数可以替代运行 coroutine.create 和 coroutine.resume 的需要。唯一的区别是,coroutine 必须分配给一个函数:

local ntwrapped = coroutine.wrap(function()
print("w00t!")
end)
ntwrapped() --Will print w00t!

确定当前的例行程序

要获取当前正在运行的程序,请使用函数 coroutine.running:

nt =coroutine.create(function()
print("New CO!")
print(coroutine.running())
end)

print(coroutine.running())
coroutine.resume(nt)

输出结果如下

thread: 0x931a008 true
 New CO!
 thread: 0x931da78 false

获取例行程序的状态

要获取一个 coroutine 的当前状态,我们可以使用函数 coroutine.status。该函数可以返回以下值之一:

runningCoroutine 正在执行
deadCoroutine 已完成运行
suspendedCoroutine 等待执行

例如:

 local nt=coroutine.create(function()
 print(string.format("I’m aliveee! The status of the coroutine
 is:%s", coroutine.status(coroutine.running())))
 end)
 coroutine.resume(nt)
 print("Now I'm "..coroutine.status(nt))

输出结果将是:

 I’m aliveee! The status of the coroutine is:running
 Now I'm dead

生成一个 coroutine

使用函数 coroutine.yield 将 coroutine 置于暂停模式:

 local nt=coroutine.wrap(function(msg)
 print(msg)
 coroutine.yield()
 print("Resumed!") 
 coroutine.yield()
 print("Resumed again")
 coroutine.yield()
 print("Resumed once more")
 end)
 nt("Hello nmaper!")
 nt()
 nt()
 nt()

输出结果如下:

 Hello nmaper!
 Resumed!
 Resumed again
 Resumed once more

元数据

元方法允许我们通过为操作符(如比较对象和算术运算)编写自定义函数来改变表格的行为。例如,我们想用一个新函数来重载表格对象的加法功能,将某个字段加起来。通常情况下,加法操作对表无效,但我们可以重写元方法 add 来执行我们需要的任何操作。

算术方法

以下是可用的方法:

__add加法运算符
__mul乘法运算符
__sub减法运算符
__div分部操作员
__unm否定运算符
__pow幂运算符
__concat连接运算符

关系方法

以下是可用的关系式方法:

__eq平等
__lt小于
__le小于或等于

函数 setmetatable 用于设置表的可迁移性:

 local vuln1 = {criticity_level = 10, name="Vuln #1"}
 local vuln2= {criticity_level = 4, name="Vuln #2"}
 local mt = {
 __add = function (l1, l2) –Override the function “add”
 return { criticity_level = l1.criticity_level + l2.criticity_level }
 end
 }
 setmetatable(vuln1, mt)
 setmetatable(vuln2, mt)
 local total = vuln1 + vuln2
 print(total.criticity_level) --Prints 14 when normally it would fail
 before reaching this statement.

使用 Lua 时应注意的事项

在使用 Lua 时,您需要牢记以下概念。

注释

注释可以是两个连字符和下一行末尾之间的任何内容:

 --This is a comment

还支持注释块。它们由字符--[[和]]分隔:

 --[[
 This is a multi-line
 comment block.
 ]]

虚拟任务

在某些情况下,您并不需要函数返回的所有信息,在 Lua 中,您可以使用虚赋值来丢弃返回值。操作符是 _(下划线):

 local _, _, item = string.find(<string>, <pattern with capture>)

索引

索引从 1 开始,而不是 0:

 z={"a","b","c"}
 z[1]="b" --This assignment will change the content of the table to
 {"b","b","c"}

不过,您可以将数组初始化为任意值:

 nmap = {}
 for x=-1337, 0 do
 nmap[x] = 1
 end

请记住,所有 Lua 库都将遵循这一约定。

语义学

由于其灵活性,您可能会遇到不同的语义。在下面的示例中,调用 gmatch 函数的两行都是完全正确的,并产生相同的结果:

 Local str = "nmap"
 string.gmatch(str, "%z");
 str:gmatch("%z")

使用 obj:func 符号只能调用最多有一个参数的函数。

胁迫

Lua 提供字符串和数字之间的自动转换:

 surprise = "Pi = "..math.pi
 --The string now contains "Pi = 3.1415926535898" without the need of
 casting.

安全语言

Lua 被认为是一种安全的语言,因为您总是可以跟踪和检测程序本身的错误,而且无论您做什么,基本上都不会导致内存损坏。不过,在引入自己的 C 语言模块时,您仍然需要小心谨慎。

布尔

除 false 和 nil 之外的所有值都被视为 true:

 str = "AAA"
 num = -1
 zero = 0
 --the following statement will evaluate to "true"
 if str and num and zero then… -- This will execute because even 0
 evaluates to true
 end

附录F 参考文献和补充读物

本附录反映了人们为 Nmap 所做的大量工作。我建议您在阅读本烹饪手册的同时,参考以下 URL 中显示的 Nmap 官方文档中的信息:

Nmap’s official book – http://nmap.org/book/

Nmap’s mailing list archives – http://seclists.org/nmap-dev/

Zenmap – http://nmap.org/zenmap/

Ncat – http://nmap.org/ncat/

Nping – http://nmap.org/nping/

Ndiff – http://nmap.org/ndiff/

Ncrack – http://nmap.org/ncrack/

NSEDoc (Script documentation) – http://nmap.org/nsedoc/

Rainmap Lite – https://github.com/cldrn/rainmap-lite

Dnmap – http://mateslab.weebly.com/dnmap-the-distributed-nmap.html

David’s personal wiki –https://www.bamsoftware.com/wiki/Nmap/HomePage

Bonsaivikin’s personal blog - http://blog.bonsaiviking.com/

Bonsaiviking’s GitHub account - https://github.com/bonsaiviking

Index

8

8dot3-brute

bruteforcing 213

A

Active Directory (AD) 205

advanced ping scans

performing 71, 73

ping probe effectiveness 73

aggressive detection mode 22

ARP ping scans

MAC address spoofing 71

used, for discovering hosts 68, 70

used, for IPv6 scanning 71

Avahi NULL UDP 82

B

BACnet devices

broadcast management device, discovering 241

enumerating 240

broadcast ping scans

options 75

target library 75

used, for discovering hosts 73

broadcast scripts

reference 84

selecting 84

target library 84, 85

used, for gathering network information 79, 82

brute force password auditing scripts

writing 315, 320

brute library

reference 320

brute modes 341

C

C/C++

NSE library, writing 332

capabilities, IMAP server

retrieving 200

capabilities, POP3 server

retrieving 202

Cassandra databases, with no authentication

enabled

detecting 187

Center for Internet Security (CIS) 163

character classes 350

cipher suites, SSL servers

strength, auditing 151

Cirrus 109

Classless Inter-domain Routing (CIDR) notation 33

code snippet

reference link 343

Comma-Separated Value (CSV) format 276

command execution

web servers, spidering 146

Common Platform Enumeration (CPE) 21

concatenation

about 353

string length 355

string repetition 355

strings, formatting 355

strings, joining 356

strings, splitting 356

substrings, finding 354

condition variables

reference 328

conditional statements 347

coroutine

about 362

creating 363

[ 371 ]

current coroutine, determining 364

executing 363

status, obtaining 364

yielding 365

correct timing template

selecting 257

CouchDB database

listing 184

reference 185

statistics, retrieving 185

Cross-Site Scripting (XSS) 132

CVE 114

D

data structures

about 356

arrays 357

custom data structures 360

linked lists 358

queues 359

sets 359

tables 357

data types

about 350

boolean 350

function 350

nil 350

number 350

string 350

table 350

thread 350

userdata 350

denial of service attacks

reference 140

dev

reference 337

Dnmap 251

internet-wide scanning 267

statistics 267

used, for scan distribution among several clients

264, 266

DNS records

brute forcing, for hostnames discovery 108

domain controllers

finding 226

Dotdotpwn

reference 314

DOUBLEPULSAR backdoor 206

E

e-mail accounts, web servers

scrapping 154

ECLIPSEDWING 215

ElasticSearch

NSE reports, saving 287

Ethernet/IP devices

enumerating 242

exception handling 343

exploitdb 114

exposed source code control systems

detecting 149

information, obtaining from subversion 151

Extensible Markup Language (XML) 271

F

file manipulation 360

file

host list, excluding from scans 31

targets, reading 30, 31

firewalk script

reference 303

flow control structures

about 347

conditional statements 347

for loop 348

while loop 348

Format Object Printer (FOP)

download link 286

reference 286

used, for generating PDF reports 285

fuzzdb project

reference 138

G

geoplugin

reference 99

Google Safe Browsing, for malicious activities

host flagging 102

google-people-enum.nse

download link 110

H

host discovery

reference 56

host state 346

host

attacking, with message signing disabled 210

discovering, with broadcast ping scans 73

discovering, with ICMP ping scans 61, 62

discovering, with IP protocol ping scans 65, 68

discovering, with SCTP INIT ping scans 63

discovering, with TCP ACK ping scans 59

discovering, with TCP SYN ping scans 56, 57

discovering, with UDP ping scans 60, 61

discovering, withARP ping scans 70

flagging, by Google Safe Browsing 102

hostnames, pointing to the same IP address

discovering 106

hostnames

dictionary, customizing 109

discovery, by brute forcing DNS records 108

DNS server, specifying 109

NSE library target, using 110

number of threads, adjusting 109

HTML scan reports

generating 281, 283

HTTP authentication

brute forcing 125

brute modes 126

HTTP pipelining 338

HTTP requests

creating, for vulnerable supermicro IPMI/BMC

controllers identification 294

HTTP user agent 338

http-google-malware file

reference 103

http-xssed script

reference 137

httpspider library

reference 327

Huawei HG5xx 299

Human Machine Interface (HMI) systems

database, creating for ports 236

finding 235

reference 236

HyperText Transfer Protocol (HTTP) 115

I

I/O operations

about 360

file modes 361

file, closing 362

file, opening 361

file, reading 361

file, writing 362

ICMP echo replies

crafting, with Nping 41

ICMP ping scans

local, versus remote networks 63

types 63

used, for discovering hosts 61, 62

ICS SCADA

about 231

common system ports, finding 232

idle scanning 87

IIS ShortName scanner

reference 213

IIS tilde character vulnerability

reference 211

IIS web servers, with Windows 8.3 names

detecting 210, 212

IMAP passwords

brute forcing 198

impacket

reference 210

Industrial Control Systems (ICS) 144

insecure configurations, MySQL servers

detecting 163, 166

insecure cross-domain policies

available attacking domain for purchase, finding

149

detecting 147

Internet

random targets, scanning 34, 35

IP address geolocation

geolocation provider, submitting 94

performing 92, 94

IP address ranges

CIDR notation 33

scanning 31, 32, 33

[ 373 ]

IP addresses

collecting, from web servers 103

IP protocol ping scans

alternate IP protocols, setting 67

random data, generating from IP packets 67

supported IP protocols 68

used, for discovering hosts 65

ipidseq

reference 303

IPv6 addresses

IPv6 fingerprinting 77

IPv6 targets, discovering 77

scanning 76

J

John the Ripper tool 172

L

library packet

reference 304

live hosts

ping scanning techniques 15

searching, in network 11, 13

LSA bruteforcing 219

Lua scripts, against network connection

running, with Ncat 47, 48

Lua

about 291

boolean 368

coercion 368

comments 366

dummy assignments 367

field, reference 292

indexes 367

NSE library, writing 330

reference 292, 330

safe language 368

semantics 368

working 366

Lua_CFunction

reference 335

M

MAC address, host

retrieving 216

magic characters 351

mail servers 190

Man in the Middle (MitM) 208

masscan

reference 267

Mateslab

reference 266

Maxmind's GeoLite City database

reference 92

Metasploit 206

metatables

about 365

arithmetic methamethods 365

relational methamethods 366

mod_userdir

enabling, for user account enumeration 123

Modbus devices

enumerating 238

Modscan

reference 239

MongoDB databases

listing 183

reference 184

MongoDB instances, with no authentication

enabled

detecting 182

reference 183

MongoDB server information

reference 181

retrieving 180

MS SQL passwords

brute forcing 171

MS SQL servers, with NTLM enabled

information, obtaining 179

MS SQL servers

commands, running through xp_cmdshell 175

force-scanned ports, limiting in NSE scripts 170

information, retrieving 168

password hashes, dumping 172

system administrator accounts with empty

passwords, finding 177

MS SQL

force-scanned ports 179

MS08-067 206

exploiting 215

[ 374 ]

reference 215

mssql instance

reference 171

Multicast Listener Discovery (MLD) 78

multiple scanning profiles

managing, with Zenmap 43, 45

mutexes

working with 328

MySQL databases

listing 158

LISTING 156

MySQL passwords

brute forcing 161

MySQL servers

insecure configurations, detecting 163, 166

root accounts with empty password, finding 162

MySQL users

listing 158

MySQL variables

listing 159

N

Ncat

--exec option 48

--lua-exec option 48

--sh-exec option 48

Lua scripts against a network connection 48

reference 48

used, for running Lua scripts against a network

connection 47

Ncrack

attacks, resuming 51

authentication options, configuring 50, 51

reference 7, 49

used, for discovering systems with weak

passwords 48, 50

Ndiff

used, for monitoring servers 38, 40

netapi (CVE-2008-4250) 213

NetBIOS 206

NetBIOS name

retrieving 216

Network Mapper (Nmap)

about 7, 92

building process, customizing 11

local working copy, updating 11

ports, categorizing into states 16

precompiled packages 11

references 7

source code, exploring 8, 9

specific services, monitoring 41

used, for monitoring servers 38, 40

network topology graph

generating, with Zenmap 279

Niagara Fox devices

enumerating 243

Nmap Fingerprint Submitter

reference 24

Nmap NSE 156

Nmap output logs

appending 345

debugging 346

Nmap packages

reference 11

Nmap scripting engine

reference 7

nmap-nse-scripts

reference 146

Nmap/External Script Library

reference 30

nnposter 142

Novell NetWare Core Protocol (NCP) 83

Nping

reference 7, 43

used, for crafting ICMP echo replies 41, 43

NSE library httpspider

configuring 339

reference link 339

NSE library

writing, in C++ 332

writing, in Lua 330

NSE reports

saving, in ElasticSearch 287

NSE script

ideas, URL 94

reference 293

NSE scripts

arguments 27

categories 26

debugging 28, 343

[ 375 ]

new scripts, adding 29

reference 307

selecting 27

using, against target host 25

vulnerability reports, generating 304

NSE sockets

used, for sending UDP payloads 299

NSE threads

working with 328

NSE

structured script output 273

used, for exploiting path traversal vulnerability

308

Nsock 298

NT LAN Manager Security Support Provider

(NTLMSSP) 180

NTLM authentication

used, for retrieving information from SMTP

servers 203

NXDOMAIN 109

O

Omrom PLC devices

enumerating 246

reference 248

open HTTP proxy

detecting, with Nmap 119

reference 120

open ports

isting, on target host 16

listing, on target host 15

network interface, selecting 18

privileged versus unprivileged 17

scanning techniques 19

specific port ranges, scanning 17

OpenSSL 8

Oracle passwords

brute forcing 166

Oracle SID names

brute forcing 167

origin IP, scan

IP ID sequence number 90

spoofing 87, 88

zombie host, selecting 89

OS and services, running on target host

fingerprinting 19, 21

OS detection

configuring 23

in verbose mode 23, 346

reference 21

service fingerprints, submitting 24

output

saving, in formats 345

P

password hashes, MS SQL servers

dumping 172

path traversal vulnerability

exploiting, with NSE 308

HTTP pipelining 314

user agent, setting 314

patterns

about 352

captures 353

repetition operators 353

PCWorx devices

enumerating 248

PDF reports

generating, with fop 285

People API, Google

profile information, obtaining 110

performance parameters

adjusting 262

Perl

reference 274

ping probe effectiveness

reference 73

ping scanning techniques 56

PLCScan

reference 238

POP3 passwords

brute forcing 201

port scanning techniques

reference 19

port scanning

legal issues 35

reference 35

port state 346

ProConOS devices

enumerating 245

[ 376 ]

proxies

scanning through 85, 87

proxychains

reference 87

R

RadialNet

reference 280

Rainmap Lite

custom arguments 54

reference 54

used, for launching Nmap scans remotely from

web browser 51, 52

random targets

scanning, on Internet 34, 35

Redis passwords

brute forcing 188

Redis

about 189

redpoint

reference 241

Responder

reference 210

root accounts, with empty password

finding, in MySQL servers 162

ross-Site Tracing (XST) 119

Round Trip Time (RTT) 260

runtime statistics, CouchDB HTTP

reference 187

S

Same Origin Policy (SOP) 273

SAMR enumeration 219

UDP, checking when TCP blocked 221

saxon

reference 281

scan profiles

reference 54

scan results

database, dumping in CSV format 276

outputpbnj, fixing 276

saving, in grepable format 277

saving, in normal format 269

saving, in XML format 271

saving, to SQLite database 273

scans

speeding up, by skipping phases 251, 256

Scipvuldb 114

scripts

making ready, for submission 335

SCTP INIT ping scans

ports, selecting 65

unprivileged SCTP INIT ping scans 65

used, for discovering hosts 63

searching, in network

routes, tracing 13

SecList project

reference 111

security advisory

reference 246

Server Message Block (SMB)

about 206

signing configuration, obtaining with Nmap 208

system information, obtaining from 206

UDP, checking when TCP block 209

services

matching, with public vulnerability advisories 112

shared folders

enumerating 221

Shellshock

vulnerable web applications, detecting 144

Shodan

querying, for obtaining target information 100

reference 100

results, saving in CSV files 101

single target, specifying 101

ShodanHQ

reference 36, 101

Siemens SIMATIC S7 PLCs

enumerating 236

skipped phases

host discovery 252

port scanning 255

reverse DNS resolution 253

target enumeration 252

Slave IDs (SIDs) 238

slowloris denial of service (DoS) attacks

service vulnerability, detecting 139

SMB sessions

brute force password auditing attack, preparing

[ 377 ]

225

enumerating 224

UDP, checking when TCP traffic block 225

SMB vulnerabilities

detecting 216

smb-enum-users

reference 220

SMTP open relays

detecting 191

SMTP passwords

brute forcing 192

SMTP servers

information, retrieving with NTLM authentication

203

SMTP usernames

enumerating 196

sniffer-detect

reference 303

source code

experimental branches 10

SourceForge repositories

reference 264

SQL injection vulnerabilities

finding 138

SQLite database

scan results, saving 273

sqlmap

reference 139

SSL servers

cipher suite strength, auditing 151

Stateless Address Autoconfiguration (SLAAC) 78

string handling

about 350

character classes 350

magic characters 351

patterns 351

subversion (svn) 8

Subversion (SVN) 337

supported HTTP methods

listing 116

reference 119

suspicious SMTP servers

detecting 194, 196

SVN repository

reference 10

system administrator accounts, MS SQL servers

with empty passwords, finding in 177

T

target host

open ports, listing 15, 16

targets

reading, from file 30

TCP ACK ping scans

ports, selecting 60

privileged, versus unprivileged TCP ACK ping

scans 60

used, for discovering hosts 59

TCP SYN ping scans

firewalls 58

privileged, versus unprivileged TCP SYN ping

scan 58

traffic filtering 58

used, for discovering hosts 56, 57

timing parameters

adjusting 259

round trip times, estimating with Nping 261

timing settings, displaying 262

timing templates

aggressive (-4) 258

insane (-5) 259

normal(-3) 258

paranoid(-0) 257

polite(-2) 258

sneaky (-1) 258

TNS listener 167

traceroute geolocation information

obtaining 97, 99

U

UDP ping scans

ports, selecting 61

used, for discovering hosts 60, 61

user accounts, Windows host

enumerating 219

LSA bruteforcing selection 221

SAMR enumeration selection 221

username word lists

reference 111

V

valid e-mail accounts

collecting, from web servers 103

version detection

about 19

intensity, increasing 22

visualization controls

reference 281

vulnerabilities

detection, by crawling web servers 321, 327

vulnerability checks

reporting 283

vulnerability reports

generating, in NSE scripts 304

vulnerability states, vulns library 308

vulnerable supermicro IPMI/BMC controllers

HTTP pipelining 298

identification, by creating HTTP requests 294

user agent, setting 297

vulns library

reference 308

vulscan library

reference 112

W

web application firewalls

detecting 130, 132

web applications, vulnerable to Shellshock

commands, remote execution 146

detecting 144

web applications, with default credentials

finding 141, 143

web applications

brute forcing 127

WordPress installations, brute forcing 128

web server vulnerability

detecting, to denial of service attacks 139

web servers

crawling, for vulnerabilities detection 321, 326

e-mail accounts, scrapping 153

files and folders, discovering 121, 123

Nikto database 123

signatures, collecting 36, 37

Web Services Dynamic Discovery (WS-Discovery)

83

while loop 348

WHOis records

about 95

cache, disabling 97

reference 96

referral code, ignoring 97

retrieving 95

service providers, selecting 96

Windows 8.3 names

bruteforcing 213

detecting, through different HTTP methods 213

Windows Communication Framework (WCF) 83

Windows hosts, vulnerable to MS08-067

detecting 213

Windows

reference 10

winlog_runtime_2

reference 236

X

XMLStarlet commands

reference 290

XSL Formatting Objects (XSL-FO) 286

XSL

reference 287

XSLT processor tool 281

XSS vulnerabilities

detecting 135, 136

scripts, reference 137

XST vulnerabilities

detecting 132, 134

Z

Zenmap

can profile, deleting 46

can profile, editing 46

reference 7

scanning profiles 46

sed, for managing multiple scanning profiles 45

used, for generating network topology 279

used, for managing multiple scanning profiles 43

Zmap

reference 267