背景
日常工作中,除了coding之外,有时候还有对程序进行部署,通常程序是部署在服务器上的,所以这个时候就免不了要会那么一点linux命令。今天我们所要学习的命令是netcat-一款网络工具!
netcat介绍
netcat(nc)是一款非常出名的网络工具,简称 “nc” ,有网络工具中的“瑞士军刀🇨🇭”之称。它可以用作端口扫描、端口监听、远程文件传输以及实现远程shell等功能。
netcat默认情况下是没有安装的,你有极大的可能需要在linux机器上通过你最喜欢的包管理工具来进行安装。
netcat二进制文件通常有一个别名叫做
nc
,在本文中我们将使用nc
,因为它比较短。通常情况下这两个命令都是指向的相同的二进制文件。
netcat选项参数介绍
使用netcat的形式为: netcat [option] [hostname] [port]
。 它支持以下命令行选项:
选项 | 用法 |
---|---|
-u |
该选项告诉nc使用UDP模式,在不指定该选项的情况下,netcat使用的是tcp模式 |
-l |
该选项告诉nc接收输入的连接,通常作为服务器进程使用 |
-h |
显示help帮助页面 |
-e filename |
该选项告诉nc在有客户端连接之后执行名称为filename 的文件 |
-c string |
该选项告诉nc在有客户端连接之后通过/bin/sh 执行string 命令 |
-i seconds |
该选项定义nc在扫描端口或发送行的时候使用的延迟间隔 |
-q seconds |
该选项告诉nc在获得EOF标准输入后,在退出之前等待指定的秒数。如果值为负,nc将永远等待。 |
-v |
该选项告诉nc生成冗长的输出 |
-v |
该选项告诉nc生成比-v 更详细的输出 |
-z |
该选项告诉nc使用0输入输出模式,这个选项通常用来进行端口扫描 |
-r |
该选项告诉nc使用随机的本机和远程端口,这个选项比较适合测试的时候用 |
-o file |
该选项告诉nc将网络中的传输保存到文本文件中,这个便于调试 |
-n |
该选项告诉nc将仅使用ip地址 |
-p port |
该选项告诉nc使用哪个端口 |
-b |
该选项告诉nc允许使用UDP广播 |
-C |
该选项告诉nc将CRLF作为行结束发送。 |
-T type |
该选项告诉nc设置TOSflag的标志 |
-g gateway |
该选项允许你指定数据包通过网络的路径 |
-G number |
该选项的值允许你指定源路由指针的值 |
-s address |
该选项允许你指定将在nc命令中使用的本地源地址 |
-t |
该选项告诉nc启用telnet协商 |
该文章的剩下部分将演示这些选项中最重要的几个。这也就是说,netcat其实用途非常广泛,需要你自己去尝试😄。
将netcat作为一个客户端
netcat最多的用法是针对一个服务进程去充当一个客户端。最常用于网络服务器和网络连接故障排除,因为我们可以看到交互数据。因此,对nc提供一个主机名或者ip地址以及端口号将会使netcat充当telnet工具:
nc localhost 22
在上述示例中,nc尝试连接本地的tcp端口22。需要注意的是ssh使用了tcp端口号22,它触发提供的输出。
将netcat作为一个服务端
netcat可以接收指定端口的连接并当你添加了-l
选项之后会充当一个服务端:
nc -l -p 1234
打开另外一个终端窗口,使用nc将客户端连接到服务器:
nc 127.0.0.1 1234
那么现在你可以在两台机器之间发送信息了。
上述命令告诉你监听端口号为1234上输入的连接。你可以看到netcat自动读取了客户端所发过来的信息。同时,你也可以输入数据将响应发送到客户端。
获得详细的输出
有时候你可能得连接不了远程机器或者得到的响应不是你期待的。在这种情况下,最好使用-v
或者-vv
从连接中获得更多详细信息。
nc -v localhost 1234
如果你想获得跟详细的信息,你可以用-vv
选项:
nc -vv localhost 1234
使用UDP协议
为了使用UDP协议代替TCP协议,你需要加上-u
选项在你的nc命令中。因此,下面的命令将使用UDP协议:
nc -vv -u 8.8.8.8 53
示例
在这个章节你会发现大量的nc用例以及示例
利用netcat来进行端口扫描
Netcat加上-z
选项之后可以用于端口的扫描,可以作为nmap
的一个简单版本。
nc -zvn localhost 5600-5610
上述命令用来扫描本机中5600-5610的端口使用情况。其中-n
选项用于指定需要扫描的主机。-v
用于获得详细的扫描信息。如果不指定-v
或者-vv
那么不会有扫描信息。
使用netcat来传输文件
netcat其中的一个特征是有文件传输的能力:
cat access.log |nc -vv -l -p 4567
当客户端连接到TCP端口号为4567时,监听4567的nc服务端会将access.log的内容发送给客户端。使nc客户端接收access.log的内容的正确方式如下:
nc -vv localhost 4567 > receive.log
你可以打开一个新的终端窗口执行上面的命令来获取nc服务端发送的内容。
使用netcat使任何进程成为服务器
Netcat允许你在-e
的帮助下使任何进程成为服务器进程。
nc -vv -l -p 12345 -e /bin/bash
上述的命令告诉nc接收来自tcp端口12345上的所有传入的tcp连接。当一个客户端被接受后,nc
将会执行/bin/bash
,这意味着它将为你提供对计算机的shell访问。当一个客户端成功连接之后,每一行输入都会作为一条shell命令被/bin/bash
执行。如果客户端输入的命令没有被找到,那么客户端不会有输出但是在服务端会输出一条错误。否则会将命令的执行结果发送给客户端。为了测试该功能,你需要新打开一个终端窗口来执行下面的命令:
nc 192.168.9.252 12345
在连接之后执行命令
如果希望在客户机每次连接到使用nc实现的服务器时执行给定的命令,那么应该使用-c
选项和该命令。下面的例子执行pwd
并将输出发送给客户端:
nc -vv -c "pwd" -l -p 1234
在另一个窗口使用如下命令获得nc服务端执行pwd
后的输出:
nc -vv 192.168.9.252 1234