Nmap扫描软件分析

[摘要] Nmap英文全称NetWork Mapper,中文为“网络映射器”,是一款开源的网络探测和安全审核的工具,它的设计目标是快速地扫描大型的网络与主机。Nmap最早是Linux下的网络扫描和嗅探工具包,后来经过不断的发展,成为了一款以新颖的方式使用原始IP数据报文发现网络主机的网络探测工具。Nmap能够发现网络上的主机以及主机提供的服务(应用程序名和版本号),运行服务的操作系统信息、主机使用的报文过滤器和防火墙等多种网络信息。Nmap常用于安全审核和许多系统管理时的维护、主机监护和服务的运行。本文研究了Nmap的运行原理和机制,分析Nmap的源代码和各种功能的使用方法以及功能背后的网络原理,通过对Nmap进行深入分析,能够有效地了解Nmap在网络中的运行和工作原理,对网络安全和Nmap在渗透测试中的使用有更深的理解。

关键词:Nmap分析;端口扫描;渗透测试


1.引言

随着计算机网络的快速发展,信息化时代的普及越来越广泛,社会网络化程度逐渐上升,随之而来的网络安全问题也逐渐明显,不容忽视。在1988年11月,康奈尔大学研究生罗伯特莫里斯设计的网络蠕虫在当时互联网没有安全防范的情况下,成功攻击了数千台计算机,蠕虫病毒在网上不断复制扩散,感染了6000多个系统,使许多重要机构部门的计算机陷入网络瘫痪,造成了将近1亿美元经济损失。此后,网络安全事件频出不穷,不断有黑客争相模仿,为了显示自我或谋取不法经济利益,对网络安全造成极大的威胁。对于各种网络安全问题,原因多种多样,计算机硬件和软件的漏洞、各种偶然因素或者人员操作和管理因素,但总结来说可以有以下几个方面:TCP/IP协议自身安全性的不足、网络的开放的特性、使用者安全意识的不足和黑客的攻击。
网络探测是黑客进行攻击的重要前提步骤,在网络探测的过程中,最常用的工具便是Nmap。Nmap是端口扫描等网络探测方面最强大的工具之一,具有广泛的知名程度,许多影视题材作品如《我是谁没有绝对安全的系统》《黑客帝国》《谍影重重》《虎胆龙威》等,均有出现的场景,据nmap.org官方统计,在好莱坞影片中出现Nmap的镜头的影片有17部以上。Nmap能成为强大的广受欢迎的工具基于以下几种原因:Nmap从1996年由Gordon Lyon开发诞生至今,经过21年,仍然以平均2至3个月更新一次的速度保持着它的不断成长和鲜活的生命力,至今为止仍然是网络探测领域使用率最高的工具。Nmap具有十分强大的功能,除了端口扫描、远程操控、服务器鉴别之外,Nmap还可以提供相对完整的信息收集、数据库渗透、网络渗透测试等功能,并且在Nmap的脚本支持下可以扩展更多的网络扫描测试。再者,Namp具有广大的家族和组织支持,由Nmap发展而出的各种扩展工具,如NetCat,Nping以及Zenmap,以及其他与Nmap相关的组织如Nmap.org、SecList.org、SecTools.Org、Insecure.Org等著名网络安全站点,提供了强大的技术支持和论坛讨论。Nmap是网络安全界一直坚持GNUGPL并一直开放源代码的典范之一,任何一个人都可以下载到Nmap的源代码并对其分析或改良,正是由于Nmap的开源性,使得它成为在世界上广受欢迎的强大工具。

2.关于网络探测的相关介绍

2.1端口扫描

端口:一个端口是一个潜在的通信通道,如果把IP地址比作一间房子,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口可以有65536(即:2^16)个之多。端口通过端口号来标记,端口号只有整数,范围是从0 到65535(2^16-1)。信息传送中每个信息都载有一个用来接收目的端口号和回复应该发往的源端口号。端口分为两种,一种是TCP端口,一种是UDP端口。计算机之间相互通信的时候,分为两种方式:一种是发送信息以后,再确认信息是否到达,也就是有应答的方式,这种方式大多采用TCP协议。另一种是发送以后不去确认信息是否到达,这种方式大多采用UDP协议。对应这两种协议的服务提供的端口,也就分为TCP端口和UDP端口。在65535个端口号中,分为了三种类型:
公开端口:0–1023
注册端口:1024–49151
动态或私有端口:49152—65535
端口扫描:端口扫描,顾名思义,就是逐个对一段端口或指定的端口进行扫描。通过扫描结果可以知道一台计算机上都提供了哪些服务,然后就可以通过所提供的这些服务的己知漏洞就可进行攻击。其原理是当一个主机向远端一个服务器的某一个端口提出建立一个连接的请求,如果对方有此项服务,就会应答,如果对方未安装此项服务时,即使你向相应的端口发出请求,对方仍无应答,利用这个原理,如果对所有熟知端口或自己选定的某个范围内的熟知端口分别建立连接,并记录下远端服务器所给予的应答,通过查看记录就可以知道目标服务器上都安装了哪些服务,这就是端口扫描。通过端口扫描,可以搜集到很多关于目标主机的各种很有参考价值的信息。例如,对方是否提供FPT服务、WWW服务或其它服务。
TCP报文结构:

TCP报文结构的详细解释如下:
1.源端口和目的端口,各占16位,分别表示发送方和接收方的端口号。
2.发送序号和确认序号字段都是32位。其中发送序号表示数据部分第一个字节的序号,而确认序号表示该数据报的接收者希望对方发送的下一个数据第一个字节的序号。
3.头长度字段的值表示TCP报文头的长度。即20字节的固定长度加上可选项的长度。
4.紧接在头长度字段后有6位保留域,应该把它设置为0。一个TCP头包含6个标志位,它们的意义分别为:
①SYN SYN标志位用来建立连接,让连接双方同步序列号。
②FIN FIN标志位表示发送端已经没有数据要传输了,释放连接。
③RST RST标志位用来复位一个连接。RST标志置位的数据包称为复
位包。一般情况下,如果TCP收到的一个分段明显不是属于该主机上的任
何一个连接,则向远端发送一个复位包。
④URG URG标志位为紧急数据标志。如果它为1,表示本数据包中包
含紧急数据。此时紧急数据指针有效。
⑤ACK ACK标志位为确认标志位。如果为1,表示包中的确认号是有
效的。否则,包中的确认号无效。
⑥PSH PSH 标志位如果置位,接收端应尽快把数据传送给应用层
5.窗口大小字段表示从被确认的字节开始,发送方最多可以连续发送的字节个数。接收方通过设置窗口值的大小,可以调节源端发送数据的速度,从而实现流控。
6.校验和域是 TCP 协议提供的一种检错机制。
7.可选项是用来进行一些参数协商的字段。
三次握手协议:
三次握手(three times handshake;three-way handshake)。所谓的三次握手即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。
为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。下图是TCP三次握手协议的示意图:

(1)主机A向B发送一个SYN=1的TCP连接请求数据报,同时为该数据报生成一个序号SEQ,放在数据报头中一起发送出去。
(2)主机B若接收本次连接请求,则返回一个确认加同步的数据包(SYN=1 且ACK=1),这就是第二次握手。其中,同步的序号是由主机B自己生成的,同时用第一个数据包的序号值加1来作为它的确认。
(3)最后,主机A再向主机B发送第二个数据包,同时对从主机B发来的数据包进行确认。

2.2指纹识别与探测

