当前位置: 首页 > news >正文

ESP32居然能当 DNS 服务器用?内含NCSI欺骗和DNS劫持实现

你有没有过这些烦恼?

  • 想在本地内网解析自定义域名,却要折腾路由器 hosts?
  • 想拦截广告,却找不到轻量的嵌入式 DNS 方案?
  • 想学习 DNS 协议,却被复杂的 C 语言实现劝退?

今天给大家分享一个开发者写的microdns库:仅能创建 WiFi 热点、监听标准 53 端口,还支持通配符解析,甚至带了 Web 管理界面!关键是,全靠 MicroPython,新手也能看懂跑通。

image.png

项目介绍

这个 0.0.1 版本的小项目,核心功能已经拉满:

  • ✅ ​AP 模式热点​:一键创建名为 ESP32_DNS_Server 的 WiFi 网络,密码 12345678,设备直连就能用
  • ✅ ​标准 DNS 服务​:监听 UDP 53 端口,完美兼容 A 记录(IPv4)查询,符合 DNS 协议规范
  • ✅ ​通配符解析​:支持 *.local 这类通配符,一键解析所有子域名
  • ✅ ​Web 管理界面​:浏览器访问就能看服务器状态,不用敲命令
  • ✅ ​轻量纯 Python​:核心代码仅 300 行,无复杂依赖,ESP32 内存毫无压力
  • ✅ ​MIT 开源协议​:随便改、随便用,商用也没问题

快速使用

这里,已经把所有文件都整理好了,跟着步骤走,新手也能一次成功,需要准备:

  • 一块 ESP32 开发板(随便哪家的都行,我用的是 ESP32-S3)
  • 已经刷好 MicroPython 固件(不会刷的看我之前的教程)
  • 安装 mpremote 工具(用来传文件到 ESP32)

首先用 mpremote 安装 microdns 包(也可以直接传文件),库的地址就在upypi上:https://upypi.net/
搜索:microdns

image.png

点击详情页 ,进入 复制 下载 指令即可:
image.png

然后把这些文件传到 ESP32 根目录:

  • main_with_web.py(带 Web 界面的完整版本)
  • microdns.py(DNS 核心模块)
  • web_server.py(Web 界面)
  • dns_list.py(域名配置文件)

具体使用细节查看 :https://upypi.net/zh/pkgs/microdns
image.png

image.png

进阶测试:DNS 劫持与 NCSI 欺骗

测试目标

在基础 DNS 解析功能之上,我们完成两个进阶实验:

  • DNS 劫持​:将公共 WiFi 下访问的 baidu.com 等域名,强制解析到 ESP32 的自定义宣传页面,模拟 “公共 WiFi 钓鱼” 场景。
  • NCSI 欺骗​:拦截 Windows 系统的网络验证请求,让设备连接 ESP32 热点后,显示「已连接,安全」而非「无 Internet 连接」,提升伪装真实性。

测试 1:DNS 劫持演示 —— 访问百度却跳转到宣传页

  • 设备连接 ESP32 热点 ESP32_DNS_Server,DNS 地址设置为 192.168.4.1

  • 浏览器输入 baidu.com,观察页面跳转。
    410395950a90aac85e07c997b8e7ade9.png

    4b800e908b96cde0619b1429582b3dbc.png

浏览器地址栏仍显示baidu.com,但页面被劫持到 ESP32 的信息安全宣传界面,同时浏览器顶部出现「不安全」提示(符合 HTTP 未加密特征)。
ESP32 的 DNS 服务器将 baidu.com 解析到自身 IP 192.168.4.1,同时 Web 服务器监听 80 端口,返回自定义 HTML 页面 —— 这就是典型的公共 WiFi DNS 劫持场景,也是我们用来科普网络安全的教育演示。

测试 2:NCSI 欺骗实现 —— 骗过 Windows 网络验证

Windows 系统会通过访问 dns.msftncsi.comwww.msftconnecttest.com/connecttest.txt 来判断网络是否连通,我们需要让 ESP32 “配合” 这个验证流程。
dns_list.py中添加 NCSI 相关域名解析:

DNS_LIST = { # ... 其他域名 'dns.msftncsi.com': '192.168.4.1', 'www.msftconnecttest.com': '192.168.4.1', 
}

