滲透測試重新打底(2.1)--論Enumeration(枚舉)之DNS Enumeration


Posted by kahatrix on 2023-09-22

透過DNS的枚舉,我們想要得到什麼資料呢? 第一個可能我們會想知道說,它的DNS server的IP address,或者是說在DNS server,它的record 它的table裡面有沒有像是,比如說它內部的其他server的名稱,像是email server、web server、或者是一些IP address。

這邊以owasp.org這一個網站做舉例。我們可以利用像是host的這個工具來得到它的IP address。比如說我這邊按一個host,比如說像這樣子.org,我們可以看到output,它會告訴我說owasp.org它不只只有一個IP address。比如說它這邊列了非常多個IPv4以及IPv6的address。那這些IP都是public network的IP。下面也可以看到它有一些mail server,像這下面這邊它列了五個mail server,那這看起來它可能是透過Google的server幫它做handle的部分。

┌──(root㉿kali)-[~]
└─# host owasp.org
owasp.org has address 172.67.10.39
owasp.org has address 104.22.27.77
owasp.org has address 104.22.26.77
owasp.org has IPv6 address 2606:4700:10::ac43:a27
owasp.org has IPv6 address 2606:4700:10::6816:1b4d
owasp.org has IPv6 address 2606:4700:10::6816:1a4d
owasp.org mail is handled by 5 alt2.aspmx.l.google.com.
owasp.org mail is handled by 1 aspmx.l.google.com.
owasp.org mail is handled by 10 alt4.aspmx.l.google.com.
owasp.org mail is handled by 5 alt1.aspmx.l.google.com.
owasp.org mail is handled by 10 alt3.aspmx.l.google.com.

那只能夠透過domain name,像是剛剛的owasp.org這樣的domain name來尋找IP嗎?那我能夠反過來嗎? 那當然也是可以的。這邊再給一個例子。

除了剛剛的這種owasp.org之外,我們還能夠給像是,我們找一下像是google.com的DNS server,好,那Google它推出了自己的DNS server IP是8.8.8.8以及8.8.4.4,那我們來嘗試一下用這個反向的lookup,意思是說我們給定一個IP address,我們能看看是不是能夠找到我們的URL。

它的用法一樣是使用host這個binary,參數就直接是帶IP,就不是像剛剛的URL的部分。那這邊我們就給host 8.8.8.8,可以看到這個output出來。host這個工具幫我們找到了說它的domain name pointer其實是到DNS.google。

┌──(root㉿kali)-[~]
└─# host 8.8.8.8
8.8.8.8.in-addr.arpa domain name pointer dns.google.

通常在大多數情況下,這種逆reverse lookup不會成功,但是通常你做domain name,像剛剛這種URL的查看是可以成功的。

那接下來介紹DNS zone transfer。為什麼需要這個zone transfer?
那先來簡介一下什麼是zone transfer。在一個自己公司它的內網

那這邊我們就直接用一個Megacorp做一個範例

mail.megacorp.com
admin.megacorp.com
dev.megacorp.com

在自家的企業的內網會有自己內部的DNS server,它的目的是讓員工可以找到他所需要的內網的網站。比如說在這個Megacorp裡面,它可能會有Mail server,也可能會有Development server也有可能會有Admin server,它可能是不應該讓所有員工都知道的這種比較機密的server。那如果你有這個企業內部的DNS server,它同時也會有一台備用的DNS server。這一台備用的server目的,是主要的DNS server有問題的時候它隨時可以上線且可以支援。

一台主DNS server跟備用的server,它可能會有一個問題,就是需要做同步。因為如果是主要的DNS server,它的record、table會一直更新,但是備用的這一台DNS server它的東西都會是舊的,所以才會出現Zone Transfer這個概念、這個技術其實就是兩台DNS server在同步自己內部record的做法。

Zone Transfer它是走TCP的port 53。這個Zone Transfer它是可以更新主要是用來查詢DNS記錄,是一個相當強大的功能。如果我們站在攻擊者的角度,要怎麼樣去利用這一個概念?

