brannondorsey/whonow
GitHub: brannondorsey/whonow
一个通过子域名编码动态规则来执行 DNS 重绑定攻击的恶意 DNS 服务器,无需自建即可利用公共实例绕过浏览器同源策略进行安全测试。
Stars: 660 | Forks: 93
# Whonow DNS 服务器
一个用于动态执行 [DNS 重绑定攻击](https://en.wikipedia.org/wiki/DNS_rebinding) 的恶意 DNS 服务器。`whonow` 允许你*使用域名请求本身*来动态指定 DNS 响应和重绑定规则。
```
# 首次请求此 domain 时,使用 34.192.228.43 响应 DNS 查询,
# 之后每次均使用 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 服务器即可开始利用浏览器的[同源策略](https://en.wikipedia.org/wiki/Same-origin_policy)。相反,所有人都可以共享运行在 `rebind.network` 的 53 端口上的公共 `whonow` 服务器。
**注意**:在对 `whonow` 服务器的每次 DNS 查找中,你应该包含一个 UUID(例如 `a06a5856-1fff-4415-9aa2-823230b05826`)作为子域名。为了简洁起见,本 README 中的示例省略了这些内容,但假定对 `*.rebind.network` 的请求实际上应为 `*.a06a5856-1fff-4415-9aa2-823230b05826.rebind.network`。有关原因的更多信息,请参阅 [注意事项](#gotchas) 部分。
**免责声明:本软件仅用于教育目的。本软件不得用于非法活动。作者对其使用行为不承担任何责任。请勿用于恶意用途。**
## 子域名 = 重绑定规则
`whonow` 的美妙之处在于,你可以通过域名本身中的子域名来定义 DNS 响应的行为。只需使用几个简单的关键字:`A`、`(n)times`、`forever` 和 `repeat`,你就可以定义复杂且强大的 DNS 行为。
### `whonow` 请求的结构
```
A..[..[..]][.uuid/random-string].example.com
```
- `A`:DNS 请求的类型。目前仅支持 `A` 记录,但 `AAAA` 即将推出。
- ``:一个 IPv4(IPv6 即将推出)地址,每个字节以句点分隔(例如 `192.168.1.1`)。
- ``:三种规则之一
- `(n)time[s]`:DNS 服务器应回复上一个 IP 地址的次数。接受复数和单数字符串(例如 `1time, 3times, 5000times`)
- `forever`:永远回复上一个 IP 地址。
- `repeat`:从头开始重复整套规则。
- `[uuid/random-string]`:一个随机字符串,用于将针对相同 IP 地址的 DNS 重绑定攻击相互隔离开来。有关更多信息,请参见 [注意事项](#gotchas)。
- `example.com`:一个你已指向 `whonow` 域名服务器的域名,例如公开可用的 `rebind.network:53` `whonow` 实例。
规则可以链接在一起,以形成复杂的响应行为。
### 示例
```
# 始终使用 192.168.1.1 响应。这并非真正的 DNS rebinding,
# 但它依然有效
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
```
### 限制
此外,标签/子域名的数量不得超过 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 中。为了避免耗尽 RAM,系统对可以同时管理程序状态的唯一域名数量设置了上限。默认情况下,此值设置为 10,000,000,但可以通过 `--max-ram-domains` 进行配置。一旦达到此限制,域名及其保存的程序状态将按照它们被添加的顺序被移除(先进先出 FIFO)。
## 运行你自己的 `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]
A malicious DNS server for executing DNS Rebinding attacks on the fly.
Optional arguments:
-h, --help Show this help message and exit.
-v, --version Show program's version number and exit.
-p PORT, --port PORT What port to run the DNS server on (default: 53).
-d DEFAULT_ANSWER, --default-answer DEFAULT_ANSWER
The default IP address to respond with if no rule is
found (default: "127.0.0.1").
-b MAX_RAM_DOMAINS, --max-ram-domains MAX_RAM_DOMAINS
The number of domain name records to store in RAM at
once. Once the number of unique domain names queried
surpasses this number domains will be removed from
memory in the order they were requested. Domains that
have been removed in this way will have their program
state reset the next time they are queried (default:
10000000).
-l LOGFILE, --logfile LOGFILE
Log to CSV file (default: false)
-m, --verbose Log request timestamp and sender IP address to stdout
(default: false)
```
## 测试
必须有一个 `whonow` 服务器运行在 `localhost:15353` 上,才能执行 `test.js` 中的测试
```
# 在一个 terminal 中
whonow -p 15353
```
```
# 在另一个 terminal 中
cd path/to/node_modules/whonow
npm test
```
标签:DNS攻击, DNS枚举, DNS解析, DNS重绑定, GNU通用公共许可证, IP 地址批量处理, MITM代理, Node.js, Web安全, 同源策略绕过, 域前置, 安全测试, 密码管理, 开源项目, 恶意DNS服务器, 攻击性安全, 暗色界面, 网络信息安全, 网络安全工具, 自定义脚本, 蓝队分析, 黑帽SEO