Trong bài viết này, chúng tôi sẽ trình bày cách bật ghi log DNS cho tất cả truy vấn người dùng trên DNS server chạy Windows Server, cách phân tích và phân tích log DNS. Tôi đối mặt với nhiệm vụ này khi phải hạ cấp domain controller Active Directory cũ tại chi nhánh và cần hiểu thiết bị nào vẫn đang sử dụng DNS server. Sau khi bật log DNS và phân tích nó, tôi đã tìm thấy các thiết bị và cấu hình lại chúng để dùng DNS server khác. Ngoài ra, phương pháp này sẽ giúp bạn tìm các máy chủ có hoạt động đáng ngờ trong mạng Active Directory (truy cập URL độc mã, host botnet, v.v.).
Tất nhiên, bạn có thể cài đặt Wireshark, Microsoft Network Monitor hoặc pktmon trên host DNS để bắt gói tin trên cổng 53, nhưng việc sử dụng tính năng ghi log truy vấn DNS tích hợp sẵn trên Windows Server dễ dàng hơn.Mặc định, ghi log DNS bị tắt trên Windows Server. Để bật nó:
- Mở snap-in DNS Manager (
dnsmgmt.msc) và kết nối đến DNS server bạn muốn; - Mở thuộc tính của nó và chuyển đến tab Debug Logging;
- Bật tùy chọn Log packets for debugging;
- Sau đó bạn có thể cấu hình các tùy chọn ghi log: chọn hướng gói tin DNS, giao thức (UDP và/hoặc TCP), loại gói tin (truy vấn DNS đơn giản, cập nhật hoặc thông báo);
- Sử dụng tùy chọn Filter packets by IP address, bạn có thể chỉ định địa chỉ IP để ghi log gói tin đến hoặc đi (giúp giảm đáng kể kích thước log);

- Trong hộp Log file path and name, chỉ định tên file văn bản bạn muốn ghi log tất cả sự kiện. Mặc định kích thước log DNS giới hạn ở 500MB. Sau khi đạt đến, các sự kiện tra cứu DNS cũ sẽ bị ghi đè bằng cái mới.
Cũng có thể bật ghi log truy vấn DNS hoặc lấy cài đặt hiện tại bằng PowerShell:
Get-DnsServerDiagnostics

Sau đó chạy truy vấn DNS đến server của bạn từ bất kỳ máy tính nào. Ví dụ, nếu địa chỉ IP host DNS chạy Windows Server là 192.168.13.10:
nslookup woshub.com 192.168.13.10

Resolve-DnsName -Name woshub.com -Server 192.168.13.10
Truy vấn tra cứu DNS trả về địa chỉ IP client của host được yêu cầu.
Hãy đảm bảo truy vấn đã xuất hiện trong log DNS server.
Để làm điều này, tìm kiếm trong file log văn bản theo địa chỉ IP client (192.168.13.130). Bạn có thể mở file log trong NotePad hoặc grep nó bằng PowerShell:
get-content "C:\Logs\dc01dns.log" | Out-String -Stream | Select-String "192.168.13.130"

Dưới đây là ví dụ sự kiện:
11/17/2021 6:00:00 AM 0D0C PACKET 00000272D98DD0B0 UDP Rcv 192.168.13.130 0002 Q [0001 D NOERROR] A (8)woshub(2)com(0)
Như bạn thấy, truy vấn DNS để phân giải tên (8)woshub(2)com(0) đã được nhận (rcv) từ client 192.168.13.130 qua UDP, sau đó DNS server phản hồi thành công (NOERROR) cho nó (snd).
Field # Information Values ------- ----------- ------ 1 Date 2 Time 3 Thread ID 4 Context 5 Internal packet identifier 6 UDP/TCP indicator 7 Send/Receive indicator 8 Remote IP 9 Xid (hex) 10 Query/Response R = Response blank = Query 11 Opcode Q = Standard Query N = Notify U = Update ? = Unknown 12 Flags (hex) 13 Flags (char codes) A = Authoritative Answer T = Truncated Response D = Recursion Desired R = Recursion Available 14 ResponseCode 15 Question Type 16 Question Name
Do định dạng đặc biệt, rất khó phân tích thủ công file log DNS truy vấn như vậy. Vì vậy bạn cần chuyển đổi log debug DNS sang định dạng thuận tiện hơn, sử dụng script Get-DNSDebugLog.ps1.
Script PowerShell này không phải của tôi, nhưng hiện không có trong TechNet Scriptcenter, nên tôi đã lưu nó vào repository GitHub của mình: https://github.com/maxbakhub/winposh/blob/main/Get-DNSDebugLog.ps1.
Tải file xuống đĩa. Sau đó cho phép script PowerShell thực thi trong phiên console hiện tại:
Set-ExecutionPolicy -Scope Process Unrestricted
Nhập hàm từ Get-DNSDebugLog.ps1 vào phiên của bạn:
. C:\ps\Get-DNSDebugLog.ps1
Sau đó chuyển đổi log DNS sang định dạng thuận tiện hơn:
Get-DNSDebugLog -DNSLog C:\Logs\dc01dns.log | format-table
Hoặc bạn có thể xuất kết quả ra file CSV để phân tích tiếp trong Excel (hoặc bạn có thể truy cập file Excel trực tiếp từ PowerShell và ghi các truy vấn DNS bạn muốn vào đó).
Get-DNSDebugLog -DNSLog C:\Logs\dc01dns.log | Export-Csv C:\log\ProperlyFormatedDNSLog.csv –NoTypeInformation
Bạn có thể xuất file ra Excel và dùng nó để phân tích truy vấn DNS (file chứa địa chỉ IP host và tên DNS chúng yêu cầu từ DNS server của bạn).
Cũng có thể sử dụng Log Parser 2.2 (https://docs.microsoft.com/en-us/archive/blogs/secadv/parsing-dns-server-log-to-track-active-clients) để phân tích file log DNS. Ví dụ, lệnh dưới sẽ hiển thị số lượng truy vấn DNS từ mỗi địa chỉ IP:
LogParser.exe -i:TSV -nskiplines:30 -headerRow:off -iSeparator:space -nSep:1 -fixedSep:off -rtp:-1 "SELECT field9 AS IP, REVERSEDNS(IP) AS Name, count(IP) as QueryCount FROM "C:\Logs\dc01dns.log" WHERE field11 = 'Q' GROUP BY IP ORDER BY QueryCount DESC"

Trong ví dụ này, chúng tôi dùng file văn bản để thu thập log DNS. Trong Windows Server 2012 và mới hơn, bạn có thể ghi log truy vấn DNS trực tiếp vào Event Viewer (Microsoft-Windows-DNS-Server/Audit). Nhưng theo tôi, log DNS văn bản dễ phân tích hơn.
Sau khi bật log truy vấn DNS và phân tích nó, tôi tìm thấy địa chỉ IP của thiết bị vẫn đang dùng DNS server và cấu hình lại chúng sang DNS server khác. Nếu DC cũ không chứa vai trò FSMO, bạn có thể xóa nó (sự kiện logon người dùng AD không quan trọng ở đây).