SECCON BeginnersCTF 2018 に参加したので write-up。
BeginnersCTF は初めての参加。オンラインだったので気軽に参加できた。
あまり時間が取れないなぁと思っていたけど、後半は結局問題解けなかったので時間はあまり問題ではなかったかも。
flagの形式がsecconとは違ったり、問題の配点が解けた人数で変動したりと、勝手が違って面白かった。
解いた問題
- Crypto [Warmup] Veni, vidi, vici
- Web [Warmup] Greeting
- Misc [Warmup] plain mail
- Misc [Warmup] Welcome
- Misc てけいさんえくすとりーむず
改めて見てみると、50点代まで点数の下がった簡単なやつだけだったなぁ。
Crypto [Warmup] Veni, vidi, vici
問題
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
全部縦書きにして、「こう書いてあるに違いない!」と強く思い込んで文字を当てはめていった。
(全然write-upになっていない)
flagっぽい形式のところとか、2回出てくるthe
とか、単語の区切りの文字数とか、そんな感じ。
G:T u:h r:e s:f v:i e:r f:s g:t c:p n:a e:r g:t b:o s:f g:t u:h r:e s:f y:l n:a t:g v:i f:s ::: p:c g:t s:f 4:4 o:b {:{ a:n 0:0 z:m b:o e:r r:e
part2
L:T z:h w:e k:s w:e u:c g:o f:n v:d h:p s:a j:r l:t g:o x:f l:t z:h w:e x:f d:l s:a y:g a:i k:s ::: _:_ u:c D:L s:a k:s k:s !:! u:c s:a d:l _:_ u:c
part3
{ʎɥdɐɹɓ0ʇdʎᴚ :sı ɓɐlɟ ǝɥʇ ɟo ʇɹɐd pɹıɥʇ ǝɥ⊥
これも行ける気がする。ただの逆さ文字。数字が入っているのに注意。
というかpart1解く前に見とけば念力がはかどったのに。
The third part of the flag is: Rypt0graphy}
合わせると
ctf4b{n0more_cLass!cal_cRypt0graphy}
no more classical cryptography.
Web [Warmup] Greeting
問題
ようこそ! http://greeting.chall.beginners.seccon.jp
言われたとおり下記にアクセス。
http://greeting.chall.beginners.seccon.jp
こんなページが表示された。
こんにちはゲストさん。 Flagは、管理者である"admin"さんにのみしか表示されません。 名前 名前を変更する <?php if(isset($_POST['name'])) { setcookie("name", $_POST['name'], time()+3600); $username = htmlspecialchars($_POST['name'], ENT_QUOTES, "UTF-8"); // 管理者でログインできる? if($username === "admin") { $username = "偽管理者"; } } elseif(isset($_COOKIE['name'])) { $username = htmlspecialchars($_COOKIE['name'], ENT_QUOTES, "UTF-8"); } else { $username = "ゲスト"; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>SECCON Beginners greeting service</title> </head> <body> <h1>こんにちは!<?=$username?>さん!</h1> <hr> <?php if($username === 'admin'): ?> こんにちは管理者さん。 Flagは、 "<?=$_ENV['SECCON_BEGINNERS_FLAG']?>"です。 <?php else: ?> こんにちは<?=$username?>さん。 Flagは、管理者である"admin"さんにのみしか表示されません。 <?php endif; ?> <form method="POST"> <input type="text" placeholder="名前" name="name"> <button type="submit">名前を変更する</button> </form> <pre> <code> <?=htmlspecialchars(file_get_contents("./index.php"), ENT_QUOTES, "UTF-8")?> </code> </pre> </body> </html>
何も読まずにとりあえず、名前フォームに admin
を入れてみる。
こんにちは!偽管理者さん!
だって!
あらら、偽物だとバレてしまっておる。ちゃんとソース読もう。
さっきのはここで弾かれたようだ。
// 管理者でログインできる? if($username === "admin") { $username = "偽管理者"; }
ソースを読むと、フォームが空で、cookieのname
valueにusername
がセットされてれば良さそうなので、Chromeの開発者ツールなどを使ってcookieにname
:admin
をセットし、対象ページに再度アクセスするとflagが表示された。
こんにちは管理者さん。 Flagは、 "ctf4b{w3lc0m3_TO_ctf4b_w3b_w0rd!!}"です。
[Warmup] plain mail
問題
packet.pcap
というパケットキャプチャファイルが配布されるのみ。
Wiresharkで packet.pcap を開いてみる。
タイトルの通り、特に暗号化されていない、通信も暗号化されていない状態のmailのやりとり。
simple mail protocolなので、data部分を探して読んでいく。
[38] attachment; filename="encrypted.zip"
という部分が見つかるので、データに暗号化されたzipが入っているらしいぞと。
zipっぽい部分のバイナリを抽出。
Wireshark User’s Guide > Exporting data
の "5.7.7. The “Export selected packet bytes” dialog box"
あたりを参照。
更に、base64でencodeされているようなのでdecodeするとzipの形式に。
packetの[59]あたりに、別メールでなにがしかのパスワードが送られてきているようなので、data部分を確認。
パスワードが書いてある。
_you_are_pro_
あとは、上で得られた暗号化されたzipを、このパスワードで復号すると、flag.txt
が出現。
ctf4b{email_with_encrypted_file}
[Warmup] Welcome
問題
フラグは公式IRCチャンネルのトピックにあります。
公式IRCに行ってみたら、本当にチャンネルのトピックにそのまま書いてあった。
公式IRCにたどり着けるかどうかのみの問題。
これが解けた人数(661) ≒ 今回ちょっとでも問題とこうと思った人数、かな。
#seccon-beginners-ctf: Flag for welcome: ctf4b{welcome_to_seccon_beginners_ctf}
Misc てけいさんえくすとりーむず
問題
てけいさんのプロのために作りました。 えくすとりーむなので300秒でタイムアウトします。 $ nc tekeisan-ekusutoriim.chall.beginners.seccon.jp 8690
言われたとおりアクセスしてみる。
$ nc tekeisan-ekusutoriim.chall.beginners.seccon.jp 8690 Welcome to TEKEISAN for Beginners -extreme edition- --------------------------------------------------------------- Please calculate. You need to answered 100 times. e.g. (Stage.1) 4 + 5 = 9 ... (Stage.99) 4 * 4 = 869 [!!] Wrong, see you. --------------------------------------------------------------- (Stage.1) 904 - 853 = 51 (Stage.2) 834 - 565 = 269 (Stage.3) 690 + 685 = 1375 (Stage.4) 709 + 734 = 1443 ...
計算式が(Stage.*)
で続々と出てたので、言われるがままに計算して(もちろん電卓)手入力していった。
・・・
終りが見えない・・・。
なんかタイム・アウトするとか言ってるし辛い・・・。
と思って中断。
最初にコンソールに出てきた説明読めばよかった!!
(Stage.1)
4 + 5 = 9
...
(Stage.99)
ってことは99問あるってことだな。それで「てけーさんえくすとりーむず」なんだな。
おとなしくプログラム書こう。
#!/usr/bin/env python3 # -*- coding:utf-8 -*- import socket import time host = 'tekeisan-ekusutoriim.chall.beginners.seccon.jp' port = 8690 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, port)) data = s.recv(500) print(data) while 1: formula = str(data).split('\\n')[-1] formula = formula.replace("'","").replace("=","") answer = eval(formula) print('answer = ' + str(answer)) s.send((str(answer) + '\n').encode()) data = s.recv(120) print(data)
終了処理やエラー処理もなにもないですが、最後エラーはいて止まるだろうから一応結果だけはわかる。
実行してみたら数秒で終わった。てけーさんなんてするもんじゃない。
b'Congrats.\nFlag is: "ctf4b{ekusutori-mu>tekeisann>bigina-zu>2018}"\n'
ちなみに送信部分の最後に改行を入れ忘れていて、プログラム作成から2時間近くかかった・・・。
同じ過ちを過去に犯したこと、絶対あるのになー。学習しないなー。
結果・感想など
土日で耐久24時間って、用事があったり子守があったりで結局使える時間頑張っても6時間くらい。それでも今の実力だと十分だった気がするし、長くやりすぎても飽きそうなのでちょうどよかったかな。
結果は、
- Score: 259 pt
- 順位: 357th
専門のツールがあれば解けるんだろうなぁというのがいくつかあったけど(gdbとかforensicsツールとか)あまり興味が持てないのでスルーした。
しかしweb系は最後まで解ける気がしてたのに、結局解けなかったなぁ。悔しい。
あとRSA系も、解き方に結構目星がついたと思ったけど解けず。計算量が多すぎた。もっと他の解き方があるに違いない。
難易度的にはちょうどよかったのか?普通のSECCONとそんなに違わなかった気もするけど?という印象でした。
次も是非Beginners 挑戦しよう!