1001001

73。CTFのWrite-upから始まったけど最近は技術全般の備忘録となっています。

ALEXCTF 2016 Write-up

top

ALEX CTF 2016にチームm1z0r3として参加しました.私が解いたのは2問(+1問)ですが,そのWrite-upになります.

開催概要

  • 開催期間 : 2月3日(金) 17:00 ~ 2月6日(月) 17:00
  • IRC : #alexctf @freenode
  • フラグ形式 : ALEXCTF{[A-Za-z0-9_]*} unless otherwise specified.

結果

1890点87位.悲しみ.なぜか右の円グラフでCRとTRとForeしか解いてないことになってるけどREとかも解いた.result01result02

 

手を付けた問題

  • CR1 : Ultracoded
  • CR2 : Many time secrets
  • CR5 : Bring weakness
  • Fore2 : Mail client
  • Fore4 : Unknows format
  • SC2 : Cutie cat

解いた問題

  • CR1 : Ultracoded
  • CR2 : Many time secrets
  • CR5 : Bring weakness

CR1はチームメイトが解いていたが,情報が全く共有されていなかったのでフラグ形式確認がてら解いた(Ruleを見てもフラグ形式が書いてなかったが普通にトップページに書いてあった).

SC2とか他のCRとかはきゅうりくんが解いた.Foreはわからなかったが2に関しては惜しいところまでGuessingしてた.

Write-up

CR1 : Ultracoded

フラグが何らかの方式でエンコードされてるとのこと.渡されるデータは以下.

ZERO ONE ZERO ZERO ONE ONE ZERO ZERO ZERO ONE ONE ZERO ONE ZERO ZERO ONE ZERO ZERO ONE ONE ZERO ZERO ZERO ZERO ZERO ONE ONE ZERO ZERO ONE ONE ONE ZERO ONE ZERO ZERO ONE ONE ZERO ZERO ZERO ONE ONE ZERO ONE ZERO ZERO ONE ZERO ZERO ONE ONE ZERO ZERO ZERO ZERO ZERO 
...
こんなのがずっと続く

"ONE","ZERO"を"1","0"に直し,ビット列を10進数値にしてlong_to_bytesする.すると base64が出てくるのでbase64デコードする .最後にモールス信号が出てくるのでデコードする

ということをするとフラグっぽいのが出てくる.拾ってきたモールス信号の辞書(CODE)をプログラムで整形(revCODE)してソルバを書く.

"ALEXCTFTH15O1SO5UP3RO5ECR3TOTXT"というのが出てくるので,それっぽいところに{}を入れてO_に変えるとフラグらしい.

The flag is ALEXCTF{TH15_1S_5UP3R_5ECR3T_TXT}

CR2 : Many time secrets

問題は以下.

This time Fady learned from his old mistake and decided to use onetime pad as his encryption technique, but he never knew why people call it one time pad!

One Time PadということはXORか.「なんでOne time padというか知らなかった」ということは複数のメッセージに鍵を使いまわしていそう.ということは与えられたファイルの一行(26文字分)について一つの鍵を使っているのか.XOR問題でヒント無しということは確実に推測できるものが鍵になっているだろう,などと考え,フラグのうち確実に推測できる"ALEXCTF"を含むものを鍵にしようと考え,とりあえず26文字で"ALEXCTF"から"ALEXCTF"を試すと,"ALEXCTFが先頭の時だけ可読な文字が現れたので,この時点で鍵がフラグであると予測.

あとはちょっと読めるようになった文章から,"Dear Fr"ということは"Dear Friend"だろうなとか,"encr"は"encryption"かな,とか推測するという方法,いわゆる古典暗号を解く方法で鍵(フラグ)を特定していった.

XORを取るときは下記のようにした.

USRPを使い始める話(2)

            USRPを使い始める話(1)でこの投稿の構成を以下のように示しました.
  1. MatlabでUSRPを動かす
  2. USRPのファームウェア及びFPGAイメージのアップデート(前編)
  3. USRPのファームウェア及びFPGAイメージのアップデート(後編)

前回はMatlabでUSRPを動かしてみようかなと思ったら,ファームウェアFPGAイメージのアップデートを要求されたところで終わりました.

