一次用户端DNS劫持引发的DNS安全研究

我们的互联网协议存在需要修复的缺陷。但是,对于提供运行互联网的核心服务的东西,即 DNS(域名服务),“刚刚好”的安全性是否足够?最大的威胁之一是 DNS 缓存中毒,恶意主机可以为网络的其余部分播下错误的域名。DNSSEC 通过建立一个受保护的区域来克服这个问题,在该区域中,所有响应都经过数字签名。然后,DNS 解析可以检查 DNS 信息是否已由其中一个受信任的主机签名。

缓慢的协议

对于 IPv4,我们已经用完了 IP 地址,需要迁移到 IPv6。但行业会大规模迁移吗?答案通常是“不会”,因为公司通常不想破坏其现有的 IPv4 网络。基本上,NAT(网络地址转换)已经解决了这个问题,有超过 300 亿台设备连接到互联网,但只使用了大约 30 亿个地址。而且,与 IPv6 一样,DNSSEC 协议从未真正流行起来。为什么?因为 SSL/TLS 协议提供了一定程度的安全性,因为我们可以使用 PKI(公钥基础设施)来验证我们连接的名称服务器。使用 DNSSEC,我们可以对记录进行数字签名,从而为我们的查找提供集成信任。

搞垮互联网

您是否知道,整个互联网可能瞬间崩溃……仅仅因为一个协议?……DNS。由于我们非常依赖 DNS 服务器来解析 IP 地址,针对核心 DNS 基础设施的大规模分布式拒绝服务 (DDoS) 攻击将使大部分互联网瘫痪。如果核心基础设施出现故障,其余基础设施将崩溃。而且,我们的 DNS 基础设施随时可能被恶意利用。

DNS 是一种糟糕的协议。它依赖于一个 DNS 服务器告诉其他 DNS 服务器域名的 IP 解析是什么。但是您可以信任谁来播种呢?好吧,域名的主要权威机构。我们不必整合主要权威机构,因为域名上的信息将通过互联网传播。那么,如果恶意实体看到错误的 IP 地址会发生什么?假设一个民族国家 — MegaTropolis — 想要接管一个小国 — MiniTropolis。好吧,他们的第一个重点可能是毒害世界各地的 DNS 缓存,以便所有 MiniTopolis 域都指向 MegaTropolis 网站。

域名系统安全扩展DNSSEC )

DNS 的问题在于它几乎没有内置任何真正的安全性,伪造的 DNS 系统很容易被设置并将用户重定向到错误的站点。但有一个解决方案……域名系统安全扩展DNSSEC )。它提供 DNS 数据的来源认证以及数据完整性。它不会阻止某人查看请求和回复中的数据。与 DNS 相关的问题已经为人所知一段时间了 [此处]:

这些威胁包括:数据包拦截;ID 猜测和查询预测;名称链;受信任服务器的背叛;拒绝服务;经过身份验证的域名拒绝;以及通配符。最大的威胁之一是 DNS 缓存中毒,恶意主机可以为网络的其余部分播下错误的域名。DNSSEC 通过建立一个受保护的区域来克服这个问题,在该区域中所有响应都经过数字签名。然后 DNS 解析可以检查 DNS 信息是否已由其中一个受信任的主机签名。

DNS 的工作原理是创建定义 SOA(授权开始)的域记录。然后定义序列号、刷新时间等:

在此,我们可以定义 NS(名称服务器)和 MX(邮件服务器),以及域内定义主机的 IP 地址。我们可以使用 nslookup 来查询条目:

需要注意的是,DNSSEC并不提供数据的机密性,也不能防止拒绝服务攻击。

编码

一些 Go 代码见 [此处]。通过此代码,我们将创建一个 2,048 位 RSA 密钥对(一个公钥和一个私钥),然后使用受信任域的私钥对 SOA 进行签名。然后,其他人可以使用受信任域的公钥检查签名。SOA 条目的创建方式与 DNS 相同,其中包含域名的响应标头和 IP 地址(dns.ClassINET):

序列号在 SOA 上很重要,因为它定义了条目的最新版本。在本例中,签名是使用 RSA 加密的 SHA-256 哈希创建的。我们还为签名添加了一个到期日期。签名由密钥 (key.Hdr.Name) 中定义的实体签名 [此处]:

主导

“crypto”
“crypto/rsa”
“github.com/miekg/dns”
“fmt”
“os”

