NỘI DUNG
Như đã chém gió trong nội dung Penetration Testing – 6 điều tối thiểu bạn cần biết, ở Step 1 của quá trình Penetration Testing bạn sẽ cần triển công tác Information Gathering and Analysis (Step 0 là Planning and Preparation). Trong Step 1 này tôi đã tạm phân thành 2 phần là Passive Information Gathering và Active Information Gathering (bạn có thể xem kỹ hơn trong nội dung Penetration Testing Step 1.a – Cẩm nang không thể thiếu cho Passive Information Gathering):
- Penetration Testing Step 1.a: Tương ứng với Passive Information Gathering – không (hoặc hạn chế) tương tác trực tiếp với target;
- Penetration Testing Step 1.b: Tương ứng với Active Information Gathering – có tương tác trực tiếp với target.
Phần Penetration Testing Step 1.a tôi cũng đã có demo giới thiệu thêm trong các nội dung Penetration Testing Step 1.a – Những điều cơ bản phải biết về recon-ng và cách tung combo với modules command, Penetration Testing Step 1.a – Lần đầu làm chuyện ấy với Maltego. Trong nội dung kỳ này, tôi sẽ bắt đầu chuyển sang Penetration Testing Step 1.b với đối tượng đầu tiên là DNS Enumeration.
#1. Domain Name System – DNS hoạt động ra sao?
Sau khi demo múa lửa các nội dung liên quan đến DNS cả tỷ lần mà đến giờ tôi mới đặt ra câu hỏi DNS là gì thì có vẻ hơi sai trái? Tuy nhiên, thôi muộn còn hơn không.
Nói ngắn gọn, Domain Name System – DNS là hệ thống chuyển đổi các Domain Name thân thiện với người dùng sang IP address thân thiện với mấy thứ không phải người.
Nói kiểu dài dòng, khi bạn nhập cái hostname (ví dụ google.com) vô browser và enter thì browser sẽ đẩy cái hostname này vô DNS client của Operating System và OS lại đẩy cái request này ra external DNS server đã được cấu hình. Thằng này sẽ đóng vai trò là DNS recursor, đối tượng môi giới nhận kết quả từ đống DNS infrastructure và trả về cho DNS client. Cụ thể, DNS recursor sẽ liên lạc với một server thuộc DNS root zone để lấy thông tin địa chỉ của server phụ trách zone chứa cái Top Level Domain – TLD mà DNS Client đang hỏi (với ví dụ google.com thì TLD là .com). Bạn có thể xem hình sau để hình rõ hơn về cái DNS infrastructure.
Nguồn: DNS 101: An introduction to Domain Name Servers | Enable Sysadmin (redhat.com)
DNS recursor lại lọ mọ liên hệ với TLD DNS server xác định ở trên để hỏi địa chỉ của Authoritative nameserver phụ trách cái domain google.com mà DNS client đang hỏi. Authoritative nameserver lúc này sẽ đọc DNS record từ local database (cụ thể là zone file bao gồm 2 loại là forward lookup zone – tìm IP theo hostname và reverse lookup zone – tìm hostname theo IP) và xác định cái IP address tương ứng để phọt ra cho thằng DNS recursor.
Lúc này DNS recursor sẽ trả cái IP address tìm được về cho DNS client để nó đá qua cho thằng browser truy cập và load page.
Vì quy trình làm việc lằng nhằng, quan liêu nói trên nên thiên hạ lại đẻ ra một thứ gọi là DNS caching để lưu trữ bản copy cục bộ các DNS records đã thu thập được ở các application (cụ thể là browser như ví dụ trên) cũng như DNS client nhằm tăng hiệu quả cho quá trình phân giải tên miền.
Lưu ý: Domain owners sẽ có thể quy định “tuổi thọ” cho đám cache này thông qua field Time To Live trong DNS record.
Bàn về đám DNS record, bạn sẽ gặp các dạng phổ biến như sau:
- NS: Nameserver record chứa tên của Authoritative servers nắm giữ DNS records cho một domain cụ thể;
- A: Host record chứa thông tin IP address tương ứng của một hostname;
- MX: Mail Exchange record chứa tên các servers xử lý email cho domain (Lưu ý một domain có thể có nhiều MX records);
- PRT: Pointer record dùng cho reverse lookup zone cũng như tìm các record khác theo IP address;
- CNAME: Canonical Name record dùng để tạo aliases (các bí danh) cho các host record khác;
- TXT: Text record có thể chứa dữ liệu tùy ý cho các mưu đồ khác nhau, ví dụ domain ownership verification.
#2. Xử lý thủ công DNS record với host command
Rồi vậy là xong phần tán dóc về DNS. Giờ tôi xắn tay vô demo cho dễ hình dung luôn. Để phân giải tên miền ra IP address, bạn có thể dùng host command:
Ví dụ xúc theo trang demo www.megacorpone.com của ông Offensive Security bạn sẽ dùng command kiểu như sau:
host www.megacorpone.com
Như nói trên, bạn có thể chỉ định cụ thể các DNS record phổ biến theo cú pháp cụ thể như các ví dụ sau:
Xử Mail Exchange record:
host -t mx megacorpone.com
Xử Text record:
host -t txt megacorpone.com
Xử Nameserver record:
host -t ns megacorpone.com
Lưu ý:
- Cái Nameserver record sẽ được sử dụng cho trong phần demo tiếp theo, bạn nhớ để ý các kết quả trả về.
- Nếu bạn quất cái hostname lởm thì kết quả sẽ là not found (NXDOMAIN).
host fake.megacorpone.com
#3. Xử lý forward lookup với host command và Bash script
Thực tế, trừ trường hợp bạn biết rõ cái hostname rồi thì mới chơi kiểu trên. Còn nếu đang dò hostname thì thiên hạ sẽ chơi kiểu “công nghiệp”. Ví dụ, bạn tạo trước một danh sách đối tượng tình nghi như file hostnames_list.txt ví dụ sau đây.
nano hostnames_list.txt
Sau đó, bạn múc nó với cái Bash one-liner như sau rồi ngồi đó rung đùi chờ coi kết quả.
for ip in $(cat hostnames_list.txt); do host $ip.megacorpone.com; done
Lưu ý: Tôi có giới thiệu về nano trong nội dung Giải ngố Kali Linux – Phần 6: Bộ 3 nguyên tử text editor nano/vi/vim và cách buff damage với skill so sánh nội dung file bằng comm/diff và Bash trong nội dung Giải ngố Kali Linux – Phần 4: Ép xung tốc độ thao tác Command Line với Bash và nhập môn Bash Script và nội dung Bash Script – Đánh tan lờ đờ, mệt mỏi của repetitive tasks với Loops và Function
Như kết quả trên, bạn đã xác định được 2 host có tồn tại là mail và router. Tuy nhiên, thực tế cũng không ai làm cái hostnames_list.txt đơn sơ mộc mạc như vậy. Giải pháp phổ biến hơn là triển với mấy cái list mà giang hồ đã dựng sẵn như https://github.com/danielmiessler/SecLists.
Lưu ý: Dù bạn có thể lấy thủ công các list về xài nhưng giải pháp hay hơn là cài vô con Kali Linux (có thể dùng apt -y install seclists) luôn cho gọn đẹp để khai thác hết khả năng của tool.
#4. Xử lý reverse lookup với host command và Bash script
Khi bạn có một số thông tin về đám IP address từ forward lookup (51.222.169.x như ví dụ trên), bạn có thể dùng tiếp Bash one-liner để dò thêm thông tin trong cái range IP address mà bạn nghi ngờ với reverse lookup kiểu như sau:
for ip in $(seq 50 100); do host 51.222.169.$ip; done | grep -v "not found"
Từ kết quả host tìm được, bạn có thể tiếp tục công cuộc đào bới để có thêm các phương án tấn công.
Lưu ý: Ở trên có dùng piping và grep để dọn đống output cho sạch đẹp. Bạn có thể xem về đám này trong nội dung Giải ngố Kali Linux – Phần 5: Nâng cấp kỹ năng tìm kiếm trên Linux với grep command
#5. Xử lý DNS Zone Transfer thủ công với host command
Zone Transfer có thể hiểu đơn giản là việc copy zone file (bao gồm tất cả DNS name nằm trong zone) từ Master DNS server sang Slave DNS server. Chuẩn cmn mực thì chỉ Slave DNS server được phân quyền mới được phép thực hiện Zone Transfer. Tuy nhiên, nếu bạn ăn ở tốt, có khi lại vớ trúng cái misconfigure DNS server cho phép thực hiện Zone Transfer tẹt ga bất chấp có được phân quyền hay không.
Để thực hiện Zone Transfer, bạn có thể dùng host command theo cú pháp:
host -l <domain name> <dns server address>
Lưu ý: Option -l tương ứng với list zone để thực hiện quá trình Zone Transfer
Ví dụ cụ thể với ông megacorpone nói trên bạn sẽ có 3 DNS server tương ứng là ns1, ns2 và ns3 (kết quả chạy ở Mục 2). Thử xúc 2 thằng ns1 và ns2 với command sau:
host -l megacorpone.com ns1.megacorpone.com
host -l megacorpone.com ns2.megacorpone.com
Kết quả cho thấy ns1 không cho phép thực hiện Zone Transfer nhưng bạn lại vớ bẩm với ns2 khi ăn trọn zone file với danh sách IP address và DSN hostname tương ứng.
#6. Xử lý DNS Zone Transfer bán tự động với host command và Bash script
Ở ví dụ trên, bạn chỉ có 3 name server nên có thể làm tay. Nếu đụng tình huống target có quá nhiều DNS server mà chơi thủ công mỹ nghệ như trên thì vỡ mồm. Tình huống này bạn lại phải nhờ cậy đến Bash script để xử lý cho nhanh, gọn và đẹp. Tuy nhiên, cần lưu ý, phương án đọc thủ công (bằng mắt) DNS server từ command “host -t ns <domain name>
” như ở Mục 2 để lấy input cho command “host -l <domain name> <dns server address>
” chỉ dành cho mấy ông thuộc trường phái “khổ d*m”. Người thường sẽ có thể xem xét dùng piping và cut cho nhanh gọn hơn, kiểu như:
host -t ns megacorpone.com | cut -d " " -f 4
Lưu ý: Tôi có đề cập cut trong nội dung Giải ngố Kali Linux – Phần 5: Nâng cấp kỹ năng tìm kiếm trên Linux với grep command
Sau đó, bạn có thể đẩy phương án trên vô Bash script kiểu như sau để nó tự xử. Để triển khai, đầu tiên, có thể tạo script có nội dung như sau với nano.
nano dns-axfr.sh
#!/bin/bash
# Simple Zone Transfer Bash Script
# $1 is the first argument given after the bash script
# Check if argument was given, if not, print usage
if [ -z "$1" ]; then
echo "[*] Simple Zone transfer script"
echo "[*] Usage : $0 <domain name> "
exit 0
fi
# if argument was given, identify the DNS servers for the domain
for server in $(host -t ns $1 | cut -d " " -f4); do
# For each of these servers, attempt a zone transfer
host -l $1 $server |grep "has address"
done
Rồi phân quyền thực thi cho nó với:
chmod +x dns-axfr.sh
Sau đó kiểm tra lại việc phân quyền với:
ls -l | grep dns
Nếu đã ngon rồi thì chạy scrip dns-axfr.sh kiểu như sau:
./dns-axfr.sh megacorpone.com
Như bạn thấy ở trên, công việc của bạn lúc này chỉ là rung đùi chờ kết quả về rồi hốt ra xài thôi.
Lưu ý: Việc phân quyền và thực thi Bash script tôi có đề cập trong nội dung Bash Script – La liếm với bộ 3 Variable, Argument & User Input
#7. Nâng tầm nghệ thuật DNS Enumeration với cặp tool DNSRecon và DNSenum
Nếu việc tự động hóa với Bash script như trên vẫn chưa làm bạn thỏa mãn thì sao? Mời bạn cắn tiếp với đám tool cực chất trong Kali Linux là DNSRecon và DNSenum.
#7.1 DNSRecon
DNSRecon là Python script được thiên hạ viết sẵn để bạn hốt về xơi thôi. Công năng nó sẽ khá nhiều nhưng nếu để mần đám công việc tương tự như mấy phần demo trước bạn sẽ dùng 2 option:
- -d: chỉ định domain name;
- -t: chỉ định enumeration type (axfr là cho zone transfer).
Ví dụ cụ thể với megacorpone sẽ kiểu như sau:
dnsrecon -d megacorpone.com -t axfr
Tương tự, cũng liên quan đến mấy tác vụ đã demo, nếu bạn muốn phân giải một đám subdomain dạng brute force với DNSRecon thì sẽ cần thêm các option:
- -D: chỉ định file chứa các subdomain tình nghi (ví dụ file txt như minh họa ở phần đầu);
- -t: chỉ định enumeration type (brt cho là brute force)
dnsrecon -d megacorpone.com -D ~/hostnames_list.txt -t brt
Như bạn thấy, kết quả thu được cũng sẽ tương tự như phương án dùng host command ở trên.
#7.2 DNSenum
Tool phổ biến kế tiếp là DNSenum. Để có thể thấy kết quả phong phú và đa dạng của Zone Transfer, bạn có thể thử target zonetransfer.me của “Ninja số” với command:
dnsenum zonetransfer.me
Như bạn thấy ở trên, khi target cho phép thực thiện Zone Transfer, bạn sẽ thu đươc cả núi thông tin liên quan để tha hồ mà nghiền ngẫm.
1 thought on “Penetration Testing Step 1.b – Nâng tầm nghệ thuật DNS Enumeration”