渗透之——Nmap+Zenmap+Amap+Zmap

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/l1028386804/article/details/84204992

转载请注明出处:https://blog.csdn.net/l1028386804/article/details/84204992
Nmap

第一部分 Nmap基础
一、Nmap功能
基本功能有三个:
    1.探测主机是否在线;
    2.扫描主机端口,嗅探所提供的网络服务
    3.推断主机操作系统
    
主机探测:
    探测网路上的主机,例如列出相应TCP和ICMP请求,icmp请求,开放特别端口的主机
端口扫描:
    探测目标主机所开放的端口
版本检测:
    探测目标主机的网络服务,判断其服务名称和版本号
系统检测:
    探测目标主机的操作系统及网络设备的硬件特性
支持探测脚本的编写:
    使用Namp的脚本引擎(NSE)和Lua编程语言
    
二、安装
到https://nmap.org 下载安装即可。

三、更新
1.更新nmap
    1-1.在windows安装目录下找到nmap-update.exe 基于SVN更新
    1-2.手动重新安装

2.更新nmap-script-database
    nmap --script-updatedb


第二部分 主机发现扫描技术
一、主机发现
发送简单的ICMP回声请求报文,这些探测的目的是获得相应以显示某个IP地址是否是活动的(正在被某主机或者网络设备使用),主机发现能够找到零星分布与IP地址海洋上的那些机器。

二、网络原理简介
    紧急标识URGent:
        当URG=1时,表明此报文应尽快传送,而不要按本来的列队次序传送,与"紧急指针"字段共同使用。
    紧迫标识PSH:
        当PSH = 1时,表明请求远程TCP将本报文段立即传送给其应用层,而不要等到全部缓存都填满了之后再向上交付。
    确认标识ACK:
        只有当ACK=1时,确认序号字段才有意义。
    复位标识ReSet:
        当RST=1时,表明出现严重错误,必须释放链接,然后再重建传输连接。复位标识还用来拒绝一个不法的报文或拒绝打开一个连接;
    同步标识SYN:
        在建立连接时使用,当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,在发还的报文段中使SYN=1和ACK=1.所以,SYN=1默认是一个连接请求。
    终止标识FINal:
        用来释放一个连接,当FIN=1时,表明欲发送的字节串已经发送完成,并请求释放传输连接。

    
    ICMP差错报文
        1.ICMP目标不可达消息
        2.ICMP重定向消息
        3.ICMP超时消息
        4.源抑制消息
        
    ICMP查询报文
        1.ICMP回送消息(echo)
        2.ICMP地址掩码消息(Adress mask)
        3.ICMP时间戳消息(Time stamp)
        
