DNS劫持(缓存投毒)实验

DNS劫持介绍(维基百科): https://zh.wikipedia.org/zh-cn/%E5%9F%9F%E5%90%8D%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BC%93%E5%AD%98%E6%B1%A1%E6%9F%93

简单来说就是,DNS劫持就是攻击者通过某种手段,使得受害者的DNS明文请求被攻击者截获(请求还没到达真实的DNS服务器),然后攻击者返回错误的DNS解析结果,使得受害者访问错误的网站。

1. 实验环境

1.1. 网络拓扑

主机 地址
网关 10.0.6.2
kali 10.0.6.10
Win7 10.0.6.20

为简化拓扑,隐藏了网关设备:

alt text

1.2. 劫持目标

域名 劫持后IP
ccb.com 10.0.6.10
www.icbc.com.cn 10.0.6.10

修改ettercap的DNS劫持配置文件:

1
2
3
4
5
mkdir -p /etc/ettercap && touch /etc/ettercap/etter.dns
cat >> /etc/ettercap/etter.dns << EOF
ccb.com A 10.0.6.10
www.icbc.com.cn A 10.0.6.10
EOF

配置支持使用通配符,例如* A 10.0.6.10表示将所有域名劫持到10.0.6.10。

1.3. 伪装站点

在kali上使用nginx启动一个http服务器,用于伪装被劫持的站点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 生成ssl自签证书
openssl genrsa -out /tmp/ca.key 2048
openssl req -x509 -new -nodes -key /tmp/ca.key -sha256 -days 36500 -out /tmp/ca.crt

# 添加nginx配置文件
cat > /etc/nginx/conf.d/dns_spoof.conf << EOF
server {
listen 80;
server_name _;

location / {
root /tmp;
index index.html;
}
}

server {
listen 443 ssl;
server_name _;

ssl_certificate /tmp/ca.crt;
ssl_certificate_key /tmp/ca.key;

location / {
root /tmp;
index index.html;
}
}
EOF

创建劫持站点的首页:

1
2
3
4
5
6
7
8
9
10
11
cat > /tmp/index.html << EOF
<!DOCTYPE html>
<html>
<head>
<title>DNS劫持状态</title>
<meta charset="UTF-8"></head>
<body>
<h1>DNS劫持已生效</h1>
</body>
</html>
EOF

2. ARP欺骗

DNS劫持之前,需要先进行ARP网关欺骗,好让Win7与网关的通信都经过kali(让Win7误以为网关是kali)。

注意: 即使Win7手动设置了DNS服务器为网关以外的IP,也同样会被ARP欺骗影响,因为和DNS服务器通信也是需要靠网关转发的。

在kali上使用root权限运行ettercap -G,打开ettercap的图形化界面。

如果提示ettercap不存在,则使用以下命令安装ettercap:

1
2
3
4
sudo apt update
sudo apt install ettercap-common
sudo apt install ettercap-graphical
sudo apt install ettercap-text-only

alt text

在”Primary Interface”菜单中选择kali实际使用的网卡,然后点击右上角的对勾图标开启嗅探。开启后再点击左上角的放大镜扫描主机,扫描完成后再点击放大镜右边的按钮,查看主机扫描列表:

alt text

接着将扫描结果中的网关(10.0.6.2)添加到Target1,Win7(10.0.6.20)添加到Target2中,然后点击右上角的地球图标,在展开的菜单中选择”ARP poisoning…”(弹窗直接点”OK”),:

alt text

如果需要修改target,可以点击右上角的3个点图标,在展开的菜单中选择”Targets”,点击”Current targets”进行管理。

此时,ettercap已经成功进行ARP网关欺骗,Win7会把网关的mac地址修改成kali的mac地址,可以在Win7上使用arp -a命令查看:

alt text

关于ARP欺骗攻击的更多信息,推荐看我以前写的博客: https://blog.lololowe.com/posts/ae0b/

3. DNS劫持

点击ettercap右上角三个点图标,在展开的菜单中选择”Plugins”,然后点击”Manage plugins,最后双击”dns_spoof”开始劫持DNS:

alt text

接着回到Win7中验证DNS劫持是否成功,使用以下命令查询DNS返回结果:

1
2
3
4
5
6
7
:: 刷新DNS缓存
ipconfig /flushdns
:: 查询域名
nslookup ccb.com
nslookup www.icbc.com.cn
:: 查看系统DNS缓存
ipconfig /displaydns

alt text

可以看到两个域名的DNS解析IP都被篡改成了10.0.6.10,即kali的IP地址。

再到浏览器中访问被劫持的站点 ccb.com 和 www.icbc.com.cn ,会看到浏览器提示连接步安全,其中 ccb.com 可以忽略危险继续访问,而 www.icbc.com.cn 则不行:

alt text

造成这种现象的原因是,在DNS劫持之前正常访问过这两个网站,浏览器缓存了这两个网站的信息,因此默认会使用历史记录中的HTTPS发起连接,而kali上面生成的ssl自签证书是不受CA机构信任的,所以浏览器会提示连接不安全(证书不可信)。

ccb.com 可以忽略警告继续访问,或者在地址栏中修改HTTPS为HTTP,然后访问成功:

alt text

www.icbc.com.cn 由于开启了HSTS,在DNS劫持之前就已经缓存了HSTS信息(时长默认一年):

alt text

因此浏览器后续会强制使用HTTPS连接此网站并且不能忽略证书错误,因此访问失败。可以在谷歌浏览器地址栏输入 chrome://net-internals/#hsts 查看HSTS缓存信息:

alt text

通过清除浏览器缓存可以去除HSTS:

alt text

alt text

或者可以结合NTP时间攻击,将Win7的时间篡改到1年以后,使HSTS缓存过期,从而绕过HSTS的防护,但这并不在本实验的范围内。

4. 总结

  1. 通过ARP欺骗,kali主机成功伪装成网关,使Win7与网关之间的通信全部经过kali。这为后续的DNS劫持奠定了基础。

  2. 通过DNS劫持,成功将目标域名 ccb.com 和 www.icbc.com.cn 的解析IP篡改为kali主机的IP(10.0.6.10)。

  3. ccb.com可以通过忽略警告或使用HTTP访问,而www.icbc.com.cn因HSTS限制无法直接绕过,体现了HSTS的安全作用。

  4. 防御措施

    • 关于ARP欺骗的防护措施,可以参考我以前写的博客: https://blog.lololowe.com/posts/ae0b/#%E9%98%B2%E6%8A%A4
    • 在公共网络下,为了防止DNS劫持,建议使用加密DNS,例如DoT(DNS over TLS)、DoH(DNS over HTTPS);
    • 对于一些重要的网站,可以在hosts文件中静态绑定域名和ip的映射关系;
    • https服务器建议开启HSTS,阻止证书错误时还能继续访问站点;
    • Windows建议时常使用Sigcheck工具来检查系统是否存在异常的CA根证书,防止基于证书的中间人攻击。

5. 参考与延伸