web_server.py 中添加对 /connecttest.txt 的响应:

@app.route('/connecttest.txt') 
def connecttest(): return 'Microsoft Connect Test', 200, {'Content-Type': 'text/plain'}

bc6fc8a4b38f38e542bfd97c4952e646.png

从终端日志可以看到,Windows 发起的 NCSI 验证请求被 ESP32 成功拦截并响应:

[dns]收到 DNS 查询: dns.msftncsi.com (类型: 1)[dns]解析 dns.msftncsi.com -> 192.168.4.1 [dns]收到 DNS 查询: www.msftconnecttest.com (类型: 1)[dns]解析 www.msftconnecttest.com -> 192.168.4.1 
[web]Generated response: [('Content-Type', 'text/plain')]

还能怎么玩?

这个项目现在只是个雏形,还有很多可以折腾的方向:

  • 🚀 ​DNS 转发​:把没匹配到的域名转发到 8.8.8.8,实现 “本地解析 + 外网解析” 混合模式
  • 📦 ​缓存机制​:给 DNS 查询加缓存,减少重复解析,提升速度
  • 🛡️ ​广告拦截​:把广告域名解析到 0.0.0.0,实现无广告上网
  • 📝 ​更多记录类型​:支持 AAAA(IPv6)、CNAME 等记录,更贴近真实 DNS
  • 🎨 ​美化 Web 界面​:把 Web 界面改成更现代的样式,加统计图表

d5e59784725650fc897d8317ffe330f4.png

36899fedf4a2fad18e969c8b792e9103.png

http://www.jsqmd.com/news/557023/

相关文章:

  • 别再瞎找了!高效论文写作全流程AI论文网站推荐(2026 最新)
  • 保姆级教程:用Fine-Pruning防御深度学习后门攻击(附PyTorch代码)
  • BGE-Large-Zh详细步骤:自定义Passages导入、分段处理与去重策略
  • C++的std--ranges操作一致性
  • Windows更新后Fork与SourceTree安装失败的深层排查与修复
  • 从论文到代码:手把手复现OpenPose手部检测(CMU开源模型),并教你用MediaPipe做个对比测试
  • 4大技术突破:Midscene.js的AI驱动跨平台自动化革命
  • python vue基于hadoop的高校图书馆借阅阅读书目智慧推荐系统
  • 如何为Windows任务栏添加现代圆角设计:RoundedTB完全配置指南
  • drissionrecord - ldx
  • Matlab/Simulink 半车主动悬架建模:ADRC 与 PID 的较量
  • MySQL高可用管理终极指南:Orchestrator快速上手教程
  • 4步精通Logisim-evolution:面向数字工程师的开源电路设计工具指南
  • 革新本地AI处理:FunClip智能剪辑工具突破视频创作效率瓶颈
  • 51单片机学习日志12
  • Phi-3-mini-128k-instruct部署教程:WSL2环境下vLLM+Chainlit轻量开发环境搭建
  • 告别阿里云!用ThingsCloud免费搭建个人智能家居控制中心(附ESP8266配置)
  • 如何快速识别B站评论区用户背景?B站成分检测器让社区互动更高效
  • 揭秘低查重的AI教材生成之道,用AI教材写作工具开启高效创作!
  • RAG实现思路流程
  • 手把手教你用XSS平台复现BUU靶场第一课(附可用的免费平台推荐)
  • 2026年全国护肤代工行业十大排行:祛痘去闭口产品OEM加工/敏感肌修护产品OEM加工企业深度解析,以科技护肤为引领布局广东佛山等地区 - 十大品牌榜
  • MVCC 与事务隔离:MySQL 如何实现“读不阻塞写”?
  • YimMenu全面使用指南:从功能探索到安全应用的完整路径
  • 当因果图遇到混淆变量:手把手教你用PAG(部分祖先图)解读真实世界数据
  • Druid连接池minIdle和maxActive参数详解:如何避免连接池耗尽问题
  • 基于PLC的间歇反应釜智能温控系统设计与实践【附仿真代码】
  • 创新二维码生成利器:theqrmodule模块实战指南
  • ARKit数字人开发指南:如何用苹果52个BlendShape权重实现自然表情动画
  • 在C++中,什么是类的友元函数,如何使用?