Penetration Testing Step 1.b – Nâng tầm nghệ thuật DNS Enumeration

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 0Planning and Preparation). Trong Step 1 này tôi đã tạm phân thành 2 phần là Passive Information Gathering 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 SystemOS 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 – TLDDNS Client đang hỏi (với ví dụ google.com thì TLD.com). Bạn có thể xem hình sau để hình rõ hơn về cái DNS infrastructure.

DNS infrastructure
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.comDNS 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

manual host command
manual host command

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

nonexist host
nonexist host

#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

simple hostname list
simple hostname list

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

foward lookup with host and bash
foward lookup with host and bash

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/diffBash 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.

SecLists
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"

reverse lookup with host and bash
reverse lookup with host and bash

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 pipinggrep để 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, ns2ns3 (kết quả chạy ở Mục 2). Thử xúc 2 thằng ns1ns2 với command sau:

host -l megacorpone.com ns1.megacorpone.com

host -l megacorpone.com ns2.megacorpone.com

zone transfer with host command
zone transfer with host command

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 pipingcut cho nhanh gọn hơn, kiểu như:

host -t ns megacorpone.com | cut -d " " -f 4

clean host command output
clean host command output

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

zone transfer bash script
zone transfer bash script

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

zone transfer bash script result
zone transfer bash script result

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 LinuxDNSReconDNSenum.

#7.1 DNSRecon

DNSReconPython 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

dnsrecon zone transfer
dnsrecon zone transfer

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

dnsrecon brute force
dnsrecon brute force

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

dnsenum zone transfer
dnsenum zone transfer

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”

Leave a Reply

Your email address will not be published. Required fields are marked *