2011/04/04

高度利用者向け緊急地震速報Mac用クライアント作っているときにできた副産物。
http://twitter.com/eewbot

機械による自動処理向け。

csvのフォーマット

電文の種別,訓練識別符,発表時刻,発表状況,電文番号,地震ID,地震発生時刻,震源の北緯,震源の東経,震央地名,震源の深さ,マグニチュード(以下M),最大震度,震源の海陸判定,警報の有無

実際はこんなの

37,00,2011/04/03 23:53:51,0,2,ND20110403235339,2011/04/03 23:53:21,37.8,142.3,宮城県沖,10,4.5,2,1,0

電文の種別
35:最大震度のみ。Mの推定なし
36、37:最大震度、Mの推定あり
39:キャンセル

訓練識別符
00:通常
01:訓練

発表状況
0:通常
7:キャンセルを誤って発表したとき(地震ID以降の項目は空)
8,9:最終報

電文番号
地震IDごとに00-99

震源海陸判定
0:陸
1:海

警報の有無
0:警報なし。予報。M3.5以上と推定、もしくは地震計で100ガル以上の加速度を検知した時発表。小さな地震でも発表。
1:警報あり。一般向けEEWが発表されている。テレビとかで出てるやつ。


注意事項:
EEWは震度速報ではありません。あくまでも、地震の規模を早期に推定するもの。
1回の地震でも、地震計で観測して推定に変化があったら発表される。1つの地震に対して、大体2報から最大20報位出る。
正しい結果を求めるなら、地震速報を見ましょう。

UbuntuでCisco VPNを使用する

Ubuntuは標準でPPTP VPNは張れるけどCisco VPN (Cisco IPsec VPN)はできないのでインストールメモ.
Terminalで以下のパッケージをインストール.

sudo apt-get install vpnc

GUIが必要なら以下のパッケージもインストール.

sudo apt-get install network-manager-vpnc

vpncだけだとTerminalでVPNの設定はできるけど,network-manager-vpncがないとGUIで接続設定ができない.

注意点として,network-manager-vpncインストール後,再起動しないとGUIでの設定が反映されず,「有効な共有シークレットがありません」と言われ接続できない.

うまくパッケージのインストールが完了するとVPN設定画面で「Cisco Compatible VPN」が選べるようになる.

環境:Ubuntu 10.10 32bit

FEREC社製ルーターのweb認証用ブックマークレット

大学の学内LANにつなぐと最初にweb認証を行う必要がある.また,この認証ページはブラウザのオートコンプリートが有効にならない.また,接続が切れるごとに毎回認証が画面が出るので煩わしい.
自分の大学のweb認証ページは,フレームで利用規約画面(body)と認証ページ(auth)に分かれている.したがって,フレーム要素のauth側を呼び出し,各項目を埋めsubmitするスクリプトを書けばログインを行える.
ブックマークレットに直接ユーザーネームとパスワードを埋めこむので取り扱いに注意が必要である.

これが,認証ページのhtmlである.

<form method=post
 onsubmit="document.getElementById('sb').disabled = true; return true;">
ユーザ名
<input type=text name=user id=user size=20 autocomplete=off>
パスワード
<input type=password name=pass id=pass size=20 autocomplete=off>
<input type=submit id=sb value="ログイン">
<input type=hidden name=login value=1>
</form>

これに対し,ユーザネームとパスワードをセットしsubmitするJavascriptを以下に挙げる.フレームがなく,上のhtmlがあるページに直接リンクするのならば,parent.auth.はいらない.

javascript:(function(){
 var d = parent.auth.document.forms[0];
 d.user.value="User Name";
 d.pass.value="Password";
 d.submit();
})()

このJavascriptブックマークレットに登録すればよい.iPhoneiPadではブックマークレットに登録するには少しコツがいるので以下のページを参考にすればよい.

iPod touchでフォーム入力補完をするbookmarkletを作るbookmarklet

Perlでim.kayac経由でiPhoneにPush配信する

