読者です 読者をやめる 読者になる 読者になる

セキュリティ・ミニキャンプ in 近畿 2017 に参加してきました

セキュリティミニキャンプ in 近畿 2017 の一般講座と専門講座に参加してきました.

まとめ

  • 一般講座
  • 専門講座
  • 最後に

一般講座

「国家が関与するサイバー攻撃の実態理解」

内容は書けませんが、普段は聞けないような色々な話があって、あと1時間くらい追加で講演して欲しいと思うくらい面白かったです。

「と或るセキュリティエンジニアの解説書」

セキュリティエンジニアになるまでのことと、セキュリティエンジニアになってからのことについての講演でした。エンジニアは技術に固執しがちだけれど、顧客の立場から考えることが一番大切という話を聞いて、どこの技術者も変わらないんだなと思いました。

「作るだけでは終わらない!〜安全なウェブサイト管理〜」

IPAのエンジニアの方による脆弱性の種類、トレンド、包括的な脆弱性の対処法などでした。 一般講座ということもあって、主にウェブサイトの管理者を対象にしてるようでした。

「サイバー捜査官をめざして」

京都府警のサイバー犯罪対策課の方によるサイバー犯罪の歴史とその対処についての講演でした。わいせつデータをいかにして法律で扱うようになったか、Winnyや流出系のウイルス、擬律判断などの話がありました。また、よくインターネット上で言われる「サイバー捜査官に捕まえたクラッカーを雇えばよいのでは」という意見を「正義感のないやつには無理」と一蹴していて、なるほど確かにという感じでした。

専門講座

「Webセキュリティ・はじめの一歩」

Webの脆弱性に関する説明を受けて、実際に用意されたデモサイトで試す、という形の講義でした。 SQLインジェクションXSS、動作確認用のphpinfoやApacheなどによる情報収集などがありました。全員同じデモサーバーでやっていたので、誰かが試したXSSで外部サイトに強制的にリダイレクトさせられて、そもそもデモサーバーにアクセスできない、みたいなある意味XSSの危険性を実感できるトラブルもあって楽しかったです。

昼食

🙏

「オンラインゲーム アタック&ディフェンス体験」

前半は、WebSocketとJavaScriptで作られた簡単な複数人型のオンラインゲームに対して、実際にチートとチート対策を行い、後半はチートや自動化の対策や是非について考えるという構成の講義でした。 チートといっても難読化などはなく、JSからレベルアップする関数を見つけて、ブラウザのJSコンソールからsetInterval(levelup_func, 5000) とかすると自動的にLvが上がる感じでした。データの不整合を起こして無理矢理全員の接続を切断させている人も居たようです。 実際に存在するゲームにチート行為を行うというのは、なかなかできない体験なのでとても新鮮でした。

おまけ

専門講座の会場にありました。

最後に

講師の方々、 チューターの方々、 そして今回のミニキャンプに関わる全ての方々、 本当にありがとうございました。

論文紹介 - "Riffle: An Efficient Communication System With Strong Anonymity"

初めに

この記事は情報セキュリティ系論文紹介 Advent Calendar 2016の24日目の記事です。 半年くらい前に話題になっていたRiffleというプロトコルの論文の紹介です。 周りが強い人たちばかりで怖いですが、よろしくお願いします。

TL;DR

匿名化ネットワークを、ダウンロードにPrivate Information Retrievalを、アップロードにmixnetsとVerifiable Shuffleを用いて構築する。また、このシステムは、既存の主流な匿名化ネットワークに欠けているトラフィック解析への耐性と、それ以上の匿名性を併せ持つ。

背景

匿名化ネットワークは現在いくつかあるが、主流になっているネットワークのトラフィック解析に対する耐性は疑わしい。そこで、提案こそ以前からあるものの技術的課題の多かった、mixnetsや他の様々な技術を改善し、かつ組み合わせることで、新たな匿名化ネットワーク「Riffle」を設計した。

前提知識

mixnets とは

古くからある匿名化ネットワークのプロトコルの1つ。クライアントから渡されたデータを、複数のサーバーに中継させ、また、中継時に内容をランダムに並び替えることで、トラフィック解析に対抗する。また、onion-encryptも併用する。いくつかの攻撃手法と、それを改善した派生プロトコルが存在する。

