那些年,我们一起用过的nmap

简要

nmap是我们最熟悉但同时又比较陌生的工具,为什么这样说呢?熟悉是因为我们都知道它是一个端口扫描工具,陌生是因为我们对它的功能了解还较为局限。实际上nmap的功能极为强大,接下来,让我们一起走进nmap之旅。

nmap初相识

记得我当时用nmap的时候常常就那么几个命令,最开始的时候甚至还不知道加什么选项,其实nmap是一块存在于我们身边的宝藏,等待有心人去发现它。

nmap主要功能有以下几种:

  • 主机发现
  • 端口扫描
  • 服务和版本探测
  • 操作系统探测
  • 防火墙/IDS躲避和欺骗
  • 漏洞探测
  • 数据库探测
  • 输出结果

接下来我将带领大家一起开启nmap奇妙之旅,打开nmap不为常人所知道的一面

nmap初探险

主机发现

任何时候,一次渗透测试都要从信息收集开始,而主机存活与否的探测又是重中之重。nmap主机发现支持多种扫描方式。

  • -sP(ping扫描):

    ping扫描可以说是最常见的一种主机发现探测方式。但是现在的服务器基本都开启了防ping,所以基本的ping扫描对于主机发现来说效果不如以前,但仍是一个最直接的方法。

  • -P0(无ping):

    nmap默认情况时只对存活的主机进行更高强度的探测,如端口探测,服务探测等。但如果使用了这个选项,那么nmap就会对自己设定的目标每个主机进行高强度探测,无论它存活与否

  • -PS(TCP SYN Ping):

    这个方式发送的是一个SYN标志位为空的TEP报文。那么nmap是如何根据返回结果来判断主机是否存活呢?由于再UNIX系统的主机上,只有root用户能发送和接收原始的TCP报文,所以实际过程中nmap会为每个主机建立一个connect()请求,如果返回成功或者返回一个ECONNREFUSED失败,则改主机被判定为存在。如果连接超时了,那么则判定改主机不在线。关于SYN包发送和接收的整个过程这里不再详述。

  • -PA(TCP ACK Ping):

    这个和上个选项类似,只不过这个选项设置的是TCP报文的ACK位。如果主机正在运行,并且收到了一个ACK,那么就会返回一个RST,进而就能判断主机存在。当SYN被防火墙阻挡时,可用这个选项,当然两个一起用效果更佳

  • -PU(UDP Ping):

    UDP扫描,原理就是发送一个空的UDP报文到目标的指定端口,默认是31338,如果目标机器的端口是关闭的,那么就能马上得到一个ICMP端口无法到达的回应报文,这样就可以判定主机存在。当然也存在误判的情况,比如TTL超时或者网络的确不可达,这个时候就没有回应了,那么也被识别为主机存在。大部分开放端口对这样一个UDP报文不进行回应。

  • -PE;-PP;-PM(ICMP Ping Types):

    -PE是ICMP回声请求ping查询,-PP是时间戳ping查询,-PM是地址掩码ping查询

  • -PR(ARP Ping):

    内网中最常用的一扫描,原理想必不用再详细阐述了

  • -n

    禁止DNS反向解析

  • -R

    反向解析域名

  • -system-dns

    只用系统域名解析器

  • -6

    扫描IPv6地址

  • -PY(SCTP INIT Ping扫描):

    向目标主机发送INIT包,通过响应包判断主机是否存活。

端口扫描

  • -sS(TCP SYN扫描):

    又叫做半开放式扫描,不建立一个完全的TCP连接。它发送一个SYN报文,然后等待响应。SYN/ACK表示端口在开放,而 RST (复位)表示没有关闭。如果数次重发后仍没响应, 该端口就被标记为被过滤。如果收到ICMP不可到达错误 (类型3,代码1,2,3,9,10,或者13),该端口也被标记为被过滤。

  • -sT(TCP connect()扫描):

    默认TCP扫描,即建立TCP连接,但是这种方式通常会在目标主机上留下日志,容易被发现。

  • -sU(UDP扫描):

    虽然很多端口都是运行的TCP服务,但是也有很多端口在运行着UDP服务。但是UDP扫描比较慢,有的系统限制一秒钟一个报文,倘若扫描65535个端口,岂不要上天。因为常用的UDP服务基本就那几个,比较普遍,所以指定端口扫描即可。

  • -sN;-sF;-sX(隐蔽扫描):

    -sN是Null扫描,通过发送常规TCP报文对计算机进行探测

    -sF是FIN扫描,比如有些防火墙会组织SYN数据包,那么这个时候我们就可用尝试使用FIN扫描

    -sX是Xmas扫描,设置FIN,PSH,URG标志位

    对于判定的原理这三个扫描是相同的,当收到一个RST,则认为该端口是关闭的,若没有响应,则意味着该端口是开放或者被过滤了。

  • -sA(TCP ACK扫描):

    这个扫描不能确定端口开放状态,一般是用来跟防火墙玩的,用来判断防火墙是有状态还是无状态,哪些端口是被过滤的。

  • -sW(TCP窗口扫描):

    通过检查返回的RST报文的TCP窗口域来实现扫描。开放端口用正数来表示窗口大小,而关闭窗口则为0.

  • -sM(TCP Maimon扫描):

    据RFC 793 (TCP),无论端口开放或者关闭,都应该对这样的探测响应RST报文。 然而,如果端口开放,许多基于BSD的系统只是丢弃该探测报文。

  • -scanflags(定制的TCP扫描):

    如果你发现了更好的标志位,或者通过包某个信息能更好的判断端口情况,你便可以使用该选项,定制符合自己情况的TCP扫描

  • -sI

    这是一种一段隐蔽的扫描方式,如果你向扫描足够隐蔽不被发现,那么可以用这种扫描方式,具体实现原理,可查看此文章

  • -sO(IP协议扫描):

    自己指定协议来进行扫描