Nmap使用Nmap-service提供的功能来实现指纹识别与探测,Nmap通过端口扫描发现TCP或UDP端口后,会在Nmap-service中查询对应的是哪种服务。Nmap-service中包含了不同的服务报文,Nmap与Nmap-service中的相应表达式进行匹配,识别对对应的服务协议,如http、ssh等,包括对应的应用程序名如Apache、OpenSSH等,然后Nmap会继续探索版本号、主机名、设别类型、操作系统。在操作系统层面,Nmap可以识别出具体的版本,如WindowsXP,Windows7,Windows8、Windows10、Windows2003等,Nmap会对无法确定的版本会给出每一个版本的几率让用户去参考辨别,确定了操作系统的版本后就可以使用历史漏洞进行渗透测试。

2.3防火墙与IDS

防火墙是一个位于计算机和它所连接的网络之间的软件。计算机流入流出的所有网络通信都要经过防火墙,防火墙对流经它的网络通信数据进行扫描,能够过滤攻击报文。防火墙还可以关闭不使用的端口、禁止特定端口的流出通信、封锁特洛伊木马,还可以进出来自特殊站点的访问,从而防止来自不明入侵者的所有通信。
IDS是英文(Intrusion Detection Systems)的缩写,中文意思为入侵检测系统。即依照一定的安全策略,通过硬件、软件对网络和系统的运行状况进行监视,尽可能的发现各种攻击的企图、攻击行为或者攻击结果,以保证网络系统信息的机密性、完整性、和可用性。
IDS系统包括信息收集、信息分析和响应单元三个组成功能部件,在IDS运行时,第一步是在计算机网络系统中的若干不同关键点中收集信息,包括收集系统、网络、数据以及用户活动的状态和行为等。第二步是使用信息匹配、统计分析和完整性分析等方式对信息进行分析。对信息进行分析后,再根据IDS中的策略决定是否响应,响应方式包括简单报警、切断用户、封锁用户和改变文件属性等。
Nmap提供了强大的防火墙/IDS逃逸功能,通过使用不同的功能指令,可以实现如的各种方式的防火墙IDS绕过功能。

2.4渗透测试

渗透测试是通过模拟恶意黑客的攻击方法,来评估计算机网络系统安全的一种评估方法。这个过程包括对系统的任何弱点、技术缺陷或漏洞的主动分析,这个分析是从一个攻击者可能存在的位置来进行的,并且从这个位置有条件主动利用安全漏洞。Nmap上提供了很多渗测试功能模块,例如MySQL数据库渗透测试、列举MySQL变量、检查审计MySQL密码、审计SMB口令、口令暴力破解等。

Nmap功能模块源码分析

3.1 代码分析:

Nmap使用C语言和C++混合编写而成,在nmap.org官方网址上最新下载的Nmap源代码数据包,下载地址链接是https://nmap.org/dist/nmap-7.60.tar.bz2,最新Nmap版本号为7.60,打开文件可以看到,大部分都是C语言和C++文件。


通过对源代码进行总体的查看分析可知,Nmap中重要的几个文件如下:
**Nmap_main.cc:**Nmap中真正的main函数入口,包含着重要的启动和初始化代码和工作流程。
FingerPrintResults.cc:用来保存扫描的结果,例如开放的端口数、匹配到的操作系统类型和匹配的精确度等等。
NmapOps.cc:用来控制Nmap的命令行用户接口和Nmap整个操作的全局变量和整个程序的选项开关,例如使用的扫描方式、是否探测操作系统类型、是否使用欺骗地址和欺骗地址的数目以及延迟时间等。例如在NmapOps.cc中第353行开始的代码如下:

bool NmapOps::SCTPScan() {return sctpinitscan|sctpcookieechoscan;
}
bool NmapOps::TCPScan() {return ackscan|bouncescan|connectscan|finscan|idlescan|maimonscan|nullscan|synscan|windowscan|xmasscan;
}
bool NmapOps::UDPScan() {return udpscan;
}bool NmapOps::RawScan() {if (ackscan||finscan||idlescan||ipprotscan||maimonscan||nullscan||osscan||synscan||udpscan||windowscan||xmasscan||sctpinitscan||sctpcookieechoscan||traceroute)return true;

其中各个参数如ackscan、finscan、idlescan、bouncescan的值决定了扫描的选项开关。
Target.cc:用于对要扫描的目标主机的实例化,通过Target类来保存主机的各种信息,例如IP地址,端口开放信息和操作系统信息等。

3.2 Nmap的整体工作流程


通过对Nmap的源代码进行分析,发现程序的入口是mian.cc文件里的main函数,从135行开始:

int main(int argc, char *argv[]) {/* The "real" main is nmap_main().  This function hijacks control at thebeginning to do the following:3) Check the environment variable NMAP_ARGS.2) Check if Nmap was called with --resume.3) Resume a previous scan or just call nmap_main.*/char command[2048];int myargc;char **myargv = NULL;char *cptr;int ret;int i;set_program_name(argv[0]);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if ((cptr = getenv("NMAP_ARGS"))) {if (Snprintf(command, sizeof(command), "nmap %s", cptr) >= (int) sizeof(command)) {error("Warning: NMAP_ARGS variable is too long, truncated");}/* copy rest of command-line arguments */for (i = 1; i < argc && strlen(command) + strlen(argv[i]) + 1 < sizeof(command); i++) {strcat(command, "");strcat(command, argv[i]);}myargc = arg_parse(command, &myargv);if (myargc < 1) {fatal("NMAP_ARG variable could not be parsed");}ret = nmap_main(myargc, myargv);arg_parse_free(myargv);return ret;}if (argc == 3 && strcmp("--resume", argv[1]) == 0) {/* OK, they want to resume an aborted scan given the log file specified.Lets gather our state from the log file */if (gather_logfile_resumption_state(argv[2], &myargc, &myargv) == -1) {fatal("Cannot resume from (supposed) log file %s", argv[2]);}return nmap_main(myargc, myargv);}return nmap_main(argc, argv);
}

Main.cc中的main函数的主要功能是判断当前模式是否为交互模式,如果不是,则构造与命令行相同的char** myargv与intmyargc变量,作为参数传给真正的nmap_main(nmap_main在另一个文件nmap.cc中)。如果是交互模式,就分析每次的命令,建立一个过程来执行nmap_main,从main.cc中171行到200行的代码中可以看到相应的实现:

 if ((cptr = getenv("NMAP_ARGS"))) {if (Snprintf(command, sizeof(command), "nmap %s", cptr) >= (int) sizeof(command)) {error("Warning: NMAP_ARGS variable is too long, truncated");}/* copy rest of command-line arguments */for (i = 1; i < argc && strlen(command) + strlen(argv[i]) + 1 < sizeof(command); i++) {strcat(command, "");strcat(command, argv[i]);}myargc = arg_parse(command, &myargv);if (myargc < 1) {fatal("NMAP_ARG variable could not be parsed");}ret = nmap_main(myargc, myargv);arg_parse_free(myargv);
    return ret;}if (argc == 3 && strcmp("--resume", argv[1]) == 0) {/* OK, they want to resume an aborted scan given the log file specified.Lets gather our state from the log file */if (gather_logfile_resumption_state(argv[2], &myargc, &myargv) == -1) {fatal("Cannot resume from (supposed) log file %s", argv[2]);}
    return nmap_main(myargc, myargv);}
  return nmap_main(argc, argv);
}

