NMAP:网络探索和安全审计手册 附录A-F
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 |
---|---|
%a | Letters |
%c | Control characters |
%d | Digits |
%l | Lower case letters |
%p | Punctuation characters |
%s | Space characters |
%u | Upper case letters |
%w | Alphanumeric characters |
%x | Hexadecimal digits |
%z | Null (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。该函数可以返回以下值之一:
running | Coroutine 正在执行 |
---|---|
dead | Coroutine 已完成运行 |
suspended | Coroutine 等待执行 |
例如:
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