Ciruelaの成長日記

将来の初心者の方のために,僕がプロになるまでの過程をここに残しておこうと思います.

CyberRebeatCTF 少しだけwrite-up

おそらくすでに超サイヤ人の方々が色々書かれていらっしゃるので,私は2問だけwrite-upを書きます...
レベル自体は自分にとって難しすぎることなく,楽しかったです!

SimpleBinary

64bitELFで,実行しても何も起こりません.ということで,IDAを使います.まず目を引くのは,26バイトの領域に即値を入れており,その26という長さもある領域に書き込んでいるということです.そしてその後,esiにバイト数の26(=0x1B),rdiに26バイトの最初のアドレスを格納し,sub_400546に渡します.
f:id:verliezer93764:20180909190907j:plain
sub_400546では,さらにvar_70からvar_Cまでの26バイトにかけて即値を代入しています.そして,その後は26回のループに入ります.したがって,このループではmainで定義した,あるいはsub_400546で定義した26バイトのバイト列について1バイトずつ何かしらの操作を行っていくと考えました.
f:id:verliezer93764:20180909191351j:plain
f:id:verliezer93764:20180909191608j:plain
あとはループの中でどのような操作が行われているか考えます.けっこう時間がかかってしまい,コメントでぐっちゃぐちゃになってしまいましたが,落ち着いて一行ずつ読んでいったところ,ここでは以下のpythonスクリプトと同様なことを行っていることがわかりました.Cで書いたほうが正確にできたなあ,と反省しています.なお,ループの最後でrdxの指すアドレスに操作結果の値を代入しているため,これが答えにつながると考え,表示を行っています.

import sys

input_26_chars =   [0x7B,0x69,0x43,0x43,0x20,0x2E,0x73,0x69,
                    0x74,0x68,0x20,0x74,0x27,0x75,0x20,0x46,
                    0x6E,0x7D,0x64,0x49,0x6D,0x54,0x67,0x61,
                    0x52,0x68]

plus_26_data = [0x03,0x0B,0x00,0x16,0x0F,0x16,0x13,0x0C,
                0x07,0x0B,0x0E,0x17,0x0F,0x17,0x01,0x14,
                0x14,0x01,0x11,0x14,0x09,0x03,0x01,0x0E,
                0x01,0x16]

for i in range(26):
    data1 = input_26_chars[i]
    tmp_char = data1

    data2 = plus_26_data[i]
    data3 = input_26_chars[data2]

    input_26_chars[i] = data3

    data4 = plus_26_data[i]
    input_26_chars[data4] = tmp_char

for i in range(26):
    sys.stdout.write("%s" % chr(input_26_chars[i]))

実行結果:CRCTF{It's a humid night.}

Uploader

まーたアップロードサイトの脆弱性を突く問題か…と思ったらSQLiの問題.
まずは定番,シングルクォーテーションマークをフォームにぶち込んでいく.するとFilename: のところでエラーが出ます.入力したfilenameをsql文で問い合わせている,といったところでしょう.
f:id:verliezer93764:20180909190716j:plain
というわけで,みんな大好き「' or '1'='1';--」を打ち込みます.すると,先ほど見えなかったユーザ"harada"によるzipファイル"secret.zip"が現れます.
f:id:verliezer93764:20180909222635j:plain
早速ダウンロードし,中にflag.txtがあることが確認されましたが,解凍するにはパスワードが必要です.そこで,サイトから更なる情報を求めます.具体的には,UserIDとPasswordを入れて,ログインするためのボタンがあるので,"harada"のIDとPassを取得し,"harada"のアカウントでログインすることを目指します.先ほどのエラー表示からsqlite3を使っていることが判明したので,googleでsqlite3のsqliについて調べます.しいて言えば,チートシートを調べます.
下記がいいでしょう.
github.com
まずは使用されているテーブルの名称がわからないと何もできないので,上の情報から「SELECT name FROM sqlite_master WHERE type='table'」または「SELECT sql FROM sqlite_master WHERE type='table'」を用いて,Union-based SQLiを行います.ちなみに,後者を行うとカラムの名称までわかるので,後者を使用します.ちなみに,今回の表ではカラムはID,FileName,Published,UploadUserの4つであることに注意し,「' union SELECT sql,1,1,1 FROM sqlite_master WHERE type='table';--」などと入力します.以下のような結果が返ってきます.
f:id:verliezer93764:20180909224947j:plain
したがって,最後に「' union select userid,password,1,1 from Users;--」を打ち込めばuserIDとPasswordがわかります.
f:id:verliezer93764:20180909225456j:plain
useridに"harada",Passwordに"seishin0129"を打ち込むと次のページが表示されます.
f:id:verliezer93764:20180909225716j:plain
この"554587c5adc54a2a2e6f"によってsecret.zipを解凍できます.
f:id:verliezer93764:20180909230130j:plain
CRCTF{Today's_internet_is_full_of_concerning_vulnerabilities}