Skip to content

Netcat 使用指南 ​

本文部分内容摘自 如何使用 netcat - 西电 CTF 终端(作者:可可今天吃什么),并遵循 CC-BY-SA 4.0 协议。

什么是 Netcat ​

nc/ncat 是一个用于网络连接的工具,它可以连接到一个指定的 IP 地址和端口,并且可以发送和接收数据。在 CTF 比赛中,我们经常使用 nc 命令来连接到题目的服务端口。

nc 是 netcat 的缩写,而 ncat 是对 nc 的一个重写,两者间的行为差别可以忽略不计。当然,如果你 Pwn 题目做得多,或者你是 CTF 「牢玩家」的话,你可能会更常用 pwntools 这个 Python 库,它提供了更多的功能,但在这里我们只讨论 nc.

如何安装 Netcat ​

Linux ​

大多数 Linux 发行版已经预装了 Netcat,你可以尝试在终端输入 nc 来判断是否已经安装 nc 工具,如果能正确显示 nc 的使用帮助,则说明已经正确安装。

如果你的 Linux 没有安装 nc,你可以根据对应的包管理器安装:

bash
sudo apt install netcat-openbsd
bash
sudo pacman -S openbsd-netcat
bash
sudo dnf install -y nmap-ncat

部分 Linux 发行版的默认包管理器

  • Debian/Ubuntu: apt
  • Arch Linux: pacman
  • CentOS/RHEL/Fedora: yum dnf

Windows ​

Windows 系统中没有 nc 工具。但是你可以下载 ncat 工具,它是 nc 的一个重写,功能更强大。访问 nmap 下载页面,选择 Windows 版本并下载,然后安装时选择安装 ncat。

你也可以下载 nc 的独立版本(请见 netcat for Win32/Win64),解压后将 nc.exe 所在目录添加到 PATH 环境变量中。

注意

如果你使用 ncat,请将之后遇到的命令中的 nc 替换为 ncat.

MacOS ​

在 MacOS 中,nc 是被默认安装的。可以在终端输入 nc 来判断是否已经安装nc工具,如果能正确显示nc的使用帮助,则说明已经正确安装。

如果你的 MacOS 并没有安装 nc,你可以使用 Homebrew 安装:

bash
brew install netcat

其他系统 ​

如果你使用的是其它系统,那么想必你应该已经对计算机有着深入的理解和认识,你可以自行搜索如何安装 nc 获其替代工具。当然,你也可以自己写一个程序完成类似 nc 的 Socket 通信。

如何使用 Netcat ​

nc 的使用方法非常简单,你只需要在终端输入 nc,然后加上你要连接的地址和端口号,就可以连接到题目的服务端口了。

例如,如果题目的主机为 hacker.akyuu.space,端口为 6668(或者以 hacker.akyuu.space:6668 等形式给出,请自行识别),那么你可以在终端输入:

bash
nc hacker.akyuu.space 6668

然后按下 ↵ Enter 回车键,你就可以连接到题目的服务端口了。

若连接成功,你会看到服务端返回的内容,并且可以使用命令行与远程进行交互。否则,你可能会看到一些错误信息,这时,你可以尝试检查一下你的网络连接,必要时寻求帮助。

为什么我不能用浏览器访问某些题目 ​

浏览器访问一个链接使用的是 HTTP/HTTPS 协议。HTTP/HTTPS 协议构建于 TCP 协议之上,有其固定的 TCP 报文格式。而一些方向(如 Pwn、Misc)的题目使用的是原始的 TCP 协议,可能并没有进一步实现 HTTP 协议的内容。这时你需要直接用 TCP 协议与服务器通信(交互)。所以用浏览器访问会使得服务器接收到一个 HTTP/HTTPS 的报文内容,即使服务器作出响应,浏览器也无法正确解析。

接下来展示一个例子,以便更好地说明这两种不同的情况。假设题目给出的地址和端口为 hacker.akyuu.space 6668,当你使用浏览器访问,浏览器会向服务器发一个 TCP 报文:

HTTP
GET / HTTP/1.1
Host: hacker.akyuu.space:6668

而 nc 则仅仅是打开了一个 TCP 连接。

之后,服务器会返回给你一个 TCP 报文:

plaintext
Input username:

而浏览器无法解析 Input username: 这个内容,因为它不是有效的 HTTP 响应报文,故显示出错。

TIP

如果你用浏览器访问题目地址时出现了问题,不妨尝试使用 nc 命令连接到题目的服务端口。

有时使用浏览器访问题目地址显示页面或跳转到某个地址,这只是因为题目做了有关 HTTP 报文的处理,以使返回的内容能够被你的浏览器正确解析。

参考链接 ​