iPhoneiPod TouchにはPush Notificationといい,文字情報を動的かつリアルタイムに通知できる機能があります.
ところがこれを実現するためには,デバイストークンのやりとり・データ受信を行うiPhoneアプリを作る必要があります.
しかし,im.kayacを使用すると,自分でiPhoneアプリを作ることなくPush配信を実現することができます.
Push配信するプログラムの情報は【iPhone】Push Notificationの実装方法を見ると大体の流れが分かります.もっと詳しく知りたいのならば,iOS Reference Libraryを見ましょう.


im.kayacの公式ページの例には,RubyPHPスクリプトはありますが,Perlスクリプトはありません.Postメソッドのいい例なんで書いてみました.LWP::UserAgentのライブラリがなかったらCPANなどでインストールしましょう.
$username変数に自分が登録したUserName,$message変数に送りたいデータを書きます.chmod +x filename.pl で実行権限をつけ実行すると,im.kayacAPIにデータを投げます.すると,iPhone等でデータを受信することができます.

#!/opt/local/bin/perl
use LWP::UserAgent;

$username = 'User Name';
$message = 'Hello World!';

$sendURL = 'http://im.kayac.com/api/post/' . $username;
$ua = LWP::UserAgent->new;
$req = new HTTP::Request POST => $sendURL;
$req->content_type('application/x-www-form-urlencoded');
$content = 'message=' . $message;
$req->content( $content );

$res = $ua->request( $req );

if( $res->is_success ){
	print $res->as_string;
}
else{
	print 'メッセージの送信に失敗しました\n';
}	


これを応用すれば、PCで緊急地震速報を受信し,im.kayacにデータを投げればこんな感じにiPhoneでも緊急地震速報を受け取ることができます。
im.kayac側の負荷や3Gネットワークの回線状況に影響されますが,遅延は概ね1秒〜4秒以内です.自分の場合,Wi-Fiだと1秒以下で受信することができます.自分でサーバーを立てたりするのも面白いと思います.

WER-AG54をDD-WRT化してみた

本来,WER-AG54はDD-WRTサポートされていません.しかし,WHR-AG108と同じチップを使用しているため,WHR-AG108向けのファームウェアを使用することができます.今回は,シリアルコンソールを使ってファームウェアを流し込む方法を説明します.
※最悪の場合,ルーターが破壊され2度と使えなくなります.いかなることに対しても筆者は責任を負いません.

WHR-AG54のシリアルコンソールは,RS-232Cの電圧レベル12Vではなく,C-MOSレベル3Vとなっています.
そこで,一般的にはADM3202といったレベルコンバータICを用い12Vと3Vを変換し通信するのですが,FT232RL USBシリアル変換モジュールを使用するとはんだ付けをすることなく簡単に接続することができます.
ピンは左から,Pin1:Rx, Pin2:Tx, Pin3:GND, Pin4:3Vとなっています.(以下の写真)

USBシリアル変換モジュールとRxとTxを反対になるように,GNDはそのままつなげます.(以下の写真)

次に,PCとルーターをLANケーブルで接続します.
この時,PC側のIPアドレスルーターアドレスと同じセグメントになるようにします.ここでは仮に,ルーター側を192.168.11.1,PC側を192.168.11.2とします.IPアドレスは各個人の環境に合わせてください.

さらに,ファームウェアをTFPTでアップロードするためにPoor TFTP Server32といったTFTPサーバーを立ち上げ,その公開ディレクトリにDD-WRTの公式ページよりダウンロードしたファームウェア等のファイル(lzma_vmlinus, root.fs, whrag108-firmware.bin)を放り込みます.

これで準備は終わりです.USBケーブルを接続し,Teratermといったターミナルソフトを立ち上げ,シリアルポートを設定し,通信方式を9600-8N-1に設定します.

ルーターの電源を入れるとメモリチェックが始まり,

enter the RedBoot console by pressing CTRL+C

と出たら,Ctrl+Cを押し,RedBootコンソール画面に入ります.

