Noted

The whole team runs on Noted: standups, 1:1s, customer calls, all captured and summarised. Past the notes and the settings there's an internal admin area the staff use to run the workspace. Your objective is to reach it.

Room Description

Noted — figure 1

https://dashboard.webverselabs-pro.com/events/noted

Briefing

The whole team runs on Noted: standups, 1:1s, customer calls, all captured and summarised. Past the notes and the settings there's an internal admin area the staff use to run the workspace. Your objective is to reach it.

Initial Analysis

We have a pitch for a note taking application that uses some sort of AI.

Noted — figure 2

This is probably just a transcription and summary bot. We have a couple of endpoints available before registering an account:

    <nav class="nav" aria-label="Primary">
      <a class="nav__link " href="/product">Product</a>
      <a class="nav__link " href="/templates">Templates</a>
      <a class="nav__link " href="/pricing">Pricing</a>
      <a class="nav__link " href="/help">Help</a>
    </nav>

    <div class="topbar__cta">
      
        <a class="btn btn--ghost btn--mini" href="/login">Sign in</a>
        <a class="btn btn--primary btn--mini" href="/register">Get Noted</a>
      
    </div>

The product endpoint is more or less fluff text leading us to registration again.

Noted — figure 3

The templates endpoint is just a sales pitch on what the application offers.

Noted — figure 4

Pricing of course is about how much you'll pay if you do end up buying this application.

Noted — figure 5

Notably, the Team plan leads to a /help endpoint which is the next section.

Noted — figure 6

This is actually a very helpful section. We have the route to actually finding the flag. We have an e-mail for the admin account, as well as instructions how to reset our password, but I digress, let's create an account and see what options we have.

Finding the bug

Registration is all normal.

Noted — figure 7

We get a session cookie, it isn't a JWT. Let's see the dashboard.

Noted — figure 8

Okay, we have a search functionality, and a settings functionality, everything else doesn't work or redirects back to one of the starting pages before we had an account.

For the search functionality we can test out whether there's an angle for SQLi by either inserting a quote (') or by adding an always true boolean statement to see whether we get an error or different/all of the results.

' OR 1=1 --
Noted — figure 9

Unfortunately, no error, nor result differences. So we have to move on the the settings section.

Noted — figure 10

We have been put under the Free plan, we can look for some editable fields in Connected Accounts or Security and maybe upgrade our plan to Pro if we can send over a PUT request and that field is editable.

The connected accounts section is just fluff.

Noted — figure 11

And now we have something interesting, a change password function that might be sending in other fields as well, like the plan and things, let's try and change our password.

Noted — figure 12

And the request we send over alongside the response:

Noted — figure 13

Exploitation

From the request and response pair we can see that the e-mail parameter is user supplied. It doesn't look like there's any cross-referencing with the session cookie whether the e-mail belongs to you, so the idea we can go with, since there's nothing requiring the old password either, is supply the administrator e-mail from the /help endpoint and change the password to something we know.

We just change the body we sent originally that was:

{"email":"[email protected]","newpass":"minatour"}

to:

{"email":"[email protected]","newpass":"minatour"}
Noted — figure 14

After this, we sign out of our minatour account and try to login to [email protected] with our new credentials. We can see it's a successful login.

Noted — figure 15

Within the navigation bar now we also see that we have an Admin endpoint.

Noted — figure 16

Navigating to it we can see the flag and the members within the application.

Noted — figure 17