当前位置:文档之家› 端口扫描技术和算法

端口扫描技术和算法

对于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,从准备到运行。

这个过程是安排运行线程,或在队列继续指导没有线程存在在任何队伍终止。

相关主题