一步一步测试DNS隧道

news2024/11/15 12:39:45

目录

0、前言       

1、DNS解析

1.1 DNS简介

1.2 DNS查询类型

1.3 DNS解析过程

2、DNS隧道准备工作

2.1 DNS隧道介绍

2.1.1 什么是DNS隧道?

2.1.2 DNS隧道的原理

2.2 客户端、服务端准备       

2.3 域名准备

2.4 连接隧道

2.5 遇坑

 3、隧道确认和利用

       3.1 隧道验证

        3.2 隧道利用

4、总结 

       4.1 公布答案       

       4.2 直连模式测试

        4.3 其他使用场景

        4.3.1 外->内

        4.3.2 内->外

0、前言       

        我在之前发过的帖子力记录过关于方向代理、多重代理的内容,今天测试一下隧道。反向代理用在那些没有映射但可以出网的环境。隧道则是用在出网受限的环境,比如内部的终端、服务器仅允许ICMP、DNS流量通过的情况下。首先从复杂一点的DNS隧道开始测试,因为ICMP、SSL隧道过程节点都可控,DNS隧道要经过第三方的DNS服务器,所以想把这个弄清楚。

        之前学习MCSE认证的时候对DNS搞得比较清除,现在好多细节都忘掉了先开始回顾一下DNS的解析过程。

1、DNS解析

1.1 DNS简介

        DNS解析是将域名转换为IP地址的过程,使得用户可以通过域名访问网站或服务,而不是直接使用数字IP地址。这一过程涉及到一个分布式的数据库系统,全球有多个服务器协作完成这一转换。以下是关于DNS解析的一些关键点:

        定义与功能:DNS是一个分布式数据库,它将人类可读的域名映射到数字IP地址,使得用户可以通过输入容易记忆的域名来访问互联网上的资源。

        工作原理:当用户尝试访问一个网站时,他们的设备首先向本地的DNS服务器发送请求。如果本地DNS服务器无法直接解答,它会向其他服务器查询,最终找到正确的IP地址并返回给用户。        

1.2 DNS查询类型

        DNS递归查询和迭代查询过程是域名解析的两种主要方式,它们在查询过程中扮演的角色和方式有所不同。

        DNS递归查询过程:

        客户端(如浏览器)发起一个DNS查询请求,通常是通过ISP提供的递归DNS服务器进行的。
        递归DNS服务器接收请求后,会代替客户端进行后续的所有查询工作,直到找到正确的IP地址并返回给客户端。
        递归DNS服务器可能会查询根DNS服务器、顶级域名服务器(TLD)、以及权威DNS服务器,以逐级解析域名到最终的IP地址。
        如果递归DNS服务器在其缓存中找到匹配的记录,则会直接返回结果给客户端,否则会进行一系列的查询直到找到答案。


        DNS迭代查询过程:

        客户端向本地DNS服务器发起查询请求。
        本地DNS服务器不直接提供答案,而是告诉客户端下一个应该查询的DNS服务器的地址。
        客户端然后向这个新的DNS服务器发送查询请求,这个过程可能会重复多次,直到找到答案或者确定没有匹配的记录。
        迭代查询过程中,客户端和DNS服务器之间的角色不变,客户端负责发起请求并跟踪下一个查询的DNS服务器地址。

        总结一下:客户端发起的请求默认是递归查询,DNS服务器之间默认是迭代查询。也就是说我们向DNS提出请求后,会给到最后结果,不会再去反复查询。而域名服务器之间会反复多次查询。

        下面做个测试:

        1.递归查询:

        使用nslookup命令查询某域名:nslookup so.com

        使用Wireshark抓包,并过滤展示:        

        基本上一个请求一个应答,就会得到解析结果,更多的交互内容由DNS服务器完成。其他的反向查询和ipv6查询先忽略。

        2.迭代查询:

        使用Linux的dig命令加trace参数可以设置迭代查询:

         通过抓包也可以看到反复查询的过程,感兴趣自己测试一下,可以看到世界上的13个根域名服务的ip地址。可以看到逐个会向顶级域名服务器、二级域名服务器、NS服务器请求解析的过程。

1.3 DNS解析过程

        当我们访问一个网站时,域名解析的过程是这样的:Client(客户端)–> hosts文件 –> DNS Service Local Cache(自己的本地缓存) –> DNS Server(recursion递归)  –> Server Cache(缓存) –> iteration(迭代) –>根 –> 顶级域名DNS –> 二级域名DNS… 

        在这里提一个小问题,也是前几天碰到的。我在客户现场做技术支持,发现某些域名解析不到,现场运维就看我的网卡IP配置,说没有配备用域名解析服务器。 因为主要的DNS是客户自建的,备用的是用外网公用的如114.114.114.114。我说肯定不是这个原因。因为我知道主备的工作机制。

       现在有个小问题,就是我们配置本机的主、备DNS服务器的工作机制是什么?也就是说什么情况下备用DNS才会使用?

       这个问题答案在最后。