Verifiable Shuffle とは

Verifiable Shuffleとは、データの内容が同一であることを検証可能にしつつ、データをランダムに並び替えるプロトコルである。mixnetなどで悪意のあるサーバーへの対策として使用されるものの、計算量が大幅に増えるという欠点がある。 Riffleでは、TLSのように公開鍵暗号を共通鍵の交換のみに用いることで、計算量を改善したHybrid Verifiable Shuffleと筆者が呼ぶものが使われる。

Private Information Retrieval とは

Private Information Retrieval(以後PIR)とは、クライアントがデータベースを持つサーバーから、どのデータを取得したかサーバーに知られることなく、特定のデータを取得できるプロトコルの総称である。原理的には、ダウンロードの度にデータベースの全てのデータを取得するプロトコルPIRと言える。Riffleでは、XORを用いて実装される。

Riffle

モデル

Riffleは、1つのサーバー群と複数のクライアントが存在し、少なくとも1つのサーバーが信頼できることを前提とする。

f:id:ak1t0:20161224184608p:plain (図は論文からの引用)

プロトコル

Riffleでは、プロトコルの開始から終了までをepoch、その中で鍵の共有などの準備をするsetupと、実際にコミュニケーションを行うcommunicationに分けられる。また、communicationの中で行われる各アップロード/ダウンロードをroundと呼ぶ。

Setup

1. 鍵のシャッフル

  • 通信に関わる全てのサーバーが公開鍵/秘密鍵のペアとシャッフル用パラメータを生成する
  • クライアントが全てのサーバーの公開鍵を取得する
  • クライアントが各サーバー用に共通鍵の配列を生成する
  • 鍵の配列をサーバーから取得した全ての公開鍵でonion-encryptする
  • onion-encryptした共通鍵鍵の配列をアップロード
  • Verifiable Shuffle が行われ各サーバーがクライアントが生成した共通鍵を1つずつ取得

2. PIRの準備

  • クライアントと全てのサーバーがPIRのためのSecretを共有

Communication

1. アップロード

  • クライアントがSetupで共有した共通鍵でメッセージをonion-encryptする
  • 暗号化したメッセージをサーバー群へアップロード

2. シャッフル

  • サーバーは受け取ったメッセージの認証と復号を行う
  • 復号したデータをSetupで生成したパラメータでシャッフル
  • 次のサーバーへシャッフルしたデータを渡す
  • 最後のサーバーは完全に復号されたメッセージを全てのサーバーへ送信

3. ダウンロード

  • Setupで共有したSecretを利用してPIRでサーバーからダウンロード

Accusation

RiffleへのDoS攻撃は、悪意のあるクライアントによる意図的な壊れたデータのアップロードが考えられ、これを防ぐ告発(accusation)というシステムが存在する。 Accusationというのは、悪意のあるクライアントを特定するためのプロトコルで、これによりオーバーヘッド無しに悪意のあるクライアントの特定と排除を実現する。ただし、そのままでは悪意のあるサーバーが乱用できてしまうので、告発には全てのサーバーの同意を必要とすることで、これを防ぐ。

ソースコード

GitHub - kwonalbert/riffle

参考文献

Riffle - people.csail.mit.edu
How to stay anonymous online - MIT News
Here's How Riffle Anonymity Network Protects Your Privacy better than Tor - The Hacker News
MITの匿名ネットワーク通信プロトコルRiffleはTorの長年の王座を揺るがすか

セキュリティ・ミニキャンプ in 中国 2016 に参加してきました

セキュリティミニキャンプ in 中国 2016 の専門講座に参加してきました.

まとめ

  • 1日目
  • 2日目
  • 最後に

1日目

「車載LAN上を流れるメッセージの解析」

車載LANの基本的な構成や規格に関する講義を受けて, 実際にそれをPythonのプログラムを書きながら試す, という構成でした. もちろん会場に車は持ち込めないので, 講師とチューターの方々によって会場にパケットが流れるケーブルが張り巡らされていて, そこに流れるパケットをOBD2-USBアダプタを通じてキャプチャして処理する, といった感じでした. 実際にT社の車からキャプチャされたパケットもありました.

