概述
nc(或netcat)实用程序可以用于任何涉及UDP或者TCP的事情,它可以打开TCP连接,发送UDP包,监听任意TCP和UDP端口,可以做端口扫描,并处理IPv4和IPv6,不像telnet一样只将错误信息输出在工作台而不对错误信息进行分类。
选项
选项 | 描述 |
---|---|
-4 | 强制nc只使用IPv4地址 |
-6 | 强制nc只使用IPv6地址 |
-A | 在socket中设置SO_RECV_ANYIF |
-b boundif | 指定要绑定socket的接口 |
-c | 发送CRLF作为行结尾 |
-D | 打开socket的调试开关。 |
-C | 强制nc不使用蜂窝数据上下文。 |
-d | 不能从stdin中读取数据 |
-h | 打印nc帮助 |
-i interval | 设置延迟时间间隔,以便传送信息以及扫描端口 |
-G conntimeout | 设置TCP连接超时时间 |
-H keepidle | 初始TCP保持存活超时(秒)。 |
-I keepintvl | 重复TCP保持存活超时时间(以秒为单位)。 |
-J keepcnt | TCP报文保持存活的重复次数。 |
-k | 强制nc在其当前连接完成后继续侦听另一个连接。使用此选项时不带-l选项是错误的。 |
-l | 监听传入的连接,而不是发起到远程主机的连接,它不能跟-p,-s或者-z结合使用,此外,如果使用-v选项则指定的任何超时都会被忽略 |
-L num_probes | 在声明对等体不可达并生成附加超时读/写事件之前要发送给对等体的探针数 |
-n | 不做任何DNS或服务查找任何指定的地址,主机名或端口 |
-p source_port | 设置nc应该使用的源端口。将此选项与-l结合使用是错误的 |
-r | 指定源端口和目的端口都进行随机的选择 |
-s source_ip_address | 设置本地主机送出数据包的IP的地址,此选项不可以跟-l结合使用 |
-t | 导致nc发送RFC 854不响应RFC 854 DO和WILL请求。这使得使用nc来编写telent会话成为可能。 |
-U | 指定使用Unix域套接字 |
-u | 指定使用UDP协议 |
-v | 让nc输出更多详细信息 |
-w timeout | 如果连接和stdin空闲时间超过timeout秒,则连接将静默关闭。-w标志对-l选项没有影响,即nc将永远侦听连接,无论是否带有-w标志。默认为无超时。 |
-X proxy_version | 请求nc在与代理服务器通信时应使用指定的协议。支持的协议有“4”(SOCKS v.4)、“5”(SOCKS v.5)和“connect”(HTTPS代理)。如果不指定协议,则使用SOCKS version 5。 |
-x ++proxy_address[:prot] | 请求nc使用位于proxy_address和port的代理连接到主机名。如果不指定port,则使用代理协议的知名端口(SOCKS为1080,HTTPS为3128)。 |
-z | 指定nc应该只扫描侦听守护进程,而不向它们发送任何数据。将此选项与-l选项结合使用是错误的。 |
--apple-delegate-pid | 请求nc为指定的PID委托套接字。将此选项与——apple-delegate-uuid选项结合使用是错误的。 |
--apple-delegate-uuid | 请求nc为指定的UUID委托套接字。将此选项与——apple-delegate-pid选项结合使用是错误的。 |
--apple-ext-bk-idle | 当进程挂起时,nc将其套接字标记为扩展的后台空闲时间。 |
--apple-nowakefromsleep | 当参数n大于0时,请求nc标记它的套接字,将本地端口从系统休眠时由驱动程序查询的开放端口列表中排除。当n大于1时,设置socket关闭时产生KEV_SOCKET_CLOSED内核事件的socket选项。 |
--ecn | 求nc标记使用套接字选项TCP_ECN_MODE来设置ecn模式(默认,启用,禁用) |
`hostname可以是数字IP地址或符号主机名(除非给出了-n选项)。通常,必须指定主机名,除非给出了-l选项(在这种情况下使用本地主机)。
port[s]可以为单个整数或范围。范围的形式为nn-mm。通常,必须指定目的端口,除非给出-U选项(在这种情况下必须指定套接字)。`
示例
监听本地端口
$ nc -l 1234
监听某个主机某个端口的
$ nc 127.0.0.1 1234
将监听数据转储
nc host.example.com 1234 < filename.in
检索一个网站主页
有时,与服务器“手工”交谈比通过用户界面交谈更有用。当需要验证服务器为了响应客户机发出的命令而发送了哪些数据时,它可以帮助进行故障排除。例如,要检索一个网站的主页
echo -n "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80
注意,这也会显示web服务器发送的头信息。如果需要,可以使用sed(1)等工具对它们进行过滤。
当用户知道服务器需要的请求格式时,可以构建更复杂的示例。另一个例子,电子邮件可以通过以下方式提交到SMTP服务器:
$ nc localhost 25 << EOF
HELO host.example.com
MAIL FROM: <user@host.example.com>
RCPT TO: <user2@host.example.com>
DATA
Body of email.
.
QUIT
端口扫描
了解目标计算机上哪些端口是开放的并正在运行服务可能会很有用。z标志可用于告诉nc报告打开的端口,而不是初始化连接。例如:
$ nc -z host.example.com 20-1000
Connection to 192.168.20.211 port 22 [tcp/ssh] succeeded!
Connection to 192.168.20.211 port 25 [tcp/smtp] succeeded!
Connection to 192.168.20.211 port 80 [tcp/http] succeeded!
Connection to 192.168.20.211 port 111 [tcp/sunrpc] succeeded!
指定端口范围,将搜索限制在端口20 - 1000。
另外,了解哪个服务器软件正在运行以及版本也可能很有用。这些信息通常包含在问候横幅中。为了检索这些信息,必须首先建立连接,然后在检索到标题时断开连接。这可以通过使用-w标志指定一个小超时来完成,或者可能通过向服务器发出"QUIT"命令来完成:
$ echo "QUIT" | nc host.example.com 20-30
ssh - 1.99 openssh_3.6.1p2
Protocol mismatch.
IMS SMTP Receiver Version 0.84 Ready
创建一个到host.example.com 42端口的TCP连接,使用端口31337作为源端口,超时5秒:
$ nc -p 31337 -w 5 host.example.com 42
创建一个到host.example.com 53端口的UDP连接
$ nc -u host.example.com 53
创建一个到host.example.com 42端口的TCP连接,10.1.2.3作为本地ip。
$ nc -s 10.1.2.3 host.example.com 42
创建一个Unix Domain Socket 监听
$ nc -lU /var/tmp dsocket
通过HTTP代理10.2.3.4端口8080连接host.example.com的端口42。
$ nc -x10.2.3.4:8080 -Xconnect host.example.com 42
note
:
UDP端口扫描将始终成功(即报告端口为open),使用-uz组合是没有啥用的。