今回は2つ目のUSRPのファームウェア及びFPGAイメージのアップデート(前編)ついて書きたいと思います.前編ではファームウェアFPGAイメージのアップデートをするために必要なUHDというツールのインストールについて書いていきます.

2. USRPのファームウェア及びFPGAイメージのアップデート(前編)

USRPのファームウェア及びFPGAイメージのアップデートを行うには,UHD(Usrp Hardware Driver)が必要です.UHDは,USRPをホストPCから操作することを可能にするドライバです.ホストPCのOSについては,Mac, Windows, Linuxが対応しています.私はMatlabWindowsで使っているので,WindowsにUHDをインストールしたいところですが,Windowsの環境構築はやや面倒くさそうなので,今回はLinux(Ubuntu)に環境を構築していきます.

Linuxの環境構築方法はこちらのEttusのKnowledge Baseを参考にしました.下記の手順もほぼこれの日本語訳のようなものです.このサイトによると,Linuxは実機環境である必要はなくVMが使えます.ありがたいですね.

UHDのインストール

上述した通り,私はubuntuにインストールしていきますので,以下はUbuntでの手順になります.バージョンは14.04と16.04については試していますが,この二つは依存関係のインストールの際若干必要になるパッケージが異なるので注意してください.ここでは14.04にインストールした時の記録を書いていきます.

必要なパッケージのインストール

UHDに必要なパッケージのインストールです.以下のコマンドを実行.

$ sudo apt-get update
$ sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.13-0 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg   libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk2.8 git-core libqt4-dev python-numpy ccache python-opengl libgsl0-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq1 libzmq-dev python-requests python-sphinx libcomedi-dev

UHDのビルドとインストール

UHDのソースコードをダウンロードして,ビルドとインストールを行います.

まずはソースコードをビルドする時に使うディレクトリを作ります.

$ cd $HOME
$ mkdir workarea-uhd
$ cd workarea-uhd

次に,gitのリポジトリをクローンし,クローンしたディレクトリに移動します.

$ git clone https://github.com/EttusResearch/uhd
$ cd uhd

次に,ビルドしたいUHDのバージョンを選択します.git的に言うとcheckoutします.以下のコマンドによってリリースしてるバージョンの一覧を確認し,checkoutします.

$ git tag -l
...
release_003_009_004
release_003_009_005
release_003_010_000_000

$ git checkout release_003_010_000_001

次にhostディレクトリに移動し,buildのためのディレクトリを生成します.

$ cd host
$ mkdir build
$ cd build

次に,Makefileを作るためにCMakeを実行します.

$ cmake ../

次に,Makeを実行してUHDをビルドします.

$ make

次に,以下のコマンドを実行することできちんとビルドの工程が完了したか確認できます.

$ make test

次にUHDをインストールします.

$ sudo make install

次にシステムの共有ライブラリのキャッシュをアップデートします.

$ sudo ldconfig

最後に,パスを通します.

$ export LD_LIBRARY_PATH=/usr/local/lib

以上でUHDのインストールが完了します.動作確認はuhd_find_devicesコマンドで確認するのが良いでしょう.接続されているUSRPの情報を表示してくれます.今は何も繋いでいないはずなので,以下のように表示されるでしょう.

$ uhd_find_devices
...

No UHD Devices Found

 

このUHDを使うことで,USRPのファームウェアFPGAイメージのアップデートをすることができます.

アップデート方法は次回にしたいと思います.

USRPを使い始める話(1)

            USRPを使い始めた時のメモです.USRPの用途は,研究においてのキャリアの照射や変調波の受信になります.受信後に復調処理や信号処理にかけるためMatlabを使ってSDRを制御しようと考えています.

これは同じようなことが起きた時に思い返せるように起こったことを煩雑にメモしたものです.ですので,USRPの購入からセットアップ,使い方に関する記事としては別でまとめたいと思っています.Get Started的なのをお求めであればこちらを参照ください.

USRPとは

ソフトウェア無線(SDR : Software Defined Radio)の一種です.他のSDRに比べて高価な代わりにスペックが高いのが特徴です.拡張ボード(daughter Board)を取り付けることで広い周波数帯扱えるようにできたりします.

今までは比較的安価なSDRを使っていたのですが,実験内容に限界が来たので新たにUSRPを使おうと決めた次第です.私はEttus ResearchというところからUSRPN210というものを購入いたしました.

