0%

Web - DNS Poisoning

记录一下这学期最难的一次网络安全实验,恰逢期末,之后回来填坑

[1] 虚拟机 virtualbox 配置

如何便捷地 copy 虚拟机(直到写这篇 wp 才想起来可以 STFW,我最开始用的 vdi...还需要用 VBoxManage internalcommands sethduuid /path/to/your.vdi 重新解绑uuid)

由于此次打开的虚拟机较多,所以每个虚拟机内存只分配2GB即可

之后,把双向粘贴板和双向拖放打开,再把“显示 -> 屏幕”中扩展特性的“启用3D加速”打开(要不然会花屏)

之后再在“网络 -> 网卡1”栏目中,将连接方式改为“内部网络”,然后名称改为intnet0/1/2(这里根据自己需求来写,比如我配的权威DNS就是intnet1)

最后进入虚拟机中,在上方栏目的“设备”中点击安装增强功能,它会自动打开一个文件夹,在终端里运行autorun.sh即可自动安装,之后重启虚拟机就可以启用双向粘贴板和拖放了

[2] 虚拟机网络配置

IP 分配为:

攻击者——192.168.3.200

受害者——192.168.3.100

权威服务器——192.168.4.105

正常网站——192.168.4.100

递归服务器——192.168.5.53

钓鱼网站——192.168.5.80

[2-1] openwrt

[2-1-1] network

通过 vi /etc/config/network 为每个⽹络接⼝配置相应的设置。这通常包括设置IP地址、⽹关、⼦⽹掩码等,这里我配置为以下内容

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
config interface 'loopback' 
option device 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'

config interface 'wan'
option device 'eth0'
option proto 'dhcp'

config interface 'lan1'
option ifname 'eth1'
option proto 'static'
option ipaddr '192.168.3.1'
option netmask '255.255.255.0'

config interface 'lan2'
option ifname 'eth2'
option proto 'static'
option ipaddr '192.168.4.1'
option netmask '255.255.255.0'

config interface 'lan3'
option ifname 'eth3'
option proto 'static'
option ipaddr '192.168.5.1'
option netmask '255.255.255.0'

其中,wan与virtualbox‘网络’配置中的网卡1(网络地址转换)是对应的,device是eth0。lan1与virtualbox‘网络’配置中的网卡2(intnet0)是对应的,device是eth1,ipaddr192.168.3.1是网关ip,netmask是子网掩码,以此类推lan2和lan3。

配置好之后,我们需要使用 /etc/init.d/network restart 重启服务

[2-1-2] firewall

通过 vi /etc/config/firewall 添加或修改防⽕墙规则,这里 firewall 的文件太长,我就不贴在这里了,可以自行gpt。编辑好之后,可以通过 /etc/init.d/firewall restart 重启防火墙

[2-1-3] 测试网络

可以通过 ping www.baidu.comping 8.8.8.8 来测试路由器是否可以访问互联网。

[2-2] ubuntu

可以通过 sudo vim /etc/netplan/01-network-manager-all.yaml 来配置 ubuntu 虚拟机的网络设置,以权威域名服务器为例,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Let NetworkManager manage all devices on this system
network:
version: 2
renderer: networkd
ethernets:
enp0s3:
dhcp4: no
addresses:
- 192.168.4.105/24
routes:
- to: default
via: 192.168.4.1
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4

然后通过 sudo netplan apply 重启网络配置,其他几个虚拟机也如法炮制

重启之后,可以通过 ping www.baidu.com 来判断是否可以通过路由器访问外网,如果成功则网络配置完毕;如果失败则使用 ping 192.168.4.1 来判断路由器与虚拟机之间的网络是否连接正常,如果成功则说明路由器无法访问互联网,如果失败则说明虚拟机和路由器间链接不正常,检查virtualbox网卡配置、虚拟机网络配置和路由器网关、防火墙配置。

[3] 域名服务器

在本实验中,我们使用 bind9 来配置 DNS,首先通过以下命令下载 bind9

1
2
sudo apt update
sudo apt install bind9 bind9utils bind9-doc

[3-1] 权威域名服务器

权威域名服务器存储了完整的域名,直接通过访问数据库获取最新的域名和ip对应关系

[3-1-1] 配置 zone 文件