次にルーター側でRedBootのブートローダーとTFTPサーバー(PC)のアドレスを設定します.以降,赤太文字はキーボード入力,黒文字はターミナルの表示を示しています.

ip_address -l 192.168.11.1 -h 192.168.11.2

ルーターのメモリの内容を初期化します.

RedBoot>fis init

すると警告画面と,実行するか?と聞かれるのでyを押します.

About to initialize [format] FLASH image system - continue (y/n)? y

Initialize FLASH Image System

Warning: device contents not erased, some blocks may not be usable

root.fsを読み込みます.

RedBoot> load -r -v -b 0x80041000 root.fs
Raw file loaded 0x80041000-0x802c1fff, assumed entry at 0x80041000

さっきのファイルを書き込みます.

RedBoot> fis create -b 0x80041000 -f 0xbe050000 -l 0x002a0000 -e 0x00000000 rootfs

lzma_vmlinusを読み込みます.

load -r -v -b 0x80100000 lzma_vmlinus
Raw file loaded 0x80100000-0x801af797, assumed entry at 0x80100000

ファイルを書き込みます.

RedBoot> fis create -r 0x80100000 -e 0x80100000 -l 0x000c0000 -f 0xbe2f0000 linux

RedBoot> fis create -f 0xbe3b0000 -b 0x80041000 -l 0x00010000 -e 0x00000000 nvram

次に,ファイルの書き込みが正しく行われたか確認します.以下のようになると正常に書き込まれています.

RedBoot> fis list
Name FLASH addr Mem addr Length Entry point
RedBoot 0xBE000000 0xBE000000 0x00050000 0x00000000
RedBoot config 0xBE3DF000 0xBE3DF000 0x00001000 0x00000000
FIS directory 0xBE3D0000 0xBE3D0000 0x0000F000 0x00000000
rootfs 0xBE050000 0xBE050000 0x002A0000 0x00000000
linux 0xBE2F0000 0x80100000 0x000C0000 0x80100000
nvram 0xBE3B0000 0xBE3B0000 0x00010000 0x00000000

最後にブートスクリプトを指定します.これがないと,ルーターは正しくファームを読み込み起動できません.

RedBoot> fconfig
Run script at boot: true
Boot script:
Enter script, terminate with empty line
> > fis load linux
> > exec
> >
Boot script timeout (1000ms resolution): 3
Use BOOTP for network configuration: false
Gateway IP address: 192.168.11.1
Local IP address: 192.168.11.1
Local IP address mask: 255.255.255.0
Default server IP address: 192.168.11.2
Console baud rate: 115200
DNS server IP address:
GDB connection port: 9000
Force console for special debug messages: false
Network debug at boot time: false
Update RedBoot non-volatile configuration - continue (y/n)? y
note

最後に,ルーターを再起動します.

RedBoot> reset

ターミナルの設定を115200-8-N-1にしてほっておくと,DD-WRTのRedboot上での起動画面が見れます.
あとはブラウザ上で各種設定を行うことができます.

セプキャン2010 セキュリティコースに参加します

セキュリティ&プログラミングキャンプ2010 セキュリティコース ソフトウェアセキュリティ組に参加が決定しました.

ソフトウェアセキュリティ組では,主にソフトウェアの脆弱性について勉強を行います.
が,自分はソフトウェアセキュリティの勉強を最近始めた新参なので,足を引っ張ることになるかもしれませんがよろしくお願いします!

