对于ICMP关心的destination unreachable hearder layout 中的0-3,9,10位的标记。
其中TCP SYN Scan (-sS)结果状态三种:open,closed,filtered在扫描过程中当确定一个端口开放后,为了不建立完整链接需要发送一个RST包,告知服务器放弃连接。
Nmap自身将根据情况发送一个RST包。
关闭的端口,直接收到一个RST包。
过滤的端口,发送SYN包后没有回复,Nmap自行决定时间,发送第二次,如果没有回复则TCP扫描(-sT)建立TCP连接(3次握手),目标发送SSH banner,接收后,终端连接。
Nmap发送RST包,让目标终止。
对于大量扫描端口为关闭或过滤,此时扫描发包同SYN扫描一致。
UDP扫描(-sU)主要针对服务DNS、SNMP和DHCP(53,161/162,67/68)UDP扫描除了open/filtered问题外,速度相对较慢。
扫描1000个端口带盖需要17min。
区分出open端口(-sV)nmap有nmap-service-probes格式,可以找到对应相应服务的包格式进行发送,(-sV)任何的open/filtered包回复则可以确认为open。
SNMP只有当确切的正确字符串给出,才能给出回复,很多设备配置开始为字符串public,但不是所有的都是。
对于nmap自动化来说,检测版本方法为唯一方法。
手工方法还有:一些特殊的traceroute,可以使用hping2等工具对一只的开放TCP或UDP 端口进行traceroute。
接着对有问题的UDP端口进行,跳数的不同可以区分出open和filtered 端口。
对UDP扫描提速nmap会根据主机的情况降低扫描速度和并限制速率,防止网络洪灾而导致目标机器丢弃。
对于linux类型规定1包/s方法:1、增加主机并行--min-hostgroup2、优先扫描主要端口-F设置3、添加—version-intensity 0 给版本扫描nmap直接查找最可能的端口数。
使用nmap-service-probes文件中的内容。
4、从防火墙后开始5、使用—host-timeout跳过慢主机6、使用-v 给出预测扫描技术时间Nmap脚本引擎目的:网络发现、更多复杂版本探测、漏洞检测、后门检测、漏洞利用脚本使用Lua语言编写NSE用-sC选项,结果为完整的Nmap和XML输出。
支持两种脚本,服务和主机脚本。
服务脚本涉及目标主机上一个开放的服务或端口,任何结果将显示在输出中。
主机脚本对每个目标IP运行不超过一次。
-Sc使用一般脚本--script使用用户编写脚本,可以指定脚本名称,或者脚本所在目录名称--script-args提供参数,--script-trace和—script-updatedb一般用于脚本调试和开发。
脚本分类:auth确定目标系统的身份验证凭据,包括snmp-brute,http-auth,ftp-anondefault 默认考虑因素包括:speed:运行速度快,不考虑暴力破解,怕中,和其他花费几分钟或消失的服务。
usefulness:提供有价值可用信息。
verbosity:产生的结果必须可读而且简洁。
reliability:很多脚本使用启发式和模糊质问匹配达到目的。
如果经常出错不应加入默认intrusiveness:太强进攻行为的脚本不适合。
privacy:有些外部脚本把信息传给第三方。
discovery 通过查询公共等级,SNMP服务,目录服务发现关于网络的更多信息。
html-title,smb-enum-shares,snmp-sysdescrexternal 这类脚本把数据发送到第三方数据库或其他网络资源。
whoisintrusive 可能造成系统崩溃,并且占用带宽或CPU时间,会被目标系统管理员认为是恶意代码。
http-open-proxy,snmp-brutemalware 检查系统是否被病毒感染,或存在后门。
smtp-strangeport,auth-spoofsafe 不会造成目标服务崩溃,不使用大量带宽或者资源,或一处漏洞的脚本。
ssh-hostkey,html-title。
version 版本探查,但不能单一选择。
只当版本检测(-sV)运行时启动。
vuln检查某一一直的漏洞返回发现的问题。
realvnc-auth-bypass,xampp-default-auth脚本格式:包括两个5部分描述域包括一个当脚本被执行时,一个动作块包含实际脚本指令的端口或者主机的规则定义。
description域描述脚本用途以及任何需要使用者注意的东西。
包括脚本的大纲。
categories域定义几个或多个脚本所属类别。
author域作者姓名,联系方式license域确定有合法许可可以分享runlevel域决定脚本执行顺序端口和主机规则nmap使用脚本规则决定是否应该在目标运行,一个脚本包含一个端口规则,管理脚本应该针对目标的哪个端口运行,或者一个主机规则,确保在条件成立时脚本针对目标IP只运行一次。
规则是一个Lua函数返回true或false。
主机规则接受一个主机表昨为他们的参数并测试,例如,ip地址和目标的主机名。
端口规则接受丢与任何open,open|filtered,或unfiltered的TCP或UDP端口主机和端口表作为参数。
端口规则通常测试如端口好,端口状态,或监听服务,是否针对端口运行。
Action运行包含任何满足端口和主机规则的条件触发后,会运行的指令。
是一个Lua函数,返回nil或者字符串。
如果返回字符串,将在nmap端口表后打印。
脚本语言NSE内部有一个Lua解释器,一个NSE库,后者连接Lua和Nmap。
负责处理初始化Lua解释器,调度并行脚本运行,脚本恢复或其他。
同时也是NSE网络I/O架构以及异常处理的核心。
同样包含一个使用的苦,使脚本更加方便有效。
基于Lua的语言nmap相关函数在命名空间nmap中,如nmap.socket()脚本中也可以引用C语言模块,模块必须遵循lua_CFunction类型。
一个特别的初始化函数提供在模块和剩余NSE代码的初始化。
初始化函数在luaopen_<module>270页具体函数注册方法以md5为例Nmap APINmap获得的关于目标主机信息以参数形式给到脚本action方法。
host和port是Lua表,如果脚本符合一条主机规则,只得到host表,如果符合端口规则,得到host和port表。
包含内容:host表:host, host.os, host.ip(如果使用主机名扫描,从反向DNS得到多余一个IP,则选择相同的IP进行扫描), , host.targetname, host.directly_connected, host.mac_addr, host.mac_addr_src(可以用来欺骗), host.interface, host.bin_ip, host.bin_ip_srcport表:port, port.number, port.protocol, port.service, port.version, port.state网络I/O API支持两种接口为:连接类型和未加工数据包connect-style network I/O连接类型网络I/O用于传统网络使用,建立socket连接,发送接收数据等。
raw packet network I/O 未加工数据包I/O未加工数据包接收依靠在Nsock库中的Libpacap封装器。
一般步骤为打开一个捕获设备,注册监听对象,处理收到的数据包。
具体函数调用关系见274线程互斥每个脚本运行线程时,当需要调用网络对象时,产生其他脚本。
有些脚本需要并发控制,nse 存在一个互斥函数。
异常处理NSE提供异常处理,Lua不提供,对于网络I/O操作设计允许结构化。
注册注册是针对一个Lua表,每个脚本可以读写注册。
脚本一般使用保存信息给相同的脚本实例。
注册也用于掌握完全不同的脚本的信息。
规则是一个Lua方法,决定是否对一个目标运行脚本。
文档使用Luadoc系统,NSEDoc执行细节初始化阶段初始阶段Nmap加载Lua解释器和库。
包括debug,io,math,os,package,string,table。
除了加载Lua提供的库,nmap命名空间函数也加载。
搜索路径是nmap搜索数据文件相同的目录,除了nselib库附加到每一个上。
在这个阶段所有的脚本参数保存在注册中。
下一步载入选择的脚本,根据默认或者提供给—script选项的参数。
version类脚本在版本探测可用时载入。
NSE首先尝试说明每个—script参数,这些使用nse_中的LuaC函数entry,基于从script.db脚本分类数据库中得到。
如果发现类别,这些脚本被载入。
否则Nmap尝试说明—script参数为文件或者目录。
如果没有相应文件或目录,脚本引擎产生错误,最终终止。
如果指定一个目录,所有的.nse文件被加载运行。
如果存在一个portrule,保存在porttests 表中同时有一个portrule key和文件终止值。
否则,如果脚本有一个hostrule,同样方式保存在hosttests表中。
对目标进行匹配脚本初始化结束后,hostrule和portrule对当前目标群的每台主机进行评估。
每个选中的脚本的规则对每台主机和主机上的open以及open/filtered端口进行测试。
portrule需要尽量简单,将任何大计算放到action中。
接着为每个匹配的脚本目标组合创建一个Lua线程。
每个线程存储相关的信息如:运行级别,目标,目标端口,host和port表,以及脚本类型。
mainloop函数按顺序处理每个运行等级。
脚本运行Nmap执行NSE脚本通过利用Nmap的Nsock并行接口库以及Lua系统语言特性实现并行扫描。
协同程序提供了合作的多个线程,脚本可以在特定点暂停,并允许其他系统程序运行。
网络I/O,特别是从远程主机等待请求,总是包含很长的等待时间,因此脚本为其他程序暂停。
Nsock封装器的主要函数因此放弃(终止)。
当Nsock完成处理如请求,回收将引起脚本从等待队列进入运行队列,当唤醒时可以重新运行。
mainloop函数将线程在等待和运行队列之间移动。
被阻止的线程从运行到等待,运行线程运行直到被阻止,完成或者出现错误而失败。
线程通过call process_waiting2running,从准备到运行。
这个过程是安排运行线程,或在队列继续指导没有线程存在在任何队伍终止。