*白百合めも*

セキュリティ中心に毎日の勉強の記録を書くよ*

CTF for Beginners(オンライン)に参加したよ🍬

みなさんこんにちは!!白百合です🍰
今回は、オンラインで開催されたCTF for Beginnersの悩んだ記録(writeupと言っていいのかわからない)を書こうと思います!

この問題はこんな感じで解いた〜、とか、この問題はここまで解いたけど、ここから分からなかった〜とか、そんなゆるい雰囲気でいきます!
正直自分の解き方が合ってるのか全く分からないので、発信することで「そこは違うよ!」と指摘していただけたら嬉しいな・私と同じ立場の人たちの勇気付けになったらいいなと思いで書きました。。
CTFは超初心者なので 、ご指摘をどうか……お願いいたします……。

白百合のCTF歴は
・CTF for GIRLSの講義(フォレンジック)に出た
ksnctfの問題を2問くらい解いた

という感じなので、今回が初競技でした!

どんな問題出るのかもどんなツール使うのかも分からないけど、
オンラインだし、24時間だし、
ググって頑張ればなんとかなるかなと思い挑みました(`・ω・´)

結果は、
f:id:white-lily6u6:20180527132542p:plain
Welcome問題+5問解けました!!やったー!!
正直1問解けたらいいなぐらいの気持ちだったのでめっちゃ嬉しいです。
昨日の夜4時まで起きていた甲斐があった……笑


※この記事では私がどのように問題を解いたかを載せますが、
ずれていたり、かなり遠回しな解き方をしているものがほとんどだと思われます。 正確さを求める方は他の方の素晴らしいwriteupをご覧になってください。


では、ざっと書いていきます!
解き方違う!!っていう部分が多々あると思われますので教えてください。。。

[Warmup] Welcome ---Misc

こちらは、運営さんとのやりとりに使うIRCというチャット?がちゃんと使えるかの確認問題でした。
IRCに行くと、Flag for welcome: ctf4b{welcome_to_seccon_beginners_ctf} と書いてあるので、これを入力すればOKです♫
(最初確認問題だと知らなくて、Miskとか何か分からないしと思って後回しにしてました……ポイントが……)

[Warmup] plain mail ---Misc

packet.pcap というパケットデータのファイルを渡されて、その中のフラグを見つける問題でした。
最初、とりあえずWireSharkで開いてみると、
f:id:white-lily6u6:20180527134325p:plain:w200
こんな文字列が。
おお!最初に暗号化されたファイルを送って、そのあとにそれを解くためのパスワードを送ったのね!
その後、適当にlength大きめのパケットを右クリックしてTCPストリームというものを見てみると、
f:id:white-lily6u6:20180527135222p:plain
こんなのとか。

f:id:white-lily6u6:20180527135042p:plain
こんなのが出て来ました。 おそらく、encrypted.zipというファイルが _you_are_pro_というパスワードで解凍できる、ということなのでしょうが、
WireSharkで、パケットから、送られているzipファイルを落とす方法がわからない…… (そもそもzipファイルが送られているパケットはどれ??状態)
一応調べたのですがわからなかったので、今回は潔く別のツールを使うことにしました。 (他の方の感想ではみんなWireSharkでやってるみたいだったので教えてください……)

WireSharkは断念し、Windowsで動く「NetworkMiner」というツールを使います。
これを起動し、packet.pcapを食わせて「File」を開くと・・・
f:id:white-lily6u6:20180527145100p:plain
なんと!今回やりとりされているファイル群が表示されているではありませんか!
([1]って書いてあるのは気にしないでください。本来は入ってない。)

これをフォルダに落とすとこんな感じ。
f:id:white-lily6u6:20180527145144p:plain
3つのemlファイルの中身は、上の方でWireShark上で確認したものなので、割愛します。
encrypted.zipを開いて、_you_are_pro_ で解凍すると
f:id:white-lily6u6:20180527145914p:plain
フラグが出て来ました!


てけいさんえくすとりーむず --Misk

こちらは、対象環境にncした結果が以下。
f:id:white-lily6u6:20180527152319p:plain
300秒の間に、計算問題を100問解かないといけないみたい。(最初試しに手動でやってみたら20問ちょいで時間が来てしまった)
これはスクリプトで自動的に解いてもわないと!
ということで、pythonで書きました。(私が前に書いたブログを参考にした)
他の方の解答を見ると、もっともっと短く書けるみたい。

import socket

HOST = "ここに相手のホスト名を書くよ"
PORT = ここに相手のポート番号を書くよ

s= socket.socket(socket.AF_INET , socket.SOCK_STREAM)
s.connect((HOST , PORT))

i = 0;
while True:
    i+=1
    print(i)
    row_res = s.recv(1024)
    print(row_res.decode("UTF-8"))
    res = row_res.decode("UTF-8").split()
    string = res[-4] + res[-3] + res[-2]
    ans = str(eval(string))
    sendstr = ans + "\n"
    print("送った文字:" + sendstr)
    s.send(sendstr.encode("UTF-8"))

    if i == 100:
      break

flagans=s.recv(1024)
print(flagans.decode("UTF-8"))
s.close()

これで一応、最後にフラグが返って来ました!
f:id:white-lily6u6:20180527154801p:plain


[Warmup] Greeting --Web

これに関しては、cookieに"admin"をセットして解くらしいのですが、
adminをPOSTしてから、「偽管理人ってなんだよー!」ってなってURLをもう1度叩いたらFlagが出て来てしまいました。
cookieのやり方もあとで見るぞ。



[Warmup] Veni, vidi, vici --Crypto

これは楽しかった!!レ○トンみたいだなって思いながら解きました!
渡されたzipファイルを開くと、「part1」「part2」「part3」と書かれた3つのファイルが入ってます。
中身はそれぞれ以下。
part1→ Gur svefg cneg bs gur synt vf: pgs4o{a0zber
part2→ Lzw kwugfv hsjl gx lzw xdsy ak: _uDskk!usd_u
part3→ {ʎɥdɐɹɓ0ʇdʎᴚ :sı ɓɐlɟ ǝɥʇ ɟo ʇɹɐd pɹıɥʇ ǝɥ⊥


私これ見たことある!!文字ずらす系のやつだ!!ってテンションが上がりました笑
part1とpart2の、:の前は「flag is」だな!とわかるので、
暗号生成ツール - 暗号くん
こちらのサイトで、平文に「synt」や「xdsy」を入れて、シーザー式暗号で「flag」になるには何文字ずらせばいいかやってみました。

すると、part1は13文字、part2は8文字ずらせば良いことがわかり、
実際のフラグ部分を(数字と記号はそのままにして)その文字数分だけずらすと、
ctf4b{n5more と、_class!cal_cに なりました。
あとは、part3の上下逆さまを直してくっつけてあげると、
ctf4b{n0more_cLass!cal_cRypt0graphy}
となります(`・∀・´)