首先,我们需要编辑 bind9 的配置文件。bind9 的主配置文件通常是 /etc/bind/named.conf.local,我们在这个文件中添加下述内容,等价于为 bind9 添加了一个 zone

1
2
3
4
zone "test.seclab.online" {
type master;
file "/etc/bind/zones/db.test.seclab.online";
};

其次,我们需要创建区域数据文件。我们先使用 sudo mkdir /etc/bind/zones 创建目录,再使用 sudo vim /etc/bind/zones/db.test.seclab.online 向该数据文件中加入下面内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$TTL    10 ; 以下NS、A等记录如果不指定生存期,默认10s的ttl
@ IN SOA ns1.test.seclab.online. admin.test.seclab.online. (
2024120601 ; 每次更新 DNS 区域文件时都需要更新序列号,通常是 YYYYMMDDNN
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
10 ) ; 如果没有找到该域名,NXDOMAIN在递归DNS服务器中的ttl是10秒

; Name servers
IN NS ns1.test.seclab.online.

; NS 记录指向 权威域名服务器
; A 记录定义了主机名到 IP 地址的映射
; 权威域名服务器是 .4.105
ns1 IN A 192.168.4.105

; test.seclab.online 的对应 ip 是 .4.100
@ IN A 192.168.4.100

; www.test.seclab.online 的对应 ip 是 .4.100
www IN A 192.168.4.100

[3-1-2] 配置 BIND 监听 IP 地址

编辑 BIND 的主配置文件 /etc/bind/named.conf.options,设置 BIND 监听的 IP 地址和端口。确保该文件中存在:

1
2
3
4
5
6
7
8
options {
directory "/var/cache/bind";

recursion no; # 禁止递归查询,只作为权威 DNS 服务器
allow-query { any; }; # 允许任何人查询
listen-on { 192.168.4.105; }; # 监听特定的 IP 地址
listen-on-v6 { none; }; # 禁止 IPv6
};

[3-1-3] 启动服务

使用以下命令重启 BIND9 服务并使防火墙允许 DNS 请求通过 53 端口

1
2
3
4
sudo systemctl restart bind9

sudo ufw allow 53
sudo ufw reload

[3-1-4] 测试

在客户端上通过 dig @192.168.4.105 test.seclab.online 命令,如果 DNS 配置正确,我们可以看到如下输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
; <<>> DiG 9.18.28-0ubuntu0.22.04.1-Ubuntu <<>> @192.168.4.105 test.seclab.online
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41596
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 5e30601cfcf185d8010000006752e9109d77d9b6c83e4824 (good)
;; QUESTION SECTION:
;test.seclab.online. IN A

;; ANSWER SECTION:
test.seclab.online. 604800 IN A 192.168.4.100

;; Query time: 3 msec
;; SERVER: 192.168.4.105#53(192.168.4.105) (UDP)
;; WHEN: Fri Dec 06 20:07:44 CST 2024
;; MSG SIZE rcvd: 91

[3-2] 递归域名服务器

[3-2-1] options文件

首先通过 sudo vim /etc/bind/named.conf.options 编辑 bind9 的主配置文件,在其中放入以下内容

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
30
options {
directory "/var/cache/bind";

// 启用递归查询
recursion yes;

// 设置允许进行递归查询的客户端 IP 范围
allow-recursion { any; };

// 监听所有网络接口上的 DNS 请求
listen-on { any; };
listen-on-v6 { any; };

// 允许使用非官方 DNS 服务器数据 -> 我们的权威 DNS 服务器是非官方的
dnssec-validation no;

// Forwarders 指定上游 DNS 服务器,我们没配置根域名服务器等,因此需要指定上游 DNS 服务器。
forwarders {
192.168.4.105
};

// 默认行为是允许所有查询
allow-query { any; };

// 禁止递归查询从非本地网络发起(提高安全性)
allow-query-cache { any; };

// 默认端口 10001,减少后续攻击难度
query-source port 10001;
};

完成配置后,我们使用 sudo systemctl restart bind9 重启配置,并通过以下命令设置防火墙

1
2
sudo ufw allow 53
sudo ufw reload

[3-2-2] 客户端设置

由于客户端虚拟机默认的 nameserver 不是 192.168.5.53,因此我们需要使用 sudo vim /etc/resolv.confnameserver 127.0.0.53 改为我们自己的递归域名服务器,即 192.168.5.53

-------------文章就到这里啦!感谢您的阅读XD-------------