一.Nmap
Nmap 是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。它是网络管理员必用的软件之一,以及用以评估网络系统安全。它不局限于仅仅收集信息和枚举,同时可以用来作为一个漏洞探测器或安全扫描器。
1.1. 编译安装
1.1.1. Linux系统
1.1.1.1. 下载源码包
下载地址:https://nmap.org/download.html
https://nmap.org/dist/nmap-7.92.tar.bz2
https://nmap.org/dist/nmap-7.92.tgz
1.1.1.2. 解压
bzip2 -cd nmap-.tar.bz2 | tar xvf -
tar xvjf nmap-.tar.bz2
1.1.1.3. 配置构建系统
构建命令:./configure
常用参数:
a) --prefix=
此选项决定Nmap及其组件的安装位置。默认情况下,前缀/usr/local,即意味着NMA安装在/usr/local/bin,nmap.1被安装在/usr/local/man/man1,和数据文件(nmap-os-db, nmap-services,nmap-service-probes等)下安装/usr/local/share/nmap。如果你只是想改变某些组件的路径,可使用的选项--bindir、--datadir和--mandir。
b) --without-zenmap
此选项可防止安装 Zenmap 图形前端。
c) --with-openssl=
版本检测系统和 Nmap 脚本引擎能够使用免费的 OpenSSL 库探测 SSL 加密服务。通常,Nmap 构建系统会在您的系统上查找这些库,如果找到,则包含此功能。如果它们位于编译器默认不搜索的位置,但您仍希望使用它们,可使用此选项指定。
d) --with-libpcap=
Nmap 使用Libpcap库来捕获原始 IP 数据包。Nmap通常会在您的系统上查找 Libpcap的现有副本,并在版本号和平台合适时使用该副本。否则 Nmap 获取 Libpcap副本(libpcap/NMAP_MODIFICATIONS在Nmap源目录中描述了一些本地修改)。如果您希望强制Nmap与您自己的Libpcap链接,可使用此选项传递给configure。
e) --with-libpcre=
PCRE 是一个与 Perl 兼容的正则表达式库,可从http://www.pcre.org 获得。Nmap 通常会在你的系统上寻找一个副本,如果失败,然后回退到它自己的副本。如果您的 PCRE 库不在编译器的标准搜索路径中,Nmap 可能找不到它。在这种情况下,您可以通过指定此选项。
f) --with-libdnet=
Libdnet 是一个优秀的网络库,Nmap 使用它来发送原始以太网帧。Nmap 树中的版本被大量修改(特别是 Windows 代码),因此默认是使用包含的版本。如果您希望改用系统上已安装的版本,可使用此选项传递给configure。
g) --with-localdirs
此选项告诉Nmap的默认使用/usr/local/lib和/usr/local/include重要的库和头文件。
1.1.1.4. 编译安装
编译安装命令:make & make install
1.1.2. Windows系统
1.1.2.1. 依赖下载
名称 |
版本 |
URL |
Nmap |
7.9.2 |
|
Cygwin |
3.2.0 |
|
Npcap |
1.5.0 |
|
Visual C++ Redistributable Packages |
Visual Studio 2013 |
https://download.microsoft.com/download/F/3/5/F3500770-8A08-488E-94B6-17A1E1DD526F/vcredist_x64.exe |
1.1.2.2. 下载源码包
下载地址:https://nmap.org/download.html
https://nmap.org/dist/nmap-7.92.tar.bz2
https://nmap.org/dist/nmap-7.92.tgz
1.1.2.3. 解压
bzip2 -cd nmap-.tar.bz2 | tar xvf -
tar xvjf nmap-.tar.bz2
1.1.2.4. 配置构建系统
构建命令:./configure
常用参数:
a) --prefix=
此选项决定Nmap及其组件的安装位置。默认情况下,前缀/usr/local,即意味着NMA安装在/usr/local/bin,nmap.1被安装在/usr/local/man/man1,和数据文件(nmap-os-db, nmap-services,nmap-service-probes等)下安装/usr/local/share/nmap。如果你只是想改变某些组件的路径,可使用的选项--bindir、--datadir和--mandir。
b) --without-zenmap
此选项可防止安装 Zenmap 图形前端。
c) --with-openssl=
版本检测系统和 Nmap 脚本引擎能够使用免费的 OpenSSL 库探测 SSL 加密服务。通常,Nmap 构建系统会在您的系统上查找这些库,如果找到,则包含此功能。如果它们位于编译器默认不搜索的位置,但您仍希望使用它们,可使用此选项指定。
d) --with-libpcap=
Nmap 使用Libpcap库来捕获原始 IP 数据包。Nmap通常会在您的系统上查找 Libpcap的现有副本,并在版本号和平台合适时使用该副本。否则 Nmap 获取 Libpcap副本(libpcap/NMAP_MODIFICATIONS在Nmap源目录中描述了一些本地修改)。如果您希望强制Nmap与您自己的Libpcap链接,可使用此选项传递给configure。
e) --with-libpcre=
PCRE 是一个与 Perl 兼容的正则表达式库,可从http://www.pcre.org 获得。Nmap 通常会在你的系统上寻找一个副本,如果失败,然后回退到它自己的副本。如果您的 PCRE 库不在编译器的标准搜索路径中,Nmap 可能找不到它。在这种情况下,您可以通过指定此选项。
f) --with-libdnet=
Libdnet 是一个优秀的网络库,Nmap 使用它来发送原始以太网帧。Nmap 树中的版本被大量修改(特别是 Windows 代码),因此默认是使用包含的版本。如果您希望改用系统上已安装的版本,可使用此选项传递给configure。
g) --with-localdirs
此选项告诉Nmap的默认使用/usr/local/lib和/usr/local/include重要的库和头文件。
1.1.2.5. 编译安装
编译安装命令:make & make install
备注:
Windows运行nmap需要安装winpcap(https://nmap.org/npcap/dist/npcap-1.50.exe)
1.1.3. 主要依赖库说明
1.1.3.1. Libpcap(Packet Capture Library)
Libpcap是Unix/Linux平台下的网络数据包捕获函数库,它是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架。主要功能如下:
a. 数据包捕获:捕获流经网卡的原始数据包
b. 自定义数据包发送:任何构造格式的原始数据包
c. 流量采集与统计:网络采集的中流量信息
d. 规则过滤:提供自带规则过滤功能,按需要选择过滤规则
1.1.3.2. Libpcap工作原理
Libpcap库主要有两部分组成:网络分接口(Network Tap)和数据过滤器(Packet Filter)。
网络分接口从网络设备驱动程序中收集数据拷贝(旁路机制),过滤器决定是否接收该数据包。Libpcap利用BSD Packet Filter(BPF)算法对网卡接收到的链路层数据包进行过滤。BPF算法的基本思想是在有BPF监听的网络中,网卡驱动将接收到的数据包复制一份交给BPF过滤器,过滤器根据用户定义的规则决定是否接收此数据包以及需要拷贝该数据包的那些内容,然后将过滤后的数据给与过滤器相关联的上层应用程序。如果没有定义规则,则把全部数据交给上层应用程序。
如图所示一个数据包的捕捉分为三个主要部分:
- 面向底层包捕获、
- 面向中间层的数据包过滤
- 面向应用层的用户接口
Libpcap的包捕获机制就是在数据链路层加一个旁路处理。当一个数据包到达网络接口时,libpcap首先利用链路层PF_PACKET原始套接字从链路层驱动程序中获得该数据包的拷贝,再通过Tap函数将数据包发给BPF过滤器。BPF过滤器根据用户已经定义好的过滤规则对数据包进行逐一匹配,匹配成功则放入内核缓冲区,并传递给用户缓冲区,匹配失败则直接丢弃。如果没有设置过滤规则,所有数据包都将放入内核缓冲区,并传递给用户层缓冲区。所以整个过程并不干扰系统自身的网路协议栈的处理。
1.1.3.3. Libpcap使用流程
1) 决定对那一个接口进行嗅探,如eth0。我们也可以用一个字符串来定义这个设备。
2) 初始化pcap。使用文件句柄传入需要嗅探的设备。同时支持多个设备的嗅探。
3) 设置BPF. 创建一个规则集合,编译并且使用它。这个过程分为三个阶段:
a. 规则集合被置于一个字符串内,并且被转换成能被pcap读的格式。
b. 编译该规则(就是调用一个不被外部程序使用的函数)。
c. 告诉pcap使用它来过滤数据包。
4) pcap进入它的主循环。在这个阶段内pcap一直工作到它接收了所有我们想要的包为止。每当它收到一个包(或者多个数据包)就调用另一个已经定义好的函数,这个函数可以做我们想要的任何工作,比如它可以剖析包的上层协议信息并给用户打印出结果,它可以将结果保存为一个文件,或者什么也不作。
5) 在嗅探到所需的数据后,我们要关闭会话并结束。
1.1.3.4. Libpcre(Perl Compatible Regular Expressions)
Libpcre是一个Perl库,包括 perl 兼容的用C语言编写的正则表达式库。
1.1.3.5. Libdnet()
Libnet是一个小型的接口函数库,主要用C语言写成,提供了低层网络数据包的构造、处理和发送功能。主要特点如下:
a) 数据包构造:libnet提供了一系列的TCP/IP数据报文的构造函数以方便用户使用。
b) 数据包的处理:libnet提供了一系列的辅助函数,利用这些辅助函数,帮助用户简化那些烦琐的事务性的编程工作。
c) 数据包发送:libnet允许用户在两种不同的数据包发送方法中选择。
d) 可移植性:libnet可以在Linux、FreeBSD、Solaris、WindowsNT等操作系统上运行,并且提供了统一的接口。
1.1.3.6. Openssl(Secure Sockets Layer)
OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。主要特点如下:
a) 数据保密性:信息加密就是把明码的输入文件用加密算法转换成加密的文件以实现数据的保密。加密的过程需要用到密钥来加密数据然后再解密。没有了密钥,就无法解开加密的数据。数据加密之后,只有密钥要用一个安全的方法传送。加密过的数据可以公开地传送。
b) 数据完整性:加密也能保证数据的一致性。例如:消息验证码(MAC),能够校验用户提供的加密信息,接收者可以用MAC来校验加密数据,保证数据在传输过程中没有被篡改过。
c) 安全验证:加密的另外一个用途是用来作为个人的标识,用户的密钥可以作为他的安全验证的标识。SSL是利用公开密钥的加密技术(RSA)来作为用户端与服务器端在传送机密资料时的加密通讯协定。
1.2. 核心功能
1.2.1. 主机发现
Nmap发现主机的4种方式:ICMP-echo请求(ping)、向443端口发送TCP-SYN包、向80端口发送TCP-ACK包和ICMP-时间戳请求。
1.2.2. 端口扫描
用于确定目标主机的TCP/UDP端口的开放情况。端口状态如下:
1.2.2.1. 开放(Open)
应用程序正在该端口接收 TCP 连接或者 UDP 报文,发现这一点常常是端口扫描的主要目的,安全意识强的人知道每个开放的端口都是攻击的入口,攻击者或者入侵者想要发现开放的端口,而管理员则试图关闭它们或者用防火墙保护它们以免阻碍了合法用户,非安全检测性质的扫描可能对开放的端口也感兴趣,因为它们显示了网络上那些服务可供使用。
1.2.2.2. 关闭(Closed)
关闭的端口对于 Nmap 来说是可到达的(它接受 Nmap 的探测报文并作出响应),但没有应用程序在监听,它们表明该 IP 地址上的主机是存活的,例如进行主机发现或者 ping 扫描的时候,同时也是进行操作系统探测的一部分,因为关闭的端口代表主机是可到达的,也许值得再扫描一下,可能等一下这个端口就开放了,系统管理员可能会考虑用防火墙封锁这样的端口,那样他们就会被显示为被过滤的状态。
1.2.2.3. 过滤(Filtered)
由于包过滤阻止了探测报文到达端口,所以 Nmap 无法确定该端口是否开放,过滤可能来自专业的防火墙设备、路由器规则或者主机上的软件防火墙,这样的端口几乎不提供任何信息,有时候它们响应 ICMP 错误消息如类型 3 代码 13(destination unreachable: communication administratively prohibited),但更普遍的是过滤器只是丢弃探测帧,不做任何响应,这迫使 Nmap 重试若干次以访万一探测包是由于网络阻塞丢弃的,这会使得扫描速度明显变慢。
1.2.2.4. 未被过滤(Unfiltered)
未被过滤的状态意味着端口可到达,但 Nmap 不能确定它是开放还是关闭,只有 ACK 扫描才会把端口分类到这种状态,用其它类型的扫描方式如窗口扫描,SYN 扫描,或者 FIN 扫描,来扫描这种未被过滤的端口可以帮助确定端口是否开放。
1.2.2.5. 开放或被过滤(Open|Filtered)
当无法确定端口是开放还是被过滤时,Nmap 就把端口划分成这种状态,开放的端口不响应就是一个例子,没有响应也可能意味着报文过滤器丢弃了探测报文或者由它引发的任何回应,因此 Nmap 无法确定该端口是开放的还是被过滤的,UDP、IP 协议、FIN、NULL 和 Xmas 扫描都可能把端口归为此类。
1.2.2.6. 关闭或被过滤(Closed|Filtered)
该状态用于 Nmap 不能确定端口是关闭的还是被过滤时,它只可能出现于 IPID Idle 扫描中。
1.2.3. 服务与版本探测
在发现开放端口后,Nmap可进一步检查目标主机的检测服务协议、应用程序名称、版本号等信息。
1.2.4. 操作系统探测
Nmap向远程主机发送一系列数据包,并能够将远程主机的响应与操作系统指纹数据库进行比较。如果发现了匹配结果,它就会显示匹配的操作系统。它确实可能无法识别目标主机的操作系统;在这种情况下,如果您知道目标系统上使用的何种操作系统,可在它提供的从URL里提交有关信息,更新它的操作系统指纹数据库。
1.3. 常用指令
1.3.1. 目标规格(Target Specification)
1.3.1.1. -iL (Input from list)
主机名或者ip地址列表列表中的项可以是Nmap在 命令行上接受的任何格式(IP地址,主机名,CIDR,IPv6,或者八位字节范围)。 每一项必须以一个或多个空格,制表符或换行符分开。 如果您希望Nmap从标准输入而不是实际文件读取列表, 您可以用一个连字符(-)作为文件名。
1.3.1.2. -iR (Choose random targets)
随机选择一定数量的目标
1.3.1.3. --exclude [,[,...]] (Exclude hosts/networks)
不包含的主机
1.3.1.4. --excludefile (Exclude list from file)
不包含的主机的列表
1.3.2. 主机发现(Host Discovery)
a) 如果没有给出主机发现的选项,Nmap 就发送一个TCP ACK报文到80端口和一个ICMP回声请求到每台目标机器。
b) 一个例外是ARP扫描用于局域网上的任何目标机器。对于非特权UNIX shell用户,使用connect()系统调用会发送一个SYN报文而不是ACK 这些默认行为和使用-PA -PE选项的效果相同。
c) 另外要注意的是即使您指定了其它 -P*选项,ARP发现(-PR)对于局域网上的 目标而言是默认行为,因为它总是更快更有效。
1.3.2.1. -sL (List Scan)
列出给出目标的具体内容,默认会对地址进行反向解析,显示主机名。
1.3.2.2. -sn (No port scan)
与-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和回应请求)就被覆盖了。
1.3.2.3. -Pn (No ping)
跳过主机发现阶段,把每个IP都当成存活主机。
1.3.2.4. -PS (TCP SYN 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报头之外没有附加的数据(除非有任何数据——数据字符串,或者——数据长度选项被指定)。
1.3.2.5. -PA (TCP ACK Ping)
a) 该选项发送一个设置了SYN标志位的空TCP报文,默认端口为80。不同的端口可以作为选项制定(如 -PS22,23,25,80,113,1050,3500)
b) SYN标志位告诉对方您正试图建立一个连接。 通常目标端口是关闭的,一个RST (复位) 包会发回来。 如果碰巧端口是开放的,目标会进行TCP三步握手的第二步,回应 一个SYN/ACK TCP报文。
c) 无论RST还是SYN/ACK响应都告诉Nmap该主机正在运行。然后运行Nmap的机器则会扼杀这个正在建立的连接, 发送一个RST而非ACK报文,ST报文是运行Nmap的机器而不是Nmap本身响应的,因为它对收到 的SYN/ACK感到很意外。
1.3.2.6. -PU (UDP Ping)
1.3.2.7. -PY (SCTP INIT Ping)
1.3.2.8. -PE; -PP; -PM (ICMP Ping Types)
1.3.2.9. -PO (IP Protocol Ping)
1.3.2.10. --disable-arp-ping (No ARP or ND Ping)
1.3.2.11. --discovery-ignore-rst
1.3.2.12. --traceroute (Trace path to host)
1.3.2.13. -n (No DNS resolution)
1.3.2.14. -R (DNS resolution for all targets)
1.3.2.15. --resolve-all (Scan each resolved address)
1.3.2.16. --system-dns (Use system DNS resolver)
1.3.2.17. --dns-servers [,[,...]] (Servers to use for reverse DNS queries)
1.3.3. 扫描技术(Scan Techniques)
1.3.3.1. -sS (TCP SYN scan)
1.3.3.2. -sT (TCP connect scan)
1.3.3.3. -sU (UDP scans)
1.3.3.4. -sY (SCTP INIT scan)
1.3.3.5. -sN; -sF; -sX (TCP NULL, FIN, and Xmas scans)
1.3.3.6. -sA (TCP ACK scan)
1.3.3.7. -sW (TCP Window scan)
1.3.3.8. -sM (TCP Maimon scan)
1.3.3.9. --scanflags (Custom TCP scan)
1.3.3.10. -sZ (SCTP COOKIE ECHO scan)
1.3.3.11. -sI [:] (idle scan)
1.3.3.12. -sO (IP protocol scan)
1.3.3.13. -b (FTP bounce scan)
1.3.4. 端口规格和扫描顺序(Port Specification and Scan Order)
1.3.4.1. -p (Only scan specified ports)
a) 制定扫描某个或某些端口用逗号分隔,或者用链接符号表示范围也可
b) 对于-sO IP协议扫描,该选项用来指定协议号(0-255)
1.3.4.2. --exclude-ports (Exclude the specified ports from scanning)
排除的端口,指定排除的端口,如果是指定排除的协议号的话,他的值在0-255之间
1.3.4.3. -F (Fast (limited port) scan)
快速扫描,在nmap的nmap-services 文件中(对于-sO,是协议文件)指定您想要扫描的端口。 这比扫描所有65535个端口快得多。
1.3.4.4. -r (Don't randomize ports)
顺序扫描端口,默认情况下,Nmap按随机顺序扫描端口。
1.3.4.5. --port-ratio
扫描nmap-services中给出的目标的一定比例,这个值在1.0-0.0之间。
1.3.4.6. --top-ports
扫描nmap-services中的前多少个端口
1.3.5. 服务/版本检测(Service/Version Detection)
1.3.5.1. -sV (Version detection)
扫描服务版本,也可以用-A同时进行操作系统探测和版本扫描。
1.3.5.2. --allports (Don't exclude any ports from version detection)
1.3.5.3. --version-intensity (Set version scan intensity)
版本扫描强度,强度在1到9之间,一般来说,强度越大,服务越有可能被正确识别
1.3.5.4. --version-light (Enable light mode)
相当于 --version-intensity 2
1.3.5.5. --version-all (Try every single probe)
相当于 --version-intensity 9
1.3.5.6. --version-trace (Trace version scan activity)
打印出正在进行的版本扫描的详细信息
1.3.6. 脚本扫描(Script Scan)
1.3.6.1. -sC
1.3.6.2. --script ||/|[,...]
1.3.6.3. --script-args =,={=},={,}
指定脚本参数,里面不能有‘{’, ‘}’, ‘=’, or ‘,’,如果要用就用\转义
1.3.6.4. --script-args-file
从一个文件获取脚本参数
1.3.6.5. --script-help ||||all[,...]
打印脚本中的帮助信息
1.3.6.6. --script-trace
打印出脚本执行的具体信息
1.3.6.7. --script-updatedb
更新脚本库
1.3.7. 操作系统检测(OS Detection)
1.3.7.1. -O (Enable OS detection)
启用操作系统检测,也可以使用-A来同时启用操作系统检测和版本扫描。
1.3.7.2. --osscan-limit (Limit OS detection to promising targets)
只对至少知晓一个端口开放或者关闭的主机进行操作系统探测
1.3.7.3. --osscan-guess; --fuzzy (Guess OS detection results)
无法确定操作系统类型的时候,默认进行推测。但是使用这两项,会让检测更加准确。
1.3.7.4. --max-os-tries (Set the maximum number of OS detection tries against a target)
操作系统识别重试次数,默认重试五次
1.3.8. 时间与性能(Timing and Performance)
1.3.8.1. --min-hostgroup ; --max-hostgroup (Adjust parallel scan group sizes)
1.3.8.2. --min-parallelism ; --max-parallelism (Adjust probe parallelization)
1.3.8.3. --min-rtt-timeout , --max-rtt-timeout , --initial-rtt-timeout (Adjust probe timeouts)
1.3.8.4. --max-retries (Specify the maximum number of port scan probe retransmissions)
没有响应后的重试次数
1.3.8.5. --host-timeout (Give up on slow target hosts)
1.3.8.6. --script-timeout
设置脚本超时时间,预防脚本的bug导致影响效率
1.3.8.7. --scan-delay ; --max-scan-delay (Adjust delay between probes)
1.3.8.8. --min-rate ; --max-rate (Directly control the scanning rate)
控制发包速度,最少每秒发多少,最多每秒发多少。如果0.1的话就是10秒发送一个包
1.3.8.9. --defeat-rst-ratelimit
忽略系统reset包的速率限制
1.3.8.10. --defeat-icmp-ratelimit
忽略系统ICMP错误消息速率限制
1.3.8.11. --nsock-engine iocp|epoll|kqueue|poll|select
选择系统IO模型,nmap -V可以查看支持哪些
1.3.8.12. -T paranoid|sneaky|polite|normal|aggressive|insane (Set a timing template)
1.3.9. 防火墙/IDS 逃避和欺骗(Firewall/Ids Evasion and Spoofing)
1.3.9.1. -f (fragment packets); --mtu (using the specified MTU)
1.3.9.2. -D [,][,ME][,...] (Cloak a scan with decoys)
1.3.9.3. -S (Spoof source address)
1.3.9.4. -e (Use specified interface)
指定nmap使用哪个网络接口收发报文
1.3.9.5. --source-port ; -g (Spoof source port number)
1.3.9.6. --data (Append custom binary data to sent packets)
1.3.9.7. --data-string (Append custom string to sent packets)
1.3.9.8. --data-length (Append random data to sent packets)
1.3.9.9. --ip-options ; --ip-options (Send packets with specified ip options)
指定IP头
1.3.9.10. --ttl (Set IP time-to-live field)
为IPv4报文的time-to-live域设置指定的值
1.3.9.11. --randomize-hosts (Randomize target host order)
1.3.9.12. --spoof-mac (Spoof MAC address)
1.3.9.13. --proxies (Relay TCP connections through a chain of proxies)
设置代理,支持http代理和socks4代理
1.3.9.14. --badsum (Send packets with bogus TCP/UDP checksums)
1.3.9.15. --adler32 (Use deprecated Adler32 instead of CRC32C for SCTP checksums)
从旧版的SCTP协议设备获得响应
1.3.10. 输出(Output Options)
1~5项为格式输出选项,6~12项为调试选项,13~18项为其他输出选项。
1.3.10.1. -oN (normal output)
将结果输入指定文件
1.3.10.2. -oX (XML output)
将XML输出写入指定文件
1.3.10.3. -oS (ScRipT KIdd|3 oUTpuT)
1.3.10.4. -oG (grepable output)
1.3.10.5. -oA (Output to all formats)
1.3.10.6. -v (Increase verbosity level) , -v (Set verbosity level)
1.3.10.7. -d (Increase debugging level) , -d (Set debugging level)
1.3.10.8. --reason (Host and port state reasons)
打印主机和端口状态的原因
1.3.10.9. --stats-every (Print periodic timing stats)
周期性的输出统计数据
1.3.10.10. --packet-trace (Trace packets and data sent and received)
1.3.10.11. --open (Show only open (or possibly open) ports)
只显示开放或者可能开放的端口
1.3.10.12. --iflist (List interfaces and routes)
1.3.10.13. --append-output (Append to rather than clobber output files)
1.3.10.14. --resume (Resume aborted scan)
1.3.10.15. --noninteractive (Disable runtime interactions)
1.3.10.16. --stylesheet (Set XSL stylesheet to transform XML output)
1.3.10.17. --webxml (Load stylesheet from Nmap.Org)
1.3.10.18. --no-stylesheet (Omit XSL stylesheet declaration from XML)
1.3.11. 杂项(Misc)
1.3.11.1. -6 (Enable IPv6 scanning)
启用IPv6扫描
1.3.11.2. -A (Aggressive scan options)
强力扫描模式
1.3.11.3. --datadir (Specify custom Nmap data file location)
1.3.11.4. --servicedb (Specify custom services file)
1.3.11.5. --versiondb (Specify custom service probes file)
1.3.11.6. --send-eth (Use raw ethernet sending)
使用raw ethernet包来发包
1.3.11.7. --send-ip (Send at raw IP level)
要求Nmap通过原IP套接字发送报文,而不是低层的以 太网帧。这是--send-eth选项的补充。
1.3.11.8. --privileged (Assume that the user is fully privileged)
1.3.11.9. --unprivileged (Assume that the user lacks raw socket privileges)
1.3.11.10. --release-memory (Release memory before quitting)
1.3.11.11. -V; --version (Print version number)
1.3.11.12. -h; --help (Print help summary page)
1.4. 应用示例
1.4.1. 扫描机器上所有保留的 TCP 端口
nmap -v scanme.nmap.org
1.4.2. 隐形 SYN 扫描
nmap -sS -O scanme.nmap.org/24
对scanme.nmap.org所在/24网络上256个IP中的每台机器进行隐形SYN扫描。由于 SYN 扫描和操作系统检测,这需要 root 权限。
1.4.3. 主机枚举和 TCP 扫描
nmap -sV -p 22,53,110,143,4564 198.116.0-255.1-127
在 198.116.0.0/16 地址空间中 255 个可能的 8 位子网的每个子网的前半部分启动主机枚举和 TCP 扫描。这会测试系统是在其标准端口上运行 SSH、DNS、POP3 或 IMAP,还是在端口 4564 上运行任何内容。
1.4.4. 随机选择10000个主机扫描
nmap -v -iR 100000 -Pn -p 80
随机选择 100,000 个主机并扫描它们以查找 Web 服务器(端口 80)。
1.4.5. 扫描任何 Web 服务器的 4096 个 IP
nmap -Pn -p80 -oX logs/pb-port80scan.xml -oG logs/pb-port80scan.gnmap 216.163.128.20/20
扫描任何 Web 服务器的 4096 个 IP(不 ping 它们)并将输出保存为 grepable 和 XML 格式。
1.4.6. 加载属于默认类或者安全类或者入侵类的但是名字开头不是http-的脚本
nmap --script "(default or safe or intrusive) and not http-*"
二.Nping
Nping 是一个用于网络数据包生成、响应分析和响应时间测量的开源工具。Nping 可以为各种协议生成网络数据包,允许用户完全控制协议头。虽然 Nping 可以用作简单ping来检测活动主机的实用程序,但它也可以用作网络堆栈压力测试、ARP中毒、拒绝服务攻击、路由跟踪和其他目的的原始数据包生成器。
Nping的回声模式让用户查看数据包在源主机和目标主机之间的传输过程中的变化。这为了解防火墙规则、检测数据包损坏等的提供方法。
Nping 有一个非常灵活和强大的命令行界面,允许用户完全控制生成的数据包。Nping的特点包括:
· 自定义 TCP、UDP、ICMP 和 ARP 数据包生成。
· 支持多目标主机规范。
· 支持多目标端口规范。
· 非 root 用户的非特权模式。
· 用于高级故障排除和发现的回声模式。
· 支持以太网帧生成。
· 支持 IPv6(目前处于试验阶段)。
· 在 Linux、Mac OS 和 MS Windows 上运行。
· 路由跟踪功能。
· 高度可定制。
· 免费和开源。
2.1. 编译
Nping是Nmap的子目录,在编译Nmap的时候会随之编译,具体方法参考:编译安装
2.2. 协议说明
2.2.1. TCP协议
2.2.1.1. 简述
传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在 TCP 协议中,通过三次握手建立连接。通信结束后,还需要断开连接。如果在发送数据包时,没有正确被发送到目的地时,将会重新发送数据包。
2.2.1.2. 工作机制
TCP 协议的数据包进行传输采用的是服务器端和客户端模式。发送 TCP 数据请求方为客户端,另一方则为服务器端。客户端要与服务器端进行通信,服务器端必须开启监听的端口,客户端才能通过端口连接到服务器,然后进行通信。
2.2.1.3. 作用
TCP 协议使用的是面向连接的方法进行通信的,其作用如下:
a) 面向流的处理:TCP 以流的方式处理数据。换句话说,TCP 可以一个字节一个字节地接收数据,而不是一次接收一个预订格式的数据块。TCP 把接收到的数据组成长度不等的段,再传递到网际层。
b) 重新排序:如果数据以错误的顺序到达目的地,TCP 模块能够对数据重新排序,来恢复原始数据。
c) 流量控制:TCP 能够确保数据传输不会超过目的计算机接收数据的能力。
d) 优先级与安全:为 TCP 连接设置可选的优先级和安全级别。
e) 适当的关闭:以确保所有的数据被发送或接收以后,再进行关闭连接。
2.2.1.4. 报文结构
TCP 报文是 TCP 层传输的数据单元,也称为报文段。TCP 报文中每个字段如图所示。
TCP 报文中每个字段的含义:
a) 源端口和目的端口字段
i. TCP源端口(Source Port):源计算机上的应用程序的端口号,占 16 位。
ii. TCP目的端口(Destination Port):目标计算机的应用程序端口号,占 16 位。
b) 序列号字段
CP序列号(Sequence Number):占 32 位。它表示本报文段所发送数据的第一个字节的编号。在 TCP 连接中,所传送的字节流的每一个字节都会按顺序编号。当SYN标记不为1时,这是当前数据分段第一个字母的序列号;如果SYN的值是1时,这个字段的值就是初始序列值(ISN),用于对序列号进行同步。这时,第一个字节的序列号比这个字段的值大1,也就是ISN加1。
c) 确认号字段
TCP 确认号(Acknowledgment Number,ACK Number):占 32 位。它表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。其值是接收计算机即将接收到的下一个序列号,也就是下一个接收到的字节的序列号加1。
d) 数据偏移字段
TCP 首部长度(Header Length):数据偏移是指数据段中的“数据”部分起始处距离 TCP 数据段起始处的字节偏移量,占 4 位。其实这里的“数据偏移”也是在确定 TCP 数据段头部分的长度,告诉接收端的应用程序,数据从何处开始。
e) 保留字段
保留(Reserved):占 4 位。为 TCP 将来的发展预留空间,目前必须全部为 0。
f) 标志位字段
i. CWR(Congestion Window Reduce):拥塞窗口减少标志,用来表明它接收到了设置 ECE 标志的 TCP 包。并且,发送方收到消息之后,通过减小发送窗口的大小来降低发送速率。
ii. ECE(ECN Echo):用来在 TCP 三次握手时表明一个 TCP 端是具备 ECN 功能的。在数据传输过程中,它也用来表明接收到的 TCP 包的 IP 头部的 ECN 被设置为 11,即网络线路拥堵。
iii. URG(Urgent):表示本报文段中发送的数据是否包含紧急数据。URG=1 时表示有紧急数据。当 URG=1 时,后面的紧急指针字段才有效。
iv. ACK:表示前面的确认号字段是否有效。ACK=1 时表示有效。只有当 ACK=1 时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1。
v. PSH(Push):告诉对方收到该报文段后是否立即把数据推送给上层。如果值为 1,表示应当立即把数据提交给上层,而不是缓存起来。
vi. RST:表示是否重置连接。如果 RST=1,说明 TCP 连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。
vii. SYN:在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。SYN=1 时,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才为 1。
viii. FIN:标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接。
g) 窗口大小字段
窗口大小(Window Size):占 16 位。它表示从 Ack Number 开始还可以接收多少字节的数据量,也表示当前接收端的接收窗口还有多少剩余空间。该字段可以用于 TCP 的流量控制。
h) TCP 校验和字段
校验位(TCP Checksum):占 16 位。它用于确认传输的数据是否有损坏。发送端基于数据内容校验生成一个数值,接收端根据接收的数据校验生成一个值。两个值必须相同,才能证明数据是有效的。如果两个值不同,则丢掉这个数据包。Checksum 是根据伪头 + TCP 头 + TCP 数据三部分进行计算的。
i) 紧急指针字段
紧急指针(Urgent Pointer):仅当前面的 URG 控制位为 1 时才有意义。它指出本数据段中为紧急数据的字节数,占 16 位。当所有紧急数据处理完后,TCP 就会告诉应用程序恢复到正常操作。即使当前窗口大小为 0,也是可以发送紧急数据的,因为紧急数据无须缓存。
j) 可选项字段
选项(Option):长度不定,但长度必须是 32bits 的整数倍。
2.2.2. UDP协议
2.2.2.1. 简述
用户数据报协议(User Datagram Protocol,UDP)是一种传输层协议。在 TCP/IP 网络中,它与 TCP 协议一样用于处理数据包,是一种无连接的协议。
2.2.2.2. 工作机制
使用UDP传输数据时,由应用程序根据需要提供报文到达确认、排序、流量控制等功能。
通常情况下,UDP采用实时传输机制和时间戳来传输语音和视频数据。
2.2.2.3. 作用
TCP 协议在进行数据传输时,需要建立连接,并且每次传输的数据都需要进行确认。当不再进行传输数据时,还需要断开连接。这样做虽然安全,但是效率较低。而 UDP 协议正好避免了这些过程,它是一种没有复杂控制,提供面向无连接的通信服务协议。
2.2.2.4. 报文结构
UDP 报文分为 UDP 报头和 UDP 数据区两部分。报头由 4 个 16 位长(2 字节)字段组成,分别说明该报文的源端口、目的端口、报文长度和校验值。UDP 报文格式如图所示:
UDP 报文中每个字段的含义如下:
a) 源端口:这个字段占据 UDP 报文头的前 16 位,通常包含发送数据报的应用程序所使用的 UDP 端口。接收端的应用程序利用这个字段的值作为发送响应的目的地址。这个字段是可选的,所以发送端的应用程序不一定会把自己的端口号写入该字段中。如果不写入端口号,则把这个字段设置为 0。这样,接收端的应用程序就不能发送响应了。
b) 目的端口:接收端计算机上 UDP 软件使用的端口,占据 16 位。
c) 长度:该字段占据 16 位,表示 UDP 数据报长度,包含 UDP 报文头和 UDP 数据长度。因为 UDP 报文头长度是 8 个字节,所以这个值最小为 8。
d) 校验值:该字段占据 16 位,可以检验数据在传输过程中是否被损坏。
2.2.3. ICMP协议
2.2.3.1. 简述
控制报文协议(Internet Control Message Protocol,ICMP)是 TCP/IP 协议族的一个子协议。ICMP 协议用于在 IP 主机和路由器之间传递控制消息,描述网络是否通畅、主机是否可达、路由器是否可用等网络状态。
2.2.3.2. 工作机制
2.2.3.3. 作用
数据包在发送到目标主机的过程中,通常会经过一个或多个路由器。而数据包在通过这些路由进行传输时,可能会遇到各种问题,导致数据包无法发送到目标主机上。为了了解数据包在传输的过程中在哪个环节出现了问题,就需要用到 ICMP 协议。它可以跟踪消息,把问题反馈给源主机。
2.2.3.4. 报文结构
ICMP 报文一般为 8 个字节,包括类型、代码、校验和扩展内容字段。ICMP 报文基本结构如图所示。
其中,类型表示 ICMP 的消息类型,代码表示对类型的进一步说明,校验和表示对整个报文的报文信息的校验。
2.2.4. ARP协议
2.2.4.1. 简述
ARP 是“Address Resolution Protocol”的缩写,译为“地址解析协议”,它是根据 IP 地址获取物理地址的一个 TCP/IP 协议。
ARP 协议通过 IP 地址向 MAC 地址的转换,解决网际层和网络访问层的衔接问题。
由于 IP 地址和 MAC 地址定位方式不同,ARP 协议成为数据传输的必备协议。主机发送信息前,必须通过 ARP 协议获取目标 IP 地址对应的 MAC 地址,才能正确地发送数据包。
2.2.4.2. 工作机制
ARP 工作流程分为两个阶段,一个是 ARP 请求过程,另一个是 ARP 响应过程。工作流程如下所示。
在上面图片中,主机 A 的 IP 地址为 192.168.1.1,主机 B 的 IP 地址为 192.168.1.2。
主机 A 与主机 B 进行通信,需要获取其 MAC 地址,基本流程如下:
a) 主机 A 以广播形式向网络中所有主机发送 ARP 请求,请求包中包含了目标 IP 地址 192.168.1.2。
b) 主机 B 接收到请求,发现自己就是主机 A 要找的主机,返回响应,响应包中包含自己的 MAC 地址。
2.2.4.3. 作用
2.2.4.4. 报文结构
ARP 协议是通过报文进行工作的,ARP 报文格式如图所示。
ARP 报文总长度为 28 字节,MAC 地址长度为 6 字节,IP 地址长度为 4 字节。字段的含义如下:
a) 硬件类型:指明了发送方想知道的硬件接口类型,以太网的值为 1。
b) 协议类型:表示要映射的协议地址类型。它的值为 0x0800,表示 IP 地址。
c) 硬件地址长度和协议长度:分别指出硬件地址和协议的长度,以字节为单位。对于以太网上 IP 地址的ARP请求或应答来说,它们的值分别为 6 和 4。
d) 操作类型:用来表示这个报文的类型,ARP 请求为 1,ARP 响应为 2,RARP 请求为 3,RARP 响应为 4。
e) 发送方 MAC 地址:发送方设备的硬件地址。
f) 发送方 IP 地址:发送方设备的 IP 地址。
g) 目标 MAC 地址:接收方设备的硬件地址。
h) 目标 IP 地址:接收方设备的IP地址。
ARP 数据包分为请求包和响应包,对应报文中的某些字段值也有所不同:
a) ARP 请求包报文的操作类型(op)字段的值为 request(1),目标 MAC 地址字段的值为 Target 00:00:00_00:00:00(00:00:00:00:00:00)(广播地址)。
b) ARP 响应包报文中操作类型(op)字段的值为 reply(2),目标 MAC 地址字段的值为目标主机的硬件地址。
2.3. 常用命令
2.3.1. 探头模式(PROBE MODES)
2.3.1.1. --tcp-connect (TCP Connect mode)
无特权的tcp连接探测模式
2.3.1.2. --tcp (TCP mode)
tcp探测模式
2.3.1.3. --udp (UDP mode)
udp探测模式
2.3.1.4. --icmp (ICMP mode)
icmp 探测模式
2.3.1.5. --arp (ARP/RARP mode)
arp 探测模式
2.3.1.6. --traceroute (Traceroute mode)
traceroute 探测模式
2.3.2. TCP连接模式(TCP CONNECT MODE)
2.3.2.1. -p , --dest-port (Target ports)
设置目标端口
2.3.2.2. -g , --source-port (Spoof source port)
尝试使用常用源端口
2.3.3. TCP探测模式(TCP PROBE MODE)
2.3.3.1. -p , --dest-port (Target ports)
设置目标端口
2.3.3.2. -g , --source-port (Spoof source port)
设置源端口
2.3.3.3. --seq (Sequence Number)
设置序列号
2.3.3.4. --flags (TCP Flags)
设置tcp标识(ACK,PSH,RST,SYN,FIN...)
2.3.3.5. --win (Window Size)
设置window大小
2.3.3.6. --badsum (Invalid Checksum)
使用随机无效校验和
2.3.4. UDP探测模式(UDP PROBE MODE)
2.3.4.1. -p , --dest-port (Target ports)
设置目标端口
2.3.4.2. -g , --source-port (Spoof source port)
设置源端口
2.3.4.3. --badsum (Invalid Checksum)
使用随机无效校验和
2.3.5. ICMP探测模式(ICMP PROBE MODE)
2.3.5.1. --icmp-type (ICMP type)
icmp类型
2.3.5.2. --icmp-code
(ICMP code)
icmp代码
2.3.5.3. --icmp-id (ICMP identifier)
设置标识
2.3.5.4. --icmp-seq (ICMP sequence)
设置序列号
2.3.5.5. --icmp-redirect-addr (ICMP Redirect address)
设置重定向地址
2.3.5.6. --icmp-param-pointer (ICMP Parameter Problem pointer)
设置参数问题指针
2.3.5.7. --icmp-advert-lifetime (ICMP Router Advertisement Lifetime)
设置路由生命时间
2.3.5.8. --icmp-advert-entry , (ICMP Router Advertisement Entry)
添加路由实体
2.3.5.9. --icmp-orig-time (ICMP Originate Timestamp)
设置初始时间戳
2.3.5.10. --icmp-recv-time (ICMP Receive Timestamp)
设置接收时间戳
2.3.5.11. --icmp-trans-time (ICMP Transmit Timestamp)
设置传输时间戳
2.3.6. ARP/RARP探测模式(ARP/RARP PROBE MODE)
2.3.6.1. --arp-type (ICMP Type)
ARP,ARP-reply,RARP,RARP-reply
2.3.6.2. --arp-sender-mac (Sender MAC address)
设置发送者MAC地址
2.3.6.3. --arp-sender-ip (Sender IP address)
设置发送者IP地址
2.3.6.4. --arp-target-mac (target MAC address)
设置目标MAC地址
2.3.6.5. --arp-target-ip (target ip address)
设置目标IP地址
2.3.7. IPv4 选项(IPv4 OPTIONS)
2.3.7.1. -S , --source-ip (Source IP Address)
设置源IP地址
2.3.7.2. --dest-ip (Destination IP Address)
设置目标IP地址(与{target specification}等效)
2.3.7.3. --tos (Type of Service)
设置服务字段(8bit)
2.3.7.4. --id (Identification)
设置标识字段(16bit)
2.3.7.5. --df (Don't Fragment)
设置不分段标识
2.3.7.6. --mf (More Fragments)
设置多段标识
2.3.7.7. --ttl (Time To Live)
设置生存时间[0-255]
2.3.7.8. --badsum-ip (Invalid IP checksum)
使用随机无效校验和
2.3.7.9. --ip-options , --ip-options (IP Options)
设置IP选项
2.3.7.10. --mtu (Maximum Transmission Unit)
设置最大传输单元
2.3.8. IPv6选项(IPv6 OPTIONS)
2.3.8.1. -6, --ipv6 (Use IPv6)
2.3.8.2. -S , --source-ip (Source IP Address)
2.3.8.3. --dest-ip (Destination IP Address)
2.3.8.4. --flow (Flow Label)
2.3.8.5. --traffic-class (Traffic Class)
2.3.8.6. --hop-limit (Hop Limit)
2.3.9. 以太网选项(ETHERNET OPTIONS)
2.3.9.1. --dest-mac (Ethernet Destination MAC Address)
设置目标mac地址(ARP解析时不可使用)
2.3.9.2. --source-mac (Ethernet Source MAC Address)
设置源mac地址
2.3.9.3. --ether-type (Ethertype)
设置以太类型
2.3.10. 有效载荷选项(PAYLOAD OPTIONS)
2.3.10.1. --data (Append custom binary data to sent packets)
包含常用负载
2.3.10.2. --data-string (Append custom string to sent packets)
包含常用ASCII文本
2.3.10.3. --data-length (Append random data to sent packets)
包含len长度随机值作为负载
2.3.11. ECHO客户端/服务器(ECHO CLIENT/SERVER)
2.3.11.1. --ec , --echo-client (Run Echo client)
在客户模式运行Nping
2.3.11.2. --es , --echo-server (Run Echo server)
在服务器模式运行Nping
2.3.11.3. --ep , --echo-port (Set Echo TCP port number)
使用常用来监听或链接
2.3.11.4. --nc, --no-crypto (Disable encryption and authentication)
关闭加密和验证
2.3.11.5. --once (Serve one client and quit)
一次连接后停止服务器
2.3.11.6. --safe-payloads (Zero application data before echoing a packet)
消除echoed包中的应用数据
2.3.12. 时间和性能(TIMING AND PERFORMANCE)
选项采用的单位'ms'(毫秒)、‘s’(秒)、‘m’(分)或者‘h’(小时),如30m、0.25h。
2.3.12.1. --delay (Delay between probes)
调节探测之间的延迟
2.3.12.2. --rate (Send probes at a given rate)
每秒发送包的数量
2.3.13. 输出(OUTPUT)
2.3.13.1. -v[], --verbose [] (Increase or set verbosity level)
设置冗余等级,如:-v4
2.3.13.2. -q[], --reduce-verbosity [] (Decrease verbosity level)
设置冗余和调试等级
2.3.13.3. -d[] (Increase or set debugging level)
设置调试等级,如:-d3
2.3.14. 杂项(MISC)
2.3.14.1. -h, --help (Display help)
显示帮助信息
2.3.14.2. -V, --version (Display version)
显示当前版本
2.3.14.3. -c , --count (Stop after a given number of rounds)
运行多次后停止
2.3.14.4. -e , --interface (Set the network interface to be used)
2.3.14.5. --privileged (Assume that the user is fully privileged)
用户全权限
2.3.14.6. --unprivileged (Assume that the user lacks raw socket privileges)
2.3.14.7. --send-eth (Use raw ethernet sending)
在原始以太网层发送包
2.3.14.8. --send-ip (Send at raw IP level)
使用原始IP接口发送包
2.3.14.9. --bpf-filter --filter (Set custom BPF filter)
描述通用BPF过滤器
2.3.14.10. -H, --hide-sent (Do not display sent packets)
不显示发送的包
2.3.14.11. -N, --no-capture (Do not attempt to capture replies)
不抓获回复包
2.4. 应用示例
2.4.1. TCP 探测模式扫描指定端口
nping -c 1 --tcp -p 80,433 scanme.nmap.org google.com
-c:指定目标每个主机的次数,--tcp:指定 TCP 探测模式, -p 80,433:指定目标端口
2.4.2. 1个目标、3个端口、执行2次
nping --tcp -c 2 1.1.1.1 -p 100-102
2.4.3. 3个目标、1个端口、执行2次
nping --tcp -c 2 1.1.1.1 2.2.2.2 3.3.3.3 -p 8080
2.4.4. 1个目标、3个端口、执行1次、探测间延迟 500 毫秒
nping --tcp -c 1 --delay 500ms 1.1.1.1 2.2.2.2 3.3.3.3 -p 137-139
三.Ncat
它可以从命令行跨网络读取和写入数据。Ncat 是为 Nmap 项目编写的,是目前Netcat 家族中的巅峰之作。
它旨在成为一种可靠的后端工具,可立即为其他应用程序和用户提供网络连接。Ncat 不仅适用于 IPv4 和 IPv6,还为用户提供了几乎无限的潜在用途。
1. 将 TCP、UDP 和 SCTP 端口重定向到其他站点;
2. SSL 支持;
3. 通过 SOCKS4、SOCKS5 或 HTTP 代理的代理连接(以及可选的代理身份验证)
3.1. 下载
3.2. 编译
3.2.1. Linux系统
3.2.2. Windows系统
参考:https://secwiki.org/w/Nmap/Ncat_Portable#Building_Ncat_Portable_for_Windows
Windos环境依赖下载如下表:
名称 |
版本 |
URL |
Strawberry Perl |
5.32.1.1 |
https://strawberryperl.com/download/5.32.1.1/strawberry-perl-5.32.1.1-64bit.msi https://strawberryperl.com/download/5.32.1.1/strawberry-perl-5.32.1.1-64bit.zip |
OpenSSL |
1.1.1k |
|
Npcap |
1.5.0 |
|
Visual C++ Redistributable Packages |
Visual Studio 2013 |
https://download.microsoft.com/download/F/3/5/F3500770-8A08-488E-94B6-17A1E1DD526F/vcredist_x64.exe |
cpan -i Text::Template |
|
http://cpan.strawberryperl.com/authors/01mailrc.txt.gz http://cpan.strawberryperl.com/modules/02packages.details.txt.gz |
Nasm |
2.15.05 |
https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/win64/nasm-2.15.05-installer-x64.exe |
3.3. 运行模式
Ncat主要有两种运行模式:连接模式和监听模式;连接模式下,Ncat 作为客户端工作。在侦听模式下,它是一个服务器。
3.3.1. 连接模式
在连接模式下, 和参数告诉要连接到什么。是必需选项,可以是主机名或 IP 地址。 是可选项,它必须是十进制端口号;如果省略,则默认为 31337。
3.3.2. 监听模式
在监听模式下, 和控制服务器将绑定的地址。该模式下,2个参数都是可选项。如果 省略,则默认侦听 IPv4 和 IPv6 上的所有可用地址。如果省略,则默认为 31337。
3.4. 常用指令
3.4.1. 协议选项(Protocol Options)
3.4.1.1. -4 (IPv4 only)
仅强制使用 IPv4
3.4.1.2. -6 (IPv6 only)
仅强制使用 IPv6
3.4.1.3. -U, --unixsock (Use Unix domain sockets)
使用 Unix 域套接字而不是网络套接字。此选项可以单独用于流套接字,也可以与--udp数据报套接字结合使用。
该选项导致 Ncat 使用 Unix 域套接字而不是网络套接字。Unix 域套接字作为文件系统中的一个条目存在。您必须提供要连接或侦听的套接字的名称。例如:
a) 要建立连接:ncat -U ~/unixsock
b) 要侦听套接字:ncat -l -U ~/unixsock
如果套接字不存在,侦听模式将创建套接字。程序结束后套接字将继续存在。
支持流和数据报域套接字。单独 -U用于流套接字,或与--udp数据报套接字结合使用。数据报套接字需要一个源套接字来连接。默认情况下,将根据需要创建具有随机文件名的源套接字,并在程序结束时删除。
3.4.1.4. -u, --udp (Use UDP)
使用 UDP 进行连接(默认为 TCP)
3.4.1.5. --sctp (Use SCTP)
使用 SCTP 进行连接(默认为 TCP)。SCTP 支持在 TCP 兼容模式
3.4.1.6. --vsock (Use AF_VSOCK sockets)
使用 AF_VSOCK 套接字而不是默认的 TCP 套接字(仅限 Linux)。此选项可单独用于流套接字或与--udp数据报套接字结合使用。
--vsock选项导致 Ncat 使用 AF_VSOCK 套接字而不是网络套接字。必须提供 CID 而不是主机名或 IP 地址。
a) 要连接到主机:ncat --vsock 2 1234
b) 要侦听套接字:ncat -l --vsock 1234
流域和数据报域套接字均受支持,但套接字类型的可用性取决于管理程序。单独 --vsock用于流套接字,或与--udp数据报套接字结合使用。
3.4.2. 连接模式选项(Connect Mode Options)
3.4.2.1. -g [,,...] (Loose source routing)
设置IPv4 松散源路由的hops,多个hops以逗号分割。
3.4.2.2. -G (Set source routing pointer)
设置 IPv4 源路由的pointer,pointer参数必须是 4 的倍数且不超过 28。
3.4.2.3. -p , --source-port (Specify source port)
设置 Ncat 绑定的端口号。
3.4.2.4. -s , --source (Specify source address)
设置 Ncat 绑定的地址。
3.4.3. 监听模式选项(Listen Mode Options)
限制可能连接到侦听 Ncat 进程的主机的信息。
3.4.3.1. -l, --listen (Listen for connections)
侦听连接而不是连接到远程机器。
3.4.3.2. -m , --max-conns (Specify maximum number of connections)
Ncat 实例接受的最大同时连接数。默认值:100(Windows 上为 60)。
3.4.3.3. -k, --keep-open (Accept multiple connections)
通常,侦听服务器只接受一个连接,然后在连接关闭时退出。该选项可支持同时有多个连接,并在它们全部关闭时退出。
它必须在--listen模式下,由于Ncat无法网络输入何时结束,所以它会一直运行直到中断;意味这它不会关闭其输出流,因此调用Ncat读取并查找文件结尾的程序会挂起。
3.4.3.4. --broker (Connection brokering)
允许多方连接到一个集中的 Ncat 服务器并相互通信。Ncat 可以代理位于 NAT 后面或无法直接连接的系统之间的通信。
--broker结合--listen使用时,会导致--listen端口启用代理模式。
3.4.3.5. --chat (Ad-hoc “chat server”)
--chat选项启用聊天模式,用于在多个用户之间交换文本。在聊天模式下,连接代理处于打开状态。Ncat 在将收到的每条消息中继到其他连接之前,为收到的每条消息加上一个 ID 前缀。ID 对于每个连接的客户端都是唯一的。这有助于区分谁发送了什么。此外,诸如控制字符之类的非打印字符会被转义以防止它们对终端造成损害。
3.4.4. SSL选项(SSL Options)
3.4.4.1. --ssl (Use SSL)
a) 连接模式
此选项透明地与 SSL 服务器协商 SSL 会话,以安全地加密连接。
b) 服务器模式
此选项侦听传入的 SSL 连接,而不是普通的非隧道流量。
c) UDP 连接模式
此选项启用数据报 TLS (DTLS)。在服务器模式下不支持。
3.4.4.2. --ssl-verify (Verify server certificates)
在客户端模式下,--ssl-verify需要验证服务器证书。Ncat 在文件中带有一组默认的可信证书 ca-bundle.crt。 某些操作系统提供受信任证书的默认列表;如果可用,这些也将被使用。
Ncat 不检查吊销的证书。
此选项在服务器模式下无效。
3.4.4.3. --ssl-cert (Specify SSL certificate)
此选项提供用于验证服务器(在侦听模式下)或客户端(在连接模式下)的 PEM 编码证书文件的位置。与--ssl-key结合使用。
3.4.4.4. --ssl-key (Specify SSL private key)
此选项提供 PEM 编码的私钥文件的位置,该文件与名为 --ssl-cert.
3.4.4.5. --ssl-trustfile (List trusted certificates)
此选项设置用于证书验证的受信任证书列表。此选项的参数的PEM包含受信任证书的文件。通常,该文件将包含证书颁发机构的证书,但它也可能直接包含服务器证书。使用此选项时,Ncat 不使用其默认证书。
3.4.4.6. --ssl-ciphers (Specify SSL ciphersuites)
此选项设置 Ncat 在连接到服务器或接受来自客户端的 SSL 连接时将使用的密码套件列表。
3.4.4.7. --ssl-servername (Request distinct server name)
在客户端模式下,此选项设置 TLS SNI(服务器名称指示)扩展,它告诉服务器 Ncat 正在联系的逻辑服务器的名称。当目标服务器在一个底层网络地址托管多个虚拟服务器时,这一点很重要。如果未提供该选项,则将使用目标服务器主机名填充 TLS SNI 扩展。
3.4.4.8. --ssl-alpn (Specify ALPN protocol list)
此选项允许您指定要通过应用层协议协商 (ALPN) TLS 扩展发送的以逗号分隔的协议列表。并非所有版本的 OpenSSL 都支持。
3.4.5. 代理选项(Proxy Options)
3.4.5.1. --proxy [:] (Specify proxy address)
请求通过:,使用指定的协议--proxy-type。
如果未指定端口,则使用代理协议的已知端口(SOCKS 为 1080,HTTP 为 3128)。当使用 IP 地址而不是主机名指定 IPv6 HTTP 代理服务器时,必须使用方括号表示法(例如 [2001:db8::1]:8080)将端口与 IPv6 地址分开。如果代理需要身份验证,请使用--proxy-auth。
3.4.5.2. --proxy-type (Specify proxy protocol)
连接模式下,此选项请求协议 通过指定的代理主机进行连接--proxy。
侦听模式下,此选项使 Ncat 充当使用指定协议的代理服务器。
当前可用的连接模式协议有http (CONNECT)、socks4(SOCKSv4) 和 socks5(SOCKSv5)。当前唯一支持的服务器是http。如果未使用此选项,则默认协议为http。
3.4.5.3. --proxy-auth [:] (Specify proxy credentials)
连接模式下,提供将用于连接到代理服务器的凭据。
侦听模式下,提供连接客户端所需的凭据。
可以通过设置环境变量将这些凭据传递给 Ncat NCAT_PROXY_AUTH,这降低了凭据在进程日志中被捕获的风险。
3.4.5.4. --proxy-dns (Specify where to resolve proxy destination)
连接模式下,它提供对代理目标主机名是由远程代理服务器解析还是由 Ncat 本身在本地解析的控制。可选的如下:
a) local- 主机名在 Ncat 主机上本地解析。如果无法解析主机名,Ncat 将退出并显示错误。
b) remote- 主机名直接传递到远程代理服务器。这是默认行为。
c) both- 首先在 Ncat 主机上尝试主机名解析。无法解析的主机名被传递到远程代理服务器。
d) none- 完全禁用主机名解析。只能将文字 IPv4 或 IPv6 地址用作代理目标。
3.4.6. 命令执行选项(Command Execution Options)
执行exec选项,需要将以下变量添加到环境变量中:
a) NCAT_REMOTE_ADDR, NCAT_REMOTE_PORT
远程主机的 IP 地址和端口号。在连接模式下,它是目标的地址;在侦听模式下,它是客户端的地址。
b) NCAT_LOCAL_ADDR, NCAT_LOCAL_PORT
连接本地端的 IP 地址和端口号。
c) NCAT_PROTO
使用的协议:TCP、UDP和SCTP。
3.4.6.1. -e , --exec (Execute command)
建立连接后执行指定的命令。该命令必须指定为完整路径名。来自远程客户端的所有输入都将发送到应用程序,并将响应通过套接字发送回远程客户端,从而使您的命令行应用程序通过套接字进行交互。
结合--keep-open,Ncat 将处理指定端口/应用程序(如 inetd)的多个连接。Ncat 将只接受由-m选项控制的最大、可定义的同时连接数。默认设置值是 100(Windows 上为 60)。
3.4.6.2. -c , --sh-exec (Execute command via sh)
与-e相同,不必为命令指定完整路径,并且可以使用诸如环境变量之类的 shell 工具。
3.4.6.3. --lua-exec (Execute a .lua script)
在建立连接后,使用内置解释器将指定文件作为 Lua 脚本运行。脚本的标准输入和标准输出都被重定向到连接数据流。
3.4.7. 访问控制选项(Access Control Options)
3.4.7.1. --allow [,,...] (Allow connections)
指定的主机列表将是唯一允许连接到 Ncat 进程的主机。所有其他尝试连接将被断开。在发生冲突的情况下, --allow和--deny, --allow优先。
3.4.7.2. --allowfile (Allow connections from file)
与--allow具有相同的功能。不同之处在于排除的主机以换行分隔的方式写在拒绝文件中,而不是直接在命令行上提供。
3.4.7.3. --deny [,,...] (Deny connections)
向 Ncat 发出不允许连接到侦听 Ncat 进程的主机列表。如果指定的主机尝试连接,它们的会话将被静默终止。在发生冲突的情况下, --allow和--deny, --allow优先。
3.4.7.4. --denyfile (Deny connections from file)
与--deny具有相同的功能。不同之处在于排除的主机以换行分隔的方式写在拒绝文件中,而不是直接在命令行上提供。
3.4.8. 时间选项(Timing Options)
选项接受一个time参数。通过ms、s、m、或h来指定毫秒、秒、分钟或小时值。
3.4.8.1. -d , --delay (Specify line delay)
设置发送行的延迟间隔。这有效地限制了 Ncat 在指定时间段内将发送的行数。这可能对低带宽站点有用,或者有其他用途,例如处理烦人的iptables --limit选项。
3.4.8.2. -i , --idle-timeout (Specify idle timeout)
为空闲连接设置固定超时。如果达到空闲超时,则连接终止。
3.4.8.3. -w , --wait (Specify connect timeout)
为尝试连接设置固定超时。
3.4.9. 输出选项(Output Options)
3.4.9.1. -o , --output (Save session data)
将会话数据转储到文件
3.4.9.2. -x , --hex-dump (Save session data in hex)
将会话数据以十六进制转储到文件中。
3.4.9.3. --append-output (Append output)
--append-ouput与-o一起使用,-x它将附加结果输出而不是截断指定的输出文件。
3.4.9.4. -v, --verbose (Be verbose)
发出 Ncat ,-v它将变得冗长并显示各种有用的基于连接的信息。多次使用 ( -vv, -vvv...) 以获得更详细的信息。
3.4.10. 其他选项(Misc Options)
3.4.10.1. -C, --crlf (Use CRLF as EOL)
选项使Ncat从标准输入获取输入时,将LF行尾转换为CRLF。
3.4.10.2. -h, --help (Help screen)
显示带有常用选项和参数的简短帮助信息,然后退出。
3.4.10.3. --recv-only (Only receive data)
Ncat 将只接收数据而不会尝试发送任何内容。
3.4.10.4. --send-only (Only send data)
Ncat 将只发送数据并忽略接收到的任何内容。此选项还会导致 Ncat 关闭网络连接并在标准输入接收到 EOF 后终止。
3.4.10.5. --no-shutdown (Do not shutdown into half-duplex mode)
Ncat 将不会在 stdin 上看到 EOF 后在套接字上调用关闭。这是为了与 OpenBSD netcat 向后兼容而提供的,当使用它的 '-d' 选项执行时,它表现出这种行为。
3.4.10.6. -n, --nodns (Do not resolve hostnames)
完全禁用所有 Ncat 选项的主机名解析,例如目的地、源地址、源路由跃点和代理。所有地址都必须以数字形式指定。
3.4.10.7. -t, --telnet (Answer Telnet negotiations)
处理 DO/DONT WILL/WONT Telnet 协商。这使得使用 Ncat 编写 Telnet 会话脚本成为可能。
3.4.10.8. --version (Display version)
显示 Ncat 版本号并退出。
3.5. 应用示例
3.5.1. 在 TCP 端口 8080 上连接到 example.org
ncat example.org 8080
3.5.2. 侦听 TCP 端口 8080 上的连接
ncat -l 8080
3.5.3. 将本地机器上的 TCP 端口 8080 重定向到端口 80 上的主机
ncat --sh-exec "ncat example.org 80" -l 8080 --keep-open
3.5.4. 绑定TCP 8081端口,连接/bin/bash,自由访问
ncat --exec "/bin/bash" -l 8081 --keep-open
3.5.5. 绑定一个shell到TCP 8081端口,限制访问本地网络上的主机,同时连接的最大数量限制为3
ncat --exec "/bin/bash" --max-conns 3 --allow 192.168.0.0/24 -l 8081 --keep-open
3.5.6. 通过端口 1080 上的 SOCKS4 服务器连接到 smtphost:25
ncat --proxy socks4host --proxy-type socks4 --proxy-auth joe smtphost 25
3.5.7. 通过端口 1080 上的 SOCKS5 服务器连接到 smtphost:25
ncat --proxy socks5host --proxy-type socks5 --proxy-auth joe:secret smtphost 25
3.5.8. 在本地主机端口 8888 上创建 HTTP 代理服务器
ncat -l --proxy-type http localhost 8888
3.5.9. 文件拷贝
通过 TCP 端口 9899 将文件从客户端NODE发送到服务器SERVER
SERVER$ ncat -l 9899 > outputfile
NODE$ ncat SERVER 9899 < inputfile
3.5.10. 文件服务器,下发文件
通过TCP端口 9899 将文件从服务器SERVER发送到客户端NODE
SERVER$ ncat -l 9899 < inputfile
NODE$ ncat SERVER 9899 > outputfile
3.5.11. 将Ncat作为聊天工具
服务器SERVER监听TCP端口8080,客户端NODE扫描8080
SERVER$ ncat -l 8080
NODE$ ncat SERVER 8080
NODE$ ncat -w 10 SERVER 8080 #连接10s后终止
3.5.12. 将Ncat作为代理
所有发往到服务器8080端口的连接都会自动转发到192.168.1.1上的 80 端口
ncat -l 8080 | ncat 192.168.1.1 80
3.5.13. 通过Ncat进行端口转发
ncat -u -l 80 -c ‘ncat -u -l 8080’
3.5.14. 系统创建后门
黑客技术,一般不使用
ncat -l 10000 -e /bin/bash
四.Ndiff
一个帮助比较 Nmap 扫描的工具。它需要两个 Nmap XML 输出文件并打印它们之间的差异。主要比较的差异是:
A) 主机状态
B) 端口状态
C) 服务版本(-sV)
D) 操作系统匹配(-o)
E) 脚本输出
4.1.常用指令
4.1.1. -h, --help
显示帮助信息并退出。
4.1.2.-v, --verbose
包括输出中的所有主机和端口,而不仅仅是那些已更改的主机和端口。
4.1.3.--text
以可读的text文本格式写入输出
4.1.4.--xml
以机器可读的 XML 格式写入输出。
4.2.应用示例
4.2.1.发送分段数据包扫描,并将扫描结果写入文件
nmap -F scanme.nmap.org -oX scanme-1.xml
4.2.2.使用脚本扫描,并将扫描结果写入文件
nmap --script=html-title scanme.nmap.org -oX scanme-2.xml
4.2.3.比较差异
ndiff -v scanme-1.xml scanme-2.xml
4.2.4.定时扫描
TARGETS="<targets>"OPTIONS="-v -T4 -F -sV"date=`date +%F`cd /root/scans nmap $OPTIONS$TARGETS-oA scan-$date > /dev/null if [ -e scan-prev.xml ]; then ndiff scan-prev.xml scan-$date.xml > diff-$dateecho"*** NDIFF RESULTS ***"cat diff-$dateechofiecho"*** NMAP RESULTS ***"cat scan-$date.nmap ln-sf scan-$date.xml scan-prev.xml 012 * * * /root/scan-ndiff.sh
五.操作系统支持
5.1. 提交官方更新指纹
5.1.1. 提交操作系统或服务指纹
通过nmap -O <目标主机>或nmap -sV <目标主机> 检测国产操作系统目标主机;如果nmap无法确定目标机器的操作系统或服务的详细版本信息,则需要提交操作系统指纹。
提交地址如下表:
名称 |
URL |
操作系统指纹提交表 |
|
服务指纹提交表 |
另一种方式,可通过nmap指纹库来查看是否存在所需操作系统信息。查询地址:https://svn.nmap.org/nmap/nmap-os-db
5.1.2. 获取最新指纹数据库
等待邮件通知,从SVN库(https://svn.nmap.org/nmap/nmap-os-db)下载最新的数据库文件。
5.1.3. 更新安装数据库并测试
备份并替换最新的数据库文件,验证测试。
5.2. 自己修改指纹库
5.2.1. 生成指纹
命令:nmap -O -sV -T4 -d <主机IP>
5.2.2. 指纹SCAN对象解码
SCAN行是指纹的主要特性,具体说明如下:
a) Nmap 版本号 (V)
b) D以月/日形式显示的扫描日期 (D)
c) 打开和关闭(在目标上)用于扫描的TCP端口(OT和CT)
d) 关闭UDP端口(CU)
e) 私有IP空间(PV)。Y:目标上是专有网络,否则是N
f) 网络距离(DS)是与目标的网络跳距。0:目标是本地主机;1:以太网网络
g) 距离计算方法(DC) 表示网络距离(DS)的计算方式
h) 好的结果(G)。Y:条件和结果看起来足够好,N:其他
i) 目标MAC前缀(M)是目标MAC地址的前六位十六进制数字,对应于供应商名称。
j) OS扫描时间( TM)以Unix time_t格式(十六进制)
附录一:参考文档
附录二:源码
备注:
nmap4j执行命令返回成功结果为xml文本,需要做特定xml内容解析获取需要信息
附录三:竞品比较
|
Nmap |
Zmap |
Masscan |
IPScan |
核心功能 |
1. 主机发现 2. 端口扫描 3. 服务与版本探测 4. 操作系统探测 |
扫描发现主机的开放端口 |
海量 IP 端口扫描 |
1. 主机发现 2. 端口扫描 3. Web 服务器检测 4. NetBIOS 信息 |
扫描模式 |
TCP SYN scan、TCP connectscan、UDP scan、No Ping scan |
TCPSYN、ICMP echo、UDP |
FTP、HTTP、IMAP4、POP3、SMTP、SSH、SSL、SMBv1、SMBv2、Telnet、RDP、VNC |
TCP、UDP、ICMP、Java Built-in |
输出结果 |
txt、xml |
csv、redis、json、api |
xml、binary、json、list |
csv、txt、xml、IP-Port 列表 |
开发语言 |
Lua、C、C++、Python、Shell |
C、CMake、Python、Roff、Shell |
C |
Java、C、NSIS |
社区活跃度 (Github Star) (Gihub URL) 最新版本 |
5.4k |
3.9k |
15.7k |
2.4k |
|
|
2018.8.31暂停运营,2021开始版本持续发布 |
|
|
7.92 |
3.0.0-beta1、2.1.1 |
1.3.2 |
3.7.6 |
|
Nping |
Hping3 |
Fping |
支持协议 |
TCP、UDP、ICMP、ARP |
TCP、UDP、ICMP、RAW-IP |
ICMP |
|
|
|
|
开发语言 |
C |
C |
C、Perl、Shell、M4 |
社区活跃度 |
5.4k |
968 |
705 |
Gihub URL |
|||
最新版本 |
7.92 |
0.0.20051105 |
5.0 |
|
Ncat |
NetCat |
核心功能 |
从TCP/UDP连接中读取或发送网络数据 |
从TCP/UDP连接中读取或发送网络数据 |
|
|
|
开发语言 |
C |
C |
社区活跃度 |
5.4k |
515 |
Gihub URL |
||
最新版本 |
7.92 |
1.217 |
附录四:竞品下载
名称 |
下载地址 |
Nmap |
|
Zmap |
https://pkgs.org/download/zmap https://codeload.github.com/zmap/zmap/tar.gz/refs/tags/<version> |
Masscan |
|
Fping |
|
Hping |
|
Netcat |
|
Hping官网 |
|
Fping官网 |
|
Zmap官网 |
|
IPScan |
附录五:主机发现
主机发现:
|
数据链路层 |
网络层 |
传输层 |
优点 |
1. 速度快 2. 可靠性高 |
1. 可发现远程主机和经过路由的主机 2. 速度相对较快 |
1. 可探测远程主机 2. 比网络层更可靠 |
缺点 |
无法扫描经过路由的主机 |
1. 经常被防火墙过滤 2. 速度较链路层慢 |
消耗时间更长 |
工具 |
arping |
ping |
Nmap |
netdiscover |
fping |
|
|
|
hping3 |
附录六:Nmap诱发问题
名称 |
URL |
nmap扫描端口导致线上大量Java服务FullGC甚至OOM |