Nmap
输出
86. -oN <filespec>
标准输出
要求将标准输出直接写入指定 的文件。如上所述,这个格式与交互式输出 略有不同。
nmap -oN normal_output.txt 192.168.174.132
87. -oX <filespec>
XML 输出
请求将 XML 输出定向到给定的文件名。Nmap 包含一个文档类型定义 (DTD),允许 XML 解析器验证 Nmap XML 输出。虽然它主要用于编程,但它也可以帮助人类解释 Nmap XML 输出。DTD 定义了格式的合法元素,并经常列举它们可以采用的属性和值。最新版本始终可从 https://svn.nmap.org/nmap/docs/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 的机器(或类似配置的机器)。使用 --webxml 或 --stylesheet 选项可创建可移植的 XML 文件,这些文件可在任何连接到 Web 的机器上呈现为 HTML。
nmap -oX xml_output.txt 192.168.174.145
88. -oS <filespec>
ScRipT KIdd|3 oUTpuT - 脚本小子输出
脚本小子输出类似于交互式输出,只不过它经过了后期处理,以更好地适应 l33t HaXXorZ,他之前因为 Nmap 的大小写和拼写一致而看不起它。幽默感欠缺的人应该注意到,这个选项是在嘲笑脚本小子,而不是指责我所谓的“帮助他们”。
nmap -oS Script_kiddie_output.txt 192.168.174.145
89. -oG <filespec>
grepable 输出
由于此输出格式已被弃用,因此最后介绍。XML 输出格式功能强大得多,对于有经验的用户来说也同样方便。XML 是一种标准,有数十种出色的解析器可供使用,而 grepable 输出则是我自己的简单技巧。XML 可扩展以支持新发布的 Nmap 功能,而我经常必须从 grepable 输出中省略这些功能,因为没有地方放置它们。
尽管如此,grepable 输出仍然很受欢迎。它是一种简单的格式,在一行中列出每个主机,可以使用标准 Unix 工具(如 grep、awk、cut、sed、diff 和 Perl)轻松搜索和解析。甚至我通常也使用它在命令行上进行一次性测试。查找所有打开 SSH 端口或运行 Solaris 的主机,只需一个简单的 grep 即可识别主机,然后通过管道传输到 awk 或 cut 命令以打印所需的字段。
Grepable 输出由注释(以井号 (#) 开头的行)和目标行组成。目标行包括六个带标签的字段组合,这些字段由制表符分隔,后跟冒号。这些字段包括主机、端口、协议、忽略状态、操作系统、序列索引、IP ID 和状态。
这些字段中最重要的通常是端口,它提供了每个相关端口的详细信息。它是一个以逗号分隔的端口条目列表。每个端口条目代表一个相关端口,并采用七个斜杠 (/) 分隔的子字段的形式。这些子字段是:端口号、状态、协议、所有者、服务、SunRPC 信息和版本信息。
与 XML 输出一样,此手册页不允许记录整个格式。有关 Nmap Grepable 输出格式的更详细信息,请参阅“Grepable 输出 (-oG)”一节。
nmap -oG grepable_output.txt 192.168.174.145
90. -oA <basename>
输出为所有格式 - 同时以三种主要格式输出
为方便起见,您可以指定 -oA <basename> 以同时以普通、XML 和 grepable 格式存储扫描结果。它们分别存储在 <basename>.nmap、<basename>.xml 和 <basename>.gnmap 中。与大多数程序一样,您可以在文件名前加上目录路径,例如 Unix 上的 ~/nmaplogs/foocorp/ 或 Windows 上的 c:\hacking\sco。
nmap -oA all_output 192.168.174.145
详细和调试选项
91. -v,-v<level>
增加详细程度,设置详细程度 - 增加详细程度(使用 -vv 或更多可获得更好的效果)
增加详细程度,使 Nmap 打印有关正在进行的扫描的更多信息。在找到开放端口时会显示这些端口,如果 Nmap 认为扫描需要几分钟以上,则会提供完成时间估计。使用两次或更多次可获得更高的详细程度:-vv,或直接指定详细程度,例如 -v3。
大多数更改仅影响交互式输出,有些还会影响正常和脚本小子输出。其他输出类型旨在由机器处理,因此 Nmap 可以在这些格式中默认提供大量详细信息,而不会让人类用户感到疲劳。但是,在其他模式下有一些更改,可以通过省略一些细节来大幅减少输出大小。例如,grepable 输出中提供所有扫描端口列表的注释行仅在详细模式下打印,因为它可能很长。
nmap -v 192.168.174.128-145
nmap -vv 192.168.174.145
nmap -v3 192.168.174.145
92. -d,-d<level>
增加调试级别,设置调试级别 - 增加调试级别(使用 -dd 或更多可获得更好的效果)
当详细模式无法为您提供足够的数据时,可以使用调试来为您提供更多信息!与详细选项 (-v) 一样,使用命令行标志 (-d) 启用调试,并且可以通过多次指定调试级别(如 -dd)或直接设置级别来增加调试级别。例如,-d9 设置级别九。这是最高有效级别,将产生数千行,除非您运行非常简单的扫描,其中包含很少的端口和目标。
当怀疑 Nmap 中存在错误,或者您只是对 Nmap 正在做什么以及为什么这样做感到困惑时,调试输出非常有用。由于此功能主要面向开发人员,因此调试行并不总是不言自明的。您可能会得到类似这样的信息:Timeout vals:srtt:-1 rttvar:-1 to:1000000 delta 14987 ==> srtt:14987 rttvar:14987 to:100000。如果您不理解某一行,您唯一的办法就是忽略它、在源代码中查找它或向开发列表 (nmap-dev) 寻求帮助。有些行是不言自明的,但随着调试级别的提高,消息变得更加晦涩难懂。
nmap -v -d 192.168.174.145
nmap -dd 192.168.174.145
nmap -d9 192.168.174.145
93. --reason
主机和端口状态原因
显示每个端口设置为特定状态的原因以及每个主机处于启动或关闭状态的原因。此选项显示确定端口或主机状态的数据包类型。例如,来自关闭端口的 RST 数据包或来自活动主机的回应回复。Nmap 可以提供的信息由扫描或 ping 的类型决定。SYN 扫描和 SYN ping(-sS 和 -PS)非常详细,但 TCP 连接扫描(-sT)受连接系统调用的实现限制。此功能由调试选项(-d)自动启用,即使未指定此选项,结果也会存储在 XML 日志文件中。
nmap --reason 192.168.174.145
94. --stats-every <time>
打印定期计时统计信息
在每个 <time> 间隔后定期打印计时状态消息。时间是“计时和性能”一节中描述的规范;例如,使用 --stats-every 10s 每 10 秒获取一次状态更新。更新将打印到交互式输出(屏幕)和 XML 输出。
nmap --stats-every 10s scan.nmap.org
95. --packet-trace
跟踪发送和接收的报文
使 Nmap 打印发送或接收的每个数据包的摘要。这通常用于调试,但也是新用户准确了解 Nmap 幕后工作的有效方法。为了避免打印数千行,您可能需要指定有限数量的端口进行扫描,例如 -p20-30。如果您只关心版本检测子系统的运行情况,请使用 --version-trace。如果您只关心脚本跟踪,请指定 --script-trace。使用 --packet-trace,您可以获得上述所有内容。
nmap --packet-trace 192.168.174.132
96. --open
仅显示打开(或可能打开)的端口
有时您只关心可以实际连接的端口(打开的端口),并且不希望结果充斥着 closed (关闭)、 filtered (过滤)和 closed|filtered (关闭 | 过滤)的端口。通常在扫描后使用 grep、awk 和 Perl 等工具进行输出自定义,但由于请求过多,因此添加了此功能。指定 --open 仅查看具有至少一个 open (打开)、 open|filtered (打开 | 过滤)或 unfiltered (未过滤)端口的主机,并且仅查看处于这些状态的端口。这三种状态将按正常方式处理,这意味着如果 open|filtered (打开 | 过滤)和 unfiltered (未过滤)的数量过多,则可能会将它们压缩为计数。
从 Nmap 7.40 开始,--open 选项隐含 --defeat-rst-ratelimit,因为该选项仅影响 closed (关闭)和 filtered (过滤)的端口,而这些端口被 --open 隐藏。
nmap --open 192.168.174.132
97. --iflist
列举接口和路由
打印 Nmap 检测到的接口列表和系统路由并退出。这对于调试路由问题或设备错误描述(例如 Nmap 将 PPP 连接视为以太网)非常有用。
nmap --iflist 192.168.174.145
其它输出选项
98. --append-output
附加到输出文件而不是破坏输出文件
当您为输出格式标志(如 -oX 或 -oN)指定文件名时,该文件默认会被覆盖。如果您希望保留文件的现有内容并附加新结果,请指定 --append-output 选项。然后,该 Nmap 执行中指定的所有输出文件名都将被附加到输出文件而不是破坏输出文件。这对于 XML (-oX) 扫描数据不太适用,因为生成的文件通常无法正确解析,除非您手动修复它。
nmap -sS -oN scan.txt --append-output 192.168.174.132
99. --resume <filename>
继续中断的扫描
一些广泛的 Nmap 运行需要很长时间——以天为单位。此类扫描并不总是能完成。限制可能会阻止 Nmap 在工作时间运行,网络可能会中断,运行 Nmap 的机器可能会遭遇计划内或计划外的重启,或者 Nmap 本身可能会崩溃。运行 Nmap 的管理员也可以通过按 ctrl-C 取消它,无论出于何种原因。从头开始重新启动整个扫描可能并不可取。幸运的是,如果保留了扫描输出文件,用户可以要求 Nmap 在执行停止时恢复对正在处理的目标的扫描。只需指定 --resume 选项并将输出文件作为其参数传递即可。不允许使用其他参数,因为 Nmap 会解析输出文件以使用之前指定的相同参数。只需将 Nmap 调用为 nmap --resume <logfilename>。Nmap 会将新结果附加到上次执行中指定的数据文件中。扫描可以从 3 种主要输出格式中的任何一种恢复:Normal、Grepable 或 XML
nmap --resume normal_output.txt
100. --noninteractive
禁用运行时交互 - 禁用通过键盘进行的运行时交互
有时,例如在 shell 后台运行 Nmap 时,Nmap 在运行时可能不需要监视和响应用户键盘输入。(请参阅“运行时交互”部分,了解如何在扫描期间控制 Nmap。)使用选项 --noninteractive 可防止 Nmap 控制终端。
nmap -Pn --noninteractive 192.168.174.1
101. --stylesheet <path or URL>
设置XSL样式表,转换XML输出
Nmap 附带一个名为 nmap.xsl 的 XSL 样式表,用于查看或将 XML 输出转换为 HTML。XML 输出包含一个 xml-stylesheet 指令,该指令指向 nmap.xml,它最初由 Nmap 安装。通过 XSLT 处理器(如 xsltproc)运行 XML 文件以生成 HTML 文件。直接在浏览器中打开 XML 文件不再有效,因为现代浏览器限制了样式表可以从中加载的位置。如果您希望使用不同的样式表,请将其指定为 --stylesheet 的参数。您必须传递完整的路径名或 URL。一个常见的调用是 --stylesheet https://nmap.org/svn/docs/nmap.xsl。这会告诉 XSLT 处理器从 Nmap.Org 加载最新版本的样式表。--webxml 选项可以做同样的事情,但需要输入和记忆的内容更少。从 Nmap.Org 加载 XSL 可以更轻松地在未安装 Nmap(因此也未安装 nmap.xsl)的机器上查看结果。因此 URL 通常更有用,但出于隐私原因,默认使用 nmap.xsl 的本地文件系统位置。
nmap -sV -oX scan.xml --stylesheet /usr/share/nmap/nmap.xsl 192.168.174.132
nmap -sV -oX scan.xml --stylesheet https://nmap.org/svn/docs/nmap.xsl 192.168.174.132
102. --webxml
从 Nmap.Org 加载样式表 - 参考 Nmap.Org 的样式表以获得更便携的 XML
这是一个方便的选项,只不过是 --stylesheet https://nmap.org/svn/docs/nmap.xsl 的别名。
nmap -sV -oX scan.xml --webxml 192.168.174.132
103. --no-stylesheet
从 XML 中省略 XSL 样式表声明
指定此选项可防止 Nmap 将任何 XSL 样式表与其 XML 输出关联。xml-stylesheet 指令被省略。
nmap --no-stylesheet 192.168.174.145
其它选项
104. -6
启用 IPv6 扫描
Nmap 最受欢迎的功能都支持 IPv6。Ping 扫描、端口扫描、版本检测和 Nmap 脚本引擎都支持 IPv6。命令语法与通常相同,只是您还添加了 -6 选项。当然,如果您指定地址而不是主机名,则必须使用 IPv6 语法。地址可能看起来像 3ffe:7501:4819:2000:210:f3ff:fe03:14d0,因此建议使用主机名。输出看起来与通常相同,其中“有趣端口”行上的 IPv6 地址是唯一的 IPv6 赠品。
虽然 IPv6 并没有席卷全球,但它在一些国家(通常是亚洲)得到了广泛的使用,并且大多数现代操作系统都支持它。要将 Nmap 与 IPv6 一起使用,扫描的源和目标都必须配置为 IPv6。如果您的 ISP(像大多数 ISP 一样)没有为您分配 IPv6 地址,则免费隧道代理随处可见,并且与 Nmap 配合良好。我使用 http://www.tunnelbroker.net 上的免费 IPv6 隧道代理服务。其他隧道代理列在 Wikipedia 上。6to4 隧道是另一种流行的免费方法。
在 Windows 上,原始套接字 IPv6 扫描仅在以太网设备(而非隧道)上受支持,并且仅在 Windows Vista 及更高版本上受支持。在其他情况下,请使用 --unprivileged 选项。
nmap -6 192.168.174.1
105. -A
需要root权限
激烈扫描模式选项 - 启用操作系统检测、版本检测、脚本扫描和跟踪路由
此选项启用其他高级和激进选项。目前,此选项启用操作系统检测 (-O)、版本扫描 (-sV)、脚本扫描 (-sC) 和跟踪路由 (--traceroute)。未来可能会添加更多功能。重点是启用一套全面的扫描选项,而无需人们记住一大堆标志。但是,由于使用默认设置进行脚本扫描被视为侵入式操作,因此您不应未经许可对目标网络使用 -A。此选项仅启用功能,而不启用您可能还需要的计时选项(例如 -T4)或详细程度选项 (-v)。需要特权(例如 root 访问权限)的选项(例如操作系统检测和跟踪路由)仅在这些特权可用时才会启用。
nmap -A 192.168.174.132
106. --datadir <directoryname>
说明用户Nmap数据文件位置 - 指定自定义 Nmap 数据文件位置
Nmap 在运行时从名为 nmap-service-probes、nmap-services、nmap-protocols、nmap-rpc、nmap-mac-prefixes 和 nmap-os-db 的文件中获取一些特殊数据。如果已指定这些文件中的任何一个的位置(使用 --servicedb 或 --versiondb 选项),则该位置将用于该文件。之后,Nmap 会在使用 --datadir 选项(如果有)指定的目录中搜索这些文件。如果在该目录中找不到任何文件,则会在 NMAPDIR 环境变量指定的目录中搜索。接下来是 ~/.nmap,用于获取真实有效的 UID;或者在 Windows 上是 <HOME>\AppData\Roaming\nmap(其中 <HOME> 是用户的主目录,如 C:\Users\user)。接下来是 nmap 可执行文件的位置,以及附加了 ../share/nmap 的相同位置。然后是编译位置,例如 /usr/local/share/nmap 或 /usr/share/nmap。
nmap -sV --datadir /usr/share/nmap/nmap-os-db 192.168.174.145
107. --servicedb <services file>
指定自定义服务文件
要求 Nmap 使用指定的服务文件,而不是 Nmap 附带的 nmap-services 数据文件。使用此选项还会导致使用快速扫描 (-F)。有关 Nmap 数据文件的更多信息,请参阅 --datadir 的描述。
nmap --servicedb /usr/share/nmap/nmap-services 192.168.174.132
108. --versiondb <service probes file>
指定自定义服务探测文件
要求 Nmap 使用指定的服务探测文件,而不是 Nmap 附带的 nmap-service-probes 数据文件。有关 Nmap 数据文件的更多信息,请参阅 --datadir 的描述。
nmap --versiondb /usr/share/nmap/nmap-services 192.168.174.132
109. --send-eth
使用原以太网帧发送
要求 Nmap 在原始以太网(数据链路)层而不是更高的 IP(网络)层发送数据包。默认情况下,Nmap 会选择最适合其运行平台的层。原始套接字(IP 层)通常对 Unix 机器最有效,而以太网帧是 Windows 操作所必需的,因为 Microsoft 禁用了原始套接字支持。尽管有此选项,当没有其他选择(例如非以太网连接)时,Nmap 仍会在 Unix 上使用原始 IP 数据包。
nmap -Pn --send-eth 192.168.174.129
110. --send-ip
在原IP层发送
要求 Nmap 通过原始 IP 套接字发送数据包,而不是发送较低级别的以太网帧。它是对前面讨论的 --send-eth 选项的补充。
nmap -Pn --send-ip 192.168.174.128
111. --privileged
需要root权限
假定用户具有全部权限
告诉 Nmap 简单地假设它拥有足够的权限来执行原始套接字发送、数据包嗅探和类似操作,这些操作通常需要 Unix 系统上的 root 权限。默认情况下,如果请求此类操作但 geteuid 不为零,Nmap 将退出。--privileged 对于 Linux 内核功能和可能配置为允许非特权用户执行原始数据包扫描的类似系统很有用。请确保在任何需要权限的选项标志(SYN 扫描、操作系统检测等)之前提供此选项标志。NMAP_PRIVILEGED 环境变量可以设置为 --privileged 的等效替代方案。
nmap --privileged 192.168.174.136
112. --unprivileged
假设用户缺乏原始套接字权限
此选项与 --privileged 相反。它告诉 Nmap 将用户视为缺乏网络原始套接字和嗅探权限。这对于测试、调试或操作系统的原始网络功能以某种方式损坏时很有用。NMAP_UNPRIVILEGED 环境变量可以设置为 --unprivileged 的等效替代方案。
nmap --unprivileged 192.168.174.136
113. --release-memory
退出前释放内存
此选项仅用于内存泄漏调试。它使 Nmap 在退出前释放分配的内存,以便更容易发现实际的内存泄漏。通常 Nmap 会跳过此操作,因为操作系统在进程终止时无论如何都会这样做。
nmap --release-memory 192.168.174.136
114. -V; --version
打印版本信息
打印Nmap版本号并退出。
nmap -V
运行时交互
在 Nmap 执行期间,所有按键都会被捕获。这样您就可以与程序交互,而无需中止并重新启动它。某些特殊键将更改选项,而任何其他键都会打印出一条状态消息,告诉您有关扫描的信息。惯例是小写字母会增加打印量,大写字母会减少打印量。您也可以按“?”寻求帮助。
v / V
增加/减少详细程度
d / D
增加/减少调试级别
p / P
打开/关闭数据包跟踪
?
打印运行时交互帮助屏幕
其他任何内容(按任意键)
打印出如下状态消息:
Stats: 0:00:07 elapsed; 20 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 33.33% done; ETC: 20:57 (0:00:12 remaining)
综合使用
这个选项扫描主机scan.nmap.org中所有的保留TCP端口。选项-v启用细节模式。
nmap -v scan.nmap.org
进行秘密SYN扫描,对象为主机Scan所在的“C类”网段的255台主机。同时尝试确定每台工作主机的操作系统类型。因为进行SYN扫描 和操作系统检测,这个扫描需要有根权限。
nmap -sS -O scan.nmap.org/24
在198.116.0.0/16地址空间中的255个可能的八位子网中的每个可能的八位子网中,发射主机枚举和TCP扫描。这测试了系统是否在其标准端口上运行SSH,DNS,POP3或IMAP,还是端口4564上的任何内容。对于发现打开的任何这些端口中的任何一个,都使用版本检测来确定正在运行的应用程序。
nmap -sV -p 22,53,110,143,4564 198.116.0-255.1-127
要求 Nmap 随机选择 100,000 个主机并扫描它们以查找 Web 服务器(端口 80)。使用 -Pn 禁用主机枚举,因为当您只探测每个目标主机上的一个端口时,首先发送几个探测来确定主机是否启动是浪费的。
nmap -v -iR 100000 -Pn -p 80
这将扫描 4096 个 IP 以查找任何 Web 服务器(但不 ping 它们),并以 grepable 和 XML 格式保存输出。
nmap -Pn -p80 -oX logs/pb-port80scan.xml -oG logs/pb-port80scan.gnmap 216.163.128.20/20
进行DNS区域传输,以发现company.com中的主机,然后将IP地址提供给 Nmap。命令用于GNU/Linux -- 其它系统进行区域传输时有不同的命令。
host -l company.com | cut -d -f 4 | nmap -v -iL -
nmap -v -A scanme.nmap.org
nmap -v -sn 192.168.0.0/16 10.0.0.0/8
以详细模式 (-v) 进行扫描,启用操作系统检测、版本检测、脚本扫描和跟踪路由 (-A),并针对目标 IP (192.168.174.1) 进行版本检测 (-sV):
nmap -v -A -sV 192.168.174.1
Ndiff
Ndiff - 用于比较 Nmap 扫描结果的实用程序
Ndiff 是一种帮助比较 Nmap 扫描的工具。它接受两个 Nmap XML 输出文件并打印它们之间的差异:主机启动和关闭、端口打开或关闭等。它可以生成人类可读的文本或机器可读的 XML 格式的输出。
安装
可以通过克隆项目源码,进入到 nmap / ndiff 文件夹去。创建一个python虚拟空间,并激活。
运行命令,安装 ndiff 工具。
python3 setup.py install
运行一下命令,如果出现这个界面就说明安装成功了。
ndiff -h
也可以通过 APT 包管理器来进行安装 Ndiff 工具。
sudo apt install ndiff
1. -h, --help
显示此帮助,显示帮助消息并退出。
ndiff -h
2. -v, --verbose
还显示未更改的主机和端口。在输出中包含所有主机和端口,而不仅仅是已更改的主机和端口。
ndiff -v scan-1.xml scan-2.xml
3. --text
以文本格式显示输出(默认)。以人可读的文本格式写入输出。
ndiff --text scan-1.xml scan-2.xml
4. --xml
以 XML 格式显示输出。以机器可读的 XML 格式写入输出。文档结构在发行版中包含的 ndiff.dtd 文件中定义。
ndiff --xml scan-1.xml scan-2.xml
任何其他参数都被视为 Nmap XML 输出文件的名称。必须恰好有两个。
综合使用
我们使用 Ndiff 比较使用不同选项的两次 Nmap 扫描的输出。第一次扫描中,我们将进行快速扫描 (-F),扫描较少的端口以提高速度。第二次扫描中,我们将扫描较大的默认端口集,并运行 NSE 脚本。
nmap -F scan.nmap.org -oX scan-1.xml
nmap --script=http-title scan.nmap.org -oX scan-2.xml
ndiff -v scan-1.xml scan-2.xml
有两种输出模式:文本和 XML。文本输出是默认模式,也可以使用 --text 选项进行选择。文本输出类似于 Nmap 正常终端输出的统一差异。每行前面都有一个字符,表示它是否以及如何更改。- 表示该行在第一次扫描中出现,但在第二次扫描中没有出现;+ 表示它出现在第二次扫描中,但在第一次扫描中没有出现。更改的行由 - 行后跟 + 行表示。未更改的行前面有一个空格。
Ncat
Ncat — 连接和重定向套接字
Ncat 是 NMAP 项目对 Netcat 的重新实现,提供原始实现中的大多数功能以及一些新功能,例如 IPv6 和 SSL 支持。端口扫描支持已被删除。
Ncat 是一款功能丰富的网络实用程序,可通过命令行跨网络读取和写入数据。Ncat 是为 Nmap 项目编写的,是目前分裂的 Netcat 家族的巅峰之作。它旨在成为一种可靠的后端工具,可立即为其他应用程序和用户提供网络连接。Ncat 不仅可与 IPv4 和 IPv6 配合使用,还为用户提供了几乎无限的潜在用途。
Ncat 的众多功能包括将 Ncat 链接在一起的能力;将 TCP、UDP 和 SCTP 端口重定向到其他站点;SSL 支持;以及通过 SOCKS4、SOCKS5 或 HTTP 代理建立代理连接(还有可选的代理身份验证)。一些一般原则适用于大多数应用程序,因此使您能够立即为通常不支持网络支持的软件添加网络支持。
选项耗时假设为秒。附加“ms”表示毫秒,'s'表示秒,‘m’表示分钟,‘h’表示小时(例如 500ms)。
1. -h, --help
显示此帮助屏幕
ncat -h
2. 常规使用
先在本机(kali linux)打开端口监听连接。监听的端口是8080。
nc -lvvp 8080
在客户端(Ubuntu)开启连接该端口。
ncat 192.168.174.134 8080
之后在本机可以看到已经连接上该端口了。
在客户端上运行命令。本机也会跟着操作。
按 Ctrl+D 关闭 TCP 连接。
协议选项
3. -4
仅使用 IPv4
ncat -4 192.168.174.134 8080
4. -6
仅使用 IPv6
ncat -6 192.168.174.134 8080
5. -U, --unixsock
仅使用 Unix 域套接字
使用 Unix 域套接字而不是网络套接字。此选项可单独用于流套接字,或与 --udp 结合用于数据报套接字。
ncat -U /tmp/socket
6. -u, --udp
使用 UDP 代替默认 TCP
ncat -l --udp -p 8080
7. --sctp
使用 SCTP 代替默认 TCP。使用 SCTP 进行连接(默认为 TCP)。SCTP 支持以 TCP 兼容模式实现。
ncat -l --sctp -p 8080
8. --vsock
仅使用 vsock 套接字
使用 AF_VSOCK 套接字而不是默认 TCP 套接字(仅限 Linux)。此选项可单独用于流套接字,或与 --udp 结合用于数据报套接字。
ncat --vsock 3 8080
连接模式选项
9. -g hop1[,hop2,...]
松散源路由跳点 (最多 8 个)
为 IPv4 松散源路由设置跳数。您可以使用逗号分隔的跳数列表使用一次 -g,使用单个跳数多次使用 -g 来构建列表,或者将两者结合起来。跳数可以作为 IP 地址或主机名给出。
ncat -g 192.168.174.2 192.168.174.134 8080
10. -G <n>
松散源路由跳点指针 (4、8、12、...)
设置用于 -g 的 IPv4 源路由“指针”。参数必须是 4 的倍数,且不超过 28。并非所有操作系统都支持将此指针设置为除 4 以外的任何值。
ncat -g 192.168.174.2 -G 4 192.168.174.134 8080
11. -p, --source-port port
指定要使用的源端口。设置 Ncat 绑定到的端口号。
ncat -l -p 8080
12. -s, --source addr
指定要使用的源地址(不影响 -l)。设置 Ncat 绑定到的地址。
ncat -s 192.168.174.145 192.168.174.134 8080
监听模式选项
13. -l, --listen
绑定并侦听传入连接。监听连接而不是连接到远程计算机
ncat -l -p 8080
14. -m, --max-conns <n>
最多 <n> 个同时连接
Ncat 实例接受的最大同时连接数。默认值为 100(Windows 上为 60)。
ncat -l --max-conns 5 -p 8080
15. -k, --keep-open
在侦听模式下接受多个连接
通常,监听服务器只接受一个连接,然后在连接关闭时退出。此选项使其接受多个同时连接,并在所有连接都关闭后等待更多连接。它必须与 --listen 结合使用。在此模式下,Ncat 无法知道其网络输入何时完成,因此它将一直运行直到中断。这也意味着它永远不会关闭其输出流,因此任何从 Ncat 读取并寻找文件结尾的程序也将挂起。
ncat -l --keep-open -p 8080
16. --broker
启用 Ncat 的连接代理模式
允许多方连接到集中式 Ncat 服务器并相互通信。Ncat 可以代理位于 NAT 后面或无法直接连接的系统之间的通信。此选项与 --listen 结合使用,这会导致 --listen 端口启用代理模式。
ncat -l -p 8080 --broker
17. --chat
启动一个简单的 Ncat 聊天服务器
--chat 选项启用聊天模式,用于多个用户之间的文本交换。在聊天模式下,连接代理已打开。Ncat 在将收到的每条消息转发到其他连接之前,会为其添加 ID 前缀。每个连接的客户端的 ID 都是唯一的。这有助于区分谁发送了什么。此外,非打印字符(如控制字符)会被转义,以防止它们损坏终端。
ncat -l -p 8080 --chat
SSL 选项
18. --ssl
使用 SSL 连接或侦听
在连接模式下,此选项透明地与 SSL 服务器协商 SSL 会话以安全地加密连接。这对于与启用 SSL 的 HTTP 服务器等通信特别方便。
在服务器模式下,此选项侦听传入的 SSL 连接,而不是普通的非隧道流量。
在 UDP 模式下,此选项启用数据报 TLS (DTLS)。
ncat -l -p 8080 --ssl
19. --ssl-verify
验证证书的信任和域名
在客户端模式下,--ssl-verify 与 --ssl 类似,只是它还需要验证服务器证书。Ncat 在文件 ca-bundle.crt 中附带一组默认的受信任证书。某些操作系统提供了受信任证书的默认列表;如果可用,也会使用这些证书。使用 --ssl-trustfile 提供自定义列表。使用 -v 一次或多次以获取有关验证失败的详细信息。
Ncat 不检查已撤销的证书。
此选项在服务器模式下无效。
ncat --ssl --ssl-verify 192.168.174.134 8080
20. --ssl-cert
指定用于侦听的 SSL 证书文件 (PEM)
此选项提供用于验证服务器(在侦听模式下)或客户端(在连接模式下)的 PEM 编码证书文件的位置。将其与 --ssl-key 结合使用。
21. --ssl-key
指定 SSL 私钥 (PEM)监听
此选项提供与使用 --ssl-cert 命名的证书一起使用的 PEM 编码私钥文件的位置。
ncat --ssl --ssl-cert server.pem --ssl-key server.key -l 8080
22. --ssl-trustfile
包含受信任 SSL 证书的 PEM 文件
此选项设置受信任的证书列表,用于证书验证。除非与 --ssl-verify 结合使用,否则它无效。此选项的参数是包含受信任证书的 PEM 文件的名称。通常,该文件将包含认证机构的证书,但它也可能直接包含服务器证书。使用此选项时,Ncat 不使用其默认证书。
ncat --ssl --ssl-trustfile ca.pem 192.168.174.134 8080
23. --ssl-ciphers
包含要使用的 SSL 密码的密码列表
此选项设置 Ncat 在连接到服务器或接受来自客户端的 SSL 连接时将使用的密码套件列表。语法在 OpenSSL ciphers(1) 手册页中描述,默认为 ALL:!aNULL:!eNULL:!LOW:!EXP:!RC4:!MD5:@STRENGTH
ncat --ssl --ssl-ciphers AES256-SHA github.com 443
24. --ssl-servername
请求不同的服务器名称 (SNI)
在客户端模式下,此选项设置 TLS SNI(服务器名称指示)扩展,该扩展告知服务器 Ncat 正在联系的逻辑服务器的名称。当目标服务器在单个底层网络地址上托管多个虚拟服务器时,这一点很重要。如果未提供该选项,则 TLS SNI 扩展将使用目标服务器主机名填充。
ncat --ssl --ssl-servername myserver.example.com example.com 443
25. --ssl-alpn
要使用的 ALPN 协议列表
此选项允许您指定通过应用层协议协商 (ALPN) TLS 扩展发送的以逗号分隔的协议列表。并非所有版本的 OpenSSL 都支持该选项。
ncat --ssl --ssl-alpn h2,http/1.1 example.com 443
代理选项
26. --proxy <addr[:port]>
指定要通过代理的主机地址
请求通过 <host>:<port> 进行代理,使用 --proxy-type 指定的协议。
如果未指定端口,则使用代理协议的知名端口(SOCKS 为 1080,HTTP 为 3128)。当使用 IP 地址而不是主机名指定 IPv6 HTTP 代理服务器时,必须使用方括号表示法(例如 [2001:db8::1]:8080)将端口与 IPv6 地址分开。如果代理需要身份验证,请使用 --proxy-auth。
ncat --proxy 192.168.174.129:7890 192.168.174.134 8080
27. --proxy-type <type>
指定代理类型(“http”、“socks4”、“socks5”)
在连接模式下,此选项请求协议 <proto> 通过 --proxy 指定的代理主机进行连接。在监听模式下,此选项让 Ncat 使用指定的协议充当代理服务器。
当前连接模式下可用的协议为 http (CONNECT)、socks4 (SOCKSv4) 和 socks5 (SOCKSv5)。当前唯一支持的服务器是 http。如果不使用此选项,则默认协议为 http。
28. --proxy-auth <auth>
使用 HTTP 或 SOCKS 代理服务器进行身份验证
在连接模式下,提供用于连接代理服务器的凭据。在监听模式下,提供连接客户端所需的凭据。对于 --proxy-type http 或 --proxy-type socks5,格式应为用户名:密码。对于 --proxy-type socks4,它应该只是一个用户名。
可以通过设置环境变量 NCAT_PROXY_AUTH 将这些凭据传递给 Ncat,从而降低凭据被捕获到进程日志中的风险。(选项 --proxy-auth 优先。)
ncat --proxy 192.168.174.129:7890 --proxy-type http --proxy-auth admin@password 192.168.174.134 8080
29. --proxy-dns <type>
指定解析代理目标的位置
在连接模式下,它可控制代理目标主机名是由远程代理服务器解析还是由 Ncat 本身在本地解析。<type> 的可能值为:
local - 主机名在 Ncat 主机上本地解析。如果无法解析主机名,Ncat 将退出并出现错误。
remote - 主机名直接传递到远程代理服务器。这是默认行为。
both - 首先在 Ncat 主机上尝试主机名解析。无法解析的主机名将传递到远程代理服务器。
none - 主机名解析完全禁用。只能使用文字 IPv4 或 IPv6 地址作为代理目标。
本地主机名解析通常遵循使用选项 -4 或 -6 指定的 IP 版本,但 SOCKS4 除外,因为它与 IPv6 不兼容。
ncat --proxy 192.168.174.129:7890 --proxy-type http --proxy-dns local 192.168.174.134 8080
命令执行选项
30. -e, --exec <command>
执行给定命令
建立连接后执行指定命令。命令必须指定为完整路径名。远程客户端的所有输入都将发送到应用程序,响应将通过套接字发送回远程客户端,从而使您的命令行应用程序通过套接字进行交互。与 --keep-open 结合使用,Ncat 将处理与您指定的端口/应用程序(如 inetd)的多个同时连接。Ncat 仅接受由 -m 选项控制的最大可定义同时连接数。默认情况下,此值设置为 100(Windows 上为 60)。
ncat --exec "/bin/bash" 192.168.174.134 8080
31. -c, --sh-exec <command>
通过 /bin/sh 执行给定命令
与 -e 相同,但它尝试通过 /bin/sh 执行命令。这意味着您不必为命令指定完整路径,并且可以使用环境变量等 shell 工具。
这里我运行了”id“命令。
ncat --sh-exec "id" 192.168.174.134 8080
32. --lua-exec <filename>
执行给定 Lua 脚本
在建立连接后,使用内置解释器将指定的文件作为 Lua 脚本运行。脚本的标准输入和标准输出都重定向到连接数据流。
ncat --lua-exec lua_file 192.168.174.134 8080
所有 exec 选项都会将以下变量添加到子进程的环境中:
NCAT_REMOTE_ADDR、NCAT_REMOTE_PORT
远程主机的 IP 地址和端口号。在连接模式下,它是目标的地址;在监听模式下,它是客户端的地址。
NCAT_LOCAL_ADDR、NCAT_LOCAL_PORT
连接本地端的 IP 地址和端口号。
NCAT_PROTO
使用的协议:TCP、UDP 和 SCTP 之一。
访问控制选项
33. --allow
仅允许给定的主机连接到 Ncat
指定的主机列表将是唯一允许连接到 Ncat 进程的主机。所有其他连接尝试都将被断开。如果 --allow 和 --deny 之间发生冲突,则 --allow 优先。主机规范遵循 Nmap 使用的相同语法。
ncat -l --allow 192.168.174.134 -p 8080
34. --allowfile
允许连接到 Ncat 的主机文件
它具有与 --allow 相同的功能,不同之处在于允许的主机是在换行符分隔的允许文件中提供的,而不是直接在命令行上提供的。
ncat -l --allowfile allowfile.txt -p 8080
35. --deny
拒绝给定的主机连接到 Ncat
向 Ncat 发出不允许连接到监听 Ncat 进程的主机列表。如果指定的主机尝试连接,其会话将被默默终止。如果 --allow 和 --deny 之间发生冲突,则 --allow 优先。主机规范遵循 Nmap 使用的相同语法。
ncat -l --deny 192.168.174.134 -p 8080
36. --denyfile
拒绝连接到 Ncat 的主机文件
此功能与 --deny 相同,不同之处在于排除的主机是在以换行符分隔的拒绝文件中提供的,而不是直接在命令行上提供的。
ncat -l --denyfile denyfile.txt -p 8080
计时选项
这些选项接受时间参数。默认情况下以秒为单位指定,但您可以将 ms、s、m 或 h 附加到值以指定毫秒、秒、分钟或小时。
37. -d, --delay <time>
读取/写入之间等待
设置发送行的延迟间隔。这有效地限制了 Ncat 在指定时间段内发送的行数。这可能对低带宽站点有用,或者有其他用途,例如应对烦人的 iptables --limit 选项。
ncat --delay 10s 192.168.174.134 8080
38. -i, --idle-timeout <time>
空闲读/写超时
设置空闲连接的固定超时。如果达到空闲超时,则终止连接。
ncat -l --idle-timeout 5s -p 8080
39. -w, --wait <time>
连接超时。设置连接尝试的固定超时。
ncat -w 5s 192.168.174.134 8080
输出选项
40. -o, --output <filename>
将会话数据转储到文件
ncat --output ncat_output.txt 192.168.174.134 8080
41. -x, --hex-dump <filename>
转储将会话数据以十六进制形式写入文件
ncat --hex-dump hex_output 192.168.174.134 8080
42. --append-output
附加而不是破坏指定的输出文件
使用 --append-ouput 以及 -o 和/或 -x 发出 Ncat,它将附加结果输出,而不是截断指定的输出文件。
ncat --append-output 192.168.174.134 8080
43. -v, --verbose
设置详细程度(可多次使用)
使用 -v 发出 Ncat,它将详细显示各种有用的基于连接的信息。使用多次(-vv、-vvv...)可获得更详细的信息。
ncat -v 192.168.174.134 8080
其他选项
44. -C, --crlf
使用 CRLF 作为 EOL 序列
此选项告诉 Ncat 在从标准输入获取输入时将 LF 行尾转换为 CRLF。这对于直接从终端与一些严格的服务器对话非常有用,因为许多常见的纯文本协议都使用 CRLF 作为行尾。
ncat -C 192.168.174.134 8080
45. --recv-only
仅接收数据,从不发送任何内容
如果传递了此选项,Ncat 将仅接收数据,而不会尝试发送任何内容。
ncat --recv-only 192.168.174.134 8080
46. --send-only
仅发送数据,忽略接收到的数据;在 EOF 上退出
如果传递了此选项,则 Ncat 将仅发送数据并忽略收到的任何内容。此选项还会导致 Ncat 在标准输入上收到 EOF 后关闭网络连接并终止。
ncat --send-only 192.168.174.134 8080
47. --no-shutdown
在 stdin 上收到 EOF 时继续半双工
如果传递此选项,Ncat 在看到 stdin 上的 EOF 后不会在套接字上调用关闭。这是为了向后兼容 OpenBSD netcat,它在使用其“-d”选项执行时表现出此行为。
ncat --no-shutdown 192.168.174.134 8080
48. -n, --nodns
不通过 DNS 解析主机名
完全禁用所有 Ncat 选项的主机名解析,例如目标、源地址、源路由跳数和代理。所有地址都必须以数字形式指定。(请注意,代理目标的解析是通过选项 --proxy-dns 单独控制的。)
ncat --nodns 192.168.174.134 8080
49. -t, --telnet
应答 Telnet 协商
处理 DO/DONT WILL/WONT Telnet 协商。这使得可以使用 Ncat 编写 Telnet 会话脚本。
ncat --exec "/bin/bash" --telnet 192.168.174.134 8080
50. -z
零 I/O 模式,仅报告连接状态
ncat -z 192.168.174.134 8080
51. --version
显示 Ncat 的版本信息并退出
ncat --version
连接模式和监听模式
Ncat 以两种主要模式之一运行:连接模式和监听模式。其他模式(例如 HTTP 代理服务器)是这两种模式的特殊情况。在连接模式下,Ncat 作为客户端工作。在监听模式下,它是服务器。
在连接模式下,<hostname> 和 <port> 参数指示要连接到什么。<hostname> 是必需的,可以是主机名或 IP 地址。如果提供 <port>,则必须是十进制端口号。如果省略,则默认为 31337。
在监听模式下,<hostname> 和 <port> 控制服务器将绑定到的地址。在监听模式下,这两个参数都是可选的。如果省略 <hostname>,则默认监听 IPv4 和 IPv6 上的所有可用地址。如果省略 <port>,则默认为 31337。
使用示例
通过 TCP 端口 8080 连接到 example.org。
ncat example.org 8080
监听 TCP 端口 8080 上的连接。
ncat -l 8080
将本地计算机上的 TCP 端口 8080 重定向到端口 80 上的主机。
ncat --sh-exec "ncat example.org 80" -l 8080 --keep-open
绑定到 TCP 端口 8081 并附加 /bin/bash,以供全世界自由访问。
ncat --exec "/bin/bash" -l 8081 --keep-open
将 shell 绑定到 TCP 端口 8081,限制对本地网络上的主机的访问,并将最大同时连接数限制为 3。
ncat --exec "/bin/bash" --max-conns 3 --allow 192.168.174.0/24 -l 8081 --keep-open
通过端口 1080 上的 SOCKS4 服务器连接到 smtphost:25。
ncat --proxy socks4host --proxy-type socks4 --proxy-auth joe smtphost 25
通过端口 1080 上的 SOCKS5 服务器连接到 smtphost:25。
ncat --proxy socks5host --proxy-type socks5 --proxy-auth joe:secret smtphost 25
在上创建 HTTP 代理服务器localhost 端口 8888。
ncat -l --proxy-type http localhost 8888
通过 TCP 端口 9899 将文件从 host2(客户端)发送到 host1(服务器)。文件传输后,连接会自动关闭。
先运行服务器,在运行客户端。
从客户端向服务器传输文件。
HOST1(服务器)
ncat -l 9899 > outputfile
HOST2(客户端)
ncat HOST1 9899 < inputfile
向另一个方向传输,将 Ncat 变成“一个文件”服务器。
从服务器向客户端传输文件。
HOST1(服务器)
ncat -l 9899 < inputfile
HOST2(客户端)
ncat HOST1 9899 > outputfile
详细(-v),连接时运行 /bin/bash(-exec “/bin/bash”),仅允许 1 个 IP 地址(-allow 192.168.174.134),监听 TCP 端口 4444(-l 4444),断开连接时保持监听器打开(-keep-open)
ncat -v --exec "/bin/bash" --allow 192.168.174.134 -l 4444 --keep-open