Matlabとは

Matlab(MATrix LABoratory)は,MathWorks社が開発している数値解析ソフトウェア.ツールボックスと呼ばれる様々なライブラリを使うことで多彩な解析・制御・処理を実現できる.その中のCommunications System Toolbox,DSP System Toolbox, Signal Processing Toolbox等を使うことでUSRPなどのSDRを制御することも可能.SDRごとのハードウェアサポートパッケージも必要になりますが,これらのツールボックスを使うには費用が結構かかるので個人での使用は厳しいかもしれないです.

これから書くことについて

USRP導入の手順を自分の身に起こった通りに書いていくつもり.中には明らかに手順がおかしいところがあったりもするが,後で振り返れるように自分がやった通りに書いていきます.全記事の最後に導入方法をまとめたいと思います.

まずはこの記事の構成を示します.

  1. MatlabでUSRPを動かす
  2. USRPのファームウェア及びFPGAイメージのアップデート(前編)
  3. USRPのファームウェア及びFPGAイメージのアップデート(後編)

このような手順で書いていきたいと思います.

それではまず1.から.

1. MatlabでUSRPを動かす

SDR制御ソフトウェアの選択

このサイトにあるように,USRPの制御ができるソフトウェアはいくつかあります(ホントはもっと良いサイトがあったのですが取り急ぎ).

  • GnuRadio : OSSのSDR制御ソフトウェア.Pythonで動かすことができ使いやすい.HackRF Oneはこれを使っていた
  • Labview : USRPを制御する際よく使われる印象.情報も多い.
  • Matlab : 言わずと知れている数値解析ソフトウェア.今回はこれを使う.

私は共同で研究している方の環境と合わせることや,USRPでの電波受信後の解析でMatlabツールボックスを利用したいという理由からMatlabを使用します.大学でMatlabを比較的安価に利用できるライセンスがあったのでそちらを利用.余談ですが,このライセンスの紐づけに問題があり,非常に苦戦した(ライセンスサーバ側の問題だった様子).

Matlabの環境構築

Matlabそのものの構築は学内ライセンスに依存するので割愛.必要なツールボックス等は以下.

  • Communications System Toolbox
  • Signal Processing Toolbox
  • DSP System Toolbox
  • Communications System Toolbox Support Package for USRP® Radio

これらを入れるとMatlabからUSRPを動かすことが可能になる.USRPのサポートパッケージを入れるとサンプルプログラムもいくつか付いてくるので試すことが可能です.

USRPの環境構築

USRPN210に加え,拡張ボードを買っていたのでそちらを取り付ける.取りつけはこちらのサイトを参考にした.

USRPは特にマニュアルなどは付属しておらず,Ettus Researchの電子ユーザマニュアルがある.だが私はこちらのナレッジベースを参考にした.ここを見ると以下のような記述がある.

All Ettus Research products are individually tested before shipment. The USRP™ is guaranteed to be functional at the time it is received by the customer.

「出荷前に個別にテストされていて,届いた時点で既に機能するぜ」と言っていると僕の英語力が言っている.そのため早速クロスケーブルでUSRPとホストPCを繋いでテストプログラムを動かしてみる.今回はsdruFMReceiverSimulinkExampleというサンプルを動かしてみる.MatlabコマンドラインにsdruFMReceiverSimulinkExampleと打ってEnter.

Simulinkのブロック図が表示されるので実行.

すると「192.168.10.2にデバイスが見つからねぇよ」的なことを言われる.当たり前である....静的にIPを振ってアドレス空間を共通にする必要がある.

気を取り直してイーサネットのプロパティのIPv4の設定から静的にIPを振る

気を取り直して実行すると,デバイスは見つかったが以下のエラーが出る(スクショを消し飛ばしたので写真になります...).

matlab_fw_fpga_update_error

んんん?ファームウェアFPGAイメージのアップデートが必要で以下のコマンドを試せと言われている(パスの上の方省略).

$PATH/UHD/lib/uhd/utils/uhd_images_downloader.py
$PATH/UHD/bin/uhd_image_loader --args="type=usrp2,addr=192.168.10.2"