車載LANやそのパケットなど普段は触れる機会がないので, とても面白かったです. また, 車載LANの構造が思ったよりシンプルで驚きました.

LT

トレンドマイクロの方のマルウェア解析についての講演でした. マルウェアの自動解析とそれを行うためのインフラの話がとても面白かったです. また, チューターの方がアナライジング・マルウェアにサインを貰っているのを見て, 自分もサイバーセキュリティプログラミングを持ってきていれば良かった...と思いました.

2日目

OSSを読もう! - HeartBleed編」

OpenSSLとその周辺の技術に関する講義を受けて, 実際に該当する脆弱なソースコードGitHubで探すという構成でした. RSA暗号の計算を手元で試したり, 実際に用意されたサーバーにHeartBleedパケットを送ったりもしました.

セキュリティキャンプなのに, GitHubで関数名をひたすら辿るのは少し不思議な感じがしたけれど, 楽しかったです.

昼食

🙏

マルウェア解析(基礎)」

マルウェア解析といっても, IDAでバイナリを...という感じではなく, 仮想環境上で動くマルウェアをProcessMonitorを使って挙動を追いかける感じでした. 検体は, 大昔に某P2Pで流行った○ン○マウイルスことAntinnyと, TeslaCryptやLockyなどの最新のランサムウェアでした.

また, 講義も理論的なことだけでなく, 実際に現場でマルウェアを発見/感染した際に, 限られた予算でどのように対処するか, ということも聞けて面白かったです.

最後に

講師の方々, チューターの方々, そして今回のミニキャンプに関わる全ての方々, 本当にありがとうございました.

はてなインターンで 🍣 🍺 🍕 📝 🍛 🍜 💪 🏆 🍖 してきた話

f:id:ak1t0:20160915190425p:plain

id:ak1t0です. はてなサマーインターン2016に参加してきました.

まとめ

whoami

プロフィール

  • 大学生
  • 情報系の学部に所属しているB3
  • セキュリティっぽい研究室に所属

プログラミングスキル

  • プログラミング歴3年
  • 趣味としてはそこそこ書ける程度
  • 実務経験ほぼゼロ
    (詳しくはここ)

応募から参加まで

境遇

プログラミングは, B1の頃にハッカーと画家という本に洗脳影響されたのがきっかけで始めました. 最初はWebアプリを目標にやっていたのですが, 途中で言語処理系とかセキュリティとかにも興味が出てきて, とりあえずは興味の赴くままに色々とやっていました. ただ, そんな生活もあっという間に終わり, 学部生活が残り2年を切ったので, 進路を真剣に考えざるを得なくなってきました. そこで, Webエンジニアという職を経験したいというのと, 精神と時の部屋と噂のはてなインターンで修行したいというのがあって, 応募しました.

格通

最初に合格メールが来たときは, 錯乱してメールヘッダを確認し始めるくらいには信じられなかったです. 5回くらい確認してようやく確信できました.

事前課題

MackerelコースはScalaJavaScriptの課題がありました. 特にScalaが難しくて, Javaの方言くらいに思ってたら死にかけました. Haskellを触ったことが無かったらやばかったと思います. コンパイル長い

前半

講義

1.5週間でWebアプリケーションの全てを消化するので密度がヤバいです. 構成は, (講義+基本課題+オプション課題) / day という感じでした. 基本課題が終わらないようなことはなかったけど, オプション課題をやっていると普通に22時までかかりました. 課題に悩みながら21時頃に食べるカレーや弁当は最高でした. 差し入れありがとうございました. また社員の方に飲みに連れて行ってもらって, ご馳走になりました. f:id:ak1t0:20160915170158j:plainf:id:ak1t0:20160915170200j:plainf:id:ak1t0:20160915170202j:plain

設計

正直な話, インターンに来るまでは, 設計なんてそこそこ適切にファイルやディレクトリを分割しておけばよくて, あまり意味のないものだと思っていました. しかし, 前半課題が, 前日作ったものに機能を足していく構造になっていて, 最初は無駄でしかないと思っていた層の分割が, 後々驚くほど上手く機能するのを見て, 設計が大事と言われる意味がよく分かりました.

Real World Machine Learning

