セキュキャンWS 「The Anatomy of Malware」完全版に参加しました

セキュキャンWS 「The Anatomy of Malware」完全版に参加しました

概要

セキュリティキャンプWSとは, セキュリティキャンプ全国/地方大会の卒業生が参加できるワークショップです. 今回はセキュリティキャンプ全国大会2017で行われた講義「The Anatomy of Malware」のバージョンアップ版が行われました.

事前課題

ここにある10-Dの資料を読み, Exerciseを行うというものでした. ここで作成したidbファイルは講師の方に提出し, 講義の最初にまとめてフィードバックされる, という形でした.

講義

idbのレビュー

IDAは高機能なメモ帳と思え, 重要な部分には色を付ける, 関数名/コメントは動作内容ではなくその意図を書く, などのフィードバックがありました. 特に関数名/コメントは, まさに動作内容をそのまま書いていたので, この程度の知識でIDA Proを使っていてすみません, という気持ちになりました.

マルウェアのトレンド

まず, 標的型攻撃, ボットネットとテイクダウン, TSBとDoublepulsar/Eternalblue, Coinhiveなど最近のトレンドの紹介がありました. そして, 日本企業を狙う標的型攻撃とその手法の大まかな解説がありました.

基礎知識

PEのフォーマットやメモリレイアウト, 呼び出し規約などの基礎的な知識の解説がありました.

演習

内容

ElirksというJTBで使用されたマルウェアのidbを渡され, 解析を行いました. まず, 暗号化手法の推測と把握を行い, いくつかの関数の動作を把握して, 実際のC2のコマンド部分を見ていくという形でした.

IDA Tips メモ

  • gで任意アドレスに飛ぶ
  • spaceでgraph view
  • dでバイト列の長さを調整できる
  • rでASCII変換

感想

実際のマルウェア解析者の方に1からマルウェア解析を教わる(しかも無料で!)という, 大変貴重な機会でかなり勉強になりました. 特に, x86の基本的な命令やスタックフレームはある程度わかるけれど, そこから実際のマルウェア解析までの道筋が分からない, という自分にとってはぴったりな講義で最高でした. 唯一心残りなのは, Elirksの復号を実際にどうやるか講義後に質問したかったのですが, 自分の時間の都合でできなかった点です.

SecHack365 参加記

SecHack365を修了しました.

sechack365.nict.go.jp

SecHack365とは

SecHack365とは, 若手セキュリティ人材の育成を目的とした, 1年間を通じて行われるセキュリティハッカソンです. 詳しい説明はここにあります. 参加した感想としては, 長期的な開発でかつある程度の成果を求められるので, ハッカソンというよりはどちらかというと未踏に近いのかな, という感じです. また, 学生は参加費が無料でした.

応募するまで

事前に, 総務省がホワイトハット育成プログラムを始めるというニュースを見ていて, 絶対に応募しようと思っていました. なので, 応募が開始したらこれがそれか, という感じですぐに応募しました. 応募制限がU-25で, 某〇ャンプ全国大会への参加が永久に不可能になった身としては, すごく助かりました.

テーマとチーム

自分でテーマを立ててそれをやっていくか, 他人が立てたテーマに乗っかるか, という感じだったので, 自分でテーマを立てました. 結果として, テーマに共感してくれる人は居たものの, チームメンバーは最後まで集まりませんでした. なので, 1人で開発を行いました. ソロチームだとフロントエンドからデータベースまですべて自分でやらざるを得なくて, 結構しんどい時期が発生してしまい, 当時はチームでやっている人がかなり羨ましかったです. が, 後から話を聞くと, チームはチームでしんどい部分もあったらしく, 結局は自由と開発リソースのトレードオフなのかなと思いました.

各回の振り返り

ここからは各回を振り返ります. なので, 各回の詳細は興味がないという方は次の段落まで読み飛ばしてください.

NICT見学会

NICTの見学(大学から公欠が出なくて行けなかった)と, 顔合わせがありました. 見たことある名前やアイコンの人がたくさん居て, 本当にここに居ていいのか, みたいな気分になりましたが, 同時に, 1年間やっていくぞという気分にもなりました .

蒲田回