一部で応募用紙を晒す流れなので,以下に晒します.(中2病要素あるけど,気にしないでね!
あくまでも,自分の経験や思ったことを述べただけですが,参考になれば幸いです.
応募用紙は締切日の締切3時間前から書き始めたので誤字と脱字がありました.
良い子のみんなは,ちゃんと文章を遂行してから提出するんだよ!

セキュリティ&プログラミングキャンプ2010の開催を、何で知りましたか?

・公式ホームページ
・友人からの紹介
・そのほか(Twitter

事前質問

[A] ソフトウェアの脆弱性、およびそれらによる攻撃・防御の仕組みに興味がありますか はい 
[B] Cやアセンブラによるプログラミングに興味はありますか? ある 
[C]キャンプの公式Webページの講義科目に記載されたこの組の講義科目の[概要]と[詳細]と[補足]をよく読んで納得できましたか?  できた

1. この組を希望した自分なりの理由を教えてください。また、何を学びたいか教えてください。
  • 学びたいこと

 キャンプでは,ソフトウェアの脆弱性の発生原因・発見方法,脆弱性の対策について学びたいと思っています.また,プログラムが動く仕組み,セキュアなコードを書く方法についても同様です.さらに,キャンプでの講義や実習だけではなく,キャンプ参加者間で行われるであろう,コースには関係ない些細な会話からも,さまざまな知識を吸収したり刺激を受けたいと思っています.

  • 理由

 今までは,キャンプのネットワークセキュリティ組に近いことに一番興味があり,VPNサーバを立てたり,パケットを眺めたり,ルーティングをいじるなどして遊んでいました.しかし,今年2月,盛岡で行われた第3回東北情報セキュリティ勉強会に参加して衝撃を受けました.それは,愛甲氏のexploit codeのデモです.その時は,恥ずかしいことにexploit codeという言葉すら知りませんでした.すなわち,脆弱性を突いて侵入するようなことは,自分の実力が到底及ばない,魔法のようなものだとも思っていたのです.結局,その時は勉強会に参加したのにもかかわらず,あまり理解することができず,勉強不足であると強く痛感しました.また,その後の懇親会で竹迫氏といろいろと話したのですが,そこでも自分の知識不足が分かってしまいました.
 その反動から,その後はソフトウェア脆弱性について一番興味を持つようになりさまざまなことを調査し始めました.そこで分かったことは脆弱性をつくコードは,決して魔法ではなく,システムのアーキテクチャや動作原理,ソフトウェアの癖を理解し,それを実現するためのc言語アセンブリといった知識があれば,書けることです.魔法が魔法ではなく,単に技術の集まりであるとわかったら,あとは幅広い知識をつけるだけです.無論,ソフトウェアの脆弱性IT技術者として,避けては通れない問題であるとも再認識しました.
 それまでまともに使った時のあるOSはWindowsしかありませんでした.しかし幅広いソフトウェアの脆弱性に対応するには,UnixLinuxの知識は必須であると考え,現在では, Mac OS Xをメインに変え,サーバのOSをUbuntu変えて使用しています.もちろん使うだけではなく,管理者権限やデーモンといったWindowsにはない概念や違いの勉強もしています.しかし,これらのことをインターネットで調べたり,本を読んだりして調べるだけでは,時間がかかったり理解ができないことがどうしてもありました.
 そこで,このきっかけを与えてくれた講師陣の下で,再び教えてもらえる機会を得て,一気に知識を習得したいと思い,このコースに応募しました.

2. プログラミング歴を教えて下さい。また、今までに作ったプログラム (特にシステムプログラム(※1))があれば、差し障りのない範囲で具体的に教えてください。

プログラミング歴は5年です.主にcやc++c#を利用しています.システムプログラムは今までに作ったことがありませんが興味はあります.今後,システムプログラムをしてみたいと思っています.

以下に作ったことのあるプログラムについて書きます.
残念ながらブログでは書けないことがあったので,一部改編し概要のみ書きました.
応募用紙に書いたことの概略:
・既存のソフトと互換性のあるネットワークプログラムを作った.
・通信仕様を特定するためにWiresharkでパケット解析し,Visual c# 2005を用いて作成した.
・既存のソフトが使用するファイル(バイナリ形式)をStirlingで解析した.
・通信結果のログをメールで投げる機能を付けた
大体こんな感じです.

3. これまでに開発したプログラムで経験したバグ、およびその影響について差し障りのない範囲で具体的に教えてください。

これも一部改編します.
未知のネットワークストリームに対する処理とか,ネットワークエラー時の対策について書きました.
メール爆弾をやってしまった.メール転送プログラムをテストするときは実環境ではなく,テスト環境でテストする.

4. セキュリティホールは放置しておくとなぜ危険なのでしょうか。自分の言葉で説明してください。

 ソフトウェアの脆弱性を突かれ,意図せぬ動作をさせられるのは,放置されていた時間と比べると一瞬である.
また,セキュリティホールをいつ突かれるかは攻撃者しか分からず,攻撃されたら既に問題となってしまう.また,その後,攻撃に踏み台にされてしまう可能性もある.
 セキュリティホールを突く人なんてなんていないだろうと考え,対策を怠っているとそれが癖になってしまい,セキュリティホールに対応しないことに慣れてしまう.また,問題が見つかってもすぐに対応せず,さらに他のセキュリティホールが見つかった場合,片方の対応に追われ,片方がないがしろになってしまうことも考えられる.

 したがって,セキュリティホールを放置しておくと,それが癖になったり,必要な時にふさぐといったことができなくなるので,セキュリティホールは早急に埋めることが必要である.また,自分だけではなく他の人にも迷惑となることにも注意する.

5. ソフトウェアの脆弱性をなくすには何が必要でしょうか。

ソフトウェアの脆弱性をなくす方法は,1)意識的な問題,2)技術的な問題,3)発見後の対策といった3つの観点に分けることができると考える.
1) 意識的な問題
プログラムをある目的のために動かすことだけではなく,脆弱性を持たないようにするという意識が必要である.また,ソフトウェアは人間が作ることから,何か問題が見つかるのが必然と考える.ソフトウェアの開発終了後も脆弱性に対応できるような心構えが必要.
2) 技術的な問題
たとえば,バッファオーバーフローの場合,必要以上の入力を受け付けいないといったバッファオーバーフロー対策が必要.また,通信等で暗号化するプログラムなど機密性が必要なプログラムは,特に理由がない場合,広く検証されているライブラリ(アルゴリズム)を使用する.
また,わからないときは専門家に相談するといったことも場合によっては必要である.
3) 発見後の対策
 自分が作成したプログラムや使用ライブラリ等で脆弱性が見つかったら,脆弱性を埋める.また,ソフトウェアを配布している場合は,自動アップデート機能搭載するなど,できる限り最新版のソフトウェアに保ってもらうことで脆弱性をなくすことが必要.

