如何使用Netcat并提升您的网络技能!

管理网络并监视系统之间的流量数据流听起来令人生畏。嗯,除非你知道如何使用Netcat

Netcat是一个命令行工具,您可以用于各种目的,例如端口扫描、文件传输以及创建最小的web服务器来测试连接活动。在本教程中,您将学习如何利用Netcat,并了解一些最常见的Netcat用例。

准备好了吗?继续阅读,提升您的网络技能吧!

先决条件

本教程将进行实际演示。如果您想跟着做,请确保您拥有以下内容。

  • 两台Linux机器:一台(ubuntu1)充当接收主机,另一台(ubuntu2)充当发送主机 – 本教程使用Ubuntu 20.04作为两台机器的操作系统。

扫描开放端口

端口是允许网络流量进出计算机的门户。当端口关闭时,该端口上没有服务在监听,流量无法通过。但如果端口是打开的,你的网络就容易受到攻击。

如果你想检查特定端口是否在某台机器上打开以补丁任何安全漏洞,Netcat 可以胜任。作为一名渗透测试者,你需要知道哪些端口是打开的以进行攻击。不管原因是什么,扫描打开的端口是一种常见的需求。

使用 Netcat 进行端口扫描的基本语法如下:

  • 主机 – 要扫描的机器的 IP 地址或主机名。
  • 起始端口 – 起始端口号。
  • 结束端口 – 结束端口号。
netcat options host startport-endport

netcat 命令有一个别名 nc,缩短命令很方便。但本教程使用 netcat 进行适当的文档记录。

SSH 到你的发送主机(ubuntu2)并运行以下命令,以扫描端口1-100之间的打开端口。

在本教程中,将 149.28.86.131 替换为你的发送主机的 IP 地址。

在大多数情况下,1-100 端口范围就足够了。大多数服务使用的默认端口号通常位于这个范围内,比如 22 用于 SSH,80 用于 HTTP 等。

以下列表解释了控制端口扫描行为的每个标志:

  • -z(零I/O模式) – Netcat 将不会从网络连接中读取或写入。此选项使扫描过程更快。
  • -n – 告诉Netcat禁用DNS查找以避免延迟。
  • -v – 使Netcat详细显示所有端口扫描过程。
netcat -z -n -v 149.28.86.131 1-100

您可以在下面看到,与端口22(SSH)的连接成功,但所有其他端口都失败了。

How to Use Netcat : Scanning for Open Ports

由于netcat命令列出了所有扫描的端口,您会获得许多信息,其中一些是不必要的。在这种情况下,运行下面的命令,使用grep命令进行管道传递。此命令仅过滤出以“succeeded!”消息结尾的开放端口,如下所示。

netcat -z -n -v 149.28.86.131 1-100 2>&1 | grep succeeded

下面,您可以看到端口22已经打开,可以进行SSH连接。

Filtering the Successful Port Connection

安全地在主机之间发送文件

除了端口扫描外,Netcat还可以在两台计算机之间安全传输文件。Netcat使用TCP协议进行文件传输,比UDP更可靠。

使用Netcat发送文件的基本语法如下:

netcat options host port filename

要将文件从您的主机发送到另一台机器:

1. 运行下面的命令在接收主机(ubuntu1)上的端口4444上开始侦听。

该命令没有输出,但下面的选项会影响命令设置监听端口:

  • -l – 告诉netcat在指定的TCP端口上监听传入连接。端口可以是任何你想要的数字,但确保其他服务没有使用你首选的端口。
  • > – 告诉netcat将所有传入数据重定向到指定路径上的文件(ata_file)。
netcat -l 4444 > ata_file

只有root用户可以绑定到低于1000的端口,所以你必须选择一个大于1000的端口作为非root用户。如果尝试在非root用户下使用低于1000的端口号,将会收到以下错误。

Getting “Permission denied” Error When Using Port Lower Than 1000

2. 在发送主机(ubuntu2)上运行以下echo命令,该命令没有输出,但会创建一个名为ata_file的文件,并将Hello from ATA作为内容。