func main () {
域:= “asecuritysite.com”
argCount:= len(os.Args [ 1:])
如果(argCount> 0){域=字符串(os.Args [ 1 ])}
域=域+ “。”
key := new (dns.DNSKEY)
key.Hdr.Name = 域
key.Hdr.Rrtype = dns.TypeDNSKEY
key.Hdr.Class = dns.ClassINET
key.Hdr.Ttl = 3600
key.Flags = 256
key.Protocol = 3
key.Algorithm = dns.RSASHA256
priv, _ := key.Generate( 2048 )
soa := new (dns.SOA)
soa.Hdr = dns.RR_Header{域, dns.TypeSOA, dns.ClassINET,144000 }
soa.Ns = "ns." +域
soa.Mbox = "邮件." +domain
soa.Serial = 1293945905
soa.Refresh = 14400
soa.Retry = 3600
soa.Expire = 604800
soa.Minttl = 86400
sig := new (dns.RRSIG)
sig.Hdr = dns.RR_Header{domain, dns.TypeRRSIG, dns.ClassINET, 14400 , 0 }
sig.TypeCovered = dns.TypeSOA
sig.Algorithm = dns.RSASHA256
sig.Labels = 2
sig.Expiration = 1562761057
sig.Inception = 1562761057
sig.OrigTtl = soa.Hdr.Ttl
sig.KeyTag = key.KeyTag()
sig.SignerName = key.Hdr.Name
var pr crypto.Signer
pr,_= newSignerFromKey(priv)
if err := sig.Sign(pr, []dns.RR{soa}); err != nil {
fmt.Printf( "签名失败" )
return
}
if err := sig.Verify(key, []dns.RR{soa}); err != nil {
fmt.Printf( "验证失败" )
} else {
fmt.Printf( "签名成功nn" )
}
fmt.Printf( "SOA: %snn" ,soa)
fmt.Printf( "签名:%snn",sig)
fmt.Printf( "密钥:%snn" ,key)

}
type rsaPrivateKey struct {
*rsa.PrivateKey
}
func newSignerFromKey (k interface {}) (crypto.Signer, error ) {
var sshKey crypto.Signer
switch t := k.( type ) {
case *rsa.PrivateKey:
sshKey = &rsaPrivateKey{t}
default :
return nil , fmt.Errorf( "ssh:不支持的密钥类型 %T" , k)
}
return sshKey, nil
}

对“asecuritysite.com.”消息的运行示例为 [此处]:

签名正常
SOA:asecuritysite.com。14400 IN SOA ns.asecuritysite.com。mail.asecuritysite.com。1293945905 14400 3600 604800 86400

签名:asecuritysite.com。14400 IN RRSIG SOA 8 2 14400 20190710121737 20190710121737 42450 asecuritysite.com。NqFhFsl
EHFtETdO1cWFKhMyWydiTDpGkWKQggzgbzVGa9COBQDrFS+NRsVEQEpIee3EMJ/hY6RXpmo75ZxWO7OO4FfIBbl2qgZctewmutFy+HT4GUFA3dJp9rzfr2Jn
0lnCCOkLIW33zHgXgSXmKJobWXPsHTPQoUogjdxmPzbzWFd6S1XXPep4klyi1hbcM9uvnABtFGw5tb/rd7hs6B/hS9spoO5MHZqDczmAKEoW1XKht12G97Qc
Qz3nyyGlRScntbHNXk3xaD3Xzevu9SWhZ4Ro2xFvIWxdFkLWCv2wZkcwHIG9q7zFE5HglZhip+q8EKzfZV1PQn8AOVf16dA==

密钥:asecuritysite.com。3600 输入 DNSKEY 256 3 8 AwEAAdcn7cvHVXBvDQVsh6ge+JHZWTCn4WarBbWzQ1TGKMpk/pT9L386Q2ZU1fvynYdp
eqQi4PKbRpavycjqMFBtJvg9qhHpXq25iSpdx1+aNHL8zyvx/eFFTAWHA8qN3uQuVKc5mm+KQ498poWd1dnYBNHRcNGgZA8epNsq+WSoLzRISIxgiFDs6j+k
ryO4ivj7n8dLOqqcv9C/tQl/7YhU4y3lHSek9FqFOCpYK4DzQb+jJuLKNWjAPobWF19JkrvcN0KeDZ2TZEeApz3UGtjsRMowH4AJ48yKyaT2vnmE52MwIiC1
/yHLtQJK77CMgow3BejXO2T9uytp+rTQyZk8Ens=

结论

互联网就像一艘巨大的木材船,需要一段时间才能转向。它一直在努力适应 IPv6 等重大变化,但它的核心存在一个重大缺陷……DNS。虽然 DNSSEC 解决了它的一些弱点,但它并不能阻止人们监视您的访问,而且 DNS 基础设施可能会受到 DDoS 攻击。

目前,DNSSEC 并未如预期般流行,而 SSL/TLS 则填补了安全漏洞。但对提供 DNS 的受信任域的攻击可能会给互联网带来严重问题。 

原创文章,作者:速盾高防cdn,如若转载,请注明出处:https://www.sudun.com/ask/78444.html

(0)
速盾高防cdn's avatar速盾高防cdn
上一篇 2024年5月29日 下午6:40
下一篇 2024年5月29日 下午6:44

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注