三、Nmap选项详解
    -P*选项(用于选择ping的类型)可以被结合使用
        可以使用不同的TCP端口/标识位和ICMP码发送许多探测报文,目的是增加穿透防守严密的防火墙的机会。
    
    -P0(无ping)
        完全跳过Nmap发现阶段。用-P0禁止主机发现会使Namp对每一个指定的目标IP地址进行所要求的扫描。所以,如果在命令行指定一个B类目标地址空间(/16),所有63336个IP地址都会被扫描。
    
    -PS[portlist] (TCP SYN PING)
        发送一个设置了SYN标志位的空TCP报文。默认目的端口是80,但不同的端口也可以作为选项指定。
        在Nmap的源码nmap.h中,找到 #define DEFAULT_TCP_PROBE_PORT 80   我们可以将80端口改成我们想要的端口,重新编译,从而可以修改Nmap的扫描的默认端口。
        示例如下:
            root@liuyazhuang:~# nmap -PS80,23,21,22 125.64.43.186-210
            Starting Nmap 7.70 ( https://nmap.org ) at 2018-11-18 16:23 CST
            Nmap done: 25 IP addresses (0 hosts up) scanned in 21.17 seconds

    
    -PA[portlist] (TCP ACK Ping)
        ACK报文标识确认一个建立连接的尝试,但该连接尚未完全建立。默认端口80,也可以指定目标端口列表。
        nmap -PA 180.24.67.1-254

    -PU[portlist] (UDP Ping)
        发送一个空的(除非指定了--data-length)UDP报文到给定的端口。如果不指定,默认是31338
        优势:可以穿越只过滤TCP的防火墙和过滤器。
        nmap -PU 180.24.67.1-254
        nmap -PA12345,2298,3399 180.24.67.1-254
        
    -PE;-PP;-PM(ICMP Ping Types)
        nmap -PM -PE -PP --send-ip 180.175.10.1-254
        
    -PR(ARP Ping)
        nmap -PR --send-ip 180.175.10.1-254
    
    -n(不用域名解析)
        不对发现的IP地址进行反向域名解析
    
    -R(为所有目标解析域名)
        对目标IP地址作反向域名解析
        
第三部分 Nmap扫描目标
    Nmap支持CIDR风格的地址,可以附加一个/<numbit>在一个IP地址或主机名后面,Nmap将会扫描所有和该参考IP地址具有<numbit>相同比特的所有IP地址或主机。例如:192.168.10.0/24将会扫描192.168.10.0,scanme.nmap.org/16也能成功使用
    192.168.1,3,7.1-254等效于:
    192.168.1.1-254    192.168.3.1-254    192.168.7.1-254
    
    -iL <inputfilename> (从列表中输入)
    用-iL把文件名作为选项传给Nmap。列表中的项可以是Nmap在命令行上接受的任何格式(IP地址,主机名,CIDR、IPv6或八字节范围),每一项必须以一个或多个空格,制表符或换行符隔开。
    nmap -PP -PM -PE -iL ip
    其中ip就是我们存放IP地址的文件,ip文件的内容如下:
        172.17.17.24 172.17.17.10
        scanme.nmap.org
        172.17.1-100.1-100
    
    -iR <hostnum> (随机选择目标)
        <hostnum>告诉Nmap生成多少个IP
        nmap -sS -PS80 -iR 0 -p 80
        
    --exclude <host1[, host2][,host2]....>(排除主机/网络)
    
    --excludefile <excludefile>(排除文件中的列表)
        排除的目标文件中的IP是以换行符、空格或制表符分隔的。
        
        nmap -PP -excludefile ip 172.17.17.1/16
        
第四部分 端口扫描技术
    -sS (TCP SYN扫描)
        SYN扫描是默认的、执行快、不易被注意到,因为它从来不完成RCP连接
        nmap -sS 125.64.43.0-255
    -sT (TCP connect扫描)
        nmap -sT 125.64.43.0-255
    -sU (UDP扫描)
        nmap -sU --host-timeout 1 125.64.43.0-255
    
    -sA (TCP ACK扫描)
    
    -sW (TCP窗口扫描)
    
    -sN;-sF-sX (TCP null, FIN, and Xmas)
        nmap -sN 125.64.43.0-254
        nmap -sF 125.64.43.0-254
        nmap -sX 125.64.43.0-254
    
    -sM (TCP Maimon扫描)
    
    -sO (IP协议扫描)
        --data-length 100
    
    
    -sI <zombie host[:probeport]> (Idlescan,空闲扫描)    
        对目标进行真正的TCP端口盲扫描
        nmap --script ipidseq 125.64.43.0-254
    
    --scanflags(定制的TCP扫描)
        nmap --scanflags URGACK 125.64.43.0-254
        nmap -sS --scanflags URGACK 125.64.43.0-254
    
    -b <ftp reply host> (FTP弹跳扫描)
        参数格式:
            <username>:<password>@<server IP>:<port>
            
    -p <port ranges>(只扫描指定的端口)
        当扫描TCP端口又扫描UDP端口时,可以在端口号前加上T:或者U:指定协议
    
    -F (快速(有限的端口)扫描)
    
    -r (按随机顺序扫描端口)
        
    
第五部分 扫描结果
    
    open(开放的)
    closed(关闭的)
        关闭的端口对于Nmap也是可访问的,但没有应用程序在其上监听。
    open|filtered(开放或者被过滤的)
    closed|filtered(关闭或者被过滤的)    
    
第六部分 服务及版本探测扫描技术
     -sV (版本探测)
        打开版本探测。 您也可以用-A同时打开操作系统探测和版本探测。
        nmap -sV www.baidu.com
        
    --allports (不为版本探测排除任何端口)
        默认情况下,Nmap版本探测会跳过9100 TCP端口,因为一些打印机简单地打印送到该端口的 任何数据,这回导致数十页HTTP get请求,二进制 SSL会话请求等等被打印出来。这一行为可以通过修改或删除nmap-service-probes 中的Exclude指示符改变, 您也可以不理会任何Exclude指示符,指定--allports扫描所有端口
        nmap -sV --allports www.baidu.com
        
    --version-intensity <intensity> (设置 版本扫描强度)
        当进行版本扫描(-sV)时,nmap发送一系列探测报文 ,每个报文都被赋予一个1到9之间的值。 被赋予较低值的探测报文对大范围的常见服务有效,而被赋予较高值的报文 一般没什么用。强度水平说明了应该使用哪些探测报文。数值越高, 服务越有可能被正确识别。 然而,高强度扫描花更多时间。强度值必须在0和9之间。 默认是7。当探测报文通过nmap-service-probes ports指示符 注册到目标端口时,无论什么强度水平,探测报文都会被尝试。这保证了DNS 探测将永远在任何开放的53端口尝试, SSL探测将在443端口尝试,等等。
        
    --version-light (打开轻量级模式)
        这是 --version-intensity 2的方便的别名。轻量级模式使 版本扫描快许多,但它识别服务的可能性也略微小一点。
        
    --version-all (尝试每个探测)
        --version-intensity 9的别名, 保证对每个端口尝试每个探测报文。
        
    --version-trace (跟踪版本扫描活动)
        这导致Nmap打印出详细的关于正在进行的扫描的调试信息。 它是您用--packet-trace所得到的信息的子集。
        
    -sR (RPC扫描)
        这种方法和许多端口扫描方法联合使用。 它对所有被发现开放的TCP/UDP端口执行SunRPC程序NULL命令,来试图 确定它们是否RPC端口,如果是, 是什么程序和版本号。因此您可以有效地获得和rpcinfo -p一样的信息, 即使目标的端口映射在防火墙后面(或者被TCP包装器保护)。Decoys目前不能和RPC scan一起工作。 这作为版本扫描(-sV)的一部分自动打开。 由于版本探测包括它并且全面得多,-sR很少被需要。
    
第七部分 操作系统探测
     -O (启用操作系统检测)
        也可以使用-A来同时启用操作系统检测和版本检测。
        
    --osscan-limit (针对指定的目标进行操作系统检测)
        如果发现一个打开和关闭的TCP端口时,操作系统检测会更有效。 采用这个选项,Nmap只对满足这个条件的主机进行操作系统检测,这样可以 节约时间,特别在使用-P0扫描多个主机时。这个选项仅在使用 -O或-A 进行操作系统检测时起作用。
    
    --osscan-guess; --fuzzy (推测操作系统检测结果)
        当Nmap无法确定所检测的操作系统时,会尽可能地提供最相近的匹配,Nmap默认 进行这种匹配,使用上述任一个选项使得Nmap的推测更加有效。

第八部分 Nmap脚本扫描
    总体命令格式为:nmap --script 脚本名称 目标

    1.获得WHOIS记录信息
        命令:
            nmap --script whois 目标
            nmap --script whois-domain 目标
            nmap --script whois-ip 目标
            nmap --script whois-domain 目标1 目标2 目标3 ...
    
    2.Nmap的HTTP方法
        命令:
            nmap -p80,443 --script http-medthods scanme.nmap.org
            
            nmap --script http-enum -p80 目标
    
        指定不同的User Agent来绕过某些防火墙
            nmap -p80 --script http-enum --script-args http.useragent="Mozilla 5" 目标
    
        指定HTTP管道数目来加快扫描
            nmap -p80 --script http-enum --script-args http.pipeline=25 目标
        
        爆破HTTP身份认证
            nmap -p80 --script http-brute --script-args http-brute.path=/admin/<target>
        
        发现使用弱密码账户安全的wordpress,输入命令:
            nmap -p80 --script http-wordpress-brute <target>
            
        设置线程的数量,使用脚本参数http-wordpress-brute.threads
            nmap -p80 --script http-wordpress-brute --script-args http-wordpress-brute.threads=5 <target>
            
        Joomla是在许多国家非常流行的cms,使用http-joomla-brute脚本来检测弱密码账户
            nmap -p80 --script http-joomla-brute <target>
            
    3、检测SQL注入
        命令:
            nmap -p80 --script http-sql-injection <target>
        
    
    4、检测数据库
        1.列出数据库名称
            nmap -sV --script=mysql-databases <target>
        
        2.用户审计
            用密码进行身份验证,通过爆破或者空口令获得凭据
            nmap -sV --script=mysql-users
        
        3.检查root空口令
            sudo nmap --script mysql-empty-password <target>
        
        4.使用Nmap脚本爆破用户名和密码
            nmap --script=mysql-brute <target>
        
    5、漏洞利用
        使用CVE-2012-2122
        MySQL最可怕的漏洞CVE-2012-2122,攻击者使用root尝试300次登录后,成功进入了数据库
        nmap --script=mysql-vuln-cve2012-2122 <target>
        
    6.枚举SMTP服务的用户
        将邮箱作为用户名在web应用程序中非常常见,在审计邮件服务器时,收集用户名是一个必要的任务。
        nmap -p25 --script smtp-enum-users <target>
        
        检测SMTP服务器后门
        nmap -sV --script smtp-strangeport <target>
        
第九部分 防火墙/IDS躲避和哄骗
     -f (报文分段); --mtu (使用指定的MTU)
        -f选项要求扫描时(包挺ping扫描)使用 小的IP包分段。其思路是将TCP头分段在几个包中,使得包过滤器、 IDS以及其它工具的检测更加困难。必须小心使用这个选项,有些系 统在处理这些小包时存在问题,例如旧的网络嗅探器Sniffit在接收 到第一个分段时会立刻出现分段错误。该选项使用一次,Nmap在IP 头后将包分成8个字节或更小。因此,一个20字节的TCP头会被分成3个 包,其中2个包分别有TCP头的8个字节,另1个包有TCP头的剩下4个字 节。当然,每个包都有一个IP头。再次使用-f可使用 16字节的分段(减少分段数量)。使用--mtu选项可 以自定义偏移的大小,使用时不需要-f,偏移量必须 是8的倍数。包过滤器和防火墙对所有的IP分段排队,如Linux核心中的 CONFIG-IP-ALWAYS-DEFRAG配置项,分段包不会直接使用。一些网络无法 承受这样所带来的性能冲击,会将这个配置禁止。其它禁止的原因有分段 包会通过不同的路由进入网络。一些源系统在内核中对发送的报文进行 分段,使用iptables连接跟踪模块的Linux就是一个例子。当使用类似Ethereal 的嗅探器时,扫描必须保证发送的报文要分段。如果主机操作系统会产 生问题,尝试使用--send-eth选项以避开IP层而直接 发送原始的以太网帧。
        nmap -f 192.168.1.100
        nmap --mtu 16 192.168.1.100
        
    -D <decoy1 [,decoy2][,ME],...> (使用诱饵隐蔽扫描)
        为使诱饵扫描起作用,需要使远程主机认为是诱饵在扫描目标网络。 IDS可能会报个某个IP的5-10个端口扫描,但并不知道哪个IP在扫描以及 哪些不是诱饵。但这种方式可以通过路由跟踪、响应丢弃以及其它主动 机制在解决。这是一种常用的隐藏自身IP地址的有效技术。

        使用逗号分隔每个诱饵主机,也可用自己的真实IP作为诱饵,这时可使用 ME选项说明。如果在第6个位置或 更后的位置使用ME选项,一些常用 端口扫描检测器(如Solar Designer's excellent scanlogd)就不会报告 这个真实IP。如果不使用ME选项,Nmap 将真实IP放在一个随机的位置

        注意,作为诱饵的主机须在工作状态,否则会导致目标主机的SYN洪水攻击。 如果在网络中只有一个主机在工作,那就很容易确定哪个主机在扫描。也可 使用IP地址代替主机名(被诱骗的网络就不可能在名字服务器日志中发现)。

        诱饵可用在初始的ping扫描(ICMP、SYN、ACK等)阶段或真正的端口扫描 阶段。诱饵也可以用于远程操作系统检测(-O)。在进行版 本检测或TCP连接扫描时,诱饵无效。

        使用过多的诱饵没有任何价值,反而导致扫描变慢并且结果不准确。 此外,一些ISP会过滤哄骗的报文,但很多对欺骗IP包没有任何限制。
        
    -S <IP_Address> (源地址哄骗)
        在某些情况下,Nmap可能无法确定你的源地址(如果这样,Nmap会给出 提示)。此时,使用-S选项并说明所需发送包的接口IP地址。

        这个标志的另一个用处是哄骗性的扫描,使得目标认为是另 一个地址在进行扫描。可以想象某一个竞争对手在不断扫描某个公司! -e选项常在这种情况下使用,也可采用-P0选项。
        
    -e <interface> (使用指定的接口)
        告诉Nmap使用哪个接口发送和接收报文,Nmap可以进行自动检测, 如果检测不出会给出提示。
        
    --source-port <portnumber>; -g <portnumber> (源端口哄骗)
        仅依赖于源端口号就信任数据流是一种常见的错误配置,这个问题非常 好理解。例如一个管理员部署了一个新的防火墙,但招来了很多用户的不满,因为 他们的应用停止工作了。可能是由于外部的UDP DNS服务器响应无法进入网络,而导致 DNS的崩溃。FTP是另一个常见的例子,在FTP传输时,远程服务器尝试和内部用 建立连接以传输数据。

        对这些问题有安全解决方案,通常是应用级代理或协议分析防火墙模块。 但也存在一些不安全的方案。注意到DNS响应来自于53端口,FTP连接 来自于20端口,很多管理员会掉入一个陷阱,即允许来自于这些端口的数据进入 网络。他们认为这些端口里不会有值得注意的攻击和漏洞利用。此外,管理员 或许认为这是一个短期的措施,直至他们采取更安全的方案。但他们忽视了安全的 升级。

        不仅仅是工作量过多的网络管理员掉入这种陷阱,很多产品本身也会有这类 不安全的隐患,甚至是微软的产品。Windows 2000和Windows XP中包含的IPsec过滤 器也包含了一些隐含规则,允许所有来自88端口(Kerberos)的TCP和UDP数据流。另 一个常见的例子是Zone Alarm个人防火墙到2.1.25版本仍然允许源端口53(DNS)或 67(DHCP)的UDP包进入。

        Nmap提供了-g和--source-port选项(它们是 等价的),用于利用上述弱点。只需要提供一个端口号,Nmap就可以从这些 端口发送数据。为使特定的操作系统正常工作,Nmap必须使用不同的端口号。 DNS请求会忽略--source-port选项,这是因为Nmap依靠系 统库来处理。大部分TCP扫描,包括SYN扫描,可以完全支持这些选项,UDP扫 描同样如此。
        
    --data-length <number> (发送报文时 附加随机数据)
        正常情况下,Nmap发送最少的报文,只含一个包头。因此TCP包通常 是40字节,ICMP ECHO请求只有28字节。这个选项告诉Nmap在发送的报文上 附加指定数量的随机字节。操作系统检测(-O)包不受影响, 但大部分ping和端口扫描包受影响,这会使处理变慢,但对扫描的影响较小。
        
    --ttl <value> (设置IP time-to-live域)
        设置IPv4报文的time-to-live域为指定的值。
        
    --randomize-hosts (对目标主机的顺序随机排列)
        告诉Nmap在扫描主机前对每个组中的主机随机排列,最多可达 8096个主机。这会使得扫描针对不同的网络监控系统来说变得不是很 明显,特别是配合值较小的时间选项时更有效。如果需要对一个较大 的组进行随机排列,需要增大nmap.h文件中 PING-GROUP-SZ的值,并重新编译。另一种方法是使用列表扫描 (-sL -n -oN <filename>),产生目标IP的列表, 使用Perl脚本进行随机化,然后使用-iL提供给Nmap。
        
    --spoof-mac <mac address,prefix,or vendor name> (MAC地址哄骗)
        要求Nmap在发送原以太网帧时使用指定的MAC地址,这个选项隐含了 --send-eth选项,以保证Nmap真正发送以太网包。MAC地址有几 种格式。如果简单地使用字符串“0”,Nmap选择一个完全随机的MAC 地址。如果给定的字符品是一个16进制偶数(使用:分隔),Nmap将使用这个MAC地址。 如果是小于12的16进制数字,Nmap会随机填充剩下的6个字节。如果参数不是0或16进 制字符串,Nmap将通过nmap-mac-prefixes查找 厂商的名称(大小写区分),如果找到匹配,Nmap将使用厂商的OUI(3字节前缀),然后 随机填充剩余的3个节字。正确的--spoof-mac参数有, Apple, 0,01:02:03:04:05:06, deadbeefcafe,0020F2, 和Cisco.
    
第十部分 其它选项    
     -6 (启用IPv6扫描)
        从2002年起,Nmap提供对IPv6的一些主要特征的支持。ping扫描(TCP-only)、 连接扫描以及版本检测都支持IPv6。除增加-6选项外, 其它命令语法相同。当然,必须使用IPv6地址来替换主机名,如 3ffe:7501:4819:2000:210:f3ff:fe03:14d0。 除“所关注的端口”行的地址部分为IPv6地址。

        IPv6目前未在全球广泛采用,目前在一些国家(亚洲)应用较多, 一些高级操作系统支持IPv6。使用Nmap的IPv6功能,扫描的源和目 的都需要配置IPv6。如果ISP(大部分)不分配IPv6地址,Nmap可以采用 免费的隧道代理。一种较好的选择是BT Exact,位于https://tb.ipv6.btexact.com/。 此外,还有Hurricane Electric,位于http://ipv6tb.he.net/。6to4隧道是 另一种常用的免费方法。
    
    -A (激烈扫描模式选项)
        这个选项启用额外的高级和高强度选项,目前还未确定代表 的内容。目前,这个选项启用了操作系统检测(-O) 和版本扫描(-sV),以后会增加更多的功能。 目的是启用一个全面的扫描选项集合,不需要用户记忆大量的 选项。这个选项仅仅启用功能,不包含用于可能所需要的 时间选项(如-T4)或细节选项(-v)。
        
    --datadir <directoryname> (说明用户Nmap数据文件位置)
        Nmap在运行时从文件中获得特殊的数据,这些文件有 nmap-service-probes, nmap-services, nmap-protocols, nmap-rpc, nmap-mac-prefixes和 nmap-os-fingerprints。Nmap首先 在--datadir选项说明的目录中查找这些文件。 未找到的文件,将在BMAPDIR环境变量说明的目录中查找。 接下来是用于真正和有效UID的~/.nmap 或Nmap可执行代码的位置(仅Win32);然后是是编译位置, 如/usr/local/share/nmap 或/usr/share/nmap。 Nmap查找的最后一个位置是当前目录。
        
    --send-eth (使用原以太网帧发送)
        要求Nmap在以太网(数据链路)层而不是IP(网络层)发送 报文。默认方式下,Nmap选择最适合其运行平台的方式,原套接 字(IP层)是UNIX主机最有效的方式,而以太网帧最适合Windows操作 系统,因为Microsoft禁用了原套接字支持。在UNIX中,如果没有其 它选择(如无以太网连接),不管是否有该选项,Nmap都使用原IP包。
        
    --send-ip (在原IP层发送)
        要求Nmap通过原IP套接字发送报文,而不是低层的以 太网帧。这是--send-eth选项的补充。
        
    --privileged (假定用户具有全部权限)
        告诉Nmap假定其具有足够的权限进行源套接字包发送、 报文捕获和类似UNIX系统中根用户操作的权限。默认状态下, 如果由getuid()请求的类似操作不为0,Nmap将退出。 --privileged在具有Linux内核性能的类似 系统中使用非常有效,这些系统配置允许非特权用户可以进行 原报文扫描。需要明确的是,在其它选项之前使用这些需要权 限的选项(SYN扫描、操作系统检测等)。Nmap-PRIVILEGED变量 设置等价于--privileged选项。
        
    -V; --version (打印版本信息)
        打印Nmap版本号并退出。
        
    -h; --help (打印帮助摘要面)
        打印一个短的帮助屏幕,列出大部分常用的 命令选项,这个功能与不带参数运行Nmap是相同的。
        
    时间和性能
     --min-hostgroup <milliseconds>; --max-hostgroup <milliseconds> (调整并行扫描组的大小)
        Nmap具有并行扫描多主机端口或版本的能力,Nmap将多个目标IP地址 空间分成组,然后在同一时间对一个组进行扫描。通常,大的组更有效。缺 点是只有当整个组扫描结束后才会提供主机的扫描结果。如果组的大小定义 为50,则只有当前50个主机扫描结束后才能得到报告(详细模式中的补充信息 除外)。

        默认方式下,Nmap采取折衷的方法。开始扫描时的组较小, 最小为5,这样便于尽快产生结果;随后增长组的大小,最大为1024。确切的 大小依赖于所给定的选项。为保证效率,针对UDP或少量端口的TCP扫描,Nmap 使用大的组。

        --max-hostgroup选项用于说明使用最大的组,Nmap不 会超出这个大小。--min-hostgroup选项说明最小的组,Nmap 会保持组大于这个值。如果在指定的接口上没有足够的目标主机来满足所 指定的最小值,Nmap可能会采用比所指定的值小的组。这两个参数虽然很少使用, 但都用于保持组的大小在一个指定的范围之内。

        这些选项的主要用途是说明一个最小组的大小,使得整个扫描更加快速。通常 选择256来扫描C类网段。对于端口数较多的扫描,超出该值没有意义。对于 端口数较少的扫描,2048或更大的组大小是有帮助的。
        
    --min-parallelism <milliseconds>; --max-parallelism <milliseconds> (调整探测报文的并行度)
        这些选项控制用于主机组的探测报文数量,可用于端口扫描和主机发现。默认状态下, Nmap基于网络性能计算一个理想的并行度,这个值经常改变。如果报文被丢弃, Nmap降低速度,探测报文数量减少。随着网络性能的改善,理想的探测报文数量会缓慢增加。 这些选项确定这个变量的大小范围。默认状态下,当网络不可靠时,理想的并行度值 可能为1,在好的条件下,可能会增长至几百。

        最常见的应用是--min-parallelism值大于1,以加快 性能不佳的主机或网络的扫描。这个选项具有风险,如果过高则影响准确度,同时 也会降低Nmap基于网络条件动态控制并行度的能力。这个值设为10较为合适, 这个值的调整往往作为最后的手段。

        --max-parallelism选项通常设为1,以防止Nmap在同一时间 向主机发送多个探测报文,和选择--scan-delay同时使用非常有用,虽然 这个选项本身的用途已经很好。
        
    --min-rtt-timeout <milliseconds>, --max-rtt-timeout <milliseconds>, --initial-rtt-timeout <milliseconds> (调整探测报文超时)
        Nmap使用一个运行超时值来确定等待探测报文响应的时间,随后会放弃或重新 发送探测报文。Nmap基于上一个探测报文的响应时间来计算超时值,如果网络延迟比较显著 和不定,这个超时值会增加几秒。初始值的比较保守(高),而当Nmap扫描无响应 的主机时,这个保守值会保持一段时间。

        这些选项以毫秒为单位,采用小的--max-rtt-timeout值,使 --initial-rtt-timeout值大于默认值可以明显减少扫描时间,特别 是对不能ping通的扫描(-P0)以及具有严格过滤的网络。如果使用太 小的值,使得很多探测报文超时从而重新发送,而此时可能响应消息正在发送,这使得整个扫描的时 间会增加。

        如果所有的主机都在本地网络,对于--max-rtt-timeout值来 说,100毫秒比较合适。如果存在路由,首先使用ICMP ping工具ping主机,或使用其 它报文工具如hpings,可以更好地穿透防火墙。查看大约10个包的最大往返时间,然后将 --initial-rtt-timeout设成这个时间的2倍,--max-rtt-timeout 可设成这个时间值的3倍或4倍。通常,不管ping的时间是多少,最大的rtt值不得小于100ms, 不能超过1000ms。

        --min-rtt-timeout这个选项很少使用,当网络不可靠时, Nmap的默认值也显得过于强烈,这时这个选项可起作用。当网络看起来不可靠时,Nmap仅将 超时时间降至最小值,这个情况是不正常的,需要向nmap-dev邮件列表报告bug。
        
    --host-timeout <milliseconds> (放弃低速目标主机)
        由于性能较差或不可靠的网络硬件或软件、带宽限制、严格的防火墙等原因, 一些主机需要很长的时间扫描。这些极少数的主机扫描往往占 据了大部分的扫描时间。因此,最好的办法是减少时间消耗并且忽略这些主机,使用 --host-timeout选项来说明等待的时间(毫秒)。通常使用1800000 来保证Nmap不会在单个主机上使用超过半小时的时间。需要注意的是,Nmap在这半小时中可以 同时扫描其它主机,因此并不是完全放弃扫描。超时的主机被忽略,因此也没有针对该主机的 端口表、操作系统检测或版本检测结果的输出。
        
    --scan-delay <milliseconds>; --max-scan-delay <milliseconds> (调整探测报文的时间间隔)
        这个选项用于Nmap控制针对一个主机发送探测报文的等待时间(毫秒),在带宽 控制的情况下这个选项非常有效。Solaris主机在响应UDP扫描探测报文报文时,每秒 只发送一个ICMP消息,因此Nmap发送的很多数探测报文是浪费的。--scan-delay 设为1000,使Nmap低速运行。Nmap尝试检测带宽控制并相应地调整扫描的延迟,但 并不影响明确说明何种速度工作最佳。

        --scan-delay的另一个用途是躲闭基于阈值的入侵检测和预防 系统(IDS/IPS)。
        
    -T <Paranoid|Sneaky|Polite|Normal|Aggressive|Insane> (设置时间模板)
        上述优化时间控制选项的功能很强大也很有效,但有些用户会被迷惑。此外, 往往选择合适参数的时间超过了所需优化的扫描时间。因此,Nmap提供了一些简单的 方法,使用6个时间模板,使用时采用-T选项及数字(0 - 5) 或名称。模板名称有paranoid (0)、sneaky (1)、polite (2)、normal(3)、 aggressive (4)和insane (5)。前两种模式用于IDS躲避,Polite模式降低了扫描 速度以使用更少的带宽和目标主机资源。默认模式为Normal,因此-T3 实际上是未做任何优化。Aggressive模式假设用户具有合适及可靠的网络从而加速 扫描。Insane模式假设用户具有特别快的网络或者愿意为获得速度而牺牲准确性。

        用户可以根据自己的需要选择不同的模板,由Nmap负责选择实际的时间值。 模板也会针对其它的优化控制选项进行速度微调。例如,-T4 针对TCP端口禁止动态扫描延迟超过10ms,-T5对应的值为5ms。 模板可以和优化调整控制选项组合使用,但模板必须首先指定,否则模板的标准值 会覆盖用户指定的值。建议在扫描可靠的网络时使用 -T4,即使 在自己要增加优化控制选项时也使用(在命令行的开始),从而从这些额外的较小的优化 中获益。

        如果用于有足够的带宽或以太网连接,仍然建议使用-T4选项。 有些用户喜欢-T5选项,但这个过于强烈。有时用户考虑到避免使主机 崩溃或者希望更礼貌一些会采用-T2选项。他们并没意识到-T Polite选项是如何的慢,这种模式的扫描比默认方式实际上要多花10倍的时间。默认时间 选项(-T3)很少有主机崩溃和带宽问题,比较适合于谨慎的用户。不进行 版本检测比进行时间调整能更有效地解决这些问题。

        虽然-T0和-T1选项可能有助于避免IDS告警,但 在进行上千个主机或端口扫描时,会显著增加时间。对于这种长时间的扫描,宁可设定确切的时间 值,而不要去依赖封装的-T0和-T1选项。

        T0选项的主要影响是对于连续扫描,在一个时间只能扫描一个端口, 每个探测报文的发送间隔为5分钟。T1和T2选项比较类似, 探测报文间隔分别为15秒和0.4秒。T3是Nmap的默认选项,包含了并行扫描。 T4选项与 --max-rtt-timeout 1250 --initial-rtt-timeout 500 等价,最大TCP扫描延迟为10ms。T5等价于 --max-rtt-timeout 300 --min-rtt-timeout 50 --initial-rtt-timeout 250 --host-timeout 900000,最大TCP扫描延迟为5ms。

    Nmap输出
     -oN <filespec> (标准输出)
        要求将标准输出直接写入指定 的文件。如上所述,这个格式与交互式输出 略有不同。
        
    -oX <filespec> (XML输出)
        要求XML输出直接写入指定 的文件。Nmap包含了一个文档类型定义(DTD),使XML解析器有效地 进行XML输出。这主要是为了程序应用,同时也可以协助人工解释 Nmap的XML输出。DTD定义了合法的格式元素,列举可使用的属性和 值。最新的版本可在 http://www.insecure.org/nmap/data/nmap.dtd获取。

        XML提供了可供软件解析的稳定格式输出,主要的计算机 语言都提供了免费的XML解析器,如C/C++,Perl,Python和Java。 针对这些语言有一些捆绑代码用于处理Nmap的输出和特定的执行程序。 例如perl CPAN中的Nmap::Scanner 和Nmap::Parser。 对几乎所有与Nmap有接口的主要应用来说,XML是首选的格式。

        XML输出引用了一个XSL样式表,用于格式化输出结果,类似于 HTML。最方便的方法是将XML输出加载到一个Web浏览器,如Firefox 或IE。由于nmap.xsl文件的绝对 路径,因此通常只能在运行了Nmap的机器上工作(或类似配置的机器)。 类似于任何支持Web机器的HTML文件,--stylesheet 选项可用于建立可移植的XML文件。
        
    -oS <filespec> (ScRipT KIdd|3 oUTpuT)
        脚本小子输出类似于交互工具输出,这是一个事后处理,适合于 'l33t HaXXorZ, 由于原来全都是大写的Nmap输出。这个选项和脚本小子开了玩笑,看上去似乎是为了 “帮助他们”。
        
    -oG <filespec> (Grep输出)
        这种方式最后介绍,因为不建议使用。XML输格式很强大,便于有经验 的用户使用。XML是一种标准,由许多解析器构成,而Grep输届更简化。XML 是可扩展的,以支持新发布的Nmap特点。使用Grep输出的目的是忽略这些 特点,因为没有足够的空间。

        然面,Grep输出仍然很常使用。它是一种简单格式,每行一个主机,可以 通过UNIX工具(如grep、awk、cut、sed、diff)和Perl方便地查找和分解。常可 用于在命令行上进行一次性测式。查找ssh端口打开或运行Sloaris的主机,只需 要一个简单的grep主机说明,使用通道并通过awk或cut命令打印所需的域。

        Grep输出可以包含注释(每行由#号开始)。每行由6个标记的域组成,由制表符及 冒号分隔。这些域有主机,端口, 协议,忽略状态, 操作系统,序列号, IPID和状态。

        这些域中最重要的是Ports,它提供 了所关注的端口的细节,端口项由逗号分隔。每个端口项代表一个所关注的端口, 每个子域由/分隔。这些子域有:端口号, 状态,协议, 拥有者,服务, SunRPCinfo和版本信息。

        对于XML输出,本手册无法列举所有的格式,有关Nmap Grep输出的更详细信息可 查阅http://www.unspecific.com/nmap-oG-output。
        
    -oA <basename> (输出至所有格式)
        为使用方便,利用-oA<basename>选项 可将扫描结果以标准格式、XML格式和Grep格式一次性输出。分别存放在 <basename>.nmap,<basename>.xml和 <basename>.gnmap文件中。也可以在文件名前 指定目录名,如在UNIX中,使用~/nmaplogs/foocorp/, 在Window中,使用c:\hacking\sco on Windows。

    细节和调试选项
    -v (提高输出信息的详细度)

        通过提高详细度,Nmap可以输出扫描过程的更多信息。 输出发现的打开端口,若Nmap认为扫描需要更多时间会显示估计 的结束时间。这个选项使用两次,会提供更详细的信息。这个选 项使用两次以上不起作用。

        大部分的变化仅影响交互式输出,也有一些影响标准和脚本 小子输出。其它输出类型由机器处理,此时Nmap默认提供详细的信 息,不需要人工干预。然而,其它模式也会有一些变化,省略一些 细节可以减小输出大小。例如,Grep输出中的注释行提供所有扫描 端口列表,但由于这些信息过长,因此只能在细节模式中输出。
        
    -d [level] (提高或设置调试级别)
        当详细模式也不能为用户提供足够的数据时,使用调试可以得到更 多的信息。使用细节选项(-v)时,可启用命令行参数 (-d),多次使用可提高调试级别。也可在-d 后面使用参数设置调试级别。例如,-d9设定级别9。这是 最高的级别,将会产生上千行的输出,除非只对很少的端口和目标进行简单扫描。

        如果Nmap因为Bug而挂起或者对Nmap的工作及原理有疑问,调试输出 非常有效。主要是开发人员用这个选项,调试行不具备自我解释的特点。 例如,Timeoutvals: srtt: -1 rttvar: -1 to: 1000000 delta 14987 ==> srtt: 14987 rttvar: 14987 to: 100000。如果对某行输出不明白, 可以忽略、查看源代码或向开发列表(nmap-dev)求助。有些输出行会有自 我解释的特点,但随着调试级别的升高,会越来越含糊。
        
    --packet-trace (跟踪发送和接收的报文)
        要求Nmap打印发送和接收的每个报文的摘要,通常用于 调试,有助于新用户更好地理解Nmap的真正工作。为避免输出过 多的行,可以限制扫描的端口数,如-p20-30。 如果只需进行版本检测,使用--version-trace。
        
    --iflist (列举接口和路由)
        输出Nmap检测到的接口列表和系统路由,用于调试路由 问题或设备描述失误(如Nmap把PPP连接当作以太网对待)。

    其它输出选项
    --append-output (在输出文件中添加)
        当使用文件作为输出格式,如-oX或-oN, 默认该文件被覆盖。如果希望文件保留现有内容,将结果添加在现 有文件后面,使用--append-output选项。所有指 定的输出文件都被添加。但对于XML(-oX)扫描输出 文件无效,无法正常解析,需要手工修改。
        
    --resume <filename> (继续中断的扫描)
        一些扩展的Nmap运行需要很长的时间 -- 以天计算,这类扫描 往往不会结束。可以进行一些限制,禁止Nmap在工作时间运行,导致 网络中断、运行Nmap的主机计划或非计划地重启、或者Nmap自己中断。 运行Nmap的管理员可以因其它原因取消运行,按下ctrl-C 即可。从头开始启动扫描可能令人不快,幸运的是,如果标准扫描 (-oN)或Grep扫描(-oG)日志 被保留,用户可以要求Nmap恢复终止的扫描,只需要简单地使用选项 --resume并说明标准/Grep扫描输出文件,不允许 使用其它参数,Nmap会解析输出文件并使用原来的格式输出。使用方式 如nmap --resume <logfilename>。 Nmap将把新地结果添加到文件中,这种方式不支持XML输出格式,原因是 将两次运行结果合并至一个XML文件比较困难。
        
    --stylesheet <path or URL> (设置XSL样式表,转换XML输出)
        Nmap提从了XSL样式表nmap.xsl,用于查看 或转换XML输出至HTML。XML输出包含了一个xml-stylesheet, 直接指向nmap.xml文件, 该文件由Nmap安装(或位于Windows当前工作目录)。在Web浏览器 中打开Nmap的XML输出时,将会在文件系统中寻找nmap.xsl文件, 并使用它输出结果。如果希望使用不同的样式表,将它作为 --stylesheet的参数,必段指明完整的路 径或URL,常见的调用方式是--stylesheet http://www.insecure.org/nmap/data/nmap.xsl。 这告诉浏览器从Insecire.Org中加载最新的样式表。这使得 没安装Nmap(和nmap.xsl) 的机器中可以方便地查看结果。因此,URL更方便使用,本地文件系统 的nmap.xsl用于默认方式。
        
    --no-stylesheet (忽略XML声明的XSL样式表)
        使用该选项禁止Nmap的XML输出关联任何XSL样式表。 xml-stylesheet指示被忽略。
        
        
Zenmap
    https://www.cnblogs.com/tdcqma/p/5692546.html
    
    
Amap
        对服务版本探查 amap -B IP PORT
        对服务版本探查 amap -b ip port
        
    Amap是第首款针对渗透测试人员的下一代扫描工具, 它尝试识别即使在不同于正常端口的端口上运行应用程序。

    Amap还可以通过发送触发数据包并在响应字符串列表中查找响应来识别基于非ascii编码的应用程序。

    amapcrap - 将随机数据发送到UDP,TCP或SSL端口以获取非法响应:

    root@kali:~# amapcrap

    amapcrap v5.4 (c) 2011 by van Hauser/THC <[email protected]>

    语法:amapcrap [-S] [-u] [-m 0ab] [-M min,max] [-n connections] [-N delay] [-w delay] [-e] [-v] TARGET PORT

    选项:

    -S TCP连接后使用SSL(不能与 -u 同时使用)

    -u 使用UDP协议(默认值:TCP)(不能与 -c 同时使用)

    -n 连接最大连接数(默认值:无限制)

    -N 连接之间的延迟(ms)(默认值:0)

    -w 延迟关闭端口之前的延迟(默认值:250)

    -e 当服务器做出响应时不停止发送

    -v 详细模式

    -m 0ab 发送为随机垃圾数据:0-空字节,a-字母+空格,b-二进制

    -M min,max 随机垃圾数据的最小和最大长度

    TARGET PORT 发送随机垃圾数据的目标(ip或dns)和端口

    此工具将随机数据发送到静默端口以获取非法响应以便下一步amap检测, 它输出适用于amap定义的形式。

    注意:默认情况下所有模式都将被激活(0:10%,a:40% b:50%),模式'a'总是发送以字母和空格结尾的行。

    amapcrap用法示例

    root@kali:~# amapcrap -n 20 -m a 192.168.1.15 80 -v

    #Starting AmapCrap on 192.168.1.15 port 80

    #Writing a "+" for every 10 connect attempts

    #++

    done

    amap – Application MAPper:渗透测试人员的下一代扫描工具

    root@kali:~# amap

    amap v5.4 (c) 2011 by van Hauser <[email protected]>www.thc.org/thc-amap

    语法: amap [-A|-B|-P|-W] [-1buSRHUdqv] [[-m] -o ] [-D ] [-t/-T sec] [-c cons] [-C retries] [-p proto] [-i ] [target port [port] ...]

    模式:

    -A 地图应用程序:发送触发包和分析响应(默认)

    -B 只抓取标识信息,不发送触发包

    -P 不抓取标识信息横幅或应用程序的东西 - (全连接)端口扫描器

    选项:

    -1 只发送触发到端口,直到第一次标识。

    -6 使用IPv6而不是IPv4

    -b 打印响应的ascii标识信息

    -i FILE 输出Nmap可读文件

    -u 在命令行上指定的端口UDP(默认为TCP)

    -R 不标识RPC服务

    -H 不发送被应用程序标记为潜在有害的触发包

    -U 不要转储无法识别的响应(更脚本处理)

    -d 转储所有响应

    -v 详细模式,使用两次(或更多!)进行调试(不推荐:-)

    -q 不报告关闭的端口,并且不将其打印为不识别的

    -o FILE [-m] 将输出写入文件FILE,-m创建机器可读输出

    -c CONS 要进行的并行连接数(默认32,最大256)

    -C RETRIES 连接超时的重新连接数(请参见-T)(默认3)

    -T SEC 连接尝试的连接超时(以秒为单位)(默认为5)

    -t SEC 响应等待超时(以秒为单位)(默认值为5)

    -p PROTO 仅发送此协议的触发包(例如ftp)

    TARGET PORT 要扫描的目标地址和端口(除-i之外)

    amap是用于标识目标端口上的应用程序协议的工具。

    注意:此版本不是使用SSL支持编译的!

    使用提示:建议使用选项“-bqv”,“-1”快速检查。

    Amap用法示例

    扫描192.168.1.15 80端口,显示接收的标识(b),不显示关闭端口(Q),并使用详细输出(V):

    root@kali:~# amap -bqv 192.168.1.15 21

    Using trigger file /etc/amap/appdefs.trig ... loaded 30 triggers

    Using response file /etc/amap/appdefs.resp ... loaded 346 responses

    Using trigger file /etc/amap/appdefs.rpc ... loaded 450 triggers

    amap v5.4 (www.thc.org/thc-amap) started at 2016-10-18 14:24:02 - APPLICATION MAPPING mode

    Total amount of tasks to perform in plain connect mode: 23

    Waiting for timeout on 23 connections ...

    Protocol on 192.168.1.15 :21/tcp matches ftp - banner: 220---------- Welcome to Pure-FTPd [privsep] ----------\r\n220-You are user number 7 of 5000 allowed.\r\n220-Local time is now 0224. Server port 21.\r\n220-This is a private system - No anonymous login\r\n220-IPv6 connections are also welcome on this ser

    Protocol on 192.168.1.15 :21/tcp matches smtp - banner: 220---------- Welcome to Pure-FTPd [privsep] ----------\r\n220-You are user number 7 of 5000 allowed.\r\n220-Local time is now 0224. Server port 21.\r\n220-This is a private system - No anonymous login\r\n220-IPv6 connections are also welcome on this ser

    amap v5.4 finished at 2016-10-18 14:24:02

    root@kali:~# amap -bqv 192.168.1.15 80

    Using trigger file /etc/amap/appdefs.trig ... loaded 30 triggers

    Using response file /etc/amap/appdefs.resp ... loaded 346 responses

    Using trigger file /etc/amap/appdefs.rpc ... loaded 450 triggers

    amap v5.4 (www.thc.org/thc-amap) started at 2016-10-18 14:25:57 - APPLICATION MAPPING mode

    Total amount of tasks to perform in plain connect mode: 23

    Waiting for timeout on 23 connections ...

    Protocol on 192.168.1.15 :80/tcp matches http - banner: HTTP/1.1 400 Bad Request\r\nServer nginx\r\nDate Tue, 18 Oct 2016 182558 GMT\r\nContent-Type text/html\r\nContent-Length 166\r\nConnection close\r\n\r\n\r\n400 Bad Request\r\n\r\n400 Bad

    amap v5.4 finished at 2016-10-18 14:25:57
    
Zmap

    初识 ZMap
    ZMap被设计用来针对整个IPv4地址空间或其中的大部分实施综合扫描的工具。ZMap是研究者手中的利器,但在运行ZMap时,请注意,您很有 可能正在以每秒140万个包的速度扫描整个IPv4地址空间 。我们建议用户即使在实施小范围扫描之前,也联系一下本地网络的管理员并参考我们列举的最佳扫描体验。

    默认情况下,ZMap会对于指定端口实施尽可能大速率的TCP SYN扫描。较为保守的情况下,对10,000个随机的地址的80端口以10Mbps的速度扫描,如下所示:

        $ zmap --bandwidth=10M --target-port=80 --max-targets=10000 --output-file=results.csv

    或者更加简洁地写成:

        $ zmap -B 10M -p 80 -n 10000 -o results.csv

    ZMap也可用于扫描特定子网或CIDR地址块。例如,仅扫描10.0.0.0/8和192.168.0.0/16的80端口,运行指令如下:

        zmap -p 80 -o results.csv 10.0.0.0/8 192.168.0.0/16

    如果扫描进行的顺利,ZMap会每秒输出类似以下内容的状态更新:

        0% (1h51m left); send: 28777 562 Kp/s (560 Kp/s avg); recv: 1192 248 p/s (231 p/s avg); hits: 0.04%
        0% (1h51m left); send: 34320 554 Kp/s (559 Kp/s avg); recv: 1442 249 p/s (234 p/s avg); hits: 0.04%
        0% (1h50m left); send: 39676 535 Kp/s (555 Kp/s avg); recv: 1663 220 p/s (232 p/s avg); hits: 0.04%
        0% (1h50m left); send: 45372 570 Kp/s (557 Kp/s avg); recv: 1890 226 p/s (232 p/s avg); hits: 0.04%

    这些更新信息提供了扫描的即时状态并表示成:

        完成进度% (剩余时间); send: 发出包的数量 即时速率 (平均发送速率); recv: 接收包的数量 接收率 (平均接收率); hits: 命中率

    如果您不知道您所在网络能支持的扫描速率,您可能要尝试不同的扫描速率和带宽限制直到扫描效果开始下降,借此找出当前网络能够支持的最快速度。

    默认情况下,ZMap会输出不同IP地址的列表(例如,根据SYN ACK数据包的情况),像下面这样。其输出结果还有几种附加的格式(如,JSON和Redis),可以用作生成程序可解析的扫描统计。 同样,可以指定附加的输出字段并使用输出过滤来过滤输出的结果。

        115.237.116.119
        23.9.117.80
        207.118.204.141
        217.120.143.111
        50.195.22.82

    我们强烈建议您使用黑名单文件,以排除预留的/未分配的IP地址空间(如,RFC1918 规定的私有地址、组播地址),以及网络中需要排除在您扫描之外的地址。默认情况下,ZMap将采用位于 /etc/zmap/blacklist.conf的这个简单的黑名单文件中所包含的预留和未分配地址。如果您需要某些特定设置,比如每次运行ZMap时的最大带宽或黑名单文件,您可以在文件/etc/zmap/zmap.conf中指定或使用自定义配置文件。

    如果您正试图解决扫描的相关问题,有几个选项可以帮助您调试。首先,您可以通过添加--dryrun实施预扫,以此来分析包可能会发送到网络的何处。此外,还可以通过设置'--verbosity=n`来更改日志详细程度。
    最佳扫描体验

    我们为针对互联网进行扫描的研究者提供了一些建议,以此来引导养成良好的互联网合作氛围。

        密切协同本地的网络管理员,以减少风险和调查
        确认扫描不会使本地网络或上游供应商瘫痪
        在发起扫描的源地址的网页和DNS条目中申明你的扫描是善意的
        明确解释你的扫描中所有连接的目的和范围
        提供一个简单的退出扫描的方法并及时响应请求
        实施扫描时,不使用比研究对象需求更大的扫描范围或更快的扫描频率
        如果可以,将扫描流量分布到不同的时间或源地址上

    即使不声明,使用扫描的研究者也应该避免利用漏洞或访问受保护的资源,并遵守其辖区内任何特殊的法律规定。
    命令行参数

    通用选项

    这些选项是实施简单扫描时最常用的选项。我们注意到某些选项取决于所使用的探测模块或输出模块(如,在实施ICMP Echo扫描时是不需要使用目的端口的)。

    -p, --target-port=port

    要扫描的目标TCP端口号(例如,443)

    -o, --output-file=name

    将结果写入该文件,使用-代表输出到标准输出。

    -b, --blacklist-file=path

    文件中被排除的子网使用CIDR表示法(如192.168.0.0/16),一个一行。建议您使用此方法排除RFC 1918地址、组播地址、IANA预留空间等IANA专用地址。在conf/blacklist.example中提供了一个以此为目的示例黑名单文件。
    扫描选项

    -n, --max-targets=n

    限制探测目标的数量。后面跟的可以是一个数字(例如'-n 1000),或可扫描地址空间的百分比(例如,-n 0.1%`,不包括黑名单)

    -N, --max-results=n

    收到多少结果后退出

    -t, --max-runtime=secs

    限制发送报文的时间

    -r, --rate=pps

    设置发包速率,以包/秒为单位

    -B, --bandwidth=bps

    以比特/秒设置传输速率(支持使用后缀G,M或K(如-B 10M就是速度10 mbps)的。设置会覆盖--rate。

    -c, --cooldown-time=secs

    发送完成后等待多久继续接收回包(默认值= 8)

    -e, --seed=n

    地址排序种子。如果要用多个ZMap以相同的顺序扫描地址,那么就可以使用这个参数。

    --shards=n

    将扫描分片/区,使其可多个ZMap中执行(默认值= 1)。启用分片时,--seed参数是必需的。

    --shard=n

    选择扫描的分片(默认值= 0)。n的范围在[0,N),其中N为碎片的总数。启用分片时,--seed参数是必需的。

    -T, --sender-threads=n

    用于发送数据包的线程数(默认值= 1)

    -P, --probes=n

    发送到每个IP的探测数(默认值= 1)

    -d, --dryrun

    用标准输出打印出每个包,而不是将其发送(用于调试)
    网络选项

    -s, --source-port=port|range

    发送数据包的源端口

    -S, --source-ip=ip|range

    发送数据包的源地址。可以仅仅是一个IP,也可以是一个范围(如,10.0.0.1-10.0.0.9)

    -G, --gateway-mac=addr

    数据包发送到的网关MAC地址(用以防止自动检测不工作的情况)

    -i, --interface=name

    使用的网络接口
    探测选项

    ZMap允许用户指定并添加自己所需要的探测模块。 探测模块的职责就是生成要发送的探测包,并处理主机回复的响应包。

    --list-probe-modules

    列出可用探测模块(如tcp_synscan)

    -M, --probe-module=name

    选择探测模块(默认值= tcp_synscan)

    --probe-args=args

    向模块传递参数

    --list-output-fields

    列出可用的输出模块
    输出选项

    ZMap允许用户指定和编写他们自己的输出模块。输出模块负责处理由探测模块返回的字段,并将它们输出给用户。用户可以指定输出的字段,并过滤相应字段。

    --list-output-modules

    列出可用输出模块(如tcp_synscan)

    -O, --output-module=name

    选择输出模块(默认值为csv)

    --output-args=args

    传递给输出模块的参数

    -f, --output-fields=fields

    输出的字段列表,以逗号分割

    --output-filter

    指定输出过滤器对探测模块定义字段进行过滤
    附加选项

    -C, --config=filename

    加载配置文件,可以指定其他路径。

    -q, --quiet

    不必每秒刷新输出

    -g, --summary

    在扫描结束后打印配置和结果汇总信息

    -v, --verbosity=n

    日志详细程度(0-5,默认值= 3)

    -h, --help

    打印帮助并退出

    -V, --version

    打印版本并退出
    附加信息

    TCP SYN 扫描

    在执行TCP SYN扫描时,ZMap需要指定一个目标端口,也支持指定发起扫描的源端口范围。

    -p, --target-port=port

    扫描的TCP端口(例如 443)

    -s, --source-port=port|range

    发送扫描数据包的源端口(例如 40000-50000)

    警示! ZMap基于Linux内核使用RST包来应答SYN/ACK包响应,以关闭扫描器打开的连接。ZMap是在Ethernet层完成包的发送的,这样做是为了减少跟踪打开的TCP连接和路由寻路带来的内核开销。因此,如果您有跟踪连接建立的防火墙规则,如类似于-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT的netfilter规则,将阻止SYN/ACK包到达内核。这不会妨碍到ZMap记录应答,但它会阻止RST包被送回,最终被扫描主机的连接会一直打开,直到超时后断开。我们强烈建议您在执行ZMap时,选择一组主机上未使用且防火墙允许访问的端口,加在-s后(如 -s '50000-60000' )。
    ICMP Echo 请求扫描

    虽然在默认情况下ZMap执行的是TCP SYN扫描,但它也支持使用ICMP echo请求扫描。在这种扫描方式下ICMP echo请求包被发送到每个主机,并以收到ICMP应答包作为答复。实施ICMP扫描可以通过选择icmp_echoscan扫描模块来执行,如下:

        $ zmap --probe-module=icmp_echoscan

    UDP 数据报扫描

    ZMap还额外支持UDP探测,它会发出任意UDP数据报给每个主机,并接收UDP或ICMP不可达的应答。ZMap可以通过使用--probe- args命令行选项来设置四种不同的UDP载荷。这些是:可在命令行设置可打印的ASCII 码的‘text’载荷和十六进制载荷的‘hex’,外部文件中包含载荷的‘file’,和通过动态字段生成的载荷的‘template’。为了得到UDP 响应,请使用-f参数确保您指定的“data”字段处于输出范围。

    下面的例子将发送两个字节'ST',即PCAnwywhere的'status'请求,到UDP端口5632。

        $ zmap -M udp -p 5632 --probe-args=text:ST -N 100 -f saddr,data -o -

    下面的例子将发送字节“0X02”,即SQL Server的'client broadcast'请求,到UDP端口1434。

        $ zmap -M udp -p 1434 --probe-args=hex:02 -N 100 -f saddr,data -o -

    下面的例子将发送一个NetBIOS状态请求到UDP端口137。使用一个ZMap自带的载荷文件。

        $ zmap -M udp -p 1434 --probe-args=file:netbios_137.pkt -N 100 -f saddr,data -o -

    下面的例子将发送SIP的'OPTIONS'请求到UDP端口5060。使用附ZMap自带的模板文件。

        $ zmap -M udp -p 1434 --probe-args=file:sip_options.tpl -N 100 -f saddr,data -o -

    UDP载荷模板仍处于实验阶段。当您在更多的使用一个以上的发送线程(-T)时可能会遇到崩溃和一个明显的相比静态载荷性能降低的表现。模板仅仅是 一个由一个或多个使用${}将字段说明封装成序列构成的载荷文件。某些协议,特别是SIP,需要载荷来反射包中的源和目的包。其他协议,如 portmapper和DNS,每个请求包含的字段应该是随机的,或降低被Zamp扫描的多宿主系统的风险。

    以下的载荷模板将发送SIP OPTIONS请求到每一个目的地:

        OPTIONS sip:${RAND_ALPHA=8}@${DADDR} SIP/2.0
        Via: SIP/2.0/UDP ${SADDR}:${SPORT};branch=${RAND_ALPHA=6}.${RAND_DIGIT=10};rport;alias
        From: sip:${RAND_ALPHA=8}@${SADDR}:${SPORT};tag=${RAND_DIGIT=8}
        To: sip:${RAND_ALPHA=8}@${DADDR}
        Call-ID: ${RAND_DIGIT=10}@${SADDR}
        CSeq: 1 OPTIONS
        Contact: sip:${RAND_ALPHA=8}@${SADDR}:${SPORT}
        Content-Length: 0
        Max-Forwards: 20
        User-Agent: ${RAND_ALPHA=8}
        Accept: text/plain

    就像在上面的例子中展示的那样,注意每行行末以\r\n结尾,请求以\r\n\r\n结尾,大多数SIP实现都可以正确处理它。一个可以工作的例子放在ZMap的examples/udp-payloads目录下 (sip_options.tpl).

    当前实现了下面的模板字段:

        SADDR: 源IP地址的点分十进制格式
        SADDR_N: 源IP地址的网络字节序格式
        DADDR: 目的IP地址的点分十进制格式
        DADDR_N: 目的IP地址的网络字节序格式
        SPORT: 源端口的ascii格式
        SPORT_N: 源端口的网络字节序格式
        DPORT: 目的端口的ascii格式
        DPORT_N: 目的端口的网络字节序格式
        RAND_BYTE: 随机字节(0-255),长度由=(length) 参数决定
        RAND_DIGIT: 随机数字0-9,长度由=(length) 参数决定
        RAND_ALPHA: 随机大写字母A-Z,长度由=(length) 参数决定
        RAND_ALPHANUM: 随机大写字母A-Z和随机数字0-9,长度由=(length) 参数决定

    配置文件

    ZMap支持使用配置文件来代替在命令行上指定所有要求的选项。配置中可以通过每行指定一个长名称的选项和对应的值来创建:

        interface "eth1"
        source-ip 1.1.1.4-1.1.1.8
        gateway-mac b4:23:f9:28:fa:2d # upstream gateway
        cooldown-time 300 # seconds
        blacklist-file /etc/zmap/blacklist.conf
        output-file ~/zmap-output
        quiet
        summary

    然后ZMap就可以按照配置文件并指定一些必要的附加参数运行了:

        $ zmap --config=~/.zmap.conf --target-port=443

    详细

    ZMap可以在屏幕上生成多种类型的输出。默认情况下,Zmap将每隔1秒打印出相似的基本进度信息。可以通过设置--quiet来禁用。

        0:01 12%; send: 10000 done (15.1 Kp/s avg); recv: 144 143 p/s (141 p/s avg); hits: 1.44%

    ZMap同样也可以根据扫描配置打印如下消息,可以通过'--verbosity`参数加以控制。

        Aug 11 16:16:12.813 [INFO] zmap: started
        Aug 11 16:16:12.817 [DEBUG] zmap: no interface provided. will use eth0
        Aug 11 16:17:03.971 [DEBUG] cyclic: primitive root: 3489180582
        Aug 11 16:17:03.971 [DEBUG] cyclic: starting point: 46588
        Aug 11 16:17:03.975 [DEBUG] blacklist: 3717595507 addresses allowed to be scanned
        Aug 11 16:17:03.975 [DEBUG] send: will send from 1 address on 28233 source ports
        Aug 11 16:17:03.975 [DEBUG] send: using bandwidth 10000000 bits/s, rate set to 14880 pkt/s
        Aug 11 16:17:03.985 [DEBUG] recv: thread started

    ZMap还支持在扫描之后打印出一个的可grep的汇总信息,类似于下面这样,可以通过调用--summary来实现。

        cnf target-port 443
        cnf source-port-range-begin 32768
        cnf source-port-range-end 61000
        cnf source-addr-range-begin 1.1.1.4
        cnf source-addr-range-end 1.1.1.8
        cnf maximum-packets 4294967295
        cnf maximum-runtime 0
        cnf permutation-seed 0
        cnf cooldown-period 300
        cnf send-interface eth1
        cnf rate 45000
        env nprocessors 16
        exc send-start-time Fri Jan 18 01:47:35 2013
        exc send-end-time Sat Jan 19 00:47:07 2013
        exc recv-start-time Fri Jan 18 01:47:35 2013
        exc recv-end-time Sat Jan 19 00:52:07 2013
        exc sent 3722335150
        exc blacklisted 572632145
        exc first-scanned 1318129262
        exc hit-rate 0.874102
        exc synack-received-unique 32537000
        exc synack-received-total 36689941
        exc synack-cooldown-received-unique 193
        exc synack-cooldown-received-total 1543
        exc rst-received-unique 141901021
        exc rst-received-total 166779002
        adv source-port-secret 37952
        adv permutation-gen 4215763218

    结果输出

    ZMap可以通过输出模块生成不同格式的结果。默认情况下,ZMap只支持csv的输出,但是可以通过编译支持redis和json 。可以使用输出过滤来过滤这些发送到输出模块上的结果。输出模块输出的字段由用户指定。默认情况如果没有指定输出文件,ZMap将以csv格式返回结果,而不会生成特定结果。也可以编写自己的输出模块;请参阅编写输出模块。

    -o, --output-file=p

    输出写入文件地址

    -O, --output-module=p

    调用自定义输出模块

    -f, --output-fields=p

    以逗号分隔的输出的字段列表

    --output-filter=filter

    对给定的探测指定字段输出过滤

    --list-output-modules

    列出可用输出模块

    --list-output-fields

    列出给定的探测的可用输出字段
    输出字段

    除了IP地址之外,ZMap有很多字段。这些字段可以通过在给定探测模块上运行--list-output-fields来查看。

        $ zmap --probe-module="tcp_synscan" --list-output-fields
        saddr string: 应答包中的源IP地址
        saddr-raw int: 网络字节格式的源IP地址
        daddr string: 应答包中的目的IP地址
        daddr-raw int: 网络字节格式的目的IP地址
        ipid int: 应答包中的IP识别号
        ttl int: 应答包中的ttl(存活时间)值
        sport int: TCP 源端口
        dport int: TCP 目的端口
        seqnum int: TCP 序列号
        acknum int: TCP Ack号
        window int: TCP 窗口
        classification string: 包类型
        success int: 是应答包成功
        repeat int: 是否是来自主机的重复响应
        cooldown int: 是否是在冷却时间内收到的响应
        timestamp-str string: 响应抵达时的时间戳使用ISO8601格式
        timestamp-ts int: 响应抵达时的时间戳使用UNIX纪元开始的秒数
        timestamp-us int: 时间戳的微秒部分(例如 从'timestamp-ts'的几微秒)

    可以通过使用--output-fields=fields或-f来选择选择输出字段,任意组合的输出字段可以被指定为逗号分隔的列表。例如:

        $ zmap -p 80 -f "response,saddr,daddr,sport,seq,ack,in_cooldown,is_repeat,timestamp" -o output.csv

    过滤输出

    在传到输出模块之前,探测模块生成的结果可以先过滤。过滤是针对探测模块的输出字段的。过滤使用类似于SQL的简单过滤语法写成,通过ZMap的--output-filter选项来指定。输出过滤通常用于过滤掉重复的结果,或仅传输成功的响应到输出模块。

    过滤表达式的形式为<字段名> <操作符> <值>。<值>的类型必须是一个字符串或一串无符号整数并且匹配<字段名>类型。对于整数比较有效的操作符是= !=, <, >, <=, >=。字符串比较的操作是=,!=。--list-output-fields可以打印那些可供探测模块选择的字段和类型,然后退出。

    复合型的过滤操作,可以通过使用&&(逻辑与)和||(逻辑或)这样的运算符来组合出特殊的过滤操作。

    示例

    书写一则过滤仅显示成功的、不重复的应答

        --output-filter="success = 1 && repeat = 0"

    过滤出RST分类并且TTL大于10的包,或者SYNACK分类的包

        --output-filter="(classification = rst && ttl > 10) || classification = synack"

    CSV

    csv模块将会生成以逗号分隔各个要求输出的字段的文件。例如,以下的指令将生成名为output.csv的CSV文件。

        $ zmap -p 80 -f "response,saddr,daddr,sport,seq,ack,in_cooldown,is_repeat,timestamp" -o output.csv

        #响应, 源地址, 目的地址, 源端口, 目的端口, 序列号, 应答, 是否是冷却模式, 是否重复, 时间戳
        response, saddr, daddr, sport, dport, seq, ack, in_cooldown, is_repeat, timestamp
        synack, 159.174.153.144, 10.0.0.9, 80, 40555, 3050964427, 3515084203, 0, 0,2013-08-15 18:55:47.681
        rst, 141.209.175.1, 10.0.0.9, 80, 40136, 0, 3272553764, 0, 0,2013-08-15 18:55:47.683
        rst, 72.36.213.231, 10.0.0.9, 80, 56642, 0, 2037447916, 0, 0,2013-08-15 18:55:47.691
        rst, 148.8.49.150, 10.0.0.9, 80, 41672, 0, 1135824975, 0, 0,2013-08-15 18:55:47.692
        rst, 50.165.166.206, 10.0.0.9, 80, 38858, 0, 535206863, 0, 0,2013-08-15 18:55:47.694
        rst, 65.55.203.135, 10.0.0.9, 80, 50008, 0, 4071709905, 0, 0,2013-08-15 18:55:47.700
        synack, 50.57.166.186, 10.0.0.9, 80, 60650, 2813653162, 993314545, 0, 0,2013-08-15 18:55:47.704
        synack, 152.75.208.114, 10.0.0.9, 80, 52498, 460383682, 4040786862, 0, 0,2013-08-15 18:55:47.707
        synack, 23.72.138.74, 10.0.0.9, 80, 33480, 810393698, 486476355, 0, 0,2013-08-15 18:55:47.710

    Redis

    Redis的输出模块允许地址被添加到一个Redis的队列,而不是保存到文件,允许ZMap将它与之后的处理工具结合使用。

    注意! ZMap默认不会编译Redis功能。如果你从源码构建ZMap,可以在CMake的时候加上-DWITH_REDIS=ON来增加Redis支持。
    JSON

    JSON输出模块用起来类似于CSV模块,只是以JSON格式写入到文件。JSON文件能轻松地导入到其它可以读取JSON的程序中。

    注意!,ZMap默认不会编译JSON功能。如果你从源码构建ZMap,可以在CMake的时候加上-DWITH_JSON=ON来增加JSON支持。
    黑名单和白名单

    ZMap同时支持对网络前缀做黑名单和白名单。如果ZMap不加黑名单和白名单参数,他将会扫描所有的IPv4地址(包括本地的,保留的以及组播地 址)。如果指定了黑名单文件,那么在黑名单中的网络前缀将不再扫描;如果指定了白名单文件,只有那些网络前缀在白名单内的才会扫描。白名单和黑名单文件可 以协同使用;黑名单优先于白名单(例如:如果您在白名单中指定了10.0.0.0/8并在黑名单中指定了10.1.0.0/16,那么10.1.0.0 /16将不会扫描)。白名单和黑名单文件可以在命令行中指定,如下所示:

    -b, --blacklist-file=path

    文件用于记录黑名单子网,以CIDR(无类域间路由)的表示法,例如192.168.0.0/16

    -w, --whitelist-file=path

    文件用于记录限制扫描的子网,以CIDR的表示法,例如192.168.0.0/16

    黑名单文件的每行都需要以CIDR的表示格式书写,一行单一的网络前缀。允许使用#加以备注。例如:

        # IANA(英特网编号管理局)记录的用于特殊目的的IPv4地址
        # http://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
        # 更新于2013-05-22
        0.0.0.0/8 # RFC1122: 网络中的所有主机
        10.0.0.0/8 # RFC1918: 私有地址
        100.64.0.0/10 # RFC6598: 共享地址空间
        127.0.0.0/8 # RFC1122: 回环地址
        169.254.0.0/16 # RFC3927: 本地链路地址
        172.16.0.0/12 # RFC1918: 私有地址
        192.0.0.0/24 # RFC6890: IETF协议预留
        192.0.2.0/24 # RFC5737: 测试地址1
        192.88.99.0/24 # RFC3068: IPv6转换到IPv4的任播
        192.168.0.0/16 # RFC1918: 私有地址
        192.18.0.0/15 # RFC2544: 检测地址
        198.51.100.0/24 # RFC5737: 测试地址2
        203.0.113.0/24 # RFC5737: 测试地址3
        240.0.0.0/4 # RFC1112: 预留地址
        255.255.255.255/32 # RFC0919: 限制广播地址
        # IANA记录的用于组播的地址空间
        # http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml
        # 更新于2013-06-25
        224.0.0.0/4 # RFC5771: 组播/预留地址ed

    如果您只是想扫描因特网中随机的一部分地址,使用抽样检出,来代替使用白名单和黑名单。

    注意!ZMap默认设置使用/etc/zmap/blacklist.conf作为黑名单文件,其中包含有本地的地址空间和预留的IP空间。通过编辑/etc/zmap/zmap.conf可以改变默认的配置。
    速度限制与抽样

    默认情况下,ZMap将以您当前网卡所能支持的最快速度扫描。以我们对于常用硬件的经验,这通常是理论上Gbit以太网速度的95-98%,这可能 比您的上游提供商可处理的速度还要快。ZMap是不会自动的根据您的上游提供商来调整发送速率的。您可能需要手动的调整发送速率来减少丢包和错误结果。

    -r, --rate=pps

    设置最大发送速率以包/秒为单位

    -B, --bandwidth=bps

    设置发送速率以比特/秒(支持G,M和K后缀)。这会覆盖--rate参数。

    ZMap同样支持对IPv4地址空间进行指定最大目标数和/或最长运行时间的随机采样。由于每次对主机的扫描是通过随机排序生成的,限制扫描的主机个数为N就会随机抽选N个主机。命令选项如下:

    -n, --max-targets=n

    探测目标上限数量

    -N, --max-results=n

    结果上限数量(累积收到这么多结果后退出)

    -t, --max-runtime=s

    发送数据包时间长度上限(以秒为单位)

    -s, --seed=n

    种子用以选择地址的排列方式。使用不同ZMap执行扫描操作时将种子设成相同的值可以保证相同的扫描顺序。

    举个例子,如果您想要多次扫描同样的一百万个互联网主机,您可以设定排序种子和扫描主机的上限数量,大致如下所示:

        zmap -p 443 -s 3 -n 1000000 -o results

    为了确定哪一百万主机将要被扫描,您可以执行预扫,只打印数据包而非发送,并非真的实施扫描。

        zmap -p 443 -s 3 -n 1000000 --dryrun | grep daddr
        | awk -F'daddr: ' '{print $2}' | sed 's/ |.*//;'

    发送多个数据包

    ZMap支持向每个主机发送多个探测。增加这个数量既增加了扫描时间又增加了到达的主机数量。然而,我们发现,增加的扫描时间(每个额外扫描的增加近100%)远远大于到达的主机数量(每个额外扫描的增加近1%)。

    -P, --probes=n

    向每个IP发出的独立探测个数(默认值=1)
    示例应用

    ZMap专为向大量主机发起连接并寻找那些正确响应而设计。然而,我们意识到许多用户需要执行一些后续处理,如执行应用程序级别的握手。例如,用户在80端口实施TCP SYN扫描也许想要实施一个简单的GET请求,还有用户扫描443端口可能希望完成TLS握手。
    Banner获取

    我们收录了一个示例程序,banner-grab,伴随ZMap使用可以让用户从监听状态的TCP服务器上接收到消息。Banner-grab连接 到提供的服务器上,发送一个可选的消息,然后打印出收到的第一个消息。这个工具可以用来获取banner,例如HTTP服务的回复的具体指 令,telnet登陆提示,或SSH服务的字符串。

    下面的例子寻找了1000个监听80端口的服务器,并向每个发送一个简单的GET请求,存储他们的64位编码响应至http-banners.out

        $ zmap -p 80 -N 1000 -B 10M -o - | ./banner-grab-tcp -p 80 -c 500 -d ./http-req > out

    如果想知道更多使用banner-grab的细节,可以参考examples/banner-grab中的README文件。

    注意! ZMap和banner-grab(如例子中)同时运行可能会比较显著的影响对方的表现和精度。确保不让ZMap占满banner-grab-tcp的并 发连接,不然banner-grab将会落后于标准输入的读入,导致阻塞ZMap的输出写入。我们推荐使用较慢扫描速率的ZMap,同时提升 banner-grab-tcp的并发性至3000以内(注意 并发连接>1000需要您使用ulimit -SHn 100000和ulimit -HHn 100000来增加每个进程的最大文件描述符数量)。当然,这些参数取决于您服务器的性能、连接成功率(hit-rate);我们鼓励开发者在运行大型扫描之前先进行小样本的试验。
    建立套接字

    我们也收录了另一种形式的banner-grab,就是forge-socket, 重复利用服务器发出的SYN-ACK,连接并最终取得banner。在banner-grab-tcp中,ZMap向每个服务器发送一个SYN,并监听服务器发回的带有SYN+ACK的应答。运行ZMap主机的内核接受应答后发送RST,这样就没有与该包关联活动连接。程序banner-grab必须在这之后创建一个新的TCP连接到从服务器获取数据。

    在forge-socket中,我们利用内核中同名的模块,使我们可以创建任意参数的TCP连接。可以通过抑制内核的RST包,并重用SYN+ACK的参数取代该包而创建套接字,通过这个套接字收发数据和我们平时使用的连接套接字并没有什么不同。

    要使用forge-socket,您需要forge-socket内核模块,从github上可以获得。您需要git clone [email protected]:ewust/forge_socket.git至ZMap源码根目录,然后cd进入forge_socket目录,运行make。以root身份运行insmod forge_socket.ko 来安装该内核模块。

    您也需要告知内核不要发送RST包。一个简单的在全系统禁用RST包的方法是使用iptables。以root身份运行iptables -A OUTPUT -p tcp -m tcp --tcp-flgas RST,RST RST,RST -j DROP即可,当然您也可以加上一项--dport X将禁用局限于所扫描的端口(X)上。扫描完成后移除这项设置,以root身份运行iptables -D OUTPUT -p tcp -m tcp --tcp-flags RST,RST RST,RST -j DROP即可。

    现在应该可以建立forge-socket的ZMap示例程序了。运行需要使用extended_fileZMap输出模块:

        $ zmap -p 80 -N 1000 -B 10M -O extended_file -o - | \
        ./forge-socket -c 500 -d ./http-req > ./http-banners.out

    详细内容可以参考examples/forge-socket目录下的README。
    编写探测和输出模块

    ZMap可以通过探测模块来扩展支持不同类型的扫描,通过输出模块增加不同类型的输出结果。注册过的探测和输出模块可以在命令行中列出:

    --list-probe-modules

    列出安装过的探测模块

    --list-output-modules

    列出安装过的输出模块
    输出模块

    ZMap的输出和输出后处理可以通过实现和注册扫描器的输出模块来扩展。输出模块在接收每一个应答包时都会收到一个回调。然而默认提供的模块仅提供简单的输出,这些模块同样支持更多的输出后处理(例如:重复跟踪或输出AS号码来代替IP地址)。

    通过定义一个新的output_module结构来创建输出模块,并在output_modules.c中注册:

        typedef struct output_module {
        const char *name; // 在命令行如何引用输出模块
        unsigned update_interval; // 以秒为单位的更新间隔
        output_init_cb init; // 在扫描器初始化的时候调用
        output_update_cb start; // 在扫描器开始的时候调用
        output_update_cb update; // 每次更新间隔调用,秒为单位
        output_update_cb close; // 扫描终止后调用
        output_packet_cb process_ip; // 接收到应答时调用
        const char *helptext; // 会在--list-output-modules时打印在屏幕上
        } output_module_t;

    输出模块必须有名称,通过名称可以在命令行调用,并且通常会实现success_ip和常见的other_ip回调。process_ip的回调由每个收到并经由probe module过滤的应答包调用。应答是否被认定为成功并不确定(比如,它可以是一个TCP的RST)。这些回调必须定义匹配output_packet_cb定义的函数:

        int (*output_packet_cb) (
        ipaddr_n_t saddr, // 网络字节格式的发起扫描主机IP地址
        ipaddr_n_t daddr, // 网络字节格式的目的IP地址
        const char* response_type, // 发送模块的数据包分类
        int is_repeat, // {0: 主机的第一个应答, 1: 后续的应答}
        int in_cooldown, // {0: 非冷却状态, 1: 扫描器处于冷却中}
        const u_char* packet, // 指向IP包的iphdr结构体的指针
        size_t packet_len // 包的长度,以字节为单位
        );

    输出模块还可以通过注册回调,执行在扫描初始化的时候(诸如打开输出文件的任务)、在扫描开始阶段(诸如记录黑名单的任务)、在扫描的常规间隔(诸如状态更新的任务)、在关闭的时候(诸如关掉所有打开的文件描述符)。提供的这些回调可以完整的访问扫描配置和当前状态:

        int (*output_update_cb)(struct state_conf*, struct state_send*, struct state_recv*);

    这些定义在output_modules.h中。在src/outputmodules/modulecsv.c中有可用示例。
    探测模块

    数据包由探测模块构造,它可以创建各种包和不同类型的响应。ZMap默认拥有两个扫描模块:tcp_synscan和icmp_echoscan。默认情况下,ZMap使用tcp_synscan来发送TCP SYN包并对每个主机的响应分类,如打开时(收到SYN+ACK)或关闭时(收到RST)。ZMap允许开发者编写自己的ZMap探测模块,使用如下的API:

    任何类型的扫描都必须通过开发和注册send_module_t结构中的回调来实现:

        typedef struct probe_module {
        const char *name; // 如何在命令行调用扫描
        size_t packet_length; // 探测包有多长(必须是静态的)
        const char *pcap_filter; // 对收到的响应实施PCAP过滤
        size_t pcap_snaplen; // libpcap 捕获的最大字节数
        uint8_t port_args; // 设为1,如果ZMap需要用户指定--target-port
        probe_global_init_cb global_initialize; // 在扫描初始化会时被调用一次
        probe_thread_init_cb thread_initialize; // 每个包缓存区的线程中被调用一次
        probe_make_packet_cb make_packet; // 每个主机更新包的时候被调用一次
        probe_validate_packet_cb validate_packet; // 每收到一个包被调用一次,
        // 如果包无效返回0,
        // 非零则有效。
        probe_print_packet_cb print_packet; // 如果在预扫模式下被每个包都调用
        probe_classify_packet_cb process_packet; // 由区分响应的接收器调用
        probe_close_cb close; // 扫描终止后被调用
        fielddef_t *fields // 该模块指定的字段的定义
        int numfields // 字段的数量
        } probe_module_t;

    在扫描操作初始化时会调用一次global_initialize,可以用来实施一些必要的全局配置和初始化操作。然而,global_initialize并不能访问包缓冲区,那里是线程特定的。代替的,thread_initialize在 每个发送线程初始化的时候被调用,提供对于缓冲区的访问,可以用来构建探测包和全局的源和目的值。此回调应用于构建主机不可知的包结构,甚至只有特定值 (如:目的主机和校验和),需要随着每个主机更新。例如,以太网头部信息在交换时不会变更(减去校验和是由NIC硬件计算的)因此可以事先定义以减少扫描 时间开销。

    调用回调参数make_packet是为了让被扫描的主机允许探测模块更 新主机指定的值,同时提供IP地址、一个非透明的验证字符串和探测数目(如下所示)。探测模块负责在探测中放置尽可能多的验证字符串,即便当服务器返回的 应答为空时,探测模块也能验证它的当前状态。例如,针对TCP SYN扫描,tcp_synscan探测模块会使用TCP源端口和序列号的格式存储验证字符串。响应包(SYN+ACK)将包含目的端口和确认号的预期 值。

        int make_packet(
        void *packetbuf, // 包的缓冲区
        ipaddr_n_t src_ip, // 网络字节格式源IP
        ipaddr_n_t dst_ip, // 网络字节格式目的IP
        uint32_t *validation, // 探测中的有效字符串
        int probe_num // 如果向每个主机发送多重探测,
        // 该值为我们对于该主机
        // 正在发送的探测数目
        );

    扫描模块也应该定义pcap_filter、validate_packet和process_packet。只有符合PCAP过滤器的包才会被扫描。举个例子,在一个TCP SYN扫描的情况下,我们只想要调查TCP SYN / ACK或RST TCP数据包,并利用类似tcp && tcp[13] & 4 != 0 || tcp[13] == 18的过滤方法。validate_packet函数将会被每个满足PCAP过滤条件的包调用。如果验证返回的值非零,将会调用process_packet函数,并使用fields定义的字段和包中的数据填充字段集。举个例子,如下代码为TCP synscan探测模块处理了一个数据包。

        void synscan_process_packet(const u_char *packet, uint32_t len, fieldset_t *fs){
            struct iphdr *ip_hdr = (struct iphdr *)&packet[sizeof(struct ethhdr)];
            struct tcphdr *tcp = (struct tcphdr*)((char *)ip_hdr + (sizeof(struct iphdr)));
            fs_add_uint64(fs, "sport", (uint64_t) ntohs(tcp->source));
            fs_add_uint64(fs, "dport", (uint64_t) ntohs(tcp->dest));
            fs_add_uint64(fs, "seqnum", (uint64_t) ntohl(tcp->seq));
            fs_add_uint64(fs, "acknum", (uint64_t) ntohl(tcp->ack_seq));
            fs_add_uint64(fs, "window", (uint64_t) ntohs(tcp->window));
            if (tcp->rst) { // RST packet
                fs_add_string(fs, "classification", (char*) "rst", 0);
                fs_add_uint64(fs, "success", 0);
            } else { // SYNACK packet
                fs_add_string(fs, "classification", (char*) "synack", 0);
                fs_add_uint64(fs, "success", 1);
            }
        }

猜你喜欢

转载自blog.csdn.net/l1028386804/article/details/84204992
今日推荐