2、DNS隧道准备工作

2.1 DNS隧道介绍

2.1.1 什么是DNS隧道?

        DNS隧道(DNS Tunneling)是将其他协议的内容封装在DNS协议中,然后以DNS请求和响应包完成传输数据(通信)的技术。当前网络世界中的DNS是一项必不可少的服务,所以防火墙和入侵检测设备处于可用性和用户友好的考虑大都不会过滤DNS流量,也为DNS成为隐蔽信道创造了条件,因此,DNS隧道在僵尸网络和APT攻击中扮演着重要的角色。

2.1.2 DNS隧道的原理

        在进行DNS查询时,如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果。如果在互联网上有一台定制的服务器,那么依靠DNS协议即可进行数据包的交换。从DNS协议的角度看,这样的操作只是在一次次查询某个特定的域名并得到解析结果,但其本质问题是,预期的返回结果应该是一个IP地址,而事实上不是——返回的可以是任意字符串,包括加密的C&C指令。

2.1.3 DNS隧道分为类

        直连模式:客户端直接向指定IP地址的DNS服务器发起DNS解析请求

        中继模式:DNS经过互联网的迭代解析,指向指定的DNS服务器。

2.2 客户端、服务端准备       

        客户端使用kali,好像默认带iodine。

        服务端我用的华为云服务器,操作系统是华为欧拉。

        下载安装包:

kryo.se: iodine (IP-over-DNS, IPv4 over DNS tunnel)iodine is a free (ISC licensed) tunnel application to forward IPv4 traffic through DNS servers (IP over DNS). Works on Linux, FreeBSD, NetBSD, OpenBSD and Mac OS X.icon-default.png?t=N7T8https://code.kryo.se/iodine/

        make 报错时候报错:

安装依赖包:
yum list | grep "zlib"

yum -y install zlib zlib-devel

        make

        make install 

        这时候服务端就有了iodine这个命令。

        注意VPS安全组需要开启UDP 53端口。

2.3 域名准备

        申请一个域名,我看网上有个免费的平台,但是我申请的时候好像暂停服务了。

Freenom - 人人都熟悉的名字icon-default.png?t=N7T8https://www.freenom.com/zh/index.html     所以用我以前申请的8元一年的online域名。在域名服务器上添加A记录和ns记录。

2.4 连接隧道

        为了贴合真实环境,我使用中继的方式进行配置和测试。

        服务端运行命令:

        在公网服务器上部署iodine服务端。(需要root权限运行)

iodined -f -c -P 123.com 192.168.200.1 ns.luotuo.online -DD

\-f:在前台运行

\-c:禁止检查所有传入请求的客户端IP地址。

\-P:客户端和服务端之间用于验证身份的密码。

\-D:指定调试级别,-DD指第二级。“D”的数量随级别增加。

这里的192.168.200.1为自定义局域网虚拟IP地址,建议不要与现有网段冲突
注意!填写的地址为NS记录

这时候查看端口开放状态,发现UDP 53端口已经被iodined进程打开。

客户端我使用的kali,kali自带iodine工具。

iodine -f -P 123.com ns.luotuo.online -M 200

-r:iodine有时会自动将DNS隧道切换为UDP隧道,该参数的作用是强制在任何情况下使用DNS隧道
-M:指定上行主机的大小。
-m:调节最大下行分片的大小。
-f:在前台运行
-T:指定DNS请求类型TYPE,可选项有NULL、PRIVATE、TXT、SRV、CNAME、MX、A。
-O:指定数据编码规范。
-P:客户端和服务端之间用于验证身份的密码。
-L:指定是否开启懒惰模式,默认开启。
-I:指定两个请求之间的时间间隔。

2.5 遇坑

        在以上准备工作完毕后,始终连接不通。

        好像提示找不到域名,明明配置没有问题。

        后来查看官方文档,发现以重要的“点”。       

        加上“.”以后马上联通。

 3、隧道确认和利用

       3.1 隧道验证

        首先在服务端和客户端查看IP地址。

        服务端:

        客户端:

        这时候可以使用ssh登录客户端。

        客户端登录服务端:

         服务端登录客户端:

        抓包会发现很多dns解析流量。

        而且请求和响应内容也很多。

        3.2 隧道利用

        隧道利用的话可以使用frp。

        服务端:

        客户端:

        客户端上没有frp,通过scp命令拷贝frp。

        可以看到是龟速,10Kb/s。

        使用客户端测试一下端口。

        这个使用ssh客户端没有连接成功,连接失败,不知道什么原因。socks5没有测试。回头测试一下。

