Linux命令-netcat

netcat的学习以及使用

Posted by LANY on October 31, 2019

背景

日常工作中,除了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

更多的信息

netcat-wiki netcat-linode netcat渗透神器