そのまま使えると書いてあったがやはり僕の読み間違いでファームウェアやイメージのインストールが必要だったのか,もしかしたら購入から使うまでに間が空いてしまったのでファームウェアFPGAイメージのアップデートが必要になったのか,と色々考えつつ,まずは指示されている上記のプログラムを実行しようと思い至った.

調べてみると,USRPはUHD(USRP Hardware Driver)というソフトウェアでホストPCから様々な設定が可能なようなのでそちらを入れることに.

続きは次の投稿とします.

余談

今回はエラー内容からUSRPが認識されているかどうかわかりましたが,Matlabのコマンドで接続を確認するには以下のようにします.

>> findsdru("192.168.10.2")

こうすることで接続機器のプラットフォームやシリアルナンバーが表示されます.さらにはステータスというのが表示されます.正常ならばSuccessと出ますが,この段階の私のようにファームウェアFPGAイメージのインストールが必要な場合ですとnot compatibleみたいな状態になってます.

Firmware Analysis Tool「Binwalk」のインストール

何らかのファイルに別のファイルが入れ子になっているようなファイルの分析や展開に便利なツールBinwalkのインストール手順のメモです.

環境

インストール

1.ソースコードのダウンロード

BinwalkのGithubからソースのZIPをダウンロード.もしくは任意のディレクトリにcloneする.

$ wget https://github.com/devttys0/binwalk/archive/master.zip
or
$ git clone https://github.com/devttys0/binwalk.git

2.解凍

ZIPをダウンロードしたディレクトリに移動してZIPを解凍.

$ cd 任意のディレクトリ
$ unzip master.zip

 

3.インストール

ZIPの中にsetup.pyがあるので,管理者権限でCygwinを起動して以下のコマンドを実行.Linux環境ならsudoすればよい.

$ cd binwalk-master
$ python setup.py install

 動作確認

ヘルプが表示されればきちんとインストールされている.

$ binwalk

Binwalk v2.1.2b Craig Heffner, http://www.binwalk.org

Usage: binwalk [OPTIONS] [FILE1] [FILE2] [FILE3] ...

Signature Scan Options:

以上になります.
<h3>参考</h3>
<ul>
    <li><a href="https://github.com/devttys0/binwalk">Github - Installation -</a></li>
    <li><a href="https://github.com/devttys0/binwalk/wiki/Quick-Start-Guide">Github - Binwalkwiki Get started -</a></li>
</ul>     

【Python】ソーシャルグラフが簡単に作れるNeo4jを試してみた

social_graph

ソーシャルグラフの作成を簡単に行うことのできるNeo4jというツールを試してみたのでメモです.

ソーシャルグラフとは

この記事のトップの画像のようなものです.

あるデータ1とデータ2の関係性を表す際に使います.アニメやドラマのHPとかで良くある関係図みたいなものを想像すると分かりやすいかもしれません.もちろん人間の関係だけでなく,「サイトAはサイトBにリンクしている」などを可視化するのにも便利です.

Neo4jとは

Neo4jはソーシャルグラフを簡単に作る事のできるJAVAで作られたツールです.Neo4jをインストールし,起動することでNeo4jのサーバが立ち上がり,そこにアクセスすることでWebUI上で操作することが可能です.Cypher QLと呼ばれるSQLライクなクエリランゲージを操作することで,データベースにノードやその関係を示したデータを追加したり,グラフの表示したりグラフを削除することができます.

環境

環境は以下とします.

Neo4jのグラフデータを操作するにはCypher QLをWebUIで入力する以外に,プログラムなどで外部からCypherのクエリを送って操作する方法もあります.今回はPythonneo4j-rest-clientというライブラリを使ってみます.

インストール

こちらのサイトからインストーラをダウンロードします.ここでは個人利用版をダウンロードしていますが,商用版もあるようです.

インストーラをダウンロードしたら実行し,手順に沿っていけばインストールが完了します.

ちなみにMac等はbrewで入れられたリ,あるいはバイナリのtarがあるのでそれをダウンロードすればいいみたいです.

使い方

Neo4jの起動

下記のようなウィンドウがでるので,Startを押すとサーバが起動します.デフォは7474ポートが使用されます.Stopすればサーバが止まります.

neostart

neostart2

サーバ起動状態でブラウザでhttp://localhost:7474/にアクセスすればWebUIを使うことができます.

