Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
dnscat2 — 基于DNS协议的加密命令与控制隧道。创建用于渗透测试的隐秘C&C通道,通过DNS查询实现文件传输、shell访问和端口转发功能。 | Kitploit
工具/GitHubGitHub/iagox86/dnscat2
加密/解密工具IDS/IPS规避数据泄露渗透测试命令与控制红队远程访问工具DNS 分析命令与控制 分类第 16 名数据泄露 分类第 1 名
4.0k652334年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
IDS/IPS规避 分类第 12 名
远程访问工具 分类第 20 名
GitHubiagox86/dnscat2

dnscat2

基于DNS协议的加密命令与控制隧道。创建用于渗透测试的隐秘C&C通道,通过DNS查询实现文件传输、shell访问和端口转发功能。

查看仓库

***** 注意:.zip 下载文件的密码均为 "password"!*****

简介

欢迎使用 dnscat2,一个不会让你生病和死亡的 DNS 隧道!

该工具旨在通过 DNS 协议创建一个加密的命令与控制(C&C)通道,这是一种能有效穿越几乎所有网络的隧道。

本 README 文件应包含您开始使用所需的一切!如果您想深入了解协议细节、代码结构、未来计划或其他深奥内容,请查看 doc/ 文件夹。

许可证

本项目基于 BSD 许可证发布。请参阅 LICENSE.md 了解更多信息。

概述

dnscat2 由两部分组成:客户端和服务器。

客户端设计用于在受感染机器上运行。它用 C 语言编写,依赖项尽可能少。它应该可以在几乎所有平台上运行(如果您发现某个系统无法编译或运行,请提交问题,尤其是如果您能帮我获得对该系统的访问权限)。

运行客户端时,通常需要指定一个域名。所有请求都将发送到本地 DNS 服务器,然后被重定向到该域名的权威 DNS 服务器(假设您已经控制了该服务器)。

如果您没有权威 DNS 服务器,也可以使用 UDP/53(或您选择的任何端口)上的直接连接。这样速度更快,在普通观察者看来仍然像 DNS 流量,但在数据包日志中会明显得多(除非您修改源代码,否则所有域名都以 "dnscat." 开头)。这种模式经常会被防火墙阻止。

服务器设计用于在权威 DNS 服务器上运行。它使用 Ruby 编写,依赖于多个不同的 gem。运行时,与客户端类似,您需要指定它应监听的域名,同时也会监听直接发送到 UDP/53 的消息。当它接收到针对某个域名的流量时,会尝试建立逻辑连接。如果接收到其他流量,默认会忽略,但也可以将其转发到上游。

下文包含两部分的详细说明。

这与 … 有何不同

dnscat2 力求与其他 DNS 隧道协议不同,因为它专为特殊目的而设计:命令与控制。

它不是为了让你从酒店网络脱网,也不是为了在飞机上获得免费互联网。它不仅仅隧道化 TCP。

它可以隧道化任何数据,不附加任何协议。这意味着它可以上传和下载文件,可以运行 shell,并且能很好地完成这些任务。它也可能隧道化 TCP,但这只在渗透测试工具的上下文中添加(即,将 TCP 隧道化进入网络),而不是作为通用的隧道工具。这项工作已经完成,对我来说并不有趣。

它默认也是加密的。我不认为任何其他公开的 DNS 隧道能加密所有流量!

获取方式

以下是一些重要链接:

  • GitHub 上的源代码
  • 下载页面(您会找到带签名的 Linux 32 位、Linux 64 位、Win32 以及客户端源代码版本,还有服务器归档文件 - 请记住,签名文件与文件托管在同一服务器上,所以如果您担心,请验证我的 PGP 密钥 :))
  • 用户文档 文件集合,包括最终用户文档(如更新日志)和开发者文档(如贡献指南)
  • 问题跟踪器(您也可以通过邮件向我报告问题,只需将我的名字(ron)放在我的域名(skullsecurity.net)前面)

如何使用

dnscat2 的原理很简单:它通过 DNS 协议创建隧道。