富士通のなんかすごいエリアで, パソコンを封印してアイディアソンを行いました. Maker的な機材や栽培中の野菜(?)があってすごかったです. 内容としてはエモグラフィやアイデアスケッチなどがあり, パソコンをカタカタすることが一切なくて, 新鮮でした. (本当はここにも写真を貼る予定だったのですが, スマホの物理インシデントに巻き込まれてデータが消えてしまいました.)

福岡回

LINE Fukuokaのオフィスと志賀島で行われました. 内容は, LINEのセキュリティの部署の方の講義と開発成果の発表と縁日(トレーナーによる講義)がありました. 講義内容は, セキュリティに機械学習を適用する時の, 基本的な考え方や注意点という感じでとても参考になりました. また, 志賀島の宿が, とても人権がある感じですごかったです.
f:id:ak1t0:20180330232354j:plain f:id:ak1t0:20180330232352j:plain Slackを色々盛り上げたということでMAYHEMのTシャツを頂きました.f:id:ak1t0:20180330232357j:plain 縁日で使ったRasPiです. f:id:ak1t0:20180330232400j:plain

北海道回

定山渓のホテルで行われました. 内容は, 開発成果の発表と縁日とさくらインターネットのデータセンター見学です. ここで頂いたクーポンには開発でかなり助けられました. また, ここも食事がとても人権がある感じですごかったです. f:id:ak1t0:20180330232604j:plain f:id:ak1t0:20180330232629j:plain 帰りに新千歳空港で食べたジンギスカンです. f:id:ak1t0:20180330232642j:plain

大阪回

大阪のコスモスクエアで行われました. インデックス大阪が在る辺りです. 内容は, 最終発表に向けた成果発表とフィードバックの繰り返しと講演でした. 人権は微妙な感じでした. f:id:ak1t0:20180330232804j:plain また, クリスマスということで, ケーキが支給されました. f:id:ak1t0:20180330233028j:plain

沖縄回

沖縄の糸満にあるホテルで行われました. 内容は内部としての最終成果発表です. 割と早めに発表が終わってしまったので, ずっとビーチを散策したりしていました. 部屋のベランダでパソコンをカタカタしながら夜景を楽しめたり, ビュッフェの食事がかなり良かったり, 人権は今までで一番ある感じでした. f:id:ak1t0:20180330233126j:plain f:id:ak1t0:20180330233130j:plain f:id:ak1t0:20180330233246j:plain

最終成果発表

秋葉原のコンベンションホールで最終成果発表を行いました. 内容は, 自分の開発した成果物のデモ展示です. 自分の作ったものに対して, 企業やメディアの方から色々質問される, というのは中々ない経験だったので, 面白かったです. 唯一残念だったのは, 後泊ができなかったので最後の打ち上げに参加できず, 早く帰らざるを得なかった点です. また, 前泊させていただいたにも関わらず, 会場に30分ほど遅刻してしまいすいませんでした. f:id:ak1t0:20180330233339j:plain

1年を振り返って

自分の作ったものに対して色んな人から真剣なフィードバックを貰う, というのは中々ない経験でとても面白かったです. また, 自分が興味がある分野について他の人と色々話したり聞けたりしたのは良かったです. 加えて, 強そうな人がやっている面白そうなことの, 詳細な内容が間近で聞けるというのは, かなり刺激になりました. 今回のSecHackに影響されて, 機械学習ハニーポット, ハイパーバイザなど, 今までの自分とは少し遠かった様々な分野にも興味が出てきました. ちょうど, SecHackが終わって時間に余裕ができたので, どれから手を出そうかなという感じです。

最後に

トレーニーの方, トレーナーの方(特に発表から論文まで色々お世話になった担当トレーナーの方), 色々アドバイスを頂いた方, SecHack365に関わるすべての方, 1年間ありがとうございました.

f:id:ak1t0:20180330230955j:plain

angr on CTF 超入門

この記事は Harekaze Advent Calender 6日目の記事です。

adventar.org

初めに

この記事ではangrをどうやってCTFで使うか、に重点を起きます。 シンボリック実行やz3などの理論的なことは扱いません。

angrとは

angrは

プログラムの特定位置に到達するための入力値を抽出することができる