在nmap.cc文件中,nmap_main首先会分析各种参数是否出现错误,如果有则返回错误信息,如果参数正确就在NmapOps全局里设置相应的成员,根据命令行参数从nmap-services文件中搜索端口扫描的相关信息。接着程序会判断有无可用的物理接口用来发送数据包,利用shortfry函数可以将扫描的端口列表打乱顺序,然后对每一个需要扫描的目标根据扫描的类型,调用相应的函数。在nmap.cc中726行开始的代码显示:
while((arg=getopt_long_only(argc,argv,”6Ab:D:d::e:Ffg:hIi:M:m:nO::o:P:p:qRrS:s:T:Vv::”, long_options, &option_index)) != EOF) {……}
意思是在while循环中设置判断开始接续命令行参数,根据解析出的结果对相应的变量进行设置。从程序的727行开始到1437行是一个大的switch结构,其中case的情况有0,4,6(IPv6),b(bouncescan),F(fastscan)等等,对应着判断不同的扫描模式。
从程序的1987行代码开始到1999行:

if (o.randomize_ports) {if (ports.tcp_count) {shortfry(ports.tcp_ports, ports.tcp_count);// move a few more common ports closer to the beginning to speed scanrandom_port_cheat(ports.tcp_ports, ports.tcp_count);}if (ports.udp_count)shortfry(ports.udp_ports, ports.udp_count);if (ports.sctp_count)shortfry(ports.sctp_ports, ports.sctp_count);if (ports.prot_count)shortfry(ports.prots, ports.prot_count);}

意思是Nmap将端口顺序打乱,在将TCP端口打乱后会调用random_port_cheat(ports.tcp_ports, ports.tcp_count)将一些常用的端口移到前面以加快扫描速度。
在程序的2041行开始代码如下:

do {ideal_scan_group_sz = determineScanGroupSize(o.numhosts_scanned, &ports);
……

在程序的2272行到2278行的代码如下:

 while (!Targets.empty()) {currenths = Targets.back();delete currenths;Targets.pop_back();}o.numhosts_scanning = 0;} while (!o.max_ips_to_scan || o.max_ips_to_scan > o.numhosts_scanned);

程序将命令行参数中目标主机IP地址的字符串读入o.numhosts_scanned数组中,用determineScanGroupSize()函数给一个名为ideal_scan_group_sz的变量复制,字符串的个数要小于o.max_ips_to_scan的值。如果命令行参数给出的字符串个数大于这个数值,则剩下的字符串留着以后读入。2278行的

while(!o.max_ips_to_scan || o.max_ips_to_scan > 

o.numhosts_scanned);语句,其前面的do{……}循环体是整个程序的主体核心部分,端口扫描的执行工作都在这个循环中完成。当已经扫描过的主机数大于o.max_ips_to_scan这个值时,循环结束,扫描过程结束。
在2041行的以下代码:

 ideal_scan_group_sz = determineScanGroupSize(o.numhosts_scanned, &ports);while(Targets.size() < ideal_scan_group_sz) {o.current_scantype = HOST_DISCOVERY;currenths = nexthost(hstate, &exclude_group, &ports, o.pingtype);if (!currenths) break;

本段代码用于确定 ideal_scan_group_sz 的值,这个值指定一次扫描行为涉及的最多的主机数。并将ideal_scan_group_sz 这个数的值放进一个名为Targets的vector

currenths = nexthost(&hstate, &exclude_group, &ports, o.pingtype);

从前面创建的hstate中可以读出下一个主机,用Target类来描述。在2047行的代码中对currenths不为0(即主机都已处理完毕)的情况做了处理:
if (!currenths) break;
hstate中的地址字符串组记录了它所持有的主机数量,其形式为{“192.168.5.0/24”,“166.110.0.0/16”},如果currenths指向的下一个host返回空指针,说明hstate包含的主机都已经被处理过了,这时候程序跳出循环,读入命令行参数中剩下的地址字符串。
第2053到2079行:

if ((o.noportscan && !o.traceroute
#ifndef NOLUA
&& !o.script
#endif) || o.listscan) {/* We're done with the hosts */if (currenths->flags & HOST_UP || (o.verbose && !o.openOnly())) {xml_start_tag("host");write_host_header(currenths);printmacinfo(currenths);//  if (currenths->flags & HOST_UP)//  log_write(LOG_PLAIN,"\n");printtimes(currenths);xml_end_tag();xml_newline();log_flush_all();}delete currenths;o.numhosts_scanned++;if (!o.max_ips_to_scan || o.max_ips_to_scan > o.numhosts_scanned + Targets.size())continue;elsebreak;}

当o.noportscan等于0时,说明没有剩余的地址字符串了,于是也没有更多的主机可添加了,所以跳出if执行2133行的代码:

Targets.push_back(currenths);

然后回到2044行的while{…}循环创建新的currenths对象:

currenths = nexthost(&hstate, &exclude_group, &ports, o.pingtype);

代码的意思是尝试从这个新的对象中读取下一个主机,如果失败(没有主机),也认为没有更多的主机了,于是也跳出循环。如果是Target容器中已经有了主机,比较从当前这个主机读到的接口是否和已有的主机一样,如果不一样,就不加入这个主机,把主机留到下一处理,并停止增加下一主机。
代码从第2120行到2130行:

 if (!currenths->deviceName())fatal("Do not have appropriate device name for target");/* Hosts in a group need to be somewhat homogeneous. Put this host inthe next group if necessary. See target_needs_new_hostgroup forthedetails of when we need to split. */if (Targets.size() && target_needs_new_hostgroup(&Targets[0], Targets.size(), currenths)) {returnhost(&hstate);o.numhosts_up--;break;}

如果顺利读到了下一个主机,把它加入这一批要处理的容器中,对应代码在第2133行:
Targets.push_back(currenths);
在循环结束之后,检查 Targets 容器中是否有主机,在2136行的代码:

if (Targets.size() == 0)break; /* Couldn't find any more targets */

如果容器大小为 0,说明再没有剩下未被处理的主机了,则接着执行后面的语句。在得到了一个非空的 Targets 之后,便开始真正的扫描。从2149行开始:

if (!o.noportscan) {// Ultra_scan sets o.scantype for us so we don't have to worryif (o.synscan)ultra_scan(Targets, &ports, SYN_SCAN);if (o.ackscan)ultra_scan(Targets, &ports, ACK_SCAN);if (o.windowscan)ultra_scan(Targets, &ports, WINDOW_SCAN);if (o.finscan)ultra_scan(Targets, &ports, FIN_SCAN);if (o.xmasscan)ultra_scan(Targets, &ports, XMAS_SCAN);if (o.nullscan)ultra_scan(Targets, &ports, NULL_SCAN);if (o.maimonscan)ultra_scan(Targets, &ports, MAIMON_SCAN);if (o.udpscan)ultra_scan(Targets, &ports, UDP_SCAN);if (o.connectscan)ultra_scan(Targets, &ports, CONNECT_SCAN);if (o.sctpinitscan)ultra_scan(Targets, &ports, SCTP_INIT_SCAN);if (o.sctpcookieechoscan)ultra_scan(Targets, &ports, SCTP_COOKIE_ECHO_SCAN);if (o.ipprotscan)ultra_scan(Targets, &ports, IPPROT_SCAN);/* These lame functions can only handle one target at a time */if (o.idlescan) {for (targetno = 0; targetno < Targets.size(); targetno++) {o.current_scantype = IDLE_SCAN;keyWasPressed(); // Check if a status message should be printedidle_scan(Targets[targetno], ports.tcp_ports,ports.tcp_count, o.idleProxy, &ports);}}if (o.bouncescan) {for (targetno = 0; targetno < Targets.size(); targetno++) {o.current_scantype = BOUNCE_SCAN;keyWasPressed(); // Check if a status message should be printedif (ftp.sd <= 0)ftp_anon_connect(&ftp);if (ftp.sd > 0)bounce_scan(Targets[targetno], ports.tcp_ports, ports.tcp_count, &ftp);}}if (o.servicescan) {o.current_scantype = SERVICE_SCAN;service_scan(Targets);}}

是否进行某种类型的扫描由参数来决定,所以可以看到,扫描的方式是按顺序完成的,并且utral_scan()函数每次只能处理一个target。接下来便是对每个得到的目标的分析结果进行日志记录,代码从2227行开始。

 for (targetno = 0; targetno < Targets.size(); targetno++) {currenths = Targets[targetno];/* Now I can do the output and such for each host */if (currenths->timedOut(NULL)) {xml_open_start_tag("host");xml_attribute("starttime", "%lu", (unsigned long) currenths->StartTime());xml_attribute("endtime", "%lu", (unsigned long) currenths->EndTime());xml_close_start_tag();write_host_header(currenths);xml_end_tag(); /* host */xml_newline();log_write(LOG_PLAIN, "Skipping host %s due to host timeout\n",currenths->NameIP(hostname, sizeof(hostname)));log_write(LOG_MACHINE, "Host: %s (%s)\tStatus: Timeout\n",currenths->targetipstr(), currenths->HostName());} else {/* --open means don't show any hosts without open ports. */if (o.openOnly() && !currenths->ports.hasOpenPorts())continue;xml_open_start_tag("host");xml_attribute("starttime", "%lu", (unsigned long) currenths->StartTime());xml_attribute("endtime", "%lu", (unsigned long) currenths->EndTime());xml_close_start_tag();write_host_header(currenths);printportoutput(currenths, &currenths->ports);printmacinfo(currenths);printosscanoutput(currenths);

最后就是清除并释放 Targets 中的内容,准备接收下一批主机,从2271行到2276行:

 /* Free all of the Targets */while (!Targets.empty()) {currenths = Targets.back();delete currenths;Targets.pop_back();}

4.Nmap在端口扫描中的应用

通过之前对Nmap源代码的简单分析,我们得知了它的大概工作流程和原理,在实际使用中,Nmap通过提供强大详细的语法规则和各种选项,能提供给用户多种端口扫描的选择,通过详细解析每条指令的意义以及当指令使用时Nmap的工作原理,就能对Nmap的实际使用有更深的了解。
在命令形式下,Nmap提供了多样的端口扫描指令,Nmap中提供了很多扫描方式,端口扫描中最主要的扫描方式就是Ping扫描方式。
指令选项如下图所示:

1.-sP
在Nmap指令中加入-sP选项用以启动Ping扫描,使用-sP选项时Nmap仅进行Ping扫描,显示做出回应的主机。在Ping扫描过程中,Nmap会发送一个ICMP报文的回声请求(Echo)和一个TCP报文到目标端口。Ping扫描的优点是返回信息简单,扫描速度快。
2.-PO
在防火墙禁止Ping的情况下,Nmap提供了无Ping扫描的功能,通过无Ping扫描能够确认正在运行的目的主机。在默认情况下,Nmap只对正在运行的主机进行高强度的探测(端口扫描、版本探测和操作系统探测等),在Nmap中使用-PO指令进行主机发现,Nmap会对每一个指定的目标IP地址进行所要求的扫描,并能穿透防火墙,避免防火墙的探测。在-PO模式下,使用形如nmap –PO 【协议编号】【目标】的指令。Nmap在默认情况下会使用协议1、协议2、协议4,Nmap支持的协议编号如下:
①TCP对应编号:6
②ICMP对应编号:1
③IGMP对应编号:2
④UDP对应编号:17
3.-PS
Nmap中的-PS选项用于TCP SYN Ping扫描,根据前文所介绍,通过利用TCP协议的三次握手性质,在-PS模式中Nmap发送一个设置了SYN标志位的空TCP报文,默认端口为80,在Nmap源代码中也可以通过改变nmap.h头文件中的DEFAULT-TCP-PROBE-PORT的值进行配置,同时可以使用-pS 80,81,20,22,114,8000形式的用逗号隔开端口的指令进行扫描,此时每个端口都会被并发地扫描。默认情况下Nmap默认Ping扫描使用TCP ACK和ICMP Echo进行扫描。Nmap在-PS模式中通过SYN/ACK和RST响应来对目标主机是否存活进行判断。
4.-PA
很多防火墙都会封锁SYN报文,所以Nmap还提供了TCP ACK Ping扫描方式,能极大的提高通过防火墙的概率。-pA选项时Nmap的TCP ACK Ping扫描功能,TCP ACK扫描与TCP SYN扫描类似,不同之处在于设置的TCP标志位是ACK,使用这种方式的扫描可以探测阻止SYN包或ICMP Echo请求的主机。
5.-PU
使用-PU选项时Nmap会发送一个空的UDP报文到指定的端口,默认为20125,同样的改变在nmap.h中的DEFAULT-PROBE-PORT的值可以更改默认配置。使用UDP Ping扫描时Nmap会发送一个空的UDP报文到目标主机,如果目标主机不是存活状态则会返回各种ICMP的错误信息。
6. -PE;-PP;-PM
-PE;-PP;-PM是Nmap ICMP Ping Types扫描选项。ICMP(Internet Control Message Protocol)是Internet控制报文协议,属于TCP/IP协议,用于在IP主机、路由器之间传递控制消息,控制消息的内容包含网络是否可通、主机是否可达、路由是否可用等网络本身的消息。在Nmap ICMP Ping Types模式中,Nmap会发送一个ICMP type8(回声请求)报文到目标IP地址,并从运行的主机得到一个type0(回声响应)报文。
-PE选项下,Nmap向目标发送ICMP Echo数据包来探测目标主机是否在线。
-PP选项是ICMP时间戳Ping扫描,当大多数主机的防火墙不允许ICMP Echo请求时,由于配置不当可能会回复ICMP时间戳请求,所以可以使用ICMP时间戳来确定目标主机是否存活。
-PM选项可以进行ICMP地址掩码的Ping扫描,这种扫描方式会试图使用备选的ICMP等级Ping指定主机,通常会有显著的穿透防火墙的效果。使用格式为 nmap –PE/PP/PM –v 【IP地址】
7.-PR
Nmap同时提供了在局域网中使用的扫描选项,-PR是Nmap的ARP Ping扫描选项。ARP(Address Resolution Protocol)是根据IP地址获取主机物理地址(MAC地址)的一个TCP/IP协议,其功能是,主机发送ARP请求广播到网络内的所有主机,并接收返回消息,确认目标IP地址主机的物理地址,同时将IP地址与对应的物理地址保存在主机的ARP缓存中,下次请求时直接从ARP缓存里查询。Nmap的ARP扫描是对目标进行一个ARP Ping的过程,在内网的情况下,使用ARP Ping扫描方式有很高的效率,一般在本地局域网中防火墙不会禁止ARP请求,这使得它比其他方法的Ping扫描更有效,在默认情况下,如果Nmap判断出目标主机在自己的局域网上,会对其进行ARP扫描。即使指定了不同的Ping选项类型,Nmap依然会对任何相同局域网上的目标主机使用ARP扫描。要关闭ARP默认扫描功能,可以使用–send-ip指令。
8.-sL
-sL是Nmap中的列表扫描方式,列表扫描是Nmap主机发现功能的退化形式,它仅仅列出指定网络上的美态主机,不发送任何报文给目标主机。默认情况下,Nmap仍然会对主机进行反向域名解析以获取它们的名字。
9.-n
Nmap的-n选项为禁止DNS反向解析,即在使用此选项时Nmap不对目标IP地址作反向域名解析。当单纯扫描一段IP时,使用该选项可以大幅减少目标主机的响应时间,从而提供扫描速度。
10.-R
-R是Nmap的反向解析域名选项,使用时Nmap会对扫描的IP地址作反向域名解析,该选项多用于绑定域名服务器的服务主机上,可以了解目标的详细信息。
11. –system-dns
–system-dns是Nmap的使用系统域名解析器的选项,默认情况下,Nmap通过直接发送查询到主机上配置的域名服务器来解析域名。
12.-6
-6选项是Nmap用于扫描IPv6地址时的选项。IPv6是Internet Protocol Version6的缩写,IPv6是IETF(Internet Engineering Task Force,互联网工程任务组)设计的用于替代现行IP协议版本(IPv4)的协议。随着互联网的不断发展和扩张,IPv4地址将不够使用,取而代之的是IPv6地址的广泛使用。
13. –traceroute
–traceroute是Nmap的路由跟踪选项,使用路由跟踪功能可以帮助用户了解网络的通信情况,通过traceroute选项可以轻松查出从本计算机到目标计算机之间所经过的网络节点,并且可以看到通过各个节点的时间。
14. -PY
最后一个选项是-PY,Nmap中的SCTP INIT Ping扫描选项,SCTP是(Stream Control Protocol)的缩写,意义为流控制协议,是IETF在2000年定义的一个传输层协议,在SCTP INIT Ping模式中,通过向目标发送INIT包,根据主机的响应判断主机是否存活。
在端口扫描中,除了Ping扫描,Nmap还提供了更多的扫描方式和选项,其语法如下图所示:

使用Nmap进行端口扫描时,Nmap会反馈通过扫描收集到的信息,从反馈回来的信息可以更进一步判断端口的情况,在Nmap对端口状态的描述有6个状态分别别是:Open(端口对外开放),Closed(端口关闭)、Filterd(当Nmap遇到防火墙或者路由器规则时,Nmap报文可能会被过滤从而无法到达目标端口,Nmap无法怕断端口是否开放)、Unfiltered(端口未被过滤,但Nmap未能判断端口是开放状态还是关闭状态,当使用Nmap进行ACK扫描时会呈现出这种状态)、Open|Filtered(端口是开放的或者过滤的,当Nmap发送的探测报文并未被目标端口响应时,可能是受到了一些专业设备的阻挡,但是又不是处于一个完全被过滤的状态)、Closed|Filtered(不能确定端口是关闭的还是被过滤的,一般只出现在IPID Idle扫描中)。
1.-T
-T指令是Nmap端口扫描中的时序指令,在此选项中可以通过设置不同的值调整扫描的速度和时序。通常的设置有
-T0:非常缓慢地扫描,用于逃避IDS检查。
-T1:缓慢扫描,用于逃避IDS检查。
-T2:降低速度以降低对带宽的消耗。
-T3:普通扫描,根据目标的反应自动调整时间。
-T4:快速扫描,需要在很好的网络环境下进行,请求可能会淹没目标。
-T5:极速扫描,通过牺牲准确度来提升扫描速度。
2.-p|-F
-p选项是最常用的Nmap端口扫描选项,可以通过形为nmap –p 【端口号】【IP地址】的方式指定要扫描的IP地址和端口范围。
-f选项可以快速地扫描端口,但不会扫描所有的端口只会扫描有限的端口,在Nmap中的map-services包含了默认扫描的端口,可以用–datadir选项指定自己的nmap-services文件。
3.-sS
TCP SYN扫描是Nmap的TCP端口扫描选项,-sS扫描方式是比较常用的一种扫描方式,这得益于它的扫描速度,在-sS模式下,平均一秒可以扫描上千个端口
4.-sT
-sT选项是Nmap的连接扫描,它用于当SYN扫描不能用的时候,连接扫描是TCP连接扫描,Nmap会在每个端口上完成三次握手,所以基本不会对主机进行泛红攻击而导致主机崩溃,所以TCP连接扫描是端口扫描中最基础也最稳定的扫描方式。但同时,TCP扫描会花费更长的时间,目标主机也可能会记录下连接。
5.-sU
-sU是Nmap的UDP扫描。Nmap使用UDP扫描时,通过发送空的UDP报文到达目的端口,UDP头没有任何数据,如果返回ICMP端口不可到达错误就可以认定该端口是关闭的,如果被响应了则可以认为该端口是开放的状态。UDP选项的缺点是速度相当的慢。
6. -sN;-sF;-sX
-sN;-sF;-sX是Nmap中的隐蔽扫描。-sN是NULL扫描,通过发送非常规的TCP数据包对计算机进行探测,NULL扫描扫描不会记录任何数据包,若目标主机的相应端口是关闭的,会响应一个rst数据包,若目标主机的端口是开放的则不会响应任何数据包。
-sF是FIN扫描,当使用TCP SYN扫描时可能会被目标主机的防火墙发现,防火墙会阻止SYN数据包,使用TCP FIN扫描方式会有很好的穿透效果。TCP FIN包不需要完成TCP握手,TCP FIN扫描就是向目标端口发送一个FIN包,如果收到目标的响应的rst包则说明端口是开放的,如果没有收到响应的rst包则说明端口是关闭的。
-sX是Xmas扫描,数据包的FIN、PSH、URG标记位置都会打开,标记为1。根据RFC 793协议规定,如果目标主机的端口是开放的则会返回一个RST标志包。Xmas扫描可以用来躲过一些无状态防火墙的过滤。
7.-sA
-sA是Nmap中的TCP ACK扫描,Nmap进行TCP ACK扫描时,扫描探测报文只设置ACK标志位。当扫描未被过滤的系统时,开放的和关闭的端口都会返回RST报文,Nmap会把它们标记为unfiltered,所以无法确定是开放的还是关闭的,不响应的端口或发送特定的ICMP错误消息的端口都会被标记为unfiltered。
8.-sW
-sW是Nmap中的TCP 窗口扫描,使用-sW选项时,原理与ACK扫描基本一致,通过检查返回的RST报文的TCP窗口域来判断目标端口是否开放。
9.-sM
-sM是Nmap的TCP Maimon扫描,Maimon扫描是由它的发现者Uriel Maimon命令的,Maimon扫描与NULL、FIN和Xmas扫描完全一样,除了探测报文是FIN/ACK外。根据RFC 793中的规则,无论端口是否开放,都应该对这样的探测报文进行RST响应。
10. –scanflags
–scanflags是Nmap中的自定义TCP扫描选项,该选项可以指定任意的TCP标志位来进行扫描,选项可以是一个数字标记值如9(PSH和FIN)或者直接使用字母组合,如URG、ACK、PSH等。使用形式如nmap -sT –scanflags SYNPSH 192.168.5.129。
11.-sI
-sI是Nmap的空闲扫描,它允许进行端口完全欺骗扫描,可以使攻击者能够不使用自己的IP向目标主机发送数据包,并可以利用不活跃的僵尸主机反弹给攻击者一个旁通信道从而进行端口扫描。IDS会把不活跃的见识主机当做攻击者,这是一种很好的隐蔽的扫描方法。
12.-sO
-sO是Nmap的IP协议扫描,使用该选项时,Nmap会确定目标端口的协议类型。
13.-b
-b选项时Nmap的FTP Bounce Scan扫描,使用该选项时,Nmap会允许用户连接到一台FTP服务器,然后要求文件送到一台第三方服务器,这是一种可以躲避防火墙的可靠方法。
总结
在Nmap的端口扫描模块的设计与实现中,TCP扫描是最基本的扫描方式。在TCP connect()扫描中,Nmap首先创立TCP流式套接字,向目标主机发送请求,完成对一个端口的一次全连接扫描。
在SYN、FIN、Xmas和NULL扫描中,Nmap的实现原理都基本互相相同,都向目标主机发送一个设置了TCP首部flag标志位的数据包,然后查看目标主机返回的应答报文信息。
IP分片扫描是以TCP SYN、FIN、Xmas和NULL扫描为基础来实施的,Nmap通过将数据包分为两个较小的IP段来逃避过滤设备的检查,增加了扫描的隐蔽性。
UDP端口扫描则使用UDP协议,FTP扫描利用了FTP协议具有支持代理FTP连接的特点,通过与目标主机的FTP协议解析器连接来对目标主机进行扫描。

5.Nmap指纹识别与探测

Nmap提供了强大的指纹识别与探测功能,包含了很多的操作系统探测技术,Nmap中定义了一个模板数据结构对指纹进行描述。新的指纹可以很容易地以模板的形式加入,所以一直以来Nmap 的指纹数据库不断增长,它能识别的操作系统也越来越多。通过使用不同的指令能够探测出目标主机的详细信息,在指纹识别与探测中使用的命令如下表:

1.-sV
使用-sV选项可以开启版本探测,使用该选项时,Nmap通过相应的端口对应相应的服务,根据服务指纹识别出相应的版本。使用-sV选项时需要注意的时,对于获得的结果并不绝对可靠,因为Nmap并不能绝对识别出某些软件的伪装。
2. –allports
使用–allports可以启用Nmap的全段版本探测功能,Nmap会扫描除了9100以外的所有TCP端口。
3. –version-intensity
–version-intensity是Nmap的设置扫描强度的选项,在使用Nmap进行扫描的时候,Nmap会发送一系列探测报文,–version-intensity选项可以为每个报文赋予1~9之间的值,被赋予较低值的探测报文对大范围的常见服务有效,而被赋予较高值的报文一般没有实际作用。强度水平说明了应该使用哪些探测报文,当被赋予的值越高,服务越有可能被正确识别,但是这些也会牺牲相当长的一段时间,强度的取值必须在0~9之间,默认的强度是7。
4. –version-light
–version-light是Nmap中轻量级扫描的选项,它是在–version-intensity中对应的version-intensity=2的快捷方式,轻量级扫描会节省大幅的时间,但是同样会牺牲一部分准确性。
5. –version-all
–version-all是Namp中的重量级扫描,同理,-version-all对应的是-version-intensity=9的快捷方式。使用该选项可以用保证对每个端口尝试每个探测报文,这样会牺牲很多的时间,但是可以获得很高的准确性。
6. –version-trace
–version-trace,使用Nmap的version-trace可以获取详细的版本信息,也就是每个端口上运行的软件的详细版本信息。
7.-sR
-sR是Nmap的RPC扫描的选项,该选项通常与其它端口扫描选项结合使用,当Nmap使用这个选项时,它会对所有被发现开放的TCP/UDP端口执行SunRPC程序NULL命令,来试图确定它们是否为RPC端口,如果是RPC端口,则返回程序号和版本号。
8.-O
-O选项时Nmap的操作系统探测选项,操作系统探测基于TCP/IP协议栈fingerprinting指纹扫描,最常用的方法是利用TTL,即数据包的存活时间来进行操作系统的探测。TCP数据包相应探测根据不同操作系统对特定的TCP的不同反应来进行识别区分,ACK序列号也可以作为参考标准,不同的操作系统对ACK序列号的处理也不一样,也可以根据ICMP的响应进行识别。
9. –osscan-limit
–osscan-limit选项可以让Nmap对指定的目标进行操作系统检测,此时Nmap只对满足“具有打开和关闭的端口”条件的主机进行操作系统检测,这样可以大大提高效率。
10. –osscan-guess;–fuzzy
–osscan-guess;–fuzzy是Nmap推测系统识别的选项,使用此选项时,Nmap可以推测并识别操作系统,识别的结果不一定准确,当识别结果不准确的时候Nmap会从最接近的数据中去取值。
总结:
总的来说,Nmap提供了多种多样的指纹识别与探测方式。其中利用到的方法有:
FIN探测分组:Nmap发送一个FIN分组或者未设置ACK或SUN标志位的数据包到目标主机的一个打开的端口等待回应,不同的操作系统会对数据包有不同的处理和响应。
假标志位探测:Nmap在SYN分组的TCP头中设置未定义的标记(64或128),不同的操作系统会保持或者修复这个标记。
初始序列号采样:Nmap通过在操作系统对连接请求的回应中寻找TCP连接初始化序列号的特征来判断不同的操作系统。
不分片(DF)标志位检测:不同的操作系统对数据包中的DF设置值不尽相同,对DF的检测也可以作为识别依据。
TCP初始化窗口检测:Nmap检查返回数据包分组的窗口大小来判定不同的操作系统。
ACK值检测:不同的操作系统对ACK值域的实现和处理也有所不同,如向一个关闭的TCP端口发送一个FIN|PSH|URG包,许多操作系统会将ACK值设为ISN而Windows会将其设为seq+1。
ICMP错误信息抑制:不同的操作系统依据RFC 1812的规则建议,对某些类型的错误信息发送频率做了限制,通过这种检测可以识别操作系统。
更多的检测方法还有TCP选项检测、碎片处理、服务类型(TOS)检测、ICMP错误信息回射完整性和ICMP信息引用等检测方式,都是根据不同的操作系统会会对应各种属性做不同的处理而综合判断出操作系统的类型的。

6.Nmap防火墙IDS逃逸

通过灵活使用Nmap的功能和指令,能够避开防火墙和IDS的检查获取信息,甚至可以进行攻击,Nmap在防火墙IDS逃逸中使用到的指令如下表:

1.-f
-f选项可以实现报文分段功能,在使用-f选项时,Nmap会将TCP头分段分在几个包中,这样可以让IDS等其他入侵检测工具的分析更加困难。Nmap在IP头后会将包分为8个字节或更小,在面对禁止ICMP请求的主机时,使用报文分段的方法可以很好的逃避防火墙的检测。
2.-mtu
-mtu可以用来指定偏移大小,mtu为英文Maximum Transmission Unit(最大传输单元),通过设置此值可以决定TCP/IP的最大传输单元,使用指定的MTU可以达到逃逸防火墙和IDS的目的,但需要注意的就是设置最大传输单元时偏移量必须是8的整数倍。
3.-D
-D选项可以实现IP欺骗的功能,Nmap使用-D选项对目标进行扫描时,会使用伪造的IP地址,让目标主机误认为实在利用诱饵进行扫描,这样可以躲避防火墙和IDS的某些规则,同时也可以达到隐藏自身的目的。其语法是 nmap –D 【decoy1,decoy2…|RND:number】【目标】。RND可以随机生成number数量的IP地址,对目标进行扫描。需要注意的是,诱饵主机必须处于工作状态,否则会导致目标主机的SYN洪水攻击.。
4.-sI
-sI是Nmap的源地址欺骗选项,可以使用它来进行源地址欺骗。
5. –source-port
–source-port选项时Nmap中的源端口欺骗选项,使用指令时提供一个端口号,Nmap便可以从这些端口中发送数据,由于防火墙对服务器的设置会根据端口的不同来选择是否信任,利用源端口欺骗可以绕过防火墙的访问控制规则。
6. –data-length
–data-length是Nmap指定发包长度的选项,Nmap可以指定发送包的长度,通常TCP包是40个字节,ICMP Echo有28个字节所以在原来的报文的基础上附加随机数据可以达到避免防火墙的效果。
7. –randomize-hosts
–randomize-hosts是主机随机排序选项,Nmap可以对目标主机的顺序进行随机的排序,最多可以对8096个主机进行随机排序。
8. –spoof-mac
–spoof-mac是MAC地址欺骗指令,Nmap可以伪造MAC地址,使用—spoof-mac选项可以使用参数包括0、MAC Address、Vender Name。0表示随机生成一个MAC地址,MAC Addressi表示用户手动指定一个MAC 地址,Vendor Name表示从指定的厂商生成一个MAC地址。

7.Nmap在渗透测试的使用

7.1 Nmap在数据库渗透测试中的使用

Nmap作为一款强大的黑客工具,不仅可以提供端口扫描的功能,同时还可以用来进行渗透测试,在数据库安全中,Nmap也大有其用处,Nmap提供了用于渗透测试的多种脚本,在指令模式下就可以直接调用这些脚本命令,进行渗透测试。在数据库的渗透测试中,Nmap提供了一下几种主要脚本指令:

1.使用形如nmap –p1900 –script mysql-databases –script-args mysqluser=root,mysqlpass【目标】的指令可以进行数据库的列举。此时如果知道目标数据库的账号和密码就可以轻易夺取目标MySQL的所有数据库。可以使用-p参数指定相应的数据库端口,使用mysqluser指定目标数据库的账号,用mysqlpass指定目标数据库密码,如果密码为空不需要填写,最后要指向IP地址。
2.使用形如nmap –p1900 –script=mysql-variables【目标】的指令可以列举目标MySQL变量。
3.使用形如namp –p1900 –script=mysql-empty-password【目标】的指令可以检查目标MySQL服务的密码。当输入密码为空时,通常用来检查目标数据库是否为空密码或者是密码为root或者允许匿名登录。
4.使用形如namp –script=mysql-brute 【目标】的指令可以审计MySQL的密码。该脚本用于MySQL弱指令,默认Nmap会扫描全部的端口,用于查找MySQL端口,也可以使用-p选项指定一个端口,也可以自定义账号密码字典。
5.使用形如nmap –p1900 –script mysql-audit –script-args “myaql-audit.username=‘root’,\mysql-audit.password=”,mysql-audit.filename=‘nselib/data/mysql-cis.audit’”【目标】的指令可以审计MySQL的安全设置。Mysql-audit脚本用于对MySQL安全配置进行审计,-p指定目标端口,如果无法确定目标端口可以使用-sV选项进行端口扫描,mysql-audit.username选项指定的是目标数据库的账号,mysql-audit.password指定的是密码。
6.使用形如nmap –script oracle-brute –p1478 –script-args oracle-brute.sid=test【目标】的指令可以进行审计Oracle密码。其中oracle-brute脚本用于暴力破解Oracle的密码,使用-p指目标端口号。如果要自定义密码字典进行暴力破解,则需要使用userdb选项指定账号字典passsdb指向密码字典。
7.使用形如nmap –p1478 –script ms-sql-brute –script-args userdb=name.txt,passdb=pass.txt【目标】的指令可以审计msSQL密码。
8. 使用形如nmap –p1900 –script ms-sql-empty–password 【目标】的指令可以检查msSQL空密码。脚本的默认登录账号为sa。
9.使用形如nmap –p1900 –script ms-sql-tables –script-args mssql.username=sa,mssql.password=sa【目标】的指令可以读取msSQL数据
10.使用形如namp –p4869 –script ms-sql-xp-cmdshell –script-args mssql.username=sa,mssql.password=sa,ms-sql-xp-cmdshell.cmd=”ipconfig” 【目标】的指令可以借助msSQL来执行系统命令,开启后门cmdshell。
11.使用形如nmap -p 5432 –script pgsql-brute【目标】指令可以审计PgSQL密码。

7.2 Nmap的更多渗透测试功能

除了对数据库进行渗透测试之外,Nmap还有其他各个方面的渗透测试功能,包括审计HTTP身份认证、FTP服务器、WordPress程序、Joomla程序、SMB口令等,在渗透测试中Nmap主要使用到的脚本语句结构如下图所示:

1.使用形如nmap –script http-brute -p80【目标】的指令可以对HTTP身份进行审计。其中http-brute脚本可以对HTTP协议中的username和password进行简单的暴力破解,使用-p参数来设置相关端口,当遇到比较复杂的密码破解时,此脚步可能无法满足要求。
2.使用形如nmap –script ftp-brute -p 21【目标】的指令可以审计FTP服务。ftp-brute脚本可以暴力破解FTP账号密码,通常需要设置一个账号密码字典进行破解,很多FTP服务器允许匿名登录,所以也可以使用此指令来检测目标主机的FTP服务是否可以匿名登录。
3.使用形为nmap -p80 –script http-wordpress-brute【目标】的指令可以进行WordPress密码的审计。http-wordpress-brute脚本可以很好地针对WordPress程序进行审计。
4.使用形为nmap -p80 –script http-joomla-brute【目标】的指令即可对目标Joomla程序进行账号密码的暴力破解。
5.使用形为nmap -p110 —script=pop3-brute【目标】的指令可以对目标的邮件服务器进行安全审计。使用pop3-brute脚本可以对邮件服务器进行审计,如果需要自定义字典则需要设置passdb、userdb两个相应的字典。
6.使用形如nmap –script smb-brute.nse -p455【目标】的指令可以对目标SMB服务进行口令审计。
7.使用形如nmap –script vnc-brute -p 5900【目标】的指令可以对目标的VNC服务器进行审计。
8.使用形如nmap -p 25 –script smtp-brute【目标】的指令可以审计 SMTP服务器。
SMTP是Simple Mail Transfer Protocol的缩写,即简单邮件传输协议,它是一组用于有源地址到目的地址传递邮件的规则,信件的中转方式由SMTP来控制。SMTP属于TCP/IP协议族,使用stmp-brute脚本可以对STMP服务器进行审计,发现其中的问题。
9.使用形如nmap –script stuxnet-detect -p 445【目标】的指令来检测sstuxnet蠕虫。Stuxnet蠕虫病毒(超级工厂病毒)是世界山首个专门针对工业设计系统编写的破坏性病毒,它能利用Windows、西门子SIMATIC WinCC系统的7个漏洞进行攻击。使用stuxnet-detect脚本能轻易发现Stuxnet蠕虫病毒,保障系统安全。
10. 使用形如nmap -sU -p161 –script=snmp-netstat【目标】的指令可以获取目标主机的网络连接状态。SNMP是简单网络管理协议,由一组网络管理的标准组成,包含一个应用层协议、数据库模型以及一组资源对象。该协议的主要作用是支持网络管理系统并用以检测连接到网络上的设备是否有任何引起管理上关注的情况。
同时,使用snmp-process脚本则可以通过SNMP服务协议枚举运行的系统进程;使用snmp-win32-services脚本可以获得Windows服务器的服务;使用snmp-brute脚本可以对目标服务器的snmp服务进行口令审计。

8.结语

Nmap作为端口扫描最流行的工具,不仅以独立软件的形式广泛地被安全人员与黑客们使用,同是也作为插件和功能被用于Matasploit等渗透测试软件、Kali Linux等Linux操作系统中。从1997年Nmap发布第一个版本以来,经过多年的发展、世界各个热心技术人员的共同开发,特别是2009年发布了5.00版后,Nmap从原来简单的网络连接端扫描软件变身成为了全方面的安全和网络工具组件。通过对Nmap从源代码到实际使用语法和底层原理各个方面的分析,我们由内而外地对Nmap进行了深入的了解,通过对作为GNUGPL经典开源项目的Nmap的源代码的分析,在代码和注释中深刻了解到了世界各地的开发人员为Nmap的改良做出的点点滴滴、积少成多的贡献,在了解Nmap的源代码基本框架和各类功能原理后,就能够根据自己的需求,对源代码进行更改、编译,开发最适合自己的版本。在网络安全层面,Nmap的各种功能背后都含有相当值得学习的网络原理,通过对Nmap的网络行为的分析,可以了解各种攻击类型和相应的防御方式,并进一步加深对TCP/IP网络协议的理解和计算机网络的掌握。在渗透测试中,Nmap也是一个强大的工具,Nmap的各种渗透测试功能模块和脚本,通过熟练的掌握,能很好地帮助对系统进行渗透测试和安全审计分析。
网络在不断发展,相关的技术也在不断进步,但Nmap作为网络扫描组件工具的开山鼻祖与中流砥柱,其自身的价值不会随着时间的流逝而消失,我们通过对Nmap进行分析,学习其基本的原理和思想,便能触类旁通举一反三,在分析其他相关的网络安全工具或进行渗透测试分析时也可以借鉴它的原理和思想。Nmap作为网络安全、渗透测试的学习,只是一个开端,我们在深刻了解Nmap的技术和思想的基础上,便如同踩在巨人之肩,对Nmap的分析与学习将成为我们强劲的助力,帮助我们在以后跟随时代的发展不断地前行与进步。

参考文献

[1] 张琦. 操作系统指纹识别工具Nmap与Xprobe的分析和研究[J]. 科技传播,2010,(Z1):47-49.
[2] 杨明欣. Nmap和分布式扫描技术研究[A]. 中国电子学会工业工程分会、中国优选法统筹法与经济数学研究会工业工程分会及管理学分会、国际信息处理联合会中国委员会第五技术委员会、北京理工大学.全国第九届企业信息化与工业工程学术会议论文集[C].中国电子学会工业工程分会、中国优选法统筹法与经济数学研究会工业工程分会及管理学分会、国际信息处理联合会中国委员会第五技术委员会、北京理工大学:,2005:4.
[3] 魏锦慧 用于Nmap的攻击工具集的设计与实现[D].吉林大学,2006
[4] Nmap渗透测试指南 商广明 人民邮电出版社 中国工信出版集团
[5] 刘坤峰. 网管员常用安全工具软件之Nmap[N]. 中国电脑教育报,2004-02-23(F05).

Nmap扫描软件分析相关推荐

  1. Nmap学习4 - 主机发现 实验一

    Nmap学习4 - 主机发现 实验一 实验 实验1- nmap -sn 无端口扫描 局域网 广域网 实验2- nmap -Pn 无 Ping 扫描 实验3- nmap -PS -PA -PU -PY ...

  2. 网络空间技能大赛A模块(乱)

    A-1任务一 登录安全加固(Windows, Linux) 请对服务器Windows.Linux按要求进行相应的设置,提高服务器的安全性. 1.密码策略(Windows, Linux) a.最小密码长 ...

  3. 第二届全国技能大赛(世赛项目)福建省选拔赛 网络安全项目任务书

    第二届全国技能大赛(世赛项目)福建省选拔赛 网络安全项目任务书 A模块基础设施设置/安全加固(350分) A-1:登录安全加固(windows.linux) A-2:数据库加固(Linux) A-3: ...

  4. 2022年“网络安全”赛项湖南省赛选拔赛 任务书

    2022年"网络安全"赛项湖南省赛选拔赛 任务书 2022年"网络安全"赛项湖南省赛选拔赛 任务书 A模块基础设施设置/安全加固(200分) B模块安全事件响应 ...

  5. 2022年全国职业院校技能大赛(中职组)网络安全竞赛试题(9)(总分100分)

    赛题说明 一.竞赛项目简介 "网络安全"竞赛共分A.基础设施设置与安全加固:B.网络安全事件响应.数字取证调查和应用安全:C.CTF夺旗-攻击:D.CTF夺旗-防御等四个模块.根据 ...

  6. 2022年全国职业院校技能大赛(中职组)网络安全竞赛试题(2)

    2022年全国职业院校技能大赛(中职组) 网络安全竞赛试题 (2) (总分100分) 赛题说明 一.竞赛项目简介 "网络安全"竞赛共分A.基础设施设置与安全加固:B.网络安全事件响 ...

  7. 2021年全国职业院校技能大赛(中职组)网络安全竞赛试题(2)详解

    2021年全国职业院校技能大赛(中职组) 网络安全竞赛试题 (2) 环境可以私信博主获得 (总分100分) 赛题说明 一.竞赛项目简介 "网络安全"竞赛共分A. 基础设施设置与安全 ...

  8. 2021年中职组网络安全山东省赛“正式” 赛卷

    2021 年山东省职业院校技能大赛 中职组"网络安全" 赛项 竞赛题库 网络安全赛项专家组 2021 年 11 月 赛题说明 一. 竞赛时间安排与分值权重 二. 竞赛拓扑图 模块编 ...

  9. 2021 年山东省职业院校技能大赛中职组“网络安全” 赛项

    2021 年山东省职业院校技能大赛 中职组"网络安全" 赛项 竞赛题库 网络安全赛项专家组 2021 年 11 月 赛题说明 一. 竞赛时间安排与分值权重 二. 竞赛拓扑图 模块编 ...

最新文章

  1. Dropout, DropConnect ——一个对输出,一个对输入
  2. python 虚拟环境 mac,Mac下python 虚拟环境安装
  3. 下周开幕,给深圳的电子工程师准备的展会!
  4. Redis 常用操作命令,非常详细
  5. 简单的Gradle Java插件自定义
  6. vue/xx/事件监听,按键与键码值
  7. 三星Galaxy Z Fold3定档8月11日:售价预计将超1.5W
  8. 数据库事务必须具备的特性:ACID【转】
  9. tensorflow版PSENet 文本检测模型训练和测试
  10. ubuntu14.04中卸载cuda、cudnn
  11. Eclipse设置中文汉化
  12. IBM DB2百度云下载
  13. 用JSDoc生成js文档
  14. 纵横iGoogle工具世界的程序发明王
  15. 极限-反函数极限问题
  16. Excel|5个神技巧,提高你的数据分析效率~
  17. 高中信息技术计算机网络教案,信息技术 - 第八册计算机教案(全册)-四年级...
  18. 【Love2d从青铜到王者】第十三篇:Love2d之游戏:射击敌人(Game: Shoot the enemy)
  19. 批处理---findstr命令详解
  20. QT中获取选中的radioButton的两种方法

热门文章

  1. C#基础------常用软件官方下载
  2. 王道计算机组成原理第六章---总线总结
  3. Python数据清洗与可视化——北京租房数据统计分析05
  4. 计算机软考网络工程师难度大吗,国家软考的网络工程师与CCNP相比,哪个难?...
  5. Spring IoC和DI XML方式 注解方式 依赖注入 AOP面向切面
  6. 网络多媒体素材加工【1】
  7. KCNA考试 第五章:kubernetes学习实践
  8. odoo10 -- 请假模块
  9. 知星社:学会了什么?
  10. Android修改自己程序字体