こんとろーるしーこんとろーるぶい

週末にカチャカチャッターン!したことを貼り付けていくブログ

HumanCTF 2018 - Nice design, Bro

問題文

One of our designers made cool gold cards. And for some reason he added numbers.

f:id:graneed:20181014005313p:plain

writeup

正しいクレジットカード番号を入力しろとのこと。

どれか1文字が?になっているクレジットカード番号が、placeholderにセットされている。

手作業で、?に適当な数値をいれて試していると、レスポンスの殆どがHTTPステータスが302だが、稀に200が返ってくることがわかる。正しいカード番号の場合、200が返ってくるようだ。

ただ、正しいカード番号の場合でも、302が返ってくることもある。
よくわからない。

placeholderで与えられるカード番号はランダムでなくパターンがあることがわかる。
カード番号のバリエーションを取得するため、スクリプトを作成した。

import requests
import re

URL="http://ctf.knastu.ru/webch/cards/gold"
pattern = 'placeholder="(.+)">'

r = requests.get(URL)
m = re.search(pattern, r.text)
if m:
    number = m.group(1)
    print("[+]number     =",number)
else:
    exit(1)

while True:
    flag = False
    for i in range(10):
        for j in range(10):
            card_number = number.replace("?",str(i))
            r = requests.post(
                URL,
                data={"card-number":card_number},
                allow_redirects=False
            )
            m = re.search(pattern, r.text)
            if "HumanCTF{" in r.text:
                print(r.text)
                exit(0)

            if m:
                print("[+]card-number=",card_number)
                number = m.group(1)
                print("[+]number     =",number)
                flag = True
                break
        if flag:
            break

結果、スクリプトを実行しているとフラグが降ってきた。 実行結果は以下。

[+]number     = 86018945306991?
[+]card-number= 860189453069916
[+]number     = ?69350876618253
[+]card-number= 169350876618253
[+]number     = 51944461476199?
[+]card-number= 519444614761991
[+]number     = 74705?779598669
[+]card-number= 747058779598669
[+]number     = 667?18296376020
[+]card-number= 667918296376020
[+]number     = 77251122409?241
[+]card-number= 772511224091241
[+]number     = 348?25600232487
[+]card-number= 348625600232487
[+]number     = 35544?989310368
[+]card-number= 355446989310368
[+]number     = 8288?1876906683
[+]card-number= 828841876906683
[+]number     = 28337872316720?
[+]card-number= 283378723167209
[+]number     = 70?673080984881
[+]card-number= 709673080984881
[+]number     = 92331906373?396
[+]card-number= 923319063733396
[+]number     = 1593020738?2606
[+]card-number= 159302073882606
[+]number     = 6145?2964936572
[+]card-number= 614502964936572
[+]number     = 1?7029011677589
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Gold Card - Überbank</title>
(snip)
                    <form action="/webch/cards/gold" method="POST">
                        <div class="form-group">
                            <label for="card-number">Enter the right number:</label>
                            <input type="text" name="card-number" id="card-number" class="form-control"
                                   placeholder="HumanCTF{giv3_m3_y0ur_CVC}">
                            <small id="card-number-help" class="form-text text-muted">
                                Example: ?78282246310005 -> 378282246310005
                            </small>
(snip)

Cookieをセットしていないため、連続正解の判定はされていないはずである。
おそらく、正しいクレジットカード番号を入力すると、ランダムでフラグが降ってくるものと想定される。

何はともあれフラグゲット。
HumanCTF{giv3_m3_y0ur_CVC}