(https://ntddk.github.io/2016/08/27/angr-afl-driller/ より引用)

バイナリ自動解析ツールです。 よって主な用途はrevです。

対象バイナリ

angrを試すための簡単なバイナリを用意しました。

target - Google ドライブ

バイナリを動かす

バイナリを動かすとuser:passを聞かれますが、get_flagやlost_flagというシンボルがあることから、user:passが正しいとflagが表示されることが推測できます。 こういう場合angrは、「このアドレスを通らず、このアドレスに到達する入力値を計算してくれ」という使い方をします。 なのでこのバイナリの場合「lost_flag()を通らず、get_flag()に到達する入力値を計算してくれ」という形になります。

solverのベース

import angr
# angrのプロジェクトを作成する
p = angr.Project('./target')
# バイナリのコマンドライン引数や初期状態を指定する
state = p.factory.entry_state(addr, args=[])
# 自動解析の条件を指定する
ex = p.surveyors.Explorer(start=state, find=(,), avoid=(,))
# 自動解析の実行
ex.run()
# 解が見つかった場合表示する
if len(ex.found) > 0:
    s = ex.found[0].state
    print "%r" % s.posix.dumps(0)

コードを足す

solverを足していきます。

まずangrにどこからプログラムが開始するかを伝える必要があるので、mainのアドレスをaddrに指定します。 MAIN_ADDRESSにはobjdumpやradare2で表示されるmainのアドレスを指定してください。

5行目

state = p.factory.entry_state(addr=MAIN_ADDRESS, args=[])

次に、到達したいget_flagと避けたいlost_flagのアドレスをfindとavoidに指定します。 ここの start=state は先程指定したmainのアドレスをプロジェクトに設定しています。

7行目

ex = p.surveyors.Explorer(start=state, find=(GET_FLAG_ADDRESS,), avoid=(LOST_FLAG_ADDRESS,))

自動解析を実行

python solve_base.py

結果

'reo\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01haifuri\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\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'

get_flag()に到達するuser:passが分かるので、バイナリを起動して入力しましょう。

HAREKAZE{This_is_flag}

バイナリのソースコード

#include<stdio.h>
#include<string.h>

void get_flag() {
  printf("HAREKAZE{This_is_flag}");
}

void lost_flag() {
  printf("You can't get the flag :)");
}

int main() {
  char username[256];
  char password[256];
  printf("username: ");
  scanf("%s", username);
  printf("password: ");
  scanf("%s", password);

  if ((strcmp(username, "reo") == 0) && (strcmp(password, "haifuri") == 0)) {
    get_flag();
  } else {
    lost_flag();
  }
  return 0;
}

参考資料

angrでシンボリック実行をやってみる - ももいろテクノロジー
angr on PythonをCTFに使う - saotake’s blog
シンボリック実行に入門しようとした | 一生あとで読んでろ
angr, AFL, Driller | 一生あとで読んでろ
hacktracking: # HITCON CTF 2017 Quals: Sakura - Reversing

セキュリティミニキャンプ in 北陸 2017(金沢)の専門講座に参加してきました

セキュリティミニキャンプ in 北陸 2017(金沢)の専門講座に参加してきました

まとめ

  • 午前
  • 午後
  • おまけ
  • 最後に

専門講座

Chrome拡張機能脆弱性を探そう!」

用意されたシンプルなChrome拡張機能に対して、脆弱性を探していく、といった形でした。最初は単純なXSSだったのですが、最終的にはrequestb.inとXHRを用いて、拡張機能の権限で取得したデータを、外のサーバに送信するところまで行いました。この盗んだデータを外に持ち出す、というのは危険性がとても分かりやすくて、勉強になりました。また、CSPの解説などもありましたが、これも手を動かして理解する形だったので分かりやすかったです。

昼食

同席したチューターの方に色々な話を聞きました。

カーネルエクスプロイトによるシステム権限奪取」

x64の呼び出し規約やROPの座学に始まり、用意されたドライバを利用して、最終的にカーネルでROPを行う、という形でした。 ハンズオンでは、rp++でStackPivotも含んだROPのためのpayloadを作り、用意されたプログラムでオフセットを計算し、実際にexploitを実行しました。 ところが、途中でトラブル(?)もあり、VMをフリーズさせるところまでしかいきませんでした。 しかし、普段は少々のことではフリーズしないVMが、こんなに小さいプログラムで一瞬でフリーズする、というのは何とも言えない面白さがありました。 講義の内容はとてもハイレベルで、まだまだ理解しきれていない部分も多いですが、こんな世界もあるのかととても勉強になりました。

最後に

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

おまけ

せっかく金沢に来たので、帰りのサンダーバードを待つ間、一緒に参加した大学の後輩と、寿司を食べました。

f:id:ak1t0:20171204171931j:plain

ハニーポットを踏んでTorネットワークからBANされた話

この記事は、Honeypot Advent Calendar 2017 4日目の記事です。

adventar.org

TL;DR

改造されたTorノードを運営してonionアドレスを収集していたら、Tor Project側のハニーポットを踏んでしまい、IPレベルでノードをBANされました。

前提

Torとは何か、秘匿サービスとは何か、onionアドレスとは何か、などについてはこの記事では説明しません。

Hidden Service Directoryの欠陥

Hidden Service Directoryとは、HSDirフラグを取得したTorノードによる分散ハッシュテーブルです。これにより、HSの名前解決が行われます。 ところが、現在のHidden Service Directoryには明確な欠陥があり、それを利用するとHSDirノードはonionアドレスを収集できます。その欠陥とは、HSの名前解決のlookupです。HSの名前解決は、クライアント側から見て次のように行われます。

  1. HSDirフラグを持つ全ノードのリストを取得
  2. そのリストの上から順にonionアドレスの名前解決の可否を尋ねる
  3. 可能なら解決、不可能なら次のノードへ

これだけ見ても分かるように、このプロトコルは明らかに欠陥があります。可否を尋ねられたノードがそのアドレスを保存してしまえば、onionアドレスを収集できてしまうのです。もちろん名前解決クエリの中には、aaaaaaaaaaaaaaaa.onionや総当たりで算出されたアドレスもあるでしょう。しかし、そのクエリの大半は正当なものであり、これを利用すると収集だけでなく、HSの人気度やトレンドすら観測できてしまいます。*1

Honey Onions

この欠陥は4年近く前に指摘されており、当然Tor Project側も把握していて、いくつかの対策を行っています。その1つがHoney Onionsと呼ばれる秘匿サービスのハニーポットです。このハニーポットは一言でいうと「誰も知らないはずのこの秘匿サービスにアクセスしてくるということはアドレスが盗まれたに違いない」という構造です。もちろんただ1つあるだけでは何の意味も無く、すべてのHSDirノードのDHTには、複数のHoney Onionが混入させられています。これにより、悪意のあるHSDirノードの運営者がそのアドレスにアクセスすると、そのノードが特定されてしまいます。*2 これにより、収集したアドレスにフルスキャンなどを掛けてしまうと、Tor Project側に特定されます。

実際にBANされた

最初にアドレスの収集を試した時には、このHoney Onionsの存在を知らず、自作のクローラで収集できた全てのアドレスにスキャンを掛けてしまい、1ヶ月後にBANされました。このBANというのはけっこう重い処置で、Atlasからはノードであった痕跡が一切消去され、また、IPレベルでAuthority Directoryに弾かれるため、もう二度と正常なノードにすらなることができませんでした。

参考資料

Honey Onions: Exposing Snooping Tor HSDir Relays | DEF CON 24

追記 12/06

ntddk氏から指摘をいただきました。 この記事だと、Honey OnionsをTor Projectが運営しているかのように見えますが、Tor Projectが公式にこれらを運営しているとの発表をしたことはありません。私が、ノードがBANされたことで、Honey Onions 運営 == Tor Project だと勘違いしていたようです。ただし、実際BAN自体は行われたので、何かしらの仕組み(Honey Onions側のTor Projectへのフィードバックなど)はあるのだと思いますが分からない、という状態です。

*1:実際には、飛んでくるクエリの傾向はonionアドレスの分散に依存するので、10~20くらいのノードで偏りを補正する必要があります

*2:実際には、DHTの分散の周期も考慮する必要があり、いくつかのアドレスにアクセスすると、確率的にHSDirノードが特定される、という形になっています

噂の月給40万円インターンに参加してきました

f:id:ak1t0:20170902200600j:plain

LINE SUMMER INTERNSHIP 2017 エンジニア就業コースに参加しました。

選考

テスト

簡単なコーディングのテストがありました。問題が3問あって全完できなかったので、落ちたかと思っていたらなぜか面接に進めました。後でインターン生に聞いてみたところ、誰も全完はできていないみたいでなるほどといった感じでした。

面接

いろいろやらかしてしまったので、今度こそ落ちたと思っていたらなぜか合格通知が届いて、思わずその場で叫んでしまいました。

インターン

f:id:ak1t0:20170902200315j:plain

初日

何かの間違いで帰れと言われませんように、と心の中でひたすら祈っていましたが、チューターの方にも部署の方にも良くしてもらったので安心しました。 また、同じ部署に配属されたインターン生がもう1人(2人?)いたので心強かったです。

オフィス

とにかくすごい。オフィス内に、オシャレなカフェがあったり、撮影スタジオや保育園があったり、70型テレビと各種ゲームが揃ったゲームコーナーがあったり、これが大企業か…といった感じでした。

f:id:ak1t0:20170902200709j:plain f:id:ak1t0:20170902200212j:plain f:id:ak1t0:20170902200545j:plain f:id:ak1t0:20170902200532j:plain

環境

ほぼ最上位(i7+16GB+USキーボード)のMBPとWQHDディスプレイが貸与されて、遠方組はマンスリーマンションの個室を借りてもらえるという、すごい環境でした。

インターンの内容

自分が配属されたゲームクラウドという部署では、インターン生にはテーマが与えられ、それを設計から実装まで1人で考えるという形でした。最初はドキュメントを1日中読んでいるだけで、これで本当に1日2万円ももらっていいのかという感じでしたが、最終的には一応ある程度形になったので良かったです。

f:id:ak1t0:20170902203141j:plain

ただ、私用で3.5日くらい休んでしまった影響で、2つめのテーマがかなり中途半端な状態で終わってしまったり、最終発表のスライドがいまいちだったりしたので、そこはかなり悔しかったです。そういうタイムマネジメントも学んでいきましょうという、発表会の締めの言葉が胸に突き刺さりました。

f:id:ak1t0:20170902200654j:plain

イベント

インターン生だけの懇親会や別の部署の方のいらっしゃった懇親会がありました。部署の方はもちろん、セキュリティ室の方にも色々な話が聞けて良かったです。

蟹味噌(とにかくヤバかった) f:id:ak1t0:20170902200130j:plain

1ヶ月を終えて

技術的な面でも、それ以外の面でもとにかく濃い1ヶ月でした。 未だについ昨日東京に来たばかりなのに、みたいな気分です。 1ヶ月間本当にありがとうございました。

f:id:ak1t0:20170902200519j:plain

おまけ

他のインターン生のエントリ

calmery.hatenablog.com

www.kagemiku.com

chigichan24.hatenablog.com

40万円の使い道

ディスプレイと懇親会で布教された暗号通貨を買って、残りは貯金します。

インターン中のご飯

f:id:ak1t0:20170902200117j:plainf:id:ak1t0:20170902200145j:plainf:id:ak1t0:20170902200329j:plainf:id:ak1t0:20170902200409j:plainf:id:ak1t0:20170902200355j:plainf:id:ak1t0:20170902200341j:plainf:id:ak1t0:20170902200158j:plain

一応気を付けて書いたつもりではありますが、もし何か公開してはいけない部分がありましたら、すぐに消しますので伝えていただけると幸いです。

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

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

まとめ

  • 午前
  • 午後
  • おまけ
  • 最後に

専門講座

ハッカーペネトレーションテスター)の考え方とハンズオン」

ハッキング(ペネトレーションテスト)に関する講義を受けて、それを用意された脆弱なVMに対して実際に試すという構成でした。 VMはCTF形式になっていたのですが、結局自力で見つけられたflagは最初の1つだけでした。

nmapやniktoの使い方、実際にWordPressのパスワードを入手した後、Metasploitでどのように侵入するか、など普段はなかなか触れる機会のないことがたくさんあって、新鮮で面白かったです。 また、講義のハッカーの世界は白黒ではなくグレーという言葉が印象に残りました。

昼食

🙏
できたて(?)で温かくて美味しかったです。

ハニーポットを用いた分析ハンズオン」

ハニーポットに関する基本的な説明を受けて、DaionaeaというハニーポットWordPressのログ分析を実際に試すという構成でした。

ハニーポットというよりはログ分析がメインで、nginxの設定を弄ってログのフォーマットを指定したり、/wp-loginとかの怪しいURLへのアクセスを弾いたりしました。 午前中に学んだWPScanなどが、ログから見るとこういう風に見えるのか、という感じで面白かったです。

おまけ

帰りのポートライナーで講師のザックさんと参加者の方と偶然一緒になって、色々話を聞けて良かったです。

最後に

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