为什么?因为 DNS 有一个奇妙的特性:它会在服务器之间不断传递,直到找到它应该去的地方。

这意味着,为了让 dnscat 将流量带出安全网络,它只需向 某个 DNS 服务器发送消息,该服务器会愉快地将消息通过 DNS 网络转发,直到到达 您的 DNS 服务器。

当然,这假定您有权访问权威 DNS 服务器。dnscat2 也支持"直接"连接 - 即,运行一个 dnscat 客户端直接连接到您 IP 地址和 UDP 端口 53(默认)上的 dnscat 服务器。流量仍然看起来像 DNS 流量,可能能绕过较傻的 IDS/IPS 系统,但仍可能被防火墙阻止。

如果您不清楚如何设置权威 DNS 服务器,需要与域名提供商进行设置。izhan 很贴心地为您编写了一份指南!

编译

客户端

编译客户端应该很简单 - 您只需要 make/gcc(Linux)或 Cygwin 或 Microsoft Visual Studio(Windows)。以下是 Linux 上的命令:

$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/client/
$ make

在 Windows 上,将 client/win32/dnscat2.vcproj 加载到 Visual Studio,然后点击"构建"。我在 Visual Studio 2008 上创建并测试它 - 在我获得免费合法的新版本之前,我可能会一直使用它。:)

如果编译失败,请在我的 GitHub 页面提交错误报告!请提供您系统的详细信息。

您可以通过不带任何标志运行客户端来验证 dnscat2 是否成功编译;您会看到它尝试使用您配置的 DNS 服务器启动 DNS 隧道(这会失败):

$ ./dnscat
Starting DNS driver without a domain! This will only work if you
are directly connecting to the dnscat2 server.

You'll need to use --dns server=<server> if you aren't.

** WARNING!
*
* It looks like you're running dnscat2 with the system DNS server,
* and no domain name!*
* That's cool, I'm not going to stop you, but the odds are really,
* really high that this won't work. You either need to provide a
* domain to use DNS resolution (requires an authoritative server):
*
*     dnscat mydomain.com
*
* Or you have to provide a server to connect directly to:
*
*     dnscat --dns=server=1.2.3.4,port=53
*
* I'm going to let this keep running, but once again, this likely
* isn't what you want!
*
** WARNING!

Creating DNS driver:
 domain = (null)
 host   = 0.0.0.0
 port   = 53
 type   = TXT,CNAME,MX
 server = 4.2.2.1
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: The server hasn't returned a valid response in the last 10 attempts.. closing session.
[[ FATAL ]] :: There are no active sessions left! Goodbye!
[[ WARNING ]] :: Terminating

服务器

服务器不需要"编译",但它需要一些 Ruby 依赖项。不幸的是,Ruby 依赖项可能安装起来很麻烦,所以祝你好运!如果有 Ruby 专家想帮助改进本节内容,我将不胜感激!

我假设你已经安装了 Ruby 和 Gem 并且工作正常。如果没有,请使用 apt-get、emerge、rvm 或你的操作系统常用的方式安装它们。

一旦 Ruby/Gem 安装好,运行以下命令(注意:如果你已经安装了客户端,显然可以跳过 git clone 命令;如果你已经安装了 bundler,可以跳过 gem install bundler):

$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/server/
$ gem install bundler
$ bundle install

如果 gem install bundler 或 bundle install 出现权限错误,你可能需要以 root 身份运行它们。如果你遇到很多问题,请卸载 Ruby/Gem 并使用 rvm 并在非 root 用户下重新安装所有内容。

如果出现类似这样的错误:

/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- mkmf (LoadError)

这意味着你需要安装 Ruby 的 -dev 版本:

$ sudo apt-get install ruby-dev

我发现 sudo 有时不足以让一切正常工作,我有时必须切换到 root 用户并直接在该账户下工作。rvmsudo 没有帮助,因为它会破坏 ctrl-z。

你可以通过不带任何标志运行服务器,并查看是否出现 dnscat2> 提示符来验证服务器是否正常工作:

# ruby ./dnscat2.rb