6. あなたがある程度読み書きできるプログラミング言語を書いてください。(いくつでも可)

c, c++, c# .現在は Objective-CJavaScriptPythonの勉強をしている.

7. そのほかアピールしたいこと、書き足りないことがあれば自由に書いてください。

 セキュリティ&プログラミングキャンプのことは,2年前から知っていましたが,時間の都合が合わずなかなか応募することができませんでした.しかしながら,セキュリティ勉強会で刺激され,ソフトウェアセキュリティに関する知識が0の状態で参加するより,少しでも知識をつけてからキャンプに応募できることができたのでよかったと思っています.
 また,キャンプに参加できたら,同じような志を持った人たちと切磋琢磨し,多くの知識を吸収したいと思っています.もちろん,キャンプ後も継続して,参加者たちと交流していきたいです.
 さらに,大学での研究や,社会でソフトウェアの開発する機会に携わった時には,ソフトウェアの脆弱性に気を使うようにしたいと思っています.また,それ以外の場所でも,セキュリティ上の問題点に気が付いたら,改善できるように指摘するなどし,社会の役立てていきたいと思います.

 最後に,項目1で述べたように,自分はセキュリティ勉強会を通じて,ソフトウェアセキュリティに関する興味を得ることができました.講師人方々の,日頃のセキュリティに関する周知活動は非常に意義があることだと思っています.またそれに感謝しています.

Mac OS X環境構築メモ(随時更新)

Macを使い始めて早1か月.そろそろインストールしたアプリをまとめようと思ったら,
牧場狼ことid:yag_aysさんがいい感じにまとめていたのでオマージュして書いてみた.
元ネタはこちら.http://d.hatena.ne.jp/yag_ays/20091130/1259564460

システム環境設定

アプリケーション

そのほか

メニューバー