今天要來聊聊 Active Directory,嗯,就是大家常說的 AD。說真的,在大部分的公司網路裡,AD 根本就是心臟一樣的存在,管著所有人的帳號、權限,什麼大小事都歸它管。所以啊,對我們這種搞滲透測試或紅隊演練的人來說,AD 自然就成了第一個想「拜訪」的地方。你只要能從 AD 找到一個小小的破口,常常就能像抽線頭一樣,一路抽絲剝繭,最後摸到整個公司的內部網路。
我自己是覺得,與其看一堆理論,不如直接動手做一次最清楚。所以我就自己架了一個小小的 AD 環境,叫做 `jgpython.lab`,然後模擬一下,如果我是一個完全狀況外的攻擊者,我會怎麼一步一步地把使用者帳號給「猜」出來,然後拿著這個帳號去內網亂逛。這整個過程,其實... 嗯,比很多人想像的要簡單,但也充滿了各種細節。
重點一句話
老實說,攻擊者根本不需要什麼超強的駭客技術,只要利用 AD 環境裡一些常見的設定小疏忽,像是 Kerberos 驗證機制和 SMB 檔案分享的漏洞,就很有機會拿到第一張進入內部網路的門票。
攻擊成功大概就像這樣
在我們深入聊那些指令跟工具之前,先直接看看最後會發生什麼事。想像一下,經過前面一連串的偵察和嘗試,我現在已經用一個「看起來合法」的員工帳號,登入了公司的檔案伺服器。進去之後,我下了一個 `ls` 指令,想看看裡面有什麼... 結果就看到下面這些東西:
唉呀,`confidential_report.pdf`、`payroll_info.xlsx`... 這些檔名,光用看的就覺得很刺激吧?攻擊者看到這種東西眼睛都會亮起來。接著,他可能只要用一個 `get` 指令,就能把這些機密檔案,像是薪資單或公司機密報告,全部下載到自己的電腦上。
不只這樣,更可怕的是,如果權限沒設定好,他還可以用 `put` 指令,把他自己寫好的惡意程式,比如一個叫做 `malware.exe` 的東西,直接上傳到公司的共享資料夾。這就等於是在你家裡放了一個後門,他隨時可以回來,做更深入的破壞。這整個過程,就是我們說的「初期訪問」和「橫向移動」的開端。
那...究竟是怎麼做到的?
好,看了上面那個有點嚇人的結果,你可能會好奇,到底是怎麼從一個外部網路,一路摸進來到可以存取內部檔案的?這裡我把它拆成幾個步驟,基本上就是我當初在自己 lab 環境裡跑的流程。
第一步:猜猜誰是合法員工?用 Kerbrute 列舉帳號
一開始,我手上什麼都沒有,只知道公司的網域名稱(`jgpython.lab`)跟網域控制器(DC)的 IP 位址。我總不能一個一個密碼亂試吧?那樣太蠢了,而且馬上就會被防火牆或資安設備發現。所以,第一件事是先弄清楚「這間公司到底有哪些員工帳號」。
這時候 Kerbrute 這個工具就超好用。它的原理很有趣,它不是真的去「登入」,而是去跟 AD 的 Kerberos 驗證服務(通常在 port 88)打交道,禮貌性地問:「嗨,請問一下,有沒有一個叫做『Steve.rogers』的員工啊?」如果 AD 回應說「有這個人喔,請他提供票證」,那 Kerbrute 就知道這個帳號存在。如果 AD 回應是「查無此人」,那就換下一個。
所以我就準備了一份使用者清單 `userlist.txt`,裡面放了一堆亂掰的名字,但偷偷塞了幾個我知道確實存在的,像是 `Administrator`、`Steve.rogers`、`Ryan.reynold`。然後下了這個指令:
kerbrute userenum -d jgpython.lab --dc 10.80.80.2 userlist.txt
你看,指令也很直白,`userenum` 就是使用者列舉,`-d` 指定網域,`--dc` 指定控制器在哪。跑完之後,結果真的蠻清楚的。
就這樣,`Administrator`, `Steve.rogers`, `Ryan.reynold` 這三個帳號被確認是「活的」。這下我就有目標了。
第二步:看看門有沒有鎖?用 CrackMapExec 掃描 SMB 服務
有了使用者名稱之後,下一步就是看看我能用這些帳號做什麼。公司內網最常見的服務之一就是 SMB(Server Message Block),簡單講就是 Windows 的檔案分享服務。我可以用 CrackMapExec(簡稱 CME)這個工具來快速掃描一下目標主機開了哪些 SMB 相關的服務,而且順便看看有沒有什麼明顯的漏洞。
crackmapexec smb 10.80.80.2 -u '' -p ''
這裡的 `-u '' -p ''` 是指我用空的使用者名稱和密碼去試,也就是匿名或訪客(Guest)的身份。結果跑出來的資訊很有意思:`Guest access allowed`。哇,這就是一個小小的破口。這代表任何人,就算沒有帳號密碼,也能用「訪客」身份連上這台主機的某些服務。
對了,這個 Guest access 被打開的情況,在現實世界中其實蠻嚴重的。如果你的公司是受台灣《資通安全管理法》規範的關鍵基礎設施提供者,光是這一點在稽核時就可能是一個大問題,因為它直接違反了身份鑑別與授權控制的基本原則。這跟國外像 NIST 或 ISO 27001 這些安全框架的要求精神上是一致的,但在台灣,這可是有白紙黑字的法規在管的。
第三步:借一張入場券來用,也就是「傳遞票證攻擊」(Pass-the-Ticket)
雖然發現了 Guest access,但訪客的權限通常很低。我想要更高的權限,所以我把目標鎖定在剛剛找到的 `Steve.rogers` 這個帳號上。這裡假設我透過某些方法(例如釣魚郵件、或是這個 lab 環境裡的弱密碼 `Password123`)拿到了他的密碼。
拿到密碼後,我就可以用 Impacket 工具包裡的 `getTGT` 來跟 Kerberos 申請一張「票證授予票證」(Ticket Granting Ticket, TGT)。你可以把 TGT 想像成去遊樂園時,在門口買的那張主要門票。有了這張門票,你才能去玩園區內的各項設施。
impacket-getTGT jgpython.lab/steve.rogers:Password123 -dc-ip 10.80.80.2
執行成功後,它會存下一個叫做 `steve.rogers.ccache` 的檔案。這個檔案就是那張 TGT 門票。最關鍵的一步來了,我只要在我的攻擊機上設定一個環境變數:
export KRB5CCNAME=steve.rogers.ccache
做了這個設定之後,我這台電腦接下來所有跟 Kerberos 相關的連線請求,都會自動帶著這張「steve.rogers 的 TGT 門票」去驗證。也就是說,我不用再輸入密碼了,我就是 `Steve.rogers` 本人。這就是所謂的 Pass-the-Ticket 攻擊,超實用。
第四步:登堂入室,逛大街
好,我現在「身份」是 `Steve.rogers` 了。我就可以用 `smbclient` 這個工具,大搖大擺地去問 DC 有哪些共享資料夾可以逛。
smbclient -L //10.80.80.2/ -U "steve.rogers"
(嗯... 其實在原始的筆記裡我是用 Administrator,但在這個階段用剛拿到的 steve.rogers 會更貼近真實情境。)
結果一列出來,我看到了 `Shared_Documents`。這名字一看就是目標啊。於是,我直接連進去:
smbclient //10.80.80.2/Shared_Documents -U "steve.rogers"
進去之後,就回到了我們一開始說的那個場景。我可以下載機敏檔案,也可以上傳我的惡意程式。整個初期滲透就完成了。
各種工具的比較,還有我自己的看法
在整個流程中,我用了好幾個工具,它們各有各的強項。我自己是這樣看的啦:
| 工具 | 主要用途 | 我個人覺得最酷的點 | 要注意的地方 |
|---|---|---|---|
| Kerbrute | 就是拿來猜 AD 帳號的。速度快而且相對安靜。 | 它不是真的去登入,所以比較不容易觸發「登入失敗」的警報。對藍隊來說,這種行為比較難抓。 | 你得先有一份品質還不錯的字典檔,不然就是大海撈針。還有,如果帳號太多,跑起來還是要點時間。 |
| CrackMapExec (CME) | 掃描內網服務的瑞士刀。特別是 SMB、WinRM、LDAP 這些。 | 它可以一口氣對整個網段做測試,而且會把結果整理得超清楚。像 `Guest access allowed` 這種好康,它會直接標出來。 | 功能太強大了,參數也多,初學者可能會有點眼花撩亂。而且它的行為比較「吵」,容易被偵測到。 |
| Impacket | 處理各種網路協定的工具包,根本是滲透測試界的聖經。 | 它幾乎把所有 Windows 相關的網路認證、遠端執行都實作一遍了。像 getTGT 只是它幾十個工具裡的一個,超級猛。 | 它比較偏底層,你要很清楚你在幹嘛。它不會給你太多提示,下錯指令就是沒反應,要自己 debug。 |
紅隊攻擊 vs. 藍隊防守,這場攻防戰的思路
講了這麼多攻擊手法,那... 如果你是防守方(藍隊),該怎麼辦?其實這就是一場永無止盡的貓捉老鼠遊戲。
從紅隊(攻擊方)的角度來看:
- 資訊就是力量: 我會花非常多時間在初期偵察,用 Kerbrute 這種工具慢慢磨,盡量不發出聲音。拿到一個有效帳號,比找到十個漏洞還重要。
- 找尋最弱的環節: 我不會去硬碰硬。我會找 `Guest access allowed` 這種設定錯誤、或是沒人管的共享資料夾。這些地方通常是防禦最薄弱的。
- 濫用正常功能: 你看,我整個過程用的 Kerberos 驗證、SMB 檔案分享,全都是 Windows 的「正常功能」。我只是用一種「不正常」的方式去組合它們。這也是為什麼防禦很困難。
從藍隊(防守方)的角度來看:
- 監控異常行為: 防不了工具,但可以監控行為。例如,短時間內出現大量來自同一個來源的 Kerberos TGS 請求(Pre-authentication),但很多都失敗了,這就很可能是 Kerbrute 在掃描。或是,一個從來沒登入過的服務帳號,突然開始存取共享資料夾,這也很可疑。
- 落實最小權限原則: 這是老生常談,但真的最重要。`Guest` 帳號就應該被停用。`Shared_Documents` 真的需要讓「所有人」都能讀寫嗎?是不是只有特定部門的特定人員才需要?權限切得越細,攻擊者能走的路就越窄。
- 強化基本功: 像 SMB signing 這個設定,在我的 lab 裡是啟用的,它可以防止某些中間人攻擊。雖然這次用不到,但這些基礎的安全性設定都應該要打開。還有,定期稽核 AD 裡的帳號、群組和 GPO 政策,清除掉沒在用的廢棄帳號。
常見的誤解與釐清
說到這個,很多人會有一些常見的迷思。我自己是覺得有幾點可以提出來講一下。
第一個是,「我們公司有很強的密碼政策,所以很安全」。這不完全對。你看我第一步用的 Kerbrute,它根本沒在試密碼,它只是在確認「帳號是否存在」。就算你的密碼是火星文,只要帳號被列舉出來,攻擊者就有下一步的目標。他可以針對這個特定帳號去進行釣魚攻擊,或是尋找其他漏洞。
第二個誤解是,「只要把 SMB port (445) 對外關閉就好了」。嗯,對,對外網關閉是基本常識。但我們這裡模擬的場景是,攻擊者已經透過某種方式(例如釣魚郵件裡的惡意附件)在公司內網的一台電腦上取得了一個低權限的 shell。這時候,他就是在「內網」裡活動了,內網的 SMB 通常是互通的。所以防禦不能只考慮邊界,也要考慮內部網路的橫向移動。
所以說,AD 安全真的是一個系統工程。它不是單點的問題,而是一連串設定、監控和管理流程的組合。任何一個環節鬆了,都可能成為破口。
看完這個從猜帳號到偷檔案的完整流程,你覺得哪個環節最讓你意外?或者,如果你是公司的 IT 管理員,你會選擇優先加強哪個部分的防禦?是想辦法讓 Kerbrute 失效,還是嚴格控管 SMB 的存取權限?在下面留言分享你的看法吧!