[Warmup] Simple Auth --Reversing

自分が解いた中だとこれが1番悩みました。
(実際は、ltraceというコマンドで解けるらしい?)
渡されたzipの中には、「simple_auth」というELF実行ファイル(fileコマンドで確認)が入っていました。
実行結果は以下。
f:id:white-lily6u6:20180527162445p:plain:w300
パスワードを聞かれ、適当に答えると、違うよ〜と言われてしまいます。

正直この手の問題はどうしたら良いのかさっぱりだったのですが、調べてみたところ、
Reversing(とかPwn)には、
IDA (Pro・Free)」と「gdb」というツールがめっちゃ役に立つらしい。

早速上記のツールを入れて、まずはIDAさんにsimple_authを食わせてみました。
すると!!!
f:id:white-lily6u6:20180527163040p:plain
この実行ファイルがどんな動きをするのか、フローで出てきました。(上に載せてるのはmain関数内)なんだこのツール、すごい・・・
見た感じ、eaxという変数に1が入っているとき、Flagが表示される方に分岐するみたいですね。
この後、何時間もかけてgdbを使い、eaxに1を入れてFlagを表示させようとしたのですが、なんどやってもFlagには自分が最初に入力したパスワードが出てきてしまいました。
一体どうなってるのよ!!と思い、上の図をもう1度見ると、「auth」という関数があることに気づきます。
中をのぞいてみると……
f:id:white-lily6u6:20180527163724p:plain
ここにもたくさんの処理が書いてあります。
すると、上の方に「;s」という文字を発見し、「あれ、さっきmain関数内で edi, offset aFlagIsS ; "Flag is %s\n" って書いてあったな。このあたり怪しいんじゃない??」と思い、ここに狙いをさだめました。

IDAでも処理をおっていけるらしいのですが、私のIDAは反抗期なのか(?)できなかったので、gdbで行なっていきました。
gdbという言葉もアセンブリという言葉も今まで1度も発することなく生きてきた人間なので、いろんなサイト様を参考にさせていただきました。
こちらが神だった。
gdbの使い方のメモ - ももいろテクノロジー

では、gdbを起動して、さっきの;sの付近で色々やってみようと思います。

$gdb simple_auth 

(gdb)disass auth //auth内のアセンブリコード?達を表示
   ...
   0x000000000040070c <+134>: mov    -0x48(%rbp),%rax
   0x0000000000400710 <+138>: mov    %rax,%rdi
   0x0000000000400713 <+141>: callq  0x400530 <strlen@plt>
   0x0000000000400718 <+146>: mov    %eax,-0x38(%rbp)
   0x000000000040071b <+149>: lea    -0x30(%rbp),%rax
   0x000000000040071f <+153>: mov    %rax,%rdi
   0x0000000000400722 <+156>: callq  0x400530 <strlen@plt>
   0x0000000000400727 <+161>: mov    %eax,-0x34(%rbp)
   ...

