0x00 DNS介绍
DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
DNS的记录类型有很多,大家常见的有A,AAAA,CNAME,MX,SOA,NS等。DNS Tunneling可以利用其中的一些记录类型来传输数据。例如A,MX,CNAME,TXT,NULL等。
A记录:A记录是用来指定主机名对应的ip地址记录,简单的说A记录是指定域名对应的IP地址。
AAAA记录:记录将域名解析到一个指定的ipv6的ip上
CNAME记录,别名解析。可以将注册不同的域名解析到一个ip地址。
NS记录:域名服务器记录,用来指定该域名是由哪个DNS服务器进行解析。
MX记录:指向的是一个邮件服务器。
TXT记录:一般是指某个主机名或域名的说明
PTR记录:反向DNS
在创建正向查找区域:
大家也可以自己了解下,在其他新纪录中有详细的介绍
DNS的解析过程可以分为两种类型:迭代查询和递归查询。通常本机到Local DNS Server的过程属于递归查询,而Local DNS Server对查询域名的解析过程属于迭代查询。为了减轻Local DNS Server的压力,提高解析速度,引入了缓存机制。缓存和TTL紧密相连,当TTL过期,Local DNS Server则会丢弃缓存的数据,重新从权威域名服务器上获取新的数据。
本地客户端---->Local DNS server---->根域服务器
Dns解析过程:系统发出dns解析之前会先看看本地是否保存了相关域名的解析,系统检测到hosts文件中没有响应的域名解析的时候会发送给本地dns解析服务器进行解析,解析之前会看看缓存中是否存在,如果没有,再将解析请求发给下一个dns服务器。结果返回后将该域名的解析结果保存到缓存中。
0x01 dnscat2
Dnscat2是一个DNS隧道工具,通过DNS协议创建加密的命令和控制通道。
1、Linnux客户端使用
$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/client/
$ make
2、Linux服务端使用
$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/server/
$ gem install bundler
$ bundle install
安装服务端的时候有个小坑,需要安装ruby。sudo apt-get install ruby-dev。遇到以下问题的时候,等一会就会自动安装。
Windows使用请阅读官方说明https://github.com/iagox86/dnscat2。
3、环境说明:
kaliLinux(攻击机) 10.0.1.139
Windows server2008 r2(目标机) 10.0.1.182
服务端运行
客户端运行,可以看到session established!说明已经创建一个会话。
服务端的显示
会话建立。
首先DNS协议是在应用层,下层是传输层采用upd协议。在下层网络层是ip协议,然后是数据链路层的以太网帧。
可以看到dns的请求数据包是 flag(标志)+queries(查询)
一下是flag的字节详解:
QR 1个比特位用来区分是请求(0)还是应答(1)。
OPCODE 4个比特位用来设置查询的种类,应答的时候会带相同值,可用的值如下:
0 标准查询 (QUERY)
1 反向查询 (IQUERY)
2 服务器状态查询 (STATUS)
3-15 保留值,暂时未使用
AA 授权应答(Authoritative Answer) - 这个比特位在应答的时候才有意义,指出给出应答的服务器是查询域名的授权解析服务器。
注意因为别名的存在,应答可能存在多个主域名,这个AA位对应请求名,或者应答中的第一个主域名。
TC 截断(TrunCation) - 用来指出报文比允许的长度还要长,导致被截断。
RD 期望递归(Recursion Desired) - 这个比特位被请求设置,应答的时候使用的相同的值返回。如果设置了RD,就建议域名服务器进行递归解析,递归查询的支持是可选的。
RA 支持递归(Recursion Available) - 这个比特位在应答中设置或取消,用来代表服务器是否支持递归查询。
Z 保留值,暂时未使用。在所有的请求和应答报文中必须置为0。
RCODE 应答码(Response code) - 这4个比特位在应答报文中设置,代表的含义如下:
0 没有错误。
1 报文格式错误(Format error) - 服务器不能理解请求的报文。
2 服务器失败(Server failure) - 因为服务器的原因导致没办法处理这个请求。
3 名字错误(Name Error) - 只有对授权域名解析服务器有意义,指出解析的域名不存在。
4 没有实现(Not Implemented) - 域名服务器不支持查询类型。
拒绝(Refused) - 服务器由于设置的策略拒绝给出应答。比如,服务器不希望对某些请求者给出应答,或者服务器不希望进行某些操作(比如区域传送zone transfer)。
我们来看看响应的内容,在响应中flags+queries+answers的格式,显然比第一个请求包多了一个answeres。
Shell可以获取一个cmdshell。
我试试exec命令执行,然后会创建一个session,好像只能执行system32下的EXE,比如弹出一个计算器。
上传文件试试了,只能读到文件,而且我们等待的时间很长。百度了一下,有的人说是他是首先缓存文件。直到文件读取完成才传输,但是我中弄了几k的小文本,也不可能时间那么长。
还有几个功能,欢迎各位老铁复现,有问题私信讨论。





















还没有评论,来说两句吧...