echo "Hello from ATA" > ata_file

3. 现在,运行下面的netcat命令将ata_file发送到接收主机(ubuntu1)。确保在接收主机上使用相同的端口号(4444)作为发送主机。

该命令没有输出,但<选项告诉netcat从指定文件中获取输入。

netcat 149.28.86.131 4444 < ata_file

4. 最后,切换到接收主机(ubuntu1)并运行下面的cat命令来检查ata_file的内容。

cat ata_file

你可以看到下面的Hello from ATA消息,表示传输成功。

Verifying the Transfer Worked

发送目录到另一个主机

到目前为止,你已经成功地从一个主机发送了一个单独的文件到另一个主机。但是如果你想发送一个完整的带有所有子目录和文件的目录怎么办?Netcat也可以发送目录!

假设您在发送主机(ubuntu2)上有一个名为apache_backup的备份目录。您首先需要压缩该目录,然后将其发送并解压到接收主机(ubuntu1)上。

1. 在接收主机(ubuntu1)上运行以下命令以创建一个名为apache_backup的新目录并进入该目录。

mkdir apache_backup && cd apache_backup
Creating the apache_backup Directory

2. 接下来,运行以下命令在端口4444上开始侦听,并从发送主机(ubuntu2)接收到的压缩文件中提取文件。

此命令没有输出,但是tar xf –标志从Netcat(标准输入)接受输入并将所有文件提取到当前目录。

netcat -l 4444 | tar xf -

3. 在发送主机(ubuntu2)上运行以下命令以创建一个目录(apache_backup)、一些文本文件,并将它们发送到接收主机(ubuntu1)。

这些命令没有输出,但您将在以下步骤中验证传输是否成功。

# 创建一个apache_backup目录并在其中创建一些文本文件
mkdir apache_backup && cd apache_backup && touch ata{1..5}.txt
# 压缩工作目录并将其发送到接收主机
tar cf - . | netcat 149.28.86.131 4444

4. 最后,切换到接收主机(ubuntu1),按Ctrl+C停止侦听端口4444,并运行ls命令以列出apache_backup目录中的文件。

ls

正如下面所示,apache_backup目录的文件已成功传输到接收主机的apache_backup目录中。

Verifying Transferred Files on the Receiving Host

将整个磁盘或分区发送到另一台主机

发送整个磁盘或分区到另一个主机可能看起来很雄心勃勃,但除了发送文件和目录之外,这个任务是可以实现的。这项技能非常方便,特别是在你需要在采取激烈措施之前备份整个磁盘,比如移动或删除大量文件时。

1. 在接收主机(ubuntu1)上运行以下命令,开始监听端口4444。这个命令没有输出,但将所有传入的数据(bzip2 -d |dd)解压缩到/dev/sdb。

/dev/sdb是机器上的第二个硬盘。但在这种情况下,/dev/sdb是连接到此教程的机器的空硬盘。

netcat -l 4444 | bzip2 -d | dd of=/dev/sdb

2. 在发送主机(ubuntu2)上运行下面的fdisk命令,查找机器上的所有磁盘和分区。

 fdisk -l

如下所示,/dev/vda1/是此教程中发送主机的根分区。您的输出可能会因为机器配置的不同而有所不同。

Finding All Disks and Partitions

3. 在发送主机(ubuntu2)上运行以下命令,它没有输出,但会通过端口4444将/dev/vda1分区发送到接收主机(ubuntu1)。

压缩并发送分区到接收主机需要一段时间,具体取决于分区的大小。

bzip2 -c /dev/vda1 | netcat 149.28.86.131 4444

4. 一旦过程完成,切换到接收主机(ubuntu1),您将看到下面的输出。

发生“设备上没有空间”的错误是预期的,因为/dev/vda1可能比/dev/sdb大。但你明白了吧!你可以使用Netcat将整个硬盘或分区发送到另一台机器。

Viewing the Sending Disk/Partition Process