接下來就來介紹怎麼樣去攻擊這個Zone Transfer。Hack the Box VIP有FriendZone這一台機器。如果我們剛剛提到的主DNS Server以及備用的DNS Server沒有設定好,導致任何人都可以查詢這一台主要DNS Server的紀錄。這是一件非常危險的事情,因為這等於算是曝光了自家企業內部所有的域名,這件事情也給了攻擊者一個很精確的目標。攻擊者不太需要再去做太多的Scanning,就可以直接知道說他的目標有哪些。

以下先掃描哪些port有開:

┌──(root㉿kali)-[~]
└─# nmap -p- -v 10.10.10.123
Starting Nmap 7.93 ( https://nmap.org ) at 2023-06-21 07:14 EDT
Initiating Ping Scan at 07:14
Scanning 10.10.10.123 [4 ports]
Completed Ping Scan at 07:14, 0.23s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 07:14
Completed Parallel DNS resolution of 1 host. at 07:14, 0.00s elapsed
Initiating SYN Stealth Scan at 07:14
Scanning 10.10.10.123 [65535 ports]
Discovered open port 443/tcp on 10.10.10.123
Discovered open port 445/tcp on 10.10.10.123
Discovered open port 53/tcp on 10.10.10.123
Discovered open port 80/tcp on 10.10.10.123
Discovered open port 139/tcp on 10.10.10.123
Discovered open port 22/tcp on 10.10.10.123
Discovered open port 21/tcp on 10.10.10.123

詳細掃開啟的port:

┌──(root㉿kali)-[~]
└─# nmap -p21,22,53,80,139,443,445 -sC -sV -O -A  10.10.10.123
Starting Nmap 7.93 ( https://nmap.org ) at 2023-06-21 07:25 EDT
Nmap scan report for 10.10.10.123
Host is up (0.41s latency).

PORT    STATE SERVICE     VERSION
21/tcp  open  ftp         vsftpd 3.0.3
22/tcp  open  ssh         OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   2048 a96824bc971f1e54a58045e74cd9aaa0 (RSA)
|   256 e5440146ee7abb7ce91acb14999e2b8e (ECDSA)
|_  256 004e1a4f33e8a0de86a6e42a5f84612b (ED25519)
53/tcp  open  domain      ISC BIND 9.11.3-1ubuntu1.2 (Ubuntu Linux)
| dns-nsid:
|_  bind.version: 9.11.3-1ubuntu1.2-Ubuntu
80/tcp  open  http        Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Friend Zone Escape software
|_http-server-header: Apache/2.4.29 (Ubuntu)
139/tcp open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
443/tcp open  ssl/http    Apache httpd 2.4.29
|_http-title: 404 Not Found
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=friendzone.red/organizationName=CODERED/stateOrProvinceName=CODERED/countryName=JO
| Not valid before: 2018-10-05T21:02:30
|_Not valid after:  2018-11-04T21:02:30
| tls-alpn:
|_  http/1.1
|_http-server-header: Apache/2.4.29 (Ubuntu)
445/tcp open  netbios-ssn Samba smbd 4.7.6-Ubuntu (workgroup: WORKGROUP)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Aggressive OS guesses: Linux 3.2 - 4.9 (95%), Linux 3.16 (95%), Linux 3.18 (95%), ASUS RT-N56U WAP (Linux 3.4) (95%), Linux 3.1 (93%), Linux 3.2 (93%), Linux 3.10 - 4.11 (93%), Oracle VM Server 3.4.2 (Linux 4.1) (93%), Linux 3.12 (93%), Linux 3.13 (93%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 2 hops
Service Info: Hosts: FRIENDZONE, 127.0.1.1; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
|_clock-skew: mean: -1h00m00s, deviation: 1h43m54s, median: -1s
| smb2-time:
|   date: 2023-06-21T11:25:51
|_  start_date: N/A
| smb2-security-mode:
|   311:
|_    Message signing enabled but not required
|_nbstat: NetBIOS name: FRIENDZONE, NetBIOS user: <unknown>, NetBIOS MAC: 000000000000 (Xerox)
| smb-security-mode:
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
| smb-os-discovery:
|   OS: Windows 6.1 (Samba 4.7.6-Ubuntu)
|   Computer name: friendzone
|   NetBIOS computer name: FRIENDZONE\x00
|   Domain name: \x00
|   FQDN: friendzone
|_  System time: 2023-06-21T14:25:51+03:00

TRACEROUTE (using port 445/tcp)
HOP RTT       ADDRESS
1   452.35 ms 10.10.16.1
2   205.27 ms 10.10.10.123

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 50.03 seconds

掃出來的結果可以看出它這邊Port 53是有開的。通常你如果TCP 53有開,那UDP 53也是會開的。所以可以看到在TCP 53這邊解析出來是有DNS的部分(dns-nsid)。

接下來我們來攻擊一下這個DNS Zone Transfer。它的指令是這樣子下的:dig然後配上axfr,再接下來你要輸入目標的Domain Name。這邊跳過找出Domain Name的步驟(其實在剛剛詳細掃描的commonName有)。那在這邊指令可以像這樣子下:

┌──(root㉿kali)-[~]
└─# dig axfr friendzone.red @10.10.10.123

; <<>> DiG 9.18.12-1-Debian <<>> axfr friendzone.red @10.10.10.123
;; global options: +cmd
friendzone.red.         604800  IN      SOA     localhost. root.localhost. 2 604800 86400 2419200 604800
friendzone.red.         604800  IN      AAAA    ::1
friendzone.red.         604800  IN      NS      localhost.
friendzone.red.         604800  IN      A       127.0.0.1
administrator1.friendzone.red. 604800 IN A      127.0.0.1
hr.friendzone.red.      604800  IN      A       127.0.0.1
uploads.friendzone.red. 604800  IN      A       127.0.0.1
friendzone.red.         604800  IN      SOA     localhost. root.localhost. 2 604800 86400 2419200 604800
;; Query time: 2480 msec
;; SERVER: 10.10.10.123#53(10.10.10.123) (TCP)
;; WHEN: Wed Jun 21 07:53:26 EDT 2023
;; XFR size: 8 records (messages 1, bytes 289)

揭露出administrator1.friendzone.red、hr.friendzone.red、uploads.friendzone.red。

好,那有人可能會問說那我知道這些,可是我又連不到,我又不知道IP是什麼,那這也是我們接下來下一步要做的事情。

┌──(root㉿kali)-[~]
└─# cat /etc/hosts
127.0.0.1       localhost
127.0.1.1       kali
172.16.1.153    hr.itop.com.tw
172.16.1.134    market.itop.com.tw
172.16.1.134    sales.itop.com.tw
172.16.1.222    wpress.itop.com.tw

#HTB Friendzone
10.10.10.123 friendzone.red administrator1.friendzone.red hr.friendzone.red uploads.friendzone.red

::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

簡單來說,就是要在/etc/hosts這個文件內新增剛剛找到的別的網域。在HTB Friendzone這一行可以看到怎麼新增的。

那Nmap可能也是整個做PT相當重要的一個工具,我們常常會使用Nmap來確認說目標有哪些port有開。可能在說我一拿到我的IP address之後,第一件事情通常就是打開Nmap這也的確是在考OSCP的時候,最常見也最快速的一個做法。

使用Nmap的目的在於了解你的目標,比如說哪些port是打開的,以及說這些port所對應的service是什麼。那使用Nmap這樣的工具,可以快速的讓我們對目標有一個大方向的了解Nmap這個工具它支援的功能非常非常多,那我們主要是趕快用Nmap了解目標,並且做更深的滲透測試。

有幾件事情我們希望透過Nmap來了解一下。第一個是剛剛提到的port number哪些有開,第二個如果它是service的話,我們可以透過Nmap來查看說它的版本;第三個我們要看的是我們目標的OS。

Nmap最簡單的用法就是直接Nmap,然後給出你的target IP或者是URL。那如果說你今天比較懶惰一點的話,你可以直接帶-a,-a的option,基本上就是自動幫你做一些掃描,然後帶T4這個option以及-p-。這個-p-它是會幫助你掃描從port 1到65535,也就是所有的port,這邊都是針對TCP的部分。

如果想要掃描的詳細一點的話,我們可以使用比如說像是-sV,我們可以來看看說它的service,或者是它的可能版本的number;以及-sc,這個option的意思是script scan,也就是使用Nmap的nse這個script來做default scan。我們也可以使用-oa這個option,這個option是我們可以把掃描的結果,透過像是GNmap、Nmap以及XML這三種格式來做output。

Nmap當然也可以針對你所想要的port做掃描

# -sV : Probe open ports to determine service/version info
# -sC : equivalent to --script=default (script scan)
# -oA : output as gnmap/nmap/xml format
# TARGET_IP : 10.10.10.123
# -p  : port number

$ nmap -sC -sV -p 21, 80, 139, 445 -oA nmap/report TARGET_IP

...
Not shown: 993 closed ports
PORT    STATE SERVICE     VERSION
21/tcp  open  ftp         vsftpd 3.0.3
....
445/tcp open  netbios-ssn Samba smbd 4.7.6-Ubuntu (workgroup: WORKGROUP)
Service Info: Hosts: FRIENDZONE, 127.0.1.1; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
|_clock-skew: mean: -59m59s, deviation: 1h43m54s, median: 0s
|_nbstat: NetBIOS name: FRIENDZONE, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb-os-discovery: 
....

$ ls nmap/
report.gnmap  report.nmap  report.xml

這邊提供一些簡單的思路。第一個我們可以檢查service的版本是不是沒有更新,是不是存在已知的漏洞;第二個,像是port 80, port 443, port 8000、8080或者是8443,它可能是web service。那port 80是http,port 8000跟8080可能都是http,但是port 443以及8443有可能是https。那再來port 139, port 445,如果看到這兩個port有打開的話,可能是SMB的服務。我們可以做更深的SMB的enumeration。

來看個指令並解釋一下:

nmap -sC -sV -A -T4 -v TARGET_IP -oN init.nmap

在OSCP的這種考試,因為它考試的時間有限,所以可以先將常用的port來掃描一遍,這邊就是使用了-a, -sv來列舉service,sc是nmap的nsc script。t4它比較適合用在網路狀況非常好的情況。如果說它沒有IDS或沒有IPS的話是可以使用t4的。如果是t3的話速度會比較慢一點。再來是如果你可以用-v的話,它就是說當掃描到port的時候就先趕快print出來,可以趕快的去做更深的enumeration,而不是說等它全部掃完,再一次性的給你看完整的結果。

再來就是-on,能夠直接讓你變成一個file,其實也都是txt檔案,然後可以直接把它輸出,讓你比較方便查看。可能不需要像剛剛的-oa,-oa是有三個不同的檔案類型,其實可能不太需要。

有可能有些人會問說為什麼我們要執行os scan,那原因是在於,比如說windows server,它提供的web service通常是not case sensitive,就是不會去區分大寫小寫。那如果說我們在針對web service的話,我們未來可能會用gobuster這樣的工具去做目錄的枚舉,我們這個時候可以選擇不分大小寫的字典檔來加速枚舉。

example: Windows系統會將下面兩個link視為一樣的
http://10.10.10.10/NotSensitive
http://10.10.10.10/notsensitive

Nmap提供了script做掃描,它的格式是這樣的:

nmap -p 445 --script smb-vuln-ms17-010 TARGET_IP

如果你給了這個--script的話,就不需要再給剛剛的--sc。那這一個--script要帶的參數,上面的例子是ms17-010。

這個地方提供一個小技巧。這個smb script的掃描,可以搭配wirecard做使用,來呼叫所有,比如說這邊我是呼叫所有snb-vuln所有漏洞的ns script。

nmap -p 445 --script smb-vuln-* 10.10.10.123

那這邊做一個簡單的demo,比如說log4j然後找nmap,其實可以很簡單的就看到這邊有針對log4j這一個漏洞所推出的nmap script。那這一個script只要把它下載下來放到剛剛的那個folder裡面就可以用了。

放的位置

  • for *nix system it might be ~/.nmap/scripts/ or $NMAPDIR

指令示範:

nmap --script log4shell.nse --script-args log4shell.callback-server=172.17.42.1:1389 -p 8080 172.17.42.2

接下來要提的是,針對Web所做的一些Enumeration,會介紹一些針對Web Server可以使用的工具。第一個我們要用的是Web App Analyzer

Wappalyzer

這一個工具它可以幫你分析說你的目標它是使用什麼Programming Language來撰寫,當然也可以尋找使用特定語言寫的網站。比如說對PHP或是JavaScript特別感興趣,也可以在這上面做尋找。它並不是在OSCP上面,當然比較不使用,就是跟大家說有這樣的一個工具,大家可以去參考。

第二個我們要介紹的工具是Nikto。它是一個Web Server的掃描器,它會提供許多網站的資料,它自己也有自帶一些漏洞搜尋的引擎,所以它也是一個可以幫助你找到漏洞的工具。但是因為這個Nikto執行速度比較慢一點,所以如果Nmap Scan有掃描到網站的話,會建議趕快跑這個Nikto,不然它會掃得很久。

這個地方你在掃描的時候,如果你遇到了像剛剛所提到的Zone Transfer這樣的事情,或者是說它會來看你HTTP header中Host的header,它可能會要你認定是它所特別允許的字樣,它才會給你一種網站。如果你只是單純打IP的話,可能會把你Redirect到不同的網站,可能是一些Default網站,所以這個地方要特別注意。不管是你未來在做Enumeration,或者是使用Nikto這樣的工具的時候,如果有存在它有注意Domain Name的時候,一定要把你已知的Domain Name打到你的/etc/hosts裡面。

Nikto能掃到的東西比較沒有這麼的多,所以當然掃還是要掃,但建議不要太依賴這個工具所產出的Output,如果能手動去做Enumeration是最好的。

接下來要講的工具是GoBuster。好,那假設今天已經知道目標網站有HTTP Server,那下一步如果沒有找到它的一些有趣的資料,也沒有找到什麼登入介面,那這個時候想要暴力的找出它所有可能存在的網頁或是目錄(像是Image的目錄、檔案的目錄),或者是有什麼樣的隱藏的文件,那這個時候我們可以使用GoBuster這樣的網頁暴力掃描工具。

這邊要注意,就是GoBuster它速度非常快,然後它也吃這個字典檔,這個字典檔要稍微慎選一下。比如說像是剛剛的針對Windows系統,我們已知它大小寫不敏感,那這個時候就可以使用都是Lowercase的字典檔。

在Kali Linux有提供一些字典檔,可以從這個/usr/share/dirbuster來找到。那針對字典檔的部分,推薦一個叫SecLists。它提供了非常非常豐富的字典檔,不只針對Web Server所做Enumeration的部分,也會針對像是Password來提供各式各樣的字典檔。

那這邊它也會有提供很多不同的,針對比如像是Drupal、Joomla或是Wordpress所設計出來的字典檔,大家未來在Lab或者是考試中如果有遇到也可以去做使用。

接下來回到GoBuster。在使用GoBuster的時候,必須要先了解你的目標有可能存在怎麼樣的extension(副檔名)。比如Linux,可以嘗試看看PHP、HTML或者是Config;如果是Windows,可能要注意一下你可能會出現aspx這種針對Windows Server所推出的Web伺服器。

如果你的Extension你設的不好,設的太多的話,掃描速度會慢許多。首先可以看這個GoBuster,這個Directory掃描的Mode,然後帶一組URL,之後要帶我們的WordList(字典檔),個人的喜好會使用這個DirBuster裡面所提供的list-2.3-median.txt,因為它的算是掃描的速度夠快,然後也還算是夠詳細。那當然如果掃描不出來的話,也可以使用更大的檔案,更完善的字典檔去做掃描。

那如果說今天一不小心在terminal貼上了東西,你游標要到最前面的時候,你可以按Ctrl+A。那如果你今天在最前面,想要到最後面怎麼辦,可以按Ctrl+E。

gobuster dir -k -x php -u https://friendzone.red/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,html

GoBuster它也支援了可以濾掉不要的HTTP return code。比如說我不要404,或者是不要30多的這種redirect的部分。可以用把它pipe,然後做grep -v 301。

gobuster dir -k -x php -u [https://friendzone.red/](https://friendzone.red/) -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,html | grep -v 301

想要加速的話可以用-t這個option,可以在-w前面加個-t 30,代表30個thread。

list-2.3-median絕大多數的結果都可以掃描出來,那如果一些比較特別的情況下,比如說它的題目就是故意要考你一些它隱藏的word list,那可能要用比較大的word list去掃,才能掃得出來。










Related Posts

Why you should or shouldn't use Google DNS?

Why you should or shouldn't use Google DNS?

菜比八寫後端(1) - MySQL簡介

菜比八寫後端(1) - MySQL簡介

關於 .gitignore

關於 .gitignore


Comments