EYCC 2025 - Web
At the beginning of the challenge, there was a normal login page with guest:guest, and everything seemed normal.

After logging in, we notice that there is an auth_token, which is a JWT Token. Let us first understand what JWT is.
What is JWT?
JWT = JSON Web Token A standard for creating a compact, URL-safe token that is signed. It’s commonly used for authentication and authorization.
Structure
A JWT has three parts separated by dots:
Header Contains metadata about the token type and signing algorithm. Example:
Payload (claims) Contains the data you want to transmit (claims). Example:
sub= subject / user idexp= expiration timeYou can add any other claims you need.
Signature Created using a signing algorithm like
HMACSHA256orRS256to ensure the token hasn’t been tampered with.
Full JWT example
Part 1 = Header (Base64).
Part 2 = Payload (Base64).
Part 3 = Signature.
What is it used for?
Authentication
User logs in once (username + password).
Server issues a JWT and returns it to the client.
Client stores it (e.g., Local Storage or Cookie).
Authorization
For API requests the client sends the JWT in the
Authorizationheader:Server verifies the signature and checks permissions.
Secure data exchange
Because the token is signed, the receiver can trust the token wasn’t modified.
In our case, when we found the Auth Token

And We used the website https://www.jwt.io/ to be able to analyze it and understand what exactly it consists of and what its contents are.

We found that the content of the header was
And the content of the payload was
We Can Crack It ?
At the start , if anyone thinks we can crack it or try to break the encryption with a wordlist, that won’t work. If you noticed above, the algorithm is RS256. It uses a key pair (public/private key), and you can’t break it with passwords, because the signature is created with the private key and the public key only verifies the signature.
Now we have two options. The first option is to try to exploit the none attack in the JWT — let's try to do it.
None Attack JWT ?

A JWT contains the header field alg to specify the verification algorithm. The JWT specification allows the "none" option (unsigned) , if the server accepts it, an attacker can change the header to none and remove the signature, then modify the token's payload (for example username: "guest" → username: "admin") to escalate privileges or impersonate a user.
You Can Read About It From Here :
Step-by-step How the attack works
Decode the original token’s header and payload (they are base64), and you’ll find it’s signed with
RS256.Modify the header to become:
{"alg":"none","typ":"JWT"}.Modify the payload (for example change
"user":"guest"→"user":"admin").Base64url-encode the header and the payload, join them with a dot, and leave out (or empty) the third part (signature):
base64url(header) + "." + base64url(payload) + "."Send the modified token to the server. If the server is weak in verification (accepts
alg=none) it will treat the token as trusted.
Practical example of the resulting header+payload after modification:
The Attack Is Work ? mm....Noo

Another Idea
As we know, the encryption algorithm used for the challenge's JWT token is HS256.
If we want to change the permission in the payload from guest to Admin, we'll need to obtain the private key.
So there's no option other than searching the website to see if we can find it.
After poking around the page source and the JavaScript files for a bit, there was nothing. We tried some common dirs like /flag or /data and still nothing.
So I thought we could use dirsearch to guess directories and see if we find anything — and we did: a directory called /vault.
It had “Your Secure Vault” written in it, so I think we’re getting close to something. Let’s keep going and see what we find.

It was hard to guess for a long time because there was a limit on the number of requests, so continuing was difficult , until a hint was posted in the last minutes of the challenge stating there’s a directory named /internal/metadata. When we opened it, we finally found the private key; at that point we could modify the payload and set admin easily.

After Open The Dir , We got base64 Private Key :
After Decode It We Got Prv Key :
Now we can use it to get a new token with elevated privileges Admin.

after changing it and using the new token, the flag appeared.

Thank you all! I hope you enjoyed the article. If you have any questions, I’m here to help.
Remember My name : everythingBlackkk
Made by <3
Github : https://github.com/everythingBlackkk
Linkedin : www.linkedin.com/in/everythingblackkk
Last updated