4、总结 

       4.1 公布答案       

 答案:主备DNS的工作机制是主DNS的失效、宕机了才会用备DNS的,而不是主DNS解析不到会去备DNS上面找。

       4.2 直连模式测试

       以上测试过程使用的是中继方式,后来我又测试了一下直连模式。只需要把客户端的dns服务器设置成为服务端IP即可,这样容易暴露自己的VPS,同时速度也没有快多少。        

        4.3 其他使用场景

        4.3.1 外->内

        iodine和dnscat2使用环境:目标是内网,并且只有dns出网的情况下,通过自己的公网服务器搭建到目标的dns隧道,从而通过公网服务器代理进入目标内网,遨游目标内网。

      4.3.2 内->外

        dns2tcp使用的环境是:自己在一个内网里面,自己所处的环境不出网,但是dns可以出网,就可以用过dns2tcp搭建一个dns隧道,从而可以访问到互联网环境。

        典型环境:在学校连接到wifi之后,必须要认证登陆,不然不能上网,但是浏览器又能加载出登陆界面,此情况就是dns出网,可以通过dns2tcp搭建dns隧道绕过认证登陆。

 =================================================================

        参考资料:https://blog.csdn.net/FreeBuf_/article/details/128149766文章浏览阅读3.2k次,点赞4次,收藏14次。此篇文章为了读者看起来更加清楚,公网服务器与域名都是未打码的,希望各位大佬手下留情。_dns隧道https://blog.csdn.net/FreeBuf_/article/details/128149766


GitHub - yarrick/iodine: Official git repo for iodine dns tunnelOfficial git repo for iodine dns tunnel. Contribute to yarrick/iodine development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/yarrick/iodine

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1946966.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编码行缩进

GitHub 曾经对 400,000 个 GitHub 存储库、10 亿个文件、14 TB 的代码的统计,发现大部分语言还是使用空格的多,除了 Go 语言: 空格的优缺点 优点: 一致性:空格可以确保代码在不同的编辑器和查看工具中看起来是一致的…

Python自动化测试之Selenium各浏览器驱动下载网址

