nc-监听和连接任意TCP或者UDP

675 阅读5分钟

概述

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 keepcntTCP报文保持存活的重复次数。
-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组合是没有啥用的。