一个恶意的 DNS 服务器,用于动态执行 DNS 重新绑定攻击。whonow 让你能够通过域名请求本身动态指定 DNS 响应和重新绑定规则。
# 首次查询该域名时响应 34.192.228.43,之后每次都响应 192.168.1.1
A.34.192.228.43.1time.192.168.1.1.forever.rebind.network
# 首次响应 34.192.228.43,接下来五次响应 192.168.1.1,然后重新开始(1次,5次,循环往复...)
A.34.192.228.43.1time.192.168.1.1.5times.repeat.rebind.network
动态 DNS 重新绑定规则的妙处在于,你无需自行搭建恶意 DNS 服务器就可以开始利用浏览器的同源策略。相反,每个人都可以共享同一个公共 whonow 服务器,它运行在 rebind.network 的 53 端口上。
注意:在向 whonow 服务器发起每次 DNS 查询时,你应当在域名中包含 UUID(例如 a06a5856-1fff-4415-9aa2-823230b05826)作为子域名。为简洁起见,本 README 中的示例省略了这部分,但请假设对 *.rebind.network 的请求应写为 *.a06a5856-1fff-4415-9aa2-823230b05826.rebind.network。更多原因请参阅注意事项部分。
免责声明:本软件仅供教育目的使用。不得用于非法活动。作者不对其使用负责。不要当混蛋。
whonow 的精妙之处在于,你可以通过域名本身的子域名来定义 DNS 响应的行为。仅需几个简单的关键字:A、(n)times、forever 和 repeat,就可以定义复杂而强大的 DNS 行为。
whonow 请求的结构A.<ip-address>.<rule>[.<ip-address>.<rule>[.<ip-address>.<rule>]][.uuid/random-string].example.com
A:DNS 请求的类型。目前仅支持 A 记录,但 AAAA 记录即将推出。<ip-address>:一个 IPv4 地址(IPv6 即将推出),每个字节用句点分隔(例如 192.168.1.1)。<rule>:三种规则之一
(n)time[s]:DNS 服务器应使用前一个 IP 地址进行响应的次数。接受单数和复数形式(例如 1time、3times、5000times)。forever:永远使用前一个 IP 地址进行响应。repeat:从开头重复整个规则集。[uuid/random-string]:一个随机字符串,用于将对同一 IP 地址的 DNS 重新绑定攻击彼此隔离。详见注意事项。example.com:一个指向 名称服务器的域名,例如公用的 实例。规则可以串联,形成复杂的响应行为。
# 始终响应 192.168.1.1。这不算真正的 DNS 重新绑定,但仍然有效
A.192.168.1.1.forever.rebind.network
# 永远交替响应 localhost 和 10.0.0.1
A.127.0.0.1.1time.10.0.0.1.1time.repeat.rebind.network
# 先响应 192.168.1.1,然后响应 192.168.1.2(两次),之后永远响应 192.168.1.3
A.192.168.1.1.1time.192.168.1.2.2times.192.168.1.3.forever.rebind.network
# 首次响应 34.192.228.43,之后永远响应 `whonow --default-address` 所设置的地址(默认:127.0.0.1)
A.34.192.228.43.1time.rebind.network
每个标签(子域名)可包含 0 到 63 个字符……完整域名在其文本表示中的长度不应超过 253 个字符。(来自 DNS 维基百科页面)
此外,标签/子域名的数量不得超过 127 个。
每个向 whonow 发起的唯一域名请求都会在服务器 RAM 中创建一个微小的状态保存程序。下次再请求该域名时,程序计数器会增加,状态可能会发生变化。所有唯一域名都是独立的唯一程序实例。为避免与其他用户冲突,或使你的域名程序状态被意外递增,你应在规则定义后添加一个 UUID 子域名。该 UUID 不应重复使用。
# 这样写
A.127.0.0.1.1time.10.0.0.1.1time.repeat.8f058b82-4c39-4dfe-91f7-9b07bcd7fbd4.rebind.network
# 不要这样写
A.127.0.0.1.1time.10.0.0.1.1time.repeat.rebind.network
--max-ram-domains每个唯一域名关联的程序状态由 whonow 存储在 RAM 中。为避免内存耗尽,对同时可管理的唯一域名数量设置了上限。默认情况下,该值设为 10,000,000,但可通过 --max-ram-domains 进行配置。一旦达到此限制,域名及其保存的程序状态将按添加顺序(先进先出)被移除。
whonow 服务器若要在云中运行你自己的 whonow 服务器,请使用域名提供商的管理面板配置一个指向你的 VPS 的自定义名称服务器。然后在该 VPS 上安装 whonow,确保它在 53 端口(默认 DNS 端口)上运行,并且该端口对互联网可访问。
# 安装
npm install --cli -g whonow@latest
# 运行!
whonow --port 53
# 你还可以通过增加日志输出到 stdout 并将 DNS 活动保存到 CSV 文件来运行
whonow --port 53 --logfile log.csv --verbose

如果上面👆的操作太麻烦,你也可以直接使用运行在 rebind.network 53 端口上的公共 whonow 服务器🌐。
$ whonow --help
usage: whonow [-h] [-v] [-p PORT] [-d DEFAULT_ANSWER] [-b MAX_RAM_DOMAINS]
[-l LOGFILE] [-m]
一个用于动态执行 DNS 重新绑定攻击的恶意 DNS 服务器。
可选参数:
-h, --help 显示此帮助信息并退出。
-v, --version 显示程序的版本号并退出。
-p PORT, --port PORT DNS 服务器运行的端口(默认:53)。
-d DEFAULT_ANSWER, --default-answer DEFAULT_ANSWER
未找到规则时响应的默认 IP 地址(默认:"127.0.0.1")。
-b MAX_RAM_DOMAINS, --max-ram-domains MAX_RAM_DOMAINS
同时存储在 RAM 中的域名记录数量。一旦查询的唯一域名数量超过此数值,域名将按请求顺序从内存中移除。以这种方式被移除的域名,下次被查询时其程序状态将重置(默认:10000000)。
-l LOGFILE, --logfile LOGFILE
记录到 CSV 文件(默认:false)。
-m, --verbose 将请求时间戳和发送方 IP 地址记录到 stdout(默认:false)。
whonow 服务器必须运行在 localhost:15353 上,才能执行 test.js 中的测试。
# 在一个终端中
whonow -p 15353
# 在另一个终端中
cd path/to/node_modules/whonow
npm test
whonowrebind.network:53whonow