確か初回起動時にログインが必要で,デフォルトのID/PASSneo4j/neo4jだった気がします.それでログインするとパスワードの変更を求められて,任意のパスワードに変更できます.

クエリの例

Pythonで使うクエリの例です.ノードというのはグラフで言う丸っこいやつです.

これを実行してみると,内部で各処理が行われ見た目上は特に何もなく終わります.

WebUIの方に移って,クエリ入力欄に以下のように打ち込むことでグラフを表示することができます.

# 全てのノードを返す
MATCH (n)-[r]-(m) RETURN n, r, m

すると以下のような片思いのグラフが表示されます.

neo4j_test

悲しい.

簡単なプログラム

取りあえず自分に関連する色々を表示するプログラムを作りました.

  • neo4j.py -> 適当にファイル読み込んでクエリ投げる
  • node.csv -> ノードになり得るキーワードを読み込みnodeを作る
  • labels.csv -> 各ノードのラベルが1行にlabel,nodeで書いてある.よくよく考えたらnode.csvと一緒でもよかった.
  • rel.csv -> 各ノードの関係を1行につきfrom,rel,toで書いとくと読み込んで表示できる

追記) 上記プログラム,has_keyなどでキーのチェックした方が良いですね.エラーで止まります.

今回はただただ繋がりを示したかっただけなので関係を全てRelとしてますが,ソーシャルグラフであればLike,とかinterestとか分けた方が良いと思われます.

デモ

こんな感じ.

neo4j_demo

こんな感じで簡単にソーシャルグラフを作ることができます(クソ情報しかグラフ化してないけどなんかセンシティブな情報がグラフ化されてないか怖い).

しかもノードをつかんでブルンブルンして遊べます自由に位置を変更したりすることもできます.楽しい.

余談

「自分に関するキーワードをたくさん挙げてね,書式は問わないよ」みたいなことを某所で言われたときに使ってみようかと思い立って使いました.Neo4jを知ったきっかけは研究室の先輩がWebトラッキングの研究でデータを可視化する際に使ったとゼミで言っていたからです.

最近可視化にちょっとはまってたりします.

参考

攻撃分析ハッカソンに参加しました

ntt_hackathon

NTTコミュニケーションズ主催の攻撃分析ハッカソンに参加してきました.抽選でしたが当選しました.ハッカソンに参加するのは初めてで,ちょー疲れましたし結果も残せませんでしたが,とても楽しいイベントで良い経験になったので参加報告させていただきます.

開催概要

正確には,Tech Workshop 「攻撃分析ハッカソン~いま、何が起きている?~」というNTTコミュニケーションズの開催する技術ワークショップです.NTTコミュニケーションズさんとしてもハッカソンというのは初の試みのようです.

主な内容は以下になります.

  • 午前 (10:30-11:45) : CTF入門
  • 午後 (13:00-18:00): 攻撃分析ハッカソン,発表,投票

午前中は,実務にも使えるCTFの技術について,簡単な問題を解きながら解説していただきました.

午後から攻撃分析ハッカソンの開始で,5時間の制限時間の中で指示されたお題に関するハッカソンを行います.

午前中のCTFについては取り急ぎ割愛し,午後の攻撃分析ハッカソンについて書きたいと思います.

攻撃分析ハッカソン

攻撃分析ハッカソンは,ハニーポットのデータを使ったハッカソンです.ハニーポットのデータを使うということは当選前から知らされていました.

当日知らされたテーマは,ハニーポットのアクセスデータ分析」です.最終目的は,「このデータから分かる攻撃や傾向についての分析結果を示す」ということですがその方法は自由で,可視化するもよし,シェル芸で解析するもよし,ハニーポットのデータを使っていれば何でもありみたいな感じでした.

また,事前にハニーポットのログ分析の例を解説していただいたり,競技中に度々アイディアのヒントみたいなものをいただけたりして,学びつつ・作りつつ・分析する,といった感じでした.

評価基準

明確な評価基準は明かされていませんでしたが,ハッカソンの解説をしてくださった社員方の発言と,実際の審査結果から,以下の二つが評価されていたと考えます.

  • データ分析における着眼点
  • 分析で用いた技術力 (実装・理論・シェル芸)

と言っても評価するのは社員さんだけでなく参加者(社員さん6人くらい,参加者15人くらい)もなので,必ずしも上記2点だけとは限らないかもしれません.