New window created: 0
Welcome to dnscat2! Some documentation may be out of date.

passthrough => disabled
auto_attach => false
auto_command =>
process =>
history_size (for new windows) => 1000
New window created: dns1
Starting Dnscat2 DNS server on 0.0.0.0:53
[domains = n/a]...

It looks like you didn't give me any domains to recognize!
That's cool, though, you can still use direct queries,
although those are less stealthy.

To talk directly to the server without a domain name, run:
  ./dnscat2 --dns server=x.x.x.x,port=53

Of course, you have to figure out <server> yourself! Clients
will connect directly on UDP port 53.

dnscat2>

如果你不以 root 身份运行,在监听 UDP/53 时可能会遇到问题(你可以使用 --dnsport 更改端口)。如果是这种情况,你会看到一条错误消息。

以 root 身份运行 Ruby

如果你以 root 身份运行 Ruby 时遇到问题,以下是我首次运行时的操作:

$ cd dnscat2/server
$ su
# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
# \curl -sSL https://get.rvm.io | bash
# source /etc/profile.d/rvm.sh
# rvm install 1.9
# rvm use 1.9
# bundle install
# ruby ./dnscat2.rb

后续运行:

$ cd dnscat2/server
$ su
# source /etc/profile.d/rvm.sh
# ruby ./dnscat2.rb

rvmsudo 本应使操作更简单,但不幸的是 dnscat2 与 rvmsudo 配合不佳。

使用方法

客户端 + 服务器

在我们讨论如何具体使用这些工具之前,先来谈谈 dnscat 的结构。dnscat 工具分为两部分:客户端和服务器。如果你经历过编译过程,就会注意到客户端是用 C 编写的,而服务器是用 Ruby 编写的。

通常,服务器先运行。它可以长期运行,并处理任意数量的客户端。正如我之前所说,它基本上是一个 C&C 服务。

随后,客户端运行,它会与服务器建立一个会话(更多关于会话的内容见下文)。会话可以穿越 DNS 层级(推荐,但更复杂),或者直接连接到服务器。穿越 DNS 层级需要一个权威域名,但可以绕过大多数防火墙。直接连接到服务器则由于多种原因而更明显。

默认情况下,连接会自动加密(可以使用客户端上的 --no-encryption 和服务器上的 --security=open 关闭)。建立新连接时,如果你担心中间人攻击,你有两种验证对端的选项:

  • 在两边使用 --secret 参数传递预共享密钥来验证连接
  • 手动验证"短认证字符串" - 在加密协商后,客户端和服务器上都会打印的一系列单词

运行服务器

服务器 - 通常运行在特定域名的权威 DNS 服务器上 - 设计为功能丰富、交互式且用户友好。它用 Ruby 编写,其设计很大程度上受 Metasploit 和 Meterpreter 的启发。

如果你按照上述编译说明操作,应该只需要运行服务器:

$ ruby ./dnscat2.rb skullseclabs.org

其中 "skullseclabs.org" 是你自己的域名。如果你没有权威 DNS 服务器,这不是必须的;但这个工具在有权威服务器的情况下效果要好得多。

除此之外应该就够了!此外,你可以在任何其他系统上使用客户端的 --ping 命令进行测试,如果你已经编译了客户端,该命令应该可用:

$ ./dnscat --ping skullseclabs.org

如果 ping 成功,你的 C&C 服务器很可能没问题!如果你将 DNS 服务器运行在不同的端口上,或者需要使用自定义 DNS 解析器,你可以在 --ping 之外使用 --dns 标志:

$ ./dnscat --dns server=8.8.8.8,domain=skullseclabs.org --ping

$ ./dnscat --dns port=53531,server=localhost,domain=skullseclabs.org --ping

请注意,当你指定 --dns 参数时,域名必须包含在该参数中(作为 domain=xxx)。你不能仅仅在命令行上传递它(这是我命令解析的一个限制;我可能会在将来的版本中改进它)。

当进程正在运行时,你可以使用基本相同的方式来启动一个新服务器:

下载工具