nmap使用指南(终极版)

发表于:2017-10-09 17:11

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:hl0rey    来源:51Testing软件测试网采编

  一、目标指定
  1.CIDR标志位 192.168.1.0/24
  2.指定范围 192.168.1.1-255192.168.1-255.1(任意位置)
  3.IPv6地址只能用规范的IPv6地址或主机名指定。 CIDR 和八位字节范围不支持IPv6,因为它们对于IPv6几乎没什么用。
  -iL <文件名>
  主机名或者ip地址列表
  列表中的项可以是Nmap在 命令行上接受的任何格式(IP地址,主机名,CIDR,IPv6,或者八位字节范围)。 每一项必须以一个或多个空格,制表符或换行符分开。 如果您希望Nmap从标准输入而不是实际文件读取列表, 您可以用一个连字符(-)作为文件名。
  -iR <数量>
  随机选择一定数量的目标
  --exclude <主机名/地址>
  不包含的主机
  --excludefile <文件名>
  不包含的主机的列表
  二、主机发现
  1.如果没有给出主机发现的选项,Nmap 就发送一个TCP ACK报文到80端口和一个ICMP回声请求到每台目标机器。
  2.一个例外是ARP扫描用于局域网上的任何目标机器。对于非特权UNIX shell用户,使用connect()系统调用会发送一个SYN报文而不是ACK 这些默认行为和使用-PA -PE选项的效果相同。
  3.另外要注意的是即使您指定了其它 -P*选项,ARP发现(-PR)对于局域网上的 目标而言是默认行为,因为它总是更快更有效。
  -sL(列表扫描)
  列出给出目标的具体内容,默认会对地址进行反向解析,显示主机名。
  -sn(不进行端口扫描)
  与-sn一起完成的默认主机发现包括一个ICMP响应请求、TCP SYN到端口443、TCP ACK到端口80,以及一个ICMP的时间戳请求。
  在以前的Nmap中,-sn被称为-sP。-sP(Ping扫描)选项在默认情况下,发送一个ICMP回声请求和一个TCP报文到80端口。如果非特权用户执行,就发送一个SYN报文 (用connect()系统调用)到目标机的80端口。 当特权用户扫描局域网上的目标机时,会发送ARP请求(-PR), ,除非使用了--send-ip选项。 -sP选项可以和除-P0)之外的任何发现探测类型-P* 选项结合使用以达到更大的灵活性。 一旦使用了任何探测类型和端口选项,默认的探测(ACK和回应请求)就被覆盖了。
  -Pn(无ping)
  跳过主机发现阶段,把每个都IP当成存活主机。
  -P0 <协议号列表>(IP 协议 ping)
  一个较新的主机发现选项是IP协议ping,它将IP数据包发送到IP报头中指定的协议号。协议列表的格式与前面讨论的TCP、UDP和SCTP主机发现选项的端口列表相同。如果没有指定协议,默认的是为ICMP(协议1)、IGMP(协议2)和ipin-IP(协议4)发送多个IP数据包。默认的协议可以在编译时通过更改nmap.h中的默认proat探测端口规范来配置。注意,对于ICMP、IGMP、TCP(协议6)、UDP(协议17)和SCTP(协议132),数据包是用适当的协议标头发送的,而其他协议被发送时,除了IP报头之外没有附加的数据(除非有任何数据——数据字符串,或者——数据长度选项被指定)。
  -PS<端口列表>(TCP SYN Ping)
  1.该选项发送一个设置了SYN标志位的空TCP报文,默认端口为80。不同的端口可以作为选项制定(如 -PS22,23,25,80,113,1050,3500)
  2.SYN标志位告诉对方您正试图建立一个连接。 通常目标端口是关闭的,一个RST (复位) 包会发回来。 如果碰巧端口是开放的,目标会进行TCP三步握手的第二步,回应 一个SYN/ACK TCP报文。
  3.无论RST还是SYN/ACK响应都告诉Nmap该主机正在运行。然后运行Nmap的机器则会扼杀这个正在建立的连接, 发送一个RST而非ACK报文,ST报文是运行Nmap的机器而不是Nmap本身响应的,因为它对收到 的SYN/ACK感到很意外。
  -PA<端口列表>(TCP ACK Ping)
  1.ACK报文表示确认一个建立连接的尝试,但该连接尚未完全建立。 所以远程主机应该总是回应一个RST报文, 因为它们并没有发出过连接请求到运行Nmap的机器,如果它们正在运行的话。
  2.如果非特权用户尝试该功能, 或者指定的是IPv6目标,前面说过的connect()方法将被使用。 这个方法并不完美,因为它实际上发送的是SYN报文,而不是ACK报文。
  3.他的默认端口和修改方法跟-PS一致
  4.SYN探测更有可能用于这样的系统,由于没头没脑的ACK报文 通常会被识别成伪造的而丢弃。解决这个两难的方法是通过即指定 -PS又指定-PA来即发送SYN又发送ACK。
  -PU <端口列表>(UDP Ping)
  1.发送一个空的(除非指定了--data-length UDP报文到给定的端口。端口列表的格式和前面讨论过的-PS和-PA选项还是一样。 如果不指定端口,默认是31338。修改方法和-PA -PS一致
  2.如果目标机器的端口是关闭的,UDP探测应该马上得到一个ICMP端口无法到达的回应报文。 这对于Nmap意味着该机器正在运行。 许多其它类型的ICMP错误,像主机/网络无法到达或者TTL超时则表示down掉的或者不可到达的主机。 没有回应也被这样解释。如果到达一个开放的端口,大部分服务仅仅忽略这个 空报文而不做任何回应。这就是为什么默认探测端口是31338这样一个 极不可能被使用的端口。少数服务如chargen会响应一个空的UDP报文, 从而向Nmap表明该机器正在运行。
  -PR(ARP Ping)
  如果Nmap发现目标主机就在它所在的局域网上,它会进行ARP扫描。 即使指定了不同的ping类型(如 -PI或者 -PS) ,Nmap也会对任何相同局域网上的目标机使用ARP。 如果您真的不想要ARP扫描,指定 --send-ip。
  对于IPv6(-6选项),-PR使用ICMPv6的邻居发现而不是ARP。在RFC 4861中定义的邻居发现可以看作是IPv6等效的。
  --disable-arp-ping (No ARP or ND Ping)
  不使用ARP发现和ICMPv6邻居发现
  -PY <端口列表> (SCTP INIT Ping)
  1.一个SCTP INIT数据包,默认端口是80,如果要改变端口可以用如下形式: -PY22:-PY22,80,179,5060。注意PY和端口列表之间没有空格。
  2.SCTP INIT数据包表示本机想跟目标主机关联。一般情况下,目标主机的端口是关闭的,就会返回一个SCTP 数据包。如果目标主机端口是开放的,它就会回复一个SCTP INIT-ACK数据包。如果运行nmap的本机支持SCTP协议栈的话,本机会给目标主机回复一个SCTP ABORT数据包,而不是SCTP COOKIE-ECHO数据包,这个数据包是由系统内核发送的,因为他没有去向目标主机发起关联请求。
  3.本技术用于主机发现,所以不必关心端口是否开放,只要收到回复就可认为主机是存活的。
  4.在linux系统中,特权用户发送和接收raw SCTP数据包,非特权用户不支持这个扫描技术。
  -PE; -PP; -PM(ICMP Ping Types)
  -PE是ICMP echo请求
  时间戳和地址掩码查询可以分别用-PP和-PM选项发送。 时间戳响应(ICMP代码14)或者地址掩码响应(代码18)表示主机在运行。
  -n   不域名解析
  -R   所有IP做反向域名解析
  --system-dns    使用本机的dns服务器
  --dns-servers <server1,server2> (使用指定的dns服务器)
  如果指定dns服务器无法使用,则会转向使用本机配置的dns服务器
  三、端口状态
  open(开放的)
  应用程序正在该端口接收TCP 连接或者UDP报文。
  closed(关闭的)
  关闭的端口对于Nmap也是可访问的(它接受Nmap的探测报文并作出响应), 但没有应用程序在其上监听。
  filtered(被过滤的)
  由于包过滤阻止探测报文到达端口, Nmap无法确定该端口是否开放。
  unfiltered(未被过滤的)
  未被过滤状态意味着端口可访问,但Nmap不能确定它是开放还是关闭。
  open|filtered(开放或者被过滤的)
  当无法确定端口是开放还是被过滤的,Nmap就把该端口划分成 这种状态。
  开放的端口不响应就是一个例子。
  closed|filtered(关闭或者被过滤的)
  该状态用于Nmap不能确定端口是关闭的还是被过滤的。 它只可能出现在IPID Idle扫描中
  四、端口扫描技术
  -sS(TCP SYN扫描)
  半开放扫描,不打开一个完整的TCP链接
  它发送一个SYN报文,然后等待响应。 SYN/ACK表示端口在监听 (开放),而 RST (复位)表示没有监听者。如果数次重发后仍没响应, 该端口就被标记为被过滤。如果收到ICMP不可到达错误 (类型3,代码1,2,3,9,10,或者13),该端口也被标记为被过滤。
  -sT(TCP connect()扫描)
  Nmap通过创建connect() 系统调用要求操作系统和目标机以及端口建立连接,而不像其它扫描类型直接发送原始报文。 这是和Web浏览器,P2P客户端以及大多数其它网络应用程序用以建立连接一样的 高层系统调用。当Nmap连接,然后不发送数据又关闭连接, 许多普通UNIX系统上的服务会在syslog留下记录,有时候是一条加密的错误消息。
  -sU(UDP 扫描)
  1.UDP扫描用-sU选项激活。它可以和TCP扫描如 SYN扫描 (-sS)结合使用来同时检查两种协议。
  2.UDP扫描发送空的(没有数据)UDP报头到每个目标端口。 如果返回ICMP端口不可到达错误(类型3,代码3), 该端口是closed(关闭的)。 其它ICMP不可到达错误(类型3, 代码1,2,9,10,或者13)表明该端口是filtered(被过滤的)。 偶尔地,某服务会响应一个UDP报文,证明该端口是open(开放的)。 如果几次重试后还没有响应,该端口就被认为是 open|filtered(开放|被过滤的)。 这意味着该端口可能是开放的,也可能包过滤器正在封锁通信。 可以用版本扫描(-sV)帮助区分真正的开放端口和被过滤的端口。
  -sY(SCTP INIT scan)
  SCTP INIT扫描类似TCP SYN扫描,他也是打开一个半开的连接,而不是建立一个完整的SCTP关联。如果目标端口回复一个INIT-ACK数据包,则说明端口是开放的,如果回复一个ABORT数据包,端口是关闭的,如果没有回复,端口会被标记标记为被过滤,当然如果收到了ICMP不可达的消息(type 3, code 0, 1, 2, 3, 9, 10, or 13)也会被标记为被过滤。
  -sN; -sF; -sX (TCP Null,FIN,Xmas扫描)
  1.如果扫描系统遵循该RFC,当端口关闭时,任何不包含SYN,RST,或者ACK位的报文会导致 一个RST返回,而当端口开放时,应该没有任何响应。只要不包含SYN,RST,或者ACK, 任何其它三种(FIN,PSH,and URG)的组合都行。Nmap有三种扫描类型利用这一点:
  Null扫描 (-sN)
  不设置任何标志位(tcp标志头是0)
  FIN扫描 (-sF)
  只设置TCP FIN标志位。
  Xmas扫描 (-sX)
  设置FIN,PSH,和URG标志位,就像点亮圣诞树上所有的灯一样。
  2.除了探测报文的标志位不同,这三种扫描在行为上完全一致。 如果收到一个RST报文,该端口被认为是 closed(关闭的),而没有响应则意味着 端口是open|filtered(开放或者被过滤的)。 如果收到ICMP不可到达错误(类型 3,代号 1,2,3,9,10,或者13),该端口就被标记为 被过滤的。
  -sA (TCP ACK扫描)
  1.这种扫描与目前为止讨论的其它扫描的不同之处在于 它不能确定open(开放的)或者 open|filtered(开放或者过滤的))端口。 它用于发现防火墙规则,确定它们是有状态的还是无状态的,哪些端口是被过滤的。
  2.ACK扫描探测报文只设置ACK标志位(除非您使用 --scanflags)。当扫描未被过滤的系统时, open(开放的)和closed(关闭的) 端口 都会返回RST报文。Nmap把它们标记为 unfiltered(未被过滤的),意思是 ACK报文不能到达,但至于它们是open(开放的)或者 closed(关闭的) 无法确定。不响应的端口 或者发送特定的ICMP错误消息(类型3,代号1,2,3,9,10, 或者13)的端口,标记为 filtered(被过滤的)。
  -sW(TCP窗口扫描)
  在某些系统上,开放端口用正数表示窗口大小(甚至对于RST报文) 而关闭端口的窗口大小为0。因此,当收到RST时,窗口扫描不总是把端口标记为 unfiltered, 而是根据TCP窗口值是正数还是0,分别把端口标记为open或者 closed
  -sM(TCP Maimon扫描)
  探测报文是FIN/ACK。 根据RFC 793 (TCP),无论端口开放或者关闭,都应该对这样的探测响应RST报文。 然而,Uriel注意到如果端口开放,许多基于BSD的系统只是丢弃该探测报文。
  --scanflags (定制的TCP扫描)
  --scanflags选项可以是一个数字标记值如9 (PSH和FIN), 但使用字符名更容易些。 只要是URG, ACK,PSH, RST,SYN,and FIN的任何组合就行。例如,--scanflags URGACKPSHRSTSYNFIN设置了所有标志位,但是这对扫描没有太大用处。 标志位的顺序不重要。
  -sZ(SCTP COOKIE ECHO扫描)
  如果目标端口开放,则会丢弃之前没有发起关联请求的SCTP COOKIE ECHO数据包,如果端口是关闭的则会返回一个SCTP ABORT数据包。所以这个扫描技术,无法分辨过滤和开放,只能分辨出关闭的端口。
  --sI <僵尸主机地址:端口>(idlescan)
  1.这种高级的扫描方法允许对目标进行真正的TCP端口盲扫描 (意味着没有报文从您的真实IP地址发送到目标)。相反,side-channel攻击 利用zombie主机上已知的IP分段ID序列生成算法来窥探目标上开放端口的信息。
  2.如果您由于IPID改变希望探测zombie上的特定端口, 您可以在zombie 主机后加上一个冒号和端口号。 否则Nmap会使用默认端口(80)。
  -sO(IP协议扫描)
  IP 协议扫描可以让您确定目标机支持哪些IP协议 (TCP,ICMP,IGMP,等等)。从技术上说,这不是端口扫描 ,既然它遍历的是IP协议号而不是TCP或者UDP端口号。 但是它仍使用 -p选项选择要扫描的协议号, 用正常的端口表格式报告结果,甚至用和真正的端口扫描一样 的扫描引擎。因此它和端口扫描非常接近,也被放在这里讨论。
  -b <ftp relay host>(FTP弹跳扫描)
  1.FTP协议的一个有趣特征(RFC 959) 是支持所谓代理ftp连接。
  2.它允许用户连接到一台FTP服务器,然后要求文件送到一台第三方服务器。 这个特性在很多层次上被滥用,所以许多服务器已经停止支持它了。其中一种就是导致FTP服务器对其它主机端口扫描。 只要请求FTP服务器轮流发送一个文件到目标主机上的所感兴趣的端口。 错误消息会描述端口是开放还是关闭的。
  3.这是绕过防火墙的好方法,因为FTP服务器常常被置于可以访问比Web主机更多其它内部主机的位置。
  4.Nmap用-b选项支持ftp弹跳扫描。参数格式是 <username>:<password>@<server>:<port>。 <Server> 是某个脆弱的FTP服务器的名字或者IP地址。 您也许可以省略<username>:<password>, 如果服务器上开放了匿名用户(user:anonymous password:-wwwuser@)。 端口号(以及前面的冒号) 也可以省略,如果<server>使用默认的FTP端口(21)。
  五、端口扫描设置
  默认情况下,Nmap用指定的协议对端口1到1024以及nmap-services 文件中列出的更高的端口在扫描。
  -p <端口号,端口列表>
  1.制定扫描某个或某些端口用逗号分隔,或者用链接符号表示范围也可。
  2.对于-sO IP协议扫描,该选项用来指定协议号(0-255)。
  --exclede-ports <端口列表>(排除的端口)
  指定排除的端口,如果是指定排除的协议号的话,他的值在0-255之间
  -F(快速扫描)
  在nmap的nmap-services 文件中(对于-sO,是协议文件)指定您想要扫描的端口。 这比扫描所有65535个端口快得多。 因为该列表包含如此多的TCP端口(1200多),这和默认的TCP扫描 scan (大约1600个端口)速度差别不是很大。如果用--datadir选项指定小的nmap-services文件 ,差别会很大。
  -r(顺序扫描端口)
  默认情况下,Nmap按随机顺序扫描端口 (除了出于效率的考虑,常用的端口前移)。可以指定-r来顺序端口扫描。
  --port-ratio <ratio>
  扫描nmap-services中给出的目标的一定比例,这个值在1.0-0.0之间。
  --top-ports
  扫描nmap-services中的前多少个端口
  六.服务和版本扫描
  -sV(版本扫描)
  扫描服务版本,也可以用-A同时进行操作系统探测和版本扫描。
  --allports(版本扫描时,不排除任何端口)
  1.默认情况下,Nmap版本探测会跳过9100 TCP端口,因为一些打印机简单地打印送到该端口的 任何数据,这回导致数十页HTTP get请求,二进制 SSL会话请求等等被打印出来。
  2.这一行为可以通过修改或删除nmap-service-probes 中的Exclude指示符改变
  --version-intensity <强度>(版本扫描强度)
  强度在1到9之间,一般来说,强度越大,服务越有可能被正确识别
  --version-light
  相当于 --version-intensity 2
  --vension-all
  相当于 --version-intensity 9
  --version-trace
  打印出正在进行的版本扫描的详细信息
  七、操作系统探测
  -O (启用操作系统检测)
  也可以使用-A来同时启用操作系统检测和版本扫描。
  --osscan-limit
  只对至少知晓一个端口开放或者关闭的主机进行操作系统探测
  --osscan-guess;--fuzzy
  无法确定操作系统类型的时候,默认进行推测。但是使用这两项,会让猜测更加准确。
  --max-os-tries(操作系统识别重试次数)
  默认重试五次,

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号