しかし実際のところ,この2点による厳正な審査であったと感じています.それは結果を見れば明らかでした.一人2票,投票権を持っており,優秀な参加者が2人選ばれるという方式だったのですが,上位二人は上記2点において非常に優れており,納得の結果でした.1位の方は,UDP通信の多さとDistination Portの1900ポートの多さ(UPnP)から,SSDPリフレクション攻撃に着目し,見事な分析をしていました.

扱ったデータ

データは12月の1ヶ月間のデータで,受ける通信のみです.また,予めエフェメラルポートの通信を除去してあるという親切設計でした.形式はJSON形式でしたが,何のハニーポットを使っていたかは聞きそびれてしまいました.

競技中

5時間という時間をどう使うかが重要ですが,皆さん最初はデータを用いて何をするかを考えていたと思います.分析しなければいけないのは当たり前なのですが,分析をするにあたり「どこに着目しようか」,「とりあえず可視化してみて当たりをつけようか」などです.事実,社員さんが言うには,分析は大きく分けて,以下の二通りの進め方であり,私もそれに共感いたしました.

  • セキュリティに関する知識を元に,事前にここが怪しいと仮説を立ててその仮説を証明できるよう分析を進める(ドメイン知識を元に仮説を立て分析)
  • 可視化をして膨大なパケットや特徴的なパケットを見極め,そのデータをフィルタリングしたりして分析を進める(探索発見的データ分析)

前者であれば,「UPnP->SSDPリフレクションが怪しい」,「クリスマス,大晦日の通信には何か特徴があるのではないか」等を考え,後者は「22番ポートは多すぎるから省いたが,すると23番ポートも多いことがわかる(TelnetはMiraiが使う)」,「ウェルノウンポートを除いた中で,7547ポートへの通信が目立つ(こちらもMiraiが使うとされる)」などを考えるということです.なお,参加者の中には,「取りあえずJSON眺めてたらShellShockの攻撃コード見つけた」という強者もいました.

競技中は積極的に社員さんに質問することが許されていました.攻撃分析ハッカソンと言ってはいますが,参加者の中にはセキュリティを専門としない別領域の専門の方も多くいらっしゃいました.その方々はセキュリティの知見を社員さんに聞きながら,自然言語処理の技術・SQLによる文字列操作の経験,など自分の専門分野の知見も活かして分析を有利に進めていました.かくいう僕も質問をさせていただき,データのどこに注目すると分析を進めやすいかなど教えていただいて,とても勉強になりました.(普段私は電波を再帰反射してあれしてあれするみたいなことをしています)

73Spicaの成果物

私はハッカソンに参加を決めたときから,「可視化に力を入れたい」と決めていました.理由は単純で,ハニーポットのデータは扱ったことが無く,どんなデータがあるのか目で見てみたいという願望があったからです.また,ハニーポットのデータの扱いが未経験であるハンデを少しでも減らすため,見慣れていないデータの概要が一目で分かる可視化ツールを作ることで,上述した「探索発見的データ分析」を行おうと考えたからです.

有名な可視化のツールとしてKibanaがありますが,今回は使いませんでした.私はKibanaを使ったことが無かったため,「競技時間の5時間で環境構築を行い適切なデータ処理を行うのは困難ではないか?」と考えたからです.そこで私の得意なJavaScriptHTML5のスキルを活かして,自分で可視化するツールを作ろうと思い立ちました.(せっかく「ハッカソン」と名の付くイベントなので何か作ってみたかったという考えもありました.ハッカソンというイベントは初参加だったのでワクワクしていました.)

以上の理由で,私は「WEBベースの可視化ツール」を作りました.ツールと言っても,時間の関係もありまして,「WEBのUIでファイルを読み込ませたら自動で解析!」というものではなく,Pythonで解析して得たデータをグラフ化していい感じに表示するUIを作った,という感じです.

下図がデモです.

ntt_hackathon_demo

この可視化データでは,

  • 国別時間帯データより,自動で攻撃している可能性が高い
  • 国別時間帯データより,1時間毎のデータが見えていることから,VNの通信は1時間毎に実行されるボットである可能性が高い
  • Telnetの多さや7547ポートの通信から,Miraiやその亜種による通信がある可能性が高い

