| | 版本 0.4 | | / _|
| | __ ___ | | __| |
/ ` | ' / |/ | ' \ / _ \ |
| (| | | | _ \ (| | | | __/ |
_,|| ||/_|| ||___||
文 档 说 明
DNSChef 是一个高度可配置的 DNS 代理,适用于渗透测试人员和恶意软件分析师。DNS 代理(又称“伪 DNS”)是一种用于应用程序网络流量分析等用途的工具。例如,DNS 代理可用于伪造对“badguy.com”的请求,使其指向本地机器进行终止或拦截,而不是指向互联网上的真实主机。
目前已有多种 DNS 代理。大多数只会将所有 DNS 查询指向单个 IP 地址,或仅实现基本的过滤功能。DNSChef 是在一次渗透测试中开发的,当时需要一种更可配置的系统。因此,DNSChef 是一个跨平台应用程序,能够基于包含和排除域名列表伪造响应,支持多种 DNS 记录类型、带通配符的域名匹配、代理非匹配域名的真实响应、定义外部配置文件、IPv6 以及许多其他功能。下文将详细解释每项功能及其建议用途。
建议在无法强制应用程序直接使用其他代理服务器的情况下使用 DNS 代理。例如,某些移动应用程序完全忽略操作系统的 HTTP 代理设置。在这些情况下,使用诸如 DNSChef 之类的 DNS 代理服务器将允许您欺骗该应用程序,将连接转发到所需的目的地。
在开始使用 DNSChef 之前,必须将您的机器配置为使用运行该工具的 DNS 名称服务器。根据您使用的操作系统,有几种选项:
Linux - 编辑 /etc/resolv.conf,在最顶部添加一行包含您流量分析主机的条目(例如,如果本地运行则添加“nameserver 127.0.0.1”)。或者,您可以使用 Network Manager 等工具添加 DNS 服务器地址。在 Network Manager 中打开 IPv4 设置,从 Method 下拉框中选择 Automatic (DHCP) addresses only 或 Manual,然后编辑 DNS Servers 文本框,包含运行 DNSChef 的 IP 地址。
Windows - 从 Control Panel 中选择 Network Connections。接着选择一个连接(如“Local Area Connection”),右键单击并选择 Properties。在新弹出的对话框中,选择 Internet Protocol (TCP/IP) 并单击 Properties。最后选择 Use the following DNS server addresses 单选按钮,输入运行 DNSChef 的 IP 地址。例如,如果本地运行则输入 127.0.0.1。
OS X - 打开 System Preferences,点击 Network 图标。选择活动接口,填写 DNS Server 字段。如果您使用 AirPort,则需要单击 Advanced... 按钮并从那里编辑 DNS 服务器。或者,您可以编辑 /etc/resolv.conf,在最顶部添加一个伪名称服务器(例如“nameserver 127.0.0.1”)。
iOS - 打开 Settings,选择 General。接着选择 Wi-Fi,点击列表中活动接入点右侧的蓝色箭头。将 DNS 条目编辑为指向运行 DNSChef 的主机。确保已禁用 Cellular 接口(如果可用)。
Android - 打开 Settings,选择 Wireless and network。点击 Wi-Fi settings,然后按下手机上的 Options 按钮并选择 Advanced。启用 Use static IP 复选框,并配置自定义 DNS 服务器。
如果您无法手动修改设备的 DNS 设置,则仍有几种选择,涉及诸如 ARP Spoofing、Rogue DHCP 等技术以及其他创造性方法。
最后,您需要配置一个伪服务,DNSChef 将把所有请求指向该服务。例如,如果您试图拦截 Web 流量,则必须启动一个在端口 80 上运行的独立 Web 服务器,或者设置一个 Web 代理(例如 Burp)来拦截流量。DNSChef 会将查询指向您的代理/服务器主机,该主机应配置了适当的服务。
DNSChef 是一个用 Python 开发的跨平台应用程序,应该能在大多数安装了 Python 解释器的平台上运行。您可以使用随附的 dnschef.exe 可执行文件在 Windows 主机上运行,而无需安装 Python 解释器。本指南将重点介绍 Unix 环境;但以下所有示例也经过测试可在 Windows 上运行。
让我们通过其最基本的监控功能来体验 DNSChef。以 root 身份执行以下命令(需要在端口 53 上启动服务器):
# ./dnschef.py
_ _ __
| | 版本 0.2 | | / _|
__| |_ __ ___ ___| |__ ___| |_
/ _` | '_ \/ __|/ __| '_ \ / _ \ _|
| (_| | | | \__ \ (__| | | | __/ |
\__,_|_| |_|___/\___|_| |_|\___|_|
[email protected]
[*] DNSChef 在接口 127.0.0.1 上启动
[*] 使用以下名称服务器:8.8.8.8
[*] 未指定参数。以完全代理模式运行
未指定任何参数时,DNSChef 将以完全代理模式运行。这意味着所有请求将简单地转发到上游 DNS 服务器(默认 8.8.8.8),并将响应返回给查询主机。例如,查询某个域的“A”记录并观察结果:
$ host -t A thesprawl.org
thesprawl.org has address 108.59.3.64
DNSChef 将打印以下日志行,显示时间、源 IP 地址、请求的记录类型,以及最重要的——查询的名称:
[23:54:03] 127.0.0.1: proxying the response of type 'A' for thesprawl.org
此模式适用于简单的应用程序监控,您需要找出应用程序用于通信的域名。
DNSChef 完全支持 IPv6,可通过 -6 或 --ipv6 标志激活。其工作方式与 IPv4 模式完全相同,唯一区别是默认监听接口切换为 ::1,默认 DNS 服务器切换为 2001:4860:4860::8888。以下是一个示例输出:
# ./dnschef.py -6
_ _ __
| | 版本 0.2 | | / _|
__| |_ __ ___ ___| |__ ___| |_
/ _` | '_ \/ __|/ __| '_ \ / _ \ _|
| (_| | | | \__ \ (__| | | | __/ |
\__,_|_| |_|___/\___|_| |_|\___|_|
[email protected]
[*] 使用 IPv6 模式。
[*] DNSChef 在接口 ::1 上启动
[*] 使用以下名称服务器:2001:4860:4860::8888
[*] 未指定参数。以完全代理模式运行
[00:35:44] ::1: proxying the response of type 'A' for thesprawl.org
[00:35:44] ::1: proxying the response of type 'AAAA' for thesprawl.org
[00:35:44] ::1: proxying the response of type 'MX' for thesprawl.org
注意:默认情况下,DNSChef 创建一个 UDP 监听器。您可以使用 --tcp 参数改用 TCP,稍后将讨论。
现在您知道了如何启动 DNSChef,让我们使用 --fakeip 参数配置它,将所有回复伪造为指向 127.0.0.1:
# ./dnschef.py --fakeip 127.0.0.1 -q
[*] DNSChef 在接口 127.0.0.1 上启动
[*] 使用以下名称服务器:8.8.8.8
[*] 将所有 A 回复伪造为指向 127.0.0.1
[23:55:57] 127.0.0.1: cooking the response of type 'A' for google.com to 127.0.0.1
[23:55:57] 127.0.0.1: proxying the response of type 'AAAA' for google.com
[23:55:57] 127.0.0.1: proxying the response of type 'MX' for google.com
在上面的输出中,您可以看到 DNSChef 被配置为将所有请求代理到 127.0.0.1。08:11:23 的第一行日志显示我们已将“A”记录响应“篡改”为指向 127.0.0.1。然而,随后对“AAAA”和“MX”记录的请求只是从真实 DNS 服务器代理而来。让我们看看请求程序的输出:
$ host google.com localhost
google.com has address 127.0.0.1
google.com has IPv6 address 2001:4860:4001:803::1001
google.com mail is handled by 10 aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
如您所见,该程序被欺骗,认为 IPv4 地址是 127.0.0.1。然而,从 IPv6(AAAA)和邮件(MX)记录获取的信息看起来完全合法。DNSChef 的目标是对程序的正常运行影响最小,因此如果应用程序依赖特定的邮件服务器,它可以通过此代理请求正确获取。
让我们再伪造一个请求,以说明如何同时针对多条记录:
# ./dnschef.py --fakeip 127.0.0.1 --fakeipv6 ::1 -q
[*] DNSChef 在接口 127.0.0.1 上启动
[*] 使用以下名称服务器:8.8.8.8
[*] 将所有 A 回复伪造为指向 127.0.0.1
[*] 将所有 AAAA 回复伪造为指向 ::1
[00:02:14] 127.0.0.1: cooking the response of type 'A' for google.com to 127.0.0.1
[00:02:14] 127.0.0.1: cooking the response of type 'AAAA' for google.com to ::1
[00:02:14] 127.0.0.1: proxying the response of type 'MX' for google.com
除了 --fakeip 标志,我还指定了 --fakeipv6,用于伪造“AAAA”记录查询。以下是更新后的程序输出:
$ host google.com localhost
google.com has address 127.0.0.1
google.com has IPv6 address ::1
google.com mail is handled by 10 aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
再次,所有未被应用程序显式覆盖的记录都被代理并从真实 DNS 服务器返回。然而,IPv4(A)和 IPv6(AAAA)都被伪造为指向本地机器。
DNSChef 支持多种记录类型:
+--------+--------------+-----------+--------------------------+
| 记录 | 描述 | 参数 | 示例 |
+--------+--------------+-----------+--------------------------+
| A | IPv4 地址 | --fakeip | --fakeip 192.0.2.1 |
| AAAA | IPv6 地址 | --fakeipv6| --fakeipv6 2001:db8::1 |
| MX | 邮件服务器 | --fakemail| --fakemail mail.fake.com |
| CNAME | CNAME 记录 | --fakealias| --fakealias www.fake.com |
| NS | 名称服务器 | --fakens | --fakens ns.fake.com |
+--------+--------------+-----------+--------------------------+
注意:为便于使用,并非所有 DNS 记录类型都暴露在命令行中。其他记录如 PTR、TXT、SOA 等可以通过 --file 标志和适当的记录头部指定。有关详细信息,请参见下文中的外部定义文件部分。
最后,让我们观察应用程序如何处理 ANY 类型的查询:
# ./dnschef.py --fakeip 127.0.0.1 --fakeipv6 ::1 --fakemail mail.fake.com --fakealias www.fake.com --fakens ns.fake.com -q
[*] DNSChef 在接口 127.0.0.1 上启动
[*] 使用以下名称服务器:8.8.8.8
[*] 将所有 A 回复伪造为指向 127.0.0.1
[*] 将所有 AAAA 回复伪造为指向 ::1
[*] 将所有 MX 回复伪造为指向 mail.fake.com
[*] 将所有 CNAME 回复伪造为指向 www.fake.com
[*] 将所有 NS 回复伪造为指向 ns.fake.com
[00:17:29] 127.0.0.1: cooking the response of type 'ANY' for google.com with all known fake records.
DNS ANY 记录查询导致 DNSChef 返回它知道的、适用于该域的所有伪造记录。以下是程序将看到的输出:
$ host -t ANY google.com localhost
google.com has address 127.0.0.1
google.com has IPv6 address ::1
google.com mail is handled by 10 mail.fake.com.
google.com is an alias for www.fake.com.
google.com name server ns.fake.com.