最后,在接收主机(ubuntu1)上运行以下命令,挂载/dev/vda1分区并列出分区中的所有文件。

# 挂载/dev/vda1分区
mount /dev/vda1 /media 
# 列出分区中的所有文件
ls media

如下所示,从/dev/vda1中的所有文件和目录都成功传输到/dev/sdb。

Verifying Data Integrity of the File Transfer

创建一个简单的Web服务器

配置像Apache或NGINX这样的完整的Web服务器来诊断Web服务器问题可能很痛苦。相反,使用Netcat创建一个简单的Web服务器可以快速识别Web服务器问题。

要创建一个简单的Web服务器:

1. 切换到接收主机并运行以下命令以创建Web服务器的根目录(nc-webserver-docroot)和生成HTTP响应的shell脚本(httpresponse.sh)。

mkdir -pv /root/nc-webserver-docroot/
Creating a Webserver Root Directory

2. 接下来,在/root/nc-webserver-docroot/目录中使用您喜欢的编辑器创建一个index.html 文件,并填充 文件中的以下代码。这个HTML文件保存了Netcat Web服务器将提供的内容。

<!doctype html>

<html lang="en">

<head>
	<title>NETCAT Testing network connectivity </title>
</head>

<body>
	<h1>NETCAT Test</h1>
	<p>Connection Successful! Your networking skills are awesome!</p>
</body>

</html>

3. 在/root/nc-webserver-docroot/目录中创建一个名为httpresponse.sh 的shell脚本文件,并填充以下代码。

这个 shell 脚本将/root/nc-webserver-docroot/index.html文件的内容作为 HTTP 响应返回给发送请求到您的 Netcat Web 服务器的任何客户端。

#!/bin/bash
printf 'HTTP/1.1 200 OK\n\n%s' "$(cat /root/nc-webserver-docroot/index.html)"

4. 现在,运行下面的 chmod 命令,它没有输出,但会将 httpresponse.sh 文件设置为可执行文件(+x)。

chmod +x /root/nc-webserver-docroot/httpresponse.sh

5. 运行以下ncat命令在端口 7777 上启动 Netcat Web 服务器。

确保将端口 7777 替换为您选择的端口号,该端口号不应被系统上的任何其他服务使用。

以下选项会影响指定 Netcat Web 服务器的行为:

  • -l – 告诉 Ncat 监听传入连接。
  • -v – 启用详细模式以在终端中显示所有传入的 HTTP 请求。
  • -c - 指定生成 HTTP 响应的httpresponse.sh脚本的路径。
  • -keep-open – 即使第一个连接关闭后仍保持 Ncat 监听器处于打开状态。如果您要使用多个客户端测试您的 Web 服务器,则此选项很有用。
ncat -lv 7777 -c /root/nc-webserver-docroot/httpresponse.sh --keep-open

一旦 Netcat Web 服务器在所有可用的网络接口上的端口 7777 上运行并监听,您将看到以下输出。

Starting the Ncat Server

6. 现在,打开另一个终端并运行以下命令来测试您的Netcat Web服务器(http://localhost:7777)。

curl -vvv http://localhost:7777

下面的输出显示,Netcat Web服务器正在按预期工作,并可以作为HTTP响应返回/root/nc-webserver-docroot/index.html文件的内容。

Testing your Ncat server

7. 最后,切换回运行Netcat Web服务器的终端。您会看到,Netcat Web服务器已收到并处理了来自curl客户端的HTTP请求。

恭喜!您已成功创建了一个简单的Netcat Web服务器,用于测试您的网络连接性!

Verifying the HTTP Request from the curl Client

结论

在本教程中,您已经学会了使用Netcat提升您的网络和调试技能。您已经扫描了开放的端口,传输了文件,并创建了一个简单的Web服务器。到目前为止,您现在可以使用这个强大的网络实用程序解决许多真实世界的网络问题!

有了这些新发现的知识,为什么不进一步提升您的网络技能,成为网络安全的高级用户呢?

Source:
https://adamtheautomator.com/how-to-use-netcat/