などの情報が分かりやすく可視化されていると思います.1位の方がおっしゃっていたUDPの1900ポートの通信の多さも伺えます.

使ってるものの簡単な説明や工夫した点は以下.UIはこのブログライクにしてみました.

  • 解析 : Python2.7
  • グラフ : Chart.js
  • UI : JavaScript, HTML5(Canvas), CSS
  • IPと国の対応 : GeoIP(Python)
  • 見やすいことを心掛けた
  • Chart.jsは動的にグラフを変えられるので,それが活かせるようなグラフを作った
  • PythonでのJSON解析は,1ループでデータを取れるようにし,辞書やSetなどを用いるようにして高速化を図った.

発表

発表は一人3分の簡単なものでした.成果物が目に見える可視化ツールだったので,「スライドなどは作らず、ツールを見せながら説明すれば良さそう」と思っていたら,スライドの発表者ツールが使えないせいで時間のマネジメントができず、タイムオーバーで死にました.(学会発表では完全にツールに頼り切っています)

社員の方が時間ぴったりでプロジェクターのシャッターを閉じてしまうので、多少であれば話続けさせてくれる慈悲もありませんでした。

反省・改善点

今回の敗因は以下にあると考えます.

  • ツールに力を入れすぎて肝心の攻撃分析が足りなかったこと
  • その不足を補うような成果発表ができなかったこと

前者が大きい原因だと言えます.今回はあくまで「ハニーポットのデータから分かる攻撃や傾向についての分析結果を示す」ことが目的であり,可視化ツールは探索発見的データ分析の道具にすぎません.

また成果発表において,上述したような可視化から分かる事象(Miraiと思われる通信の多さ等)を指摘したり,このツールが分析において有用であるということをアピールできれば良かったのですが,それを上手く伝える発表ができませんでした.

今後は攻撃分析を行えるよう知識を付けると共に,上記のような点を改善できればと思います.

ツールの改善点としては,入力としてファイルを渡せば一気に最後まで解析をしてくれるような改善をすると使いやすくなると考えています.

感想

最初にも書きましたが,とても楽しく勉強になりました.最後には社員さんからの分析結果の発表もあり,最近のセキュリティの動向を知ることもできました.また社員さんとお話することもできたため,セキュリティ業務の内容について理解を深めることができました.個人的にはとても良いイベントだと感じました.

余談

1位,2位は共に有名CTFチーム「TomoriNao」のメンバーでした.さすがの知識と分析力でした。

【Python,Cygwin】GeoIPでIPから国名などの情報を取得

取り急ぎメモ.

環境

Windows, Cygwin, Python2.7

インストール

libGeoIP-develが必要.

管理者権限でCygwinを起動して以下を実行.

$ apt-cyg install libGeoIP-devel
hash_check: sha512sum: GeoIP-database-20161207-1.tar.xz: OK
Unpacking...
Package GeoIP-database installed
Package cygwin is already installed, skipping
Package libGeoIP1 installed
Package pkg-config is already installed, skipping
Running postinstall scripts
Package libGeoIP-devel installed

$ pip install GeoIP Collecting GeoIP Using cached GeoIP-1.3.2.tar.gz Installing collected packages: GeoIP Running setup.py install for GeoIP ... done Successfully installed GeoIP-1.3.2</pre> <h3> 実行確認</h3> <pre class="theme:dark-terminal lang:default decode:true">$ python Python 2.7.10 (default, Jun 1 2015, 18:17:45) [GCC 4.9.2] on cygwin Type "help", "copyright", "credits" or "license" for more information. &gt;&gt;&gt; import GepIP Traceback (most recent call last): File "&lt;stdin&gt;", line 1, in &lt;module&gt; ImportError: No module named GepIP &gt;&gt;&gt; import GeoIP &gt;&gt;&gt; gi = GeoIP.new(GeoIP.GEOIP_MEMORY_CACHE) &gt;&gt;&gt; gi.country_code_by_name("yahoo.com") 'US' &gt;&gt;&gt; gi.country_code_by_addr("107.189.171.198") 'US'</pre> <h4> 参考</h4> <ul> <li><a href="GeoIP">http://sonickun.hatenablog.com/entry/2014/07/30/211426">GeoIPIPアドレスから位置情報を取得する[Python]</a></li> </ul>