在自动化测试领域,Selenium无疑是一个不可或缺的工具。它允许开发者编写脚本来模拟用户在浏览器中的操作,从而进行自动化测试。然而,为了使用Selenium控制不同的浏览器,我们需要安装相应的浏览器驱动(WebDriver&#x…

Istio_01_Istio初识

文章目录 IstioService Mesh Istio Istio: 以服务网格形态用于服务治理的开放平台和基础设施 本质: 以非侵入式治理服务之间的访问和调用服务治理: 流量管理、可观测性、安全性可同时管理多类基础设施(多种网络方案) 如: Istio和Kubernetes架构的结合 Istio通过Kubernetes的域…

SpringBoot 2.x 配置ssl - 自签证书/信用库

文章目录 前言SpringBoot 2.x 配置ssl - 自签证书/信用库1. yml 配置2. 当服务器为客户端发送https请求时改造 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气…

通过 WSL 2 在Windows 上挂载 Linux 磁盘

原文查看 曾为了传输或者共享不同系统的文件频繁地在 Windows 和 Linux 系统之间切换,效率过低,所以尝试通过 WSL 2 在Windows 上挂载 Linux 磁盘。 先决条件 需要在Windows 10 2004 及更高版本(Build 19041 及更高版本)或 Win…

Docker简单快速入门

1. 安装Docker 基于 Ubuntu 24.04 LTS 安装Docker 。 # 更新包索引并安装依赖包 sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common# 添加Docker的官方GPG密钥并存储在正确的位置 curl -fsSL https://mirror…

记一次Mycat分库分表实践

一、分库分表 在系统的研发过程中,随着数据量的不断增长,单库单表已无法满足数据的存储需求,此时就需要对数据库进行分库分表操作。 分库分表是随着业务的不断发展,单库单表无法承载整体的数据存储时,采取的一种将整体数据分散存储到不同服务器上的不同数据库中的不同数…

【C++BFS算法】2192. 有向无环图中一个节点的所有祖先

本文涉及知识点 CBFS算法 LeetCode2192. 有向无环图中一个节点的所有祖先 给你一个正整数 n ,它表示一个 有向无环图 中节点的数目,节点编号为 0 到 n - 1 (包括两者)。 给你一个二维整数数组 edges ,其中 edges[i]…

vue3前端开发-小兔鲜项目-产品详情基础数据渲染

vue3前端开发-小兔鲜项目-产品详情基础数据渲染!这一次内容比较多,我们分开写。第一步先完成详情页面的基础数据的渲染。然后再去做一下右侧的热门产品的列表内容。 第一步,还是老规矩,先准备好接口函数。方便我们的页面组件拿到对…

Vue Router基础

Router 的作用是在单页应用(SPA)中将浏览器的URL和用户看到的内容绑定起来。当用户在浏览不同页面时,URL会随之更新,但页面不需要从服务器重新加载。 1 Router 基础 RouterView RouterView 用于渲染当前URL路径对应的路由组件。…

【Linux】-----工具篇(yum介绍)

目录 Ⅰ、是什么? Ⅱ、Linux下安装软件的三种方式 ①源代码安装 ②rpm包安装 ③yum安装 Ⅲ、yum相关操作 1.查看软件包 2.安装软件 3.卸载软件 Ⅳ、yum本地配置 Ⅰ、是什么? yum是包管理器,也就像一个软件下载安装管理的客户端&…

vsftpd搭建FTP服务器 - 虚拟用户

命令记录 $ sudo apt install vsftpd db-util $ sudo nano /etc/vsftpd.conf $ sudo nano /etc/vsftpd/vsftpd-virtual-users.txt $ sudo db_load -T -t hash -f /etc/vsftpd/vsftpd-virtual-users.txt /etc/vsftpd/vsftpd-virtual-users.db ls /etc/vsftpd/vsftpd-virtual-us…

【PHP】系统的登录和注册

一、为什么要学习系统的登录和注册 系统的登录和注册可能存在多种漏洞,这些漏洞可能被恶意攻击者利用,从而对用户的安全和隐私构成威胁。通过学习系统的登录和注册理解整个登录和注册的逻辑方便后续更好站在开发的角度思考问题发现漏洞。以下是一些常见…

基于STM32瑞士军刀--【FreeRTOS开发】学习笔记(一)|| RISC / 底层代码执行步骤 / 汇编指令

本篇文章基于韦东山老师讲课笔记和自己理解编写。 RISC ARM芯片属于精简指令集计算机(RISC:Reduced Instruction Set Computing),它所用的指令比较简单,有如下特点: ① 对内存只有读、写指令 ② 对于数据的运算是在CPU内部实现 …

Cyberchef基础概念之-分叉合并-fork/merge

本文将介绍如何利用cyberchef中的fork和merge操作,通过对数据进行分叉和合并对数据进行分类处理。为读者提供数据处理多种思路,使得读者能够在日常的工作中灵活的应对数据中的不同部分,还原被编码数据的原貌。 fork和merge操作是Cyberchef非…

【odoo17】后端py方法触发右上角提示组件

概要 在前面文章中,有介绍过前端触发的通知服务。 【odoo】右上角的提示(通知服务) 此文章则介绍后端触发方法。 内容 直接上代码:但是前提一定是按钮触发!!!!! def bu…

OZON宠物产品推荐,OZON那些宠物产品卖得好

俄罗斯人在为他们的“毛孩子”(通常指宠物,特别是狗和猫)选择玩具时,同样展现出对多种类型和风格的偏好。结合当前的市场趋势和Ozon等电商平台的热销数据,以下是几款俄罗斯人最喜欢的宠物玩具及其特点: OZ…

C++ 代码实现局域网即时通信功能 (windows 系统 客户端)

本项目使用C实现具备多个客户端和服务器端即时通信聊天功能软件 一:项目内容 使用C实现一个具备多客户端和一个服务器端即时通信功能的聊天软件。 本项目的目的是 学习在windows平台下,进行C网络开发的基本概念:TCP/IP socket通信&#xff0…

西蒙学习法

西蒙学习法 一根筋,挖死坑;会思考,持续不断的思考;会问问题,有深度的问题;一直想一个问题的解决办法; 资料 《世界十大学习方法》之西蒙学习法

数据结构(5.3_3)——由遍历序列构造二叉树

若只给出一棵二叉树的前/中/后/层 序遍历序列中的一种,不能唯一确定一棵二叉树 构造二叉树 前序 中序遍历序列 例: 前序遍历序列:DAEFBCHGI 中序遍历序列:DAEFBCHGI 后序中序遍历序列 层序中序遍历 总结: