chadillac/mdns_recon
GitHub: chadillac/mdns_recon
基于 Scapy 的 mDNS 侦察工具,用于检测互联网上错误配置并暴露敏感信息的多播 DNS 服务。
Stars: 88 | Forks: 26
# 快速介绍
部署在互联网上各种系统中的多播 DNS 和 DNS 服务发现守护程序存在配置错误,并且会回复
针对其单播地址的查询,包括来自其 WAN 接口的请求。
攻击者可以利用这些守护程序进行敏感信息泄露,并且可能
在 DDoS 攻击活动中将其用于反射,在某些情况下甚至用于放大。
该漏洞是与 CERT (http://www.kb.cert.org/vuls/id/550620) 协调后公开的
## mDNS
## 谁,什么,在哪里?
mDNS 在某种意义上非常像 SSDP(这也是我最初决定测试它的原因),即它
允许本地网络上的设备轻松发现彼此,交换关于
可用服务的信息,并减少或消除配置需求。因为这些是当今 mDNS 的主要
用途,所以它可以在广泛的消费设备中找到,例如电话、打印机、NAS 系统、
媒体设备等。所有主要操作系统(Windows、OS X 和 Linux)也都有可用的守护程序。
mDNS 的著名用途包括 ZeroConf 网络、Apple 的 Bonjour 和 AirDrop 以及 ChromeCast,在
我的测试中,这些似乎都不存在漏洞(除了在野外发现的一台 MacBook Air)。并非所有
实现在互联网上都易受攻击,但一些存在漏洞的实现在嵌入式设备上,这些设备不太可能
收到来自其供应商或用户的更新。
## 外面有什么?
作为对这些易受攻击守护程序影响初步研究的一部分,进行了广泛扫描,识别出
超过 100,000 台在互联网上回复 mDNS 查询的设备。这些设备包括几台 NAS 盒子和打印机
以及 Windows 和 Linux 机器。其中一些机器位于较大的网络中,例如公司和
大学,并且似乎安全性很差,甚至根本没有安全措施。一些供应商已经声明他们不会
修复目前在野外易受攻击的旧设备上的此问题。
## 你如何查询这些机器?
当我最初开始研究时,我的第一个测试是使用 `dig` 来确认是否可以触发回复。
```
$ dig +short @[target_ip] -p 5353 -t any _services._dns-sd._udp.local
_workstation._tcp.local.
_http._tcp.local.
_afpovertcp._tcp.local.
_device-info._tcp.local.
_dacp._tcp.local.
_daap._tcp.local.
```
一旦我确认在野外存在一些机器,我就编写了一个快速而简陋的 Scapy 脚本,我可以用它来
轻松地自动化我未来的测试,并在实验室环境中测试可行的反射。我已经删除了
反射部分(原因应该很明显),并正在发布侦察部分,我将其
命名为 `mdns_recon`,我们稍后将在下面介绍。
## 信息泄露
mDNS 查询的回复差异很大,在某些情况下,它们几乎不会泄露任何可用信息,
在其他情况下,它们可能会泄露敏感细节,例如网络信息、管理信息和
设备信息,如制造商、型号、序列号等。以下是在
野外发现的一些泄露上述某些示例的设备示例。为了便于阅读和节省空间,我清理了回复内容。
### 主机名和 MAC
```
inventory [00:18:51:2a:a2:0d]
administrator-X8DT6 [00:25:90:38:6c:c4]
ispadmin [00:0c:29:5d:08:2f]
vpsadmin [00:16:3e:d1:61:50]
```
### 网络详情
```
0 0 548 KenNas.local.
fe80::211:32ff:fe13:7de7
192.168.1.110
```
### NAS 泄露详情,Password=false
```
DiskStation(WebDAV)
vendor=Synology model=DS114 serial=[REMOVED]
version_major=5 version_minor=1 version_build=5021
admin_port=5000 secure_admin_port=5001
mac_address=00:11:32:2A:97:9D
model=Xserve
txtvers=1 Database ID= Machine ID= Machine Name=DiskStation
mtd-version=0.2.4.1
iTSh Version=131073
Version=196610
Password=false
```
### 打印机
```
Phaser 8560DN (00:00:aa:d4:b8:2b)
test-178307
adminurl=http://test-178307.local.
qtotal=1 priority=80 txtvers=1
product=(Phaser 8560DN) ty=Xerox Phaser 8560DN
Bind=F Copies=T Sort=F Binary=T Transparent=T TBCP=F Staple=F Color=T Duplex=T Collate=T PaperCustom=T
```
## DDoS 反射和放大
由于 mDNS 使用 UDP,所有回复的主机都可能被恶意
行为者在 DDoS 攻击活动中用作反射器。由于回复
往往大于初始查询,因此也存在放大的潜力。攻击者可以预期至少 1:1 的反射,
在我的一些测试中,某些服务的放大率高达 975%。真实的放大率很
难预测,因为回复因服务器配置和
查询数据包本身的大小而差异很大,后者根据查询的服务而变化,但一个安全的估计是
平均放大率约为 130%+。
# 缓解措施
## 作为反射器
阻止发往端口 5353 的 UDP 流量。
## 作为目标
阻止源端口为 5353 的 UDP 流量。
# mdns_recon.py
`mdns_recon.py` 是一个快速而简陋的 Scapy 脚本,在我的测试中用于识别
在野外会回复指向它们的单播查询的 mDNS 客户端。因为它的目标是快速测试
并记录这些回复及其各自的长度以用于研究目的,所以这实际上就是它所做的一切。
如果您想添加功能,或者您发现了一个错误等等,请 fork 代码,如果有
必要,我们将很乐意接受 Pull Request。
如果您想要能取悦您人类大脑的漂亮回复,我建议您使用 `dig`,但如果您
正在进行大规模自动化扫描,`mdns_recon` 可以与多线程中间层一起使用。
## 扫描目标
```
# ./mdns_recon.py [target]
```
### 示例输出
```
TARGET_IP - START
[_services._dns-sd._udp.local]===
E ¬´√¨√
√®¬
¬®¬
√©5¬
Kn¬
_services_dns-sd_udplocal
_pdl-datastream_tcp√
_printer√
_ipp√
_http√
[_services._dns-sd._udp.local]===
[_pdl-datastream._tcp.local.]===
E ¬ø√¨√
√≠√
¬®¬
√©5¬´√
_pdl-datastream_tcplocal
RICOH IPSiO SP C810√
RNPBC3B0A√
txtvers=1qtotal=1pdl=application/postscript!product=(RICOH IPSiO SP C810 PS3)ty=RICOH IPSiO SP C810note=PaperMax=legal-A4priority=10 adminurl=http://RNPBC3B0A.local/Bind=FColor=T
Collate=FCopies=TDuplex=F
PaperCustom=FSort=FStaple=FPunch=FBinary=T
Transparent=FTBCP=T√
[_pdl-datastream._tcp.local.]===
[_printer._tcp.local.]===
E √
√¨√
√≠√
¬®¬
√©5¬¥¬
¬ø¬
_printer_tcplocal
RICOH IPSiO SP C810√
RNPBC3B0A√
txtvers=1qtotal=1rp=filetype_RPSpdl=application/postscript!product=(RICOH IPSiO SP C810 PS3)ty=RICOH IPSiO SP C810note=PaperMax=legal-A4priority=20 adminurl=http://RNPBC3B0A.local/Bind=FColor=T
Collate=FCopies=TDuplex=F
PaperCustom=FSort=FStaple=FPunch=FBinary=T
Transparent=FTBCP=T√
[_printer._tcp.local.]===
[_ipp._tcp.local.]===
E ¬ø√¨√
√≠√
¬®¬
√©5¬´¬
√§¬
_ipp_tcplocal
RICOH IPSiO SP C810√
RNPBC3B0A√
txtvers=1qtotal=1
rp=printerpdl=application/postscript!product=(RICOH IPSiO SP C810 PS3)ty=RICOH IPSiO SP C810note=PaperMax=legal-A4priority=30 adminurl=http://RNPBC3B0A.local/Bind=FColor=T
Collate=FCopies=TDuplex=F
PaperCustom=FSort=FStaple=FPunch=FBinary=T
Transparent=FTBCP=T√
[_ipp._tcp.local.]===
[_http._tcp.local.]===
None
[_http._tcp.local.]===
{'_printer._tcp.local.': 456, '_services._dns-sd._udp.local': 171, '_pdl-datastream._tcp.local.': 447, '_ipp._tcp.local.': 447}
TARGET_IP - END
```
### 扫描范围
```
# for oct in {1..254}; do echo "192.32.68.$oct"; done | xargs -I{} ./mdns_recon.py {}
192.32.68.4 - START
[_services._dns-sd._udp.local]===
E fN¬
√±¬
r D√
¬®¬
EJ1P√
¬®¬
r D5é6:ø
_services_dns-sd_udplocal
[_services._dns-sd._udp.local]===
{'_services._dns-sd._udp.local': 102}
192.32.68.4 - END
192.32.68.6 - START
[_services._dns-sd._udp.local]===
E fH¬®3√
zr D√
¬®¬
EJ1N√
¬®¬
r D5é6:ö
_services_dns-sd_udplocal
[_services._dns-sd._udp.local]===
{'_services._dns-sd._udp.local': 102}
192.32.68.6 - END
192.32.68.8 - START
[_services._dns-sd._udp.local]===
E fe3¬™r D√
¬®¬
EJ1L√
¬®¬
r D5é6:ô
_services_dns-sd_udplocal
[_services._dns-sd._udp.local]===
{'_services._dns-sd._udp.local': 102}
192.32.68.8 - END
192.32.68.10 - START
[_services._dns-sd._udp.local]===
E fa/3­ïr D
¬®¬
EJ1J√
¬®¬
r D
5é6:ò
_services_dns-sd_udplocal
[_services._dns-sd._udp.local]===
{'_services._dns-sd._udp.local': 102}
192.32.68.10 - END
```
### 扫描范围到文件
```
# for oct in {1..254}; do echo "192.32.68.$oct"; done | xargs -I{} ./mdns_recon.py {} >> mdns_replies.txt
```
标签:Bonjour, CERT, DDoS放大攻击, DNS服务发现, mDNS, NAS安全, Unicast, 信息泄露, 反射攻击, 实时处理, 密码管理, 嵌入式设备安全, 广域网接口, 打印机安全, 插件系统, 物联网安全, 虚拟机镜像, 逆向工具, 错误配置