服务和版本探测

  • -sV(版本探测)
  • --allports(全端口探测)
  • --version-intensity(设置扫描强度,0为最低强度,9为最高强度)
  • --version-light(打开轻量级模式)
  • -version-all(尝试每个探测)
  • --version-trace(打印出详细扫描过程调试信息)
  • -sR(RPC扫描)

操作系统探测

  • -O(启用操作系统检测):

    可配合-A同时启用版本检测

  • --osscan-limit(针对指定的目标进行操作系统检测)

  • --osscan-guess; --fuzzy(推测操作系统检测结果)

防火墙/IDS躲避和欺骗

  • -f(报文分段); --mtu(使用指定的MTU)

    使用小的IP包分段来进行扫描,从而躲避IDS及其他工具

  • -D(使用诱饵隐蔽扫描,在进行版本检测或TCP连接扫描时诱饵无效)

    例如:nmap 127.0.0.1,127.0.0.2,127.0.0.3

  • -S(源地址欺骗)

  • -e(使用指定的接口)

  • --source-port ; -g(源端口欺骗)

  • --data-length(发送报文时 附加随机数据)

  • --ttl(设置IP time-to-live域)

  • --randomize-hosts(对目标主机的顺序随机排列)

  • --spoof-mac(MAC地址欺骗)

输出结果

  • -oN(标准输出)

    将标准输出直接写入指定 的文件

  • -oX(XML输出)

  • -oS(ScRipT KIdd|3 oUTpuT)

  • -oG(Grep输出)

    曾经网鼎杯有一道CTF题目就是利用这个选项将后门写入,然后连接后门取得flag

  • -oA(输出至所有格式)

nmap再探险

上述都是nmap的一些基本选项和使用方式,下面才是平常我们所忽略的nmap的高级功能。

漏洞探测

  • --script=vuln

  • smb相关脚本

    后台打印机服务漏洞
    nmap --script smb-security-mode.nse -p 445 192.168.74.133
    
    系统漏洞扫描
    nmap --script smb-check-vulns.nse -p 445 192.168.74.133
    
  • http相关脚本

    xss检测
    nmap --script http-stored-xss.nse www.example.com
    
    HTTP头信息检测
    nmap -p 80 --script=http-headers www.example.com
    
    web目录结构爬取
    nmap -p 80 --script=http-sitemap-generator www.example.com
    
    弱口令爆破
    http-wordpress-brute
    http-joomla-brute
    
  • ssl相关脚本

    枚举ssl密钥
    nmap -p 443 --script=ssl-enum-ciphers www.example.com
    
  • ssh相关脚本

    ssh服务密钥信息探测
    nmap -p 22 --script ssh-hostkey --script-args ssh_hostkey=full www.example.com
    

数据库探测

  • mysql数据库

    列举mysql数据库
    nmap -p 3306 --script mysql-database --script-args mysqluser=root,mysqlpass www.example.com
    
    列举mysql变量
    nmap -p 3306 --script=mysql-variables ww.example.com
    
    mysql弱口令爆破(可使用userdb=xx/xx.txt passdb=xx/xx.txt指定字典爆破)
    nmap --script=mysql-brute www.example
    
    mysql安全配置审计
    nmap -p 3306 --script mysql-audit --script-args "mysql-audit.username='root',mysql-audit.password='',mysql-audit.filename='nselib/data/mysql-cis.audit'" www.example.com
    
  • oracle数据库

    爆破orcal密码
    nmap --script oracle-brute -p 1521 --script-args oracle-brute.sid=test www.example.com
    
  • mssql数据库

    mssql空密码
    nmap -p 1433 --script ms-sql-brute --script-args userdb=username.txt,passdb=password.txt www.example.com
    

总结

其实nmap的使用远远不止文章所属这点,nmap的强大之处在于我们能够将自己的工具和编写的脚本或者字典与nmap相结合,从而极大的发挥出nmap功能。

posted @ 2021-01-19 21:09  怪味巧克力  阅读(277)  评论(0编辑  收藏  举报