魅力程序猿

  • 首页
  • Java
  • Android
  • APP
    • 扑克计分器
    • Video Wallpaper
  • 联系我
  • 关于我
  • 资助
道子
向阳而生
  1. 首页
  2. AI技术
  3. 正文

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

2026年3月30日 10点热度 0人点赞 0条评论

📰 来源: 博客园


  • 想在本地内网解析自定义域名,却要折腾路由器 hosts?
  • 想拦截广告,却找不到轻量的嵌入式 DNS 方案?
  • 想学习 DNS 协议,却被复杂的 C 语言实现劝退?
  • 今天给大家分享一个开发者写的microdns库:仅能创建 WiFi 热点、监听标准 53 端口,还支持通配符解析,甚至带了 Web 管理界面!关键是,全靠 MicroPython,新手也能看懂跑通。

    这个 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

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

  • main_with_web.py(带 Web 界面的完整版本)
  • microdns.py(DNS 核心模块)
  • web_server.py(Web 界面)
  • dns_list.py(域名配置文件)
  • 具体使用细节查看 :https://upypi.net/zh/pkgs/microdns
    image.png

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

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

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

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

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

    4b800e908b96cde0619b1429582b3dbc.png

  • 浏览器输入 baidu.com,观察页面跳转。
    410395950a90aac85e07c997b8e7ade9.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.com 和 www.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'}
    

    从终端日志可以看到,Windows 发起的 NCSI 验证请求被


    🔗 原文链接: 点击阅读原文

    标签: AI 人工智能 技术博客
    最后更新:2026年3月30日

    daozi

    这个人很懒,什么都没留下

    点赞
    < 上一篇

    文章评论

    razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    取消回复
    搜索
    联系方式

    QQ群:179730949
    QQ群:114559024
    欢迎您加入Android大家庭
    本人QQ:136049925

    赐我一丝安慰
    给我一点鼓励

    COPYRIGHT © 2023 魅力程序猿. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang

    豫ICP备15000477号