機械学習は今年から始まった目玉講義で, 教科書の濃さがすごかったです. 内容は自然言語処理+機械学習で, 課題ははてなブックマークの生データを元にした悪意のあるコメントの検知の実装でした. Courseraの機械学習コースを1通りやっていたので油断していたら, 生データにボコボコにされました. 講師の方が1日で, インターン生が3日かけた学習器をあっという間に追い抜いていてすごかったです.

前半成果発表

前半学んだことをベースにWebアプリを2-3日で作りました. 前日の勉強会で知ったFlexboxのおかげで, 普段は悩ましいフッターの調整が即終わって最高でした. 1票も入らないかもと思ってビクビクしていたけれど, ちゃんと票をある程度貰えてよかったです. ほぼ外部APIのデモにしかなっていないという, 耳の痛い(けれどその通りな)コメントも貰いました.

前半感想

自分の知識の偏りや抜けをすごく実感して, 色々な分野を基礎からもう一度勉強し直したくなりました.

後半

チーム配属

初日の会議に遅刻という大ポカをいきなりやらかしました. Mackerelチームの方々本当に申し訳ありませんでした. 前半は課題で22時まで作業するのが基本だったので, チームに配属されると定時に帰れるようになるのは, 少し不思議な感じがしました.

やったこと

インターン生にやってもらいたいことというGitHubのIssueがあって, そこにあるタスクを選んでこなしていく感じでした.

初Angular

いきなりテンプレートに<ng-model>とか<ng-class>とか出てきて面食らったので調べてみると, Angularの機能だということが分かりました. Angularについては, 最近よくdisられているというメタ情報くらいしか知りませんでした. 結果として, フロントエンドという未知の領域に, Angularという未知のフレームワークで挑む必要があってけっこう辛かったです. 最初はdirective?なにそれ美味しいの?という状態でした. Angularは詳しくないと言いつつ, 初日からどんどんフロントエンドに手を入れていくペアのid:upamuneが頼もしかったです.

コードレビュー

今までコードレビューの経験が無かったのでとても新鮮でした.

リリース

自分たちの作った機能が, デザイナーさんの手によって調整されて, 実際に告知ブログに紹介されて, リリースされるというのは, 言葉にできない感動があって本当に最高です.

最高!!!

最終成果発表

優勝(優勝)

僅差でしたが優勝できました. Mackerelチームのインターン開始以来常に優勝する伝統を維持(1/1 → 2/2)できて良かったです.

雑感

東京でのエンジニア生活やはてなのサポートの話, また, ここには書けないような話まで, 社員の方から色々な話を聞かせてもらいました. 他にも, 隣の研究室出身の方が居て驚きました.

まかない

野菜が一杯使われてて栄養バランスが良いし美味しいしすごかったです. この1ヶ月でだいぶ健康的な体になった気がします. 前半の成果発表前にぎりぎりまでコード書いてて, その日のハヤシライスを食べ損なったのが心残りです.

打ち上げ

三嶋亭のすき焼き. 最高. 肉も美味しいが漬け物も美味しい. f:id:ak1t0:20160915170212j:plain

Mackerelチーム

メンターのid:itchynyさんだけでなくid:astjさんやid:daiksyさん, デザイナーのid:takuwologさん, 東京のid:stefafafanさんにもとてもお世話になりました. id:itchynyさんとid:haya14busaさんとペアのid:upamuneがみんなVimmerで, Vim力がすごかったです. f:id:ak1t0:20160915170205j:plain f:id:ak1t0:20160915170208j:plain

生活

自分は月曜日から金曜日まではホテルで, 土日は帰る半ホテル組といった感じでした. 個人的な事情だったにも関わらず, 色々と対応していただいて, id:tomomiiさんありがとうごさいました.

インターン

id:upamune Mackerelチームのペア. 芹澤優. Vimmer. フロントエンド力とGo力がすごくて頼もしかった. 最高. 朝は色々と迷惑をかけて申し訳なかったです.

id:hantas セキュキャンからそのままインターンに来た強者. ISUCONよろしくお願いします.

id:miki_bene お酒を飲み過ぎる人. 大学のレポートが辛そうだった.

id:mr-sunege プレゼンのプロ. 両方の成果発表ですごかった.

id:polamjag DJ烏丸御池. 打ち上げの日まで本名を知らなかった.