(gdb) b *0x40070c //0x000000000040070cにブレイクポイントを作る
Breakpoint 1 at 0x40070c

(gdb) r //ブレイクポイントまで走らせる(run)
Starting program: /home/.../simple_auth 
Input Password: 12345 //適当に入力

Breakpoint 1, 0x000000000040070c in auth ()

(gdb) until *0x40071f //0x000000000040071f まで処理を進める
0x000000000040071f in auth ()

(gdb) x/s $rdi //変数rdiを表示してみる。さっき入力したパスワードだ!
0x7fffffffe4b0: "12345"

(gdb) x/s $rax //変数raxを表示する。Flagが出てきた!
0x7fffffffe470:"ctf4b{rev3rsing_p4ssw0rd}"

一応Flag出せたけど、分からないことだらけなのでもっと勉強しないとなぁという気持ち!



ここまでが、白百合が解いた問題でした!
あとは、途中までやってみようとしたけど断念した問題も、自分の記録用に書いていきます🍦🌹


できなかった問題達

[Warmup] condition --Pwn

こちらは、ホスト名とポートと、ELFファイルが渡され、「あなたは flag にアクセスする権限を持っていますか?」という問題文でした。
書いてあったホストにアクセスしてみると、
f:id:white-lily6u6:20180527172704p:plain:w300
名前を聞かれ、適当に入力すると、違うよと言われてしまいました。


とりあえずは、ELFファイルなので、先ほど登場IDAさんに食わせていきます。
すると、こんな感じ!
f:id:white-lily6u6:20180527172929p:plain
見た所、[rbp+var_4] に、0DEADBEEFhという文字列が入って入れば、flag.txtが表示されるらしいですね!
……ということまでは分かったのですが、これ以上何をしたらいいのか分からずに断念してしまいました!
他の方のwriteup見るぞー!


Find the messages --Misk

「ディスクイメージに隠されているメッセージファイルを探せ!」という問題文と共に、zipが渡されました。
解凍すると、ディスクイメージファイルが出てきます。
こういう系の問題は、前にCTF for GIRLSで習った「FTK Imager」が役に立ちそう!と思い、FTK Imagerを起動し、Image Fileでdisk.imgを選択します。
すると、
f:id:white-lily6u6:20180527173837p:plain
このように、3つのmessageファイルが出てきました!

message1の中に入っているテキストファイルを開くと、何やら文字列が表示されるので、 これをBase64でデコードしてやると(最後の=がBase64感あるよね)、 ctf4b{y0u_t0uched となります!!!

あとは、message2とmessage3からそれぞれflagをゲットすればできる!!とテンションが上がったのですが、力が及びませんでした……。

message2
中に、png拡張子のファイルが入っていた。画像は表示されず、fileコマンドを叩いたところ、「data」と出る。
バイナリエディタでこれを開いて「CTF」や「FLAG」などそれっぽい文字で検索をかけるが見つからない。

PNG」の前まで全消ししたりとか、
Forensics入門(CTF)
ここに載っているツールを片っ端から試してみたけど分からなかった。

あ、ちなみにvimバイナリエディタになるって知ってすごいびっくりしました。
ファイルをviで開いて、:% ! xxdって打ってエンター押すだけ。すごい。


message3
中にpdfファイルが入っているような雰囲気があるのに、どこにも見当たらない。
これもいろんなコマンド試してみたけど分かりませんでした。



他の問題もちょこちょこ見てはみたものの、取っ掛かりも掴めなかったので、
writeupを見て今後は解けるようにしていきたいです!!



それにしても、みんなでやるゲーム!っていうものをやるのが久々だったから、楽しかったなぁ🍘
僕のヒーローアカデミアのサントラをBGMにしてやっていたらテンション上がっちゃいました(*^ー^*)
これでCTF初デビューできたから、今度は力つけて他のCTFにも参加してみるぞー🌺

なんどもうるさいですが、間違ったこと書いていたり、これは書いちゃいけない内容だぞっていうのがあったら、そっと教えていただけると、とてもとても嬉しいです(><)💦

あと、これすごい疑問なんですけど、結構Windowsだけでしか動かないツールってあるじゃないですか。
そういうのって、Mac勢の方はどうやってるのでしょう……?
今回は家だったから隣にWindowsがあって助かったのですが、外でやるとしたら、
CALライセンス買ってVMで解く的な感じでしょうか……??
このあたりのことも全然分かっていないので、教えていただけると嬉しいです。


では、今回はこのへんで!
今日も読んでいただきありがとうございましたm( )m