id:susisu 半額シールの人. Glitchすごかった.

id:takuya-nakamura めっちゃ飯を食う人. ○ワン○をも恐れぬアイデア.

賞金

PS4買います.

応募のすすめ

プロのエンジニアに講義+αしてもらえて, 本物のソースコードに触れて, ハイレベルなインターン生と知り合えて, 実際の開発を体験できて, 美味しいまかないがあって, 給料も貰えます. シュッと書いてシュッと応募しましょう!!! ポートフォリオが要るので, github.io等でまとめておくと良いと思います.

最後に

メンターのid:itchynyさん, 実行委員長のid:daiksyさん, そして今回のインターンに関わる全ての方々, 本当にありがとうございました.

おまけ

高倉二条のラーメン f:id:ak1t0:20160915170211j:plain

他のインターン生のレポート blog.upamune.com

susisu.hatenablog.com

polamjag.hatenablog.jp

mr-sunege.hatenablog.com

blog.taniho.net

benevolent0505.hatenablog.com

MNCTF 2016 Write-up

MNCTF 2016 Write-up

MNCTF2016

Macnica Networks DAY 2016 で行われたCTFが一般公開されていたので挑戦しました。

点呼

CTF恒例の確認問題

暗号新聞

ヨコの鍵

HTTPS

AES

MD5

SHA

タテの鍵

  • 1D

    開発当初、米国の暗号輸出規制を回避するため、ソースコードを書籍にし、海外へ広めた逸話を持つ暗号ソフトウェア

PGP

NTLM

RSA

TLS

ECC

ECC(Elliptic Curve Cryptography)とECDSA(Elliptic Curve Digital Signature Algorithm)に注意

  • 5C

    Tripe □□□などの延命措置が取られたものの、非推奨となった共通鍵アルゴリズム

DES

同一集団

C&C(?)を模した問題

shinobot.comをwhoisして出てきたメールアドレスググるとDomainBigDataに5つほど保持しているドメインが表示される

超持株会

Webサービスを模した問題

URLに含まれる71a842cd29f851f722069ee64c6ec5a8をMD5で逆変換すると社員番号とおぼしき文字列が出てくる
対象人物の社員番号のMD5をidに指定すると対象の購入ページが表示される
1000口の指定が無いのでTamperDataやBurpのようなツールでPOSTパラメータを1000に書き換える

難読記録

AD\\(?!AABBCC)(?!DUMMYZ)[0-9A-F]{6}

権限昇格

VirusTotalに解凍したexeを投げるといくつかのアンチウイルスソフトがCVEを表示してくれる

一行挿入

ExploitKit(?)を模した問題

オンラインのアンパッカー or 手元のブラウザコンソールでコードを少しずつ動かして確かめる
User-Agentが"ShinoBrowser 1.0.0.1"の時だけリダイレクトするJavaScriptが生成される
JSを更に解読 or UAを偽装してアクセスするとファイル名が分かる

超標的型

マルウェアを模した問題

stringsするとgetComputerNameAが出てくるのでホスト名を取得してチェックすると推測
IDAで開くと指定のホスト名がそのまま見つかるのでASCIIで変換

丸文字文

A-Za-z0-9+/なのでBase64と推測
丸文字を通常文字に変換してBase64デコードするとS-JISのテキストファイルになる
Windowsのメモ帳が自動で対応してくれるので問題文を読んで答えるだけ

以下Clojure(REPL)での丸文字-通常文字変換プログラム

;; wget http://mnctf.info/mnctf2016/task/crypt.html
;; 先頭を1行削る

(require '[clojure.string :as str])

(def cdata (->> (-> (slurp "crypt.html") (str/split #"\r\n")) (map #(drop 2 %)) (map #(drop-last 1 %)) (map #(apply str %))))

(defn inter [x] (Integer. x))

(defn conv [x] (cond (and (>= x 9398) (<= x 9423)) (- x 9333) (and (>= x 9424) (<= x 9449)) (- x 9327) (and (>= x 9312) (<= x 9320)) (- x 9263) (== x 9450) 48 (== 8853 x) 43 (== 8856 x) 47))

(def decoded (->> cdata (map inter) (map conv) (map char) (apply str)))

(spit "decoded" decoded)

;; base64 -d decoded > km.txt