MD Blog

誰かの何かに役に立てることを書いていきたいです

遠隔操作事件におけるセキュリティ攻撃まとめ

2012年に起きた遠隔操作ウイルスおよびクロスサイト・リクエスト・フォージェリによる連続威力業務妨害等事件[1]において、犯人が行ったセキュリティ攻撃を個人的にまとめます。

クロスサイト・リクエスト・フォージェリ

  • 保土ヶ谷区桜台小学校への無差別殺人予告で用いられた攻撃手法[2][3]
  • 殺人予告は2012年6月29日に横浜市のWebページ「市民からの提案」に投稿された[4]

概要

  • HTTPリクエストを偽装(フォージェリ)する攻撃
  • Webサイト訪問者が意図しない、別のWebサイトへのリクエストを送信する
    • JavaScriptを用いた手法
      • Webサイトを訪れた瞬間などに、任意の文字が埋められたフォームをPOSTする
    • imgタグを用いた手法
      • imgタグのsrcに任意のURIを指定してGETリクエストを送信する

実際に行われた攻撃手順

  1. 2ちゃんねるの「OCN規制被害者の会 2006年目」というスレッドに以下が投稿される[5]

    小ネタですが...
    http://is.gd/STDcf0

  2. このURIへアクセスすると、犯罪予告を自動で書き込むJavaScriptコードが組み込まれたURI http://fragt.freezoy.com/?key=y01[1] へリダイレクトされる

  3. 横浜市のWebページに犯罪予告が投稿される

遠隔操作

  • クロスサイト・リクエスト・フォージェリが用いられた事件は1件のみで、それより後の犯罪予告はすべて遠隔操作によって行われた[1][2][3]
  • 犯人は遠隔操作ウイルスの画面キャプチャ機能を用いてウイルス感染者のPC画面を観察していた[2][3]
  • 画面キャプチャからウイルス感染者の居住地が特定されたケースでは、それが犯罪予告に反映された[2][3]
  • プログラム名は「iesys.exe」[1]
  • トレンドマイクロ社は「BKDR_SYSIE.A」、シマンテック社は「Backdoor.Rabasheeta」と遠隔操作ウイルスを命名し、それぞれ解析情報を公開している
    • シマンテック社が用いたの「Rabaseeta」という言葉は、遠隔操作の命令コマンドが書き込まれた「したらば掲示板」が由来

iesys.exeの挙動

  1. Windows起動時に自分自身を起動するようにレジストリを変更する[6][7]
  2. したらば掲示板へ書き込まれたコマンドを読みに行く(おそらく定期的に掲示板へアクセスすると思われる)[6][7]
  3. コマンドを実行

iesys.exeの機能[6]

  • スクリーンショットの取得
  • ファイルのダウンロード
  • ファイルのアップロード
  • ファイルおよびフォルダの列挙
  • ファイルの実行
  • デフォルトのインターネットブラウザの取得
  • 隠しブラウザで特定のURLを操作および開く
  • ユーザのキー入力操作情報およびマウスの操作の記録
  • 自身のアップデート
  • 環境設定ファイルの更新
  • 利用した掲示板のスレッドの更新
  • コンピュータを一定の時間スリープする
  • コンピュータから自身を削除する

実際に行われた攻撃手順

  1. 2ちゃんねるの「シベリア郵便局」に代行書き込みの依頼がされる[1]
    • 「シベリア郵便局」とは、2ちゃんねるにおける書き込み規制を回避するために、目的のスレッドへの書き込みを他人に依頼するためのシステムの名称
  2. 2ちゃんねるの「【ソフトウェア】気軽に「こんなソフトありませんか?」 」スレッドに遠隔操作ウイルスが内在するファイルをダウンロードできるURIが投稿される[5]
  3. ファイルをダウンロードさせウイルスに感染させる
  4. したらば掲示板を通じて任意のコマンドが実行され、ウイルス感染者の情報が収集される
  5. 任意のコマンドによって犯罪予告の投稿が行われる

Reference

  1. 遠隔操作ウイルスによる連続威力業務妨害等事件
  2. 犯行声明メール
  3. 遠隔操作事件・真犯人と称する者からのメール全文
  4. ウイルスと別の手口可能 横浜市HPの弱点突く
  5. 遠隔操作ウイルス事件 2ちゃんねるの関連レス
  6. BKDR_SYSIE.A
  7. Backdoor.Rabasheeta

[Java] public static final を使わない方がいい理由

public static final で定義した変数は、コンパイル時に呼び出した場所へインライン展開されるから。定数の値を再設定してそのファイルだけを再コンパイルした場合、定数を呼び出す側のファイルは以前の定数を使用したままになる。

private static final で定義した場合 (推奨)

Api.java

private static final int VERSION = 10;

public static int getVersion() {
    return VERSION;
}

Main.java

Integer apiVersion = Api.getVersion();

Main.classをデコンパイル

Integer apiVersion = Integer.valueOf(Api.getVersion());

public static final で定義した場合 (非推奨)

Api.java

public static final int VERSION = 10;

Main.java

Integer apiVersion = Api.VERSION;

Main.classをデコンパイル

Integer apiVersion = Integer.valueOf(10);

Reference

HerokuのPostgreSQLをpgAdminから見る方法

すこしハマったので。

PostgreSQLを追加する

heroku addons:add heroku-postgresql:dev

PostgreSQL接続情報を確認する

heroku config

これで出てきたURLを以下のように読みます。

postgres://<Username>:<Password>@<Host>:<Port>/<DB Name>

pgAdminからサーバに接続

左上の接続アイコンから、Username, Password, Host, Port, Maintenance DB(= DB Name) と Name(適当) を入力してOKボタンを押せば接続できるはずです。

自分のDBを探す

DBが大量に表示されるので、自分の DB Name を探します。

Webサイトの更新を捕まえるRubyスクリプトを書きました

不定期にイベント情報が更新されるWebサイトがあるのですが、いつも見逃してしまうので今年こそは見逃さないようにスクリプトを書きました。

特定URIのHTMLを定期的に取得して、前回のHTMLと比較して追加分だけを抽出し、設定したワードが書き込まれていたらメールを送信します。

 

github: https://github.com/mishimadesign/cormorant

  1. config.yamlに送信元のメール設定と、監視するURIと探すワードと送信先メールアドレスを設定します。監視対象はいくつでも設定可能です。ワードは正規表現です。
  2. HTML取得間隔をclock.rbに設定します。1.hourのところを10.seconds, 3.minutes, 1.dayなどに変更できます(詳しくは https://github.com/adamwiggins/clockwork )。
  3. Herokuへアップロードします(詳しくは http://www.ownway.info/Ruby/index.php?heroku%2Fhelloclockwork  )。または、bundleが実行できる環境で"bundle install"してforemanが実行できる環境で"foreman start"で実行。

おすすめ設定
 - uri:   http://www.ntv.co.jp/kinro/lineup/
   word:  カリオストロの城|天空の城ラピュタ|となりのトトロ|火垂るの墓|魔女の宅急便|おもひでぽろぽろ|紅の豚|平成狸合戦ぽんぽこ|耳をすませば|もののけ姫|となりの山田くん|千と千尋の神隠し|猫の恩返し|ハウルの動く城|ゲド戦記|崖の上のポニョ|借りぐらしのアリエッティ|コクリコ坂から|風立ちぬ|かぐや姫の物語
   mail:  example@gmail.com

デジタル署名についてのメモ

送信者

文書のハッシュ値秘密鍵で暗号化して署名を作成する。

 

受信者

公開鍵で署名を復号して、文章のハッシュ値が正しいか確認する。

 

以上から、通信経路において文書が改竄されていないことを確かめられる。

しかし、文書の作成者が文書に記されている本人かどうかはわからない。

それを証明するには、公開鍵が文書に記されている本人から配布されていることが保証されている必要がある。

そうすれば、署名を復号できればその署名をしたのが文書作成者本人であることが確かめられる。

 

公開鍵は認証局(CA)に認証してもらう。

そのために電子証明書を発行してもらう。

 

参考

http://yamanjo.net/knowledge/internet/internet_19.html

MVCの本質

MVCの古典的定義を読んで思ったこと。

 

MODELS - VIEWS - CONTROLLERS

http://heim.ifi.uio.no/~trygver/1979/mvc-2/1979-12-MVC.pdf

モデル・ビュー・コントローラ - Trygve Reenskaug

http://d.hatena.ne.jp/digitalsoul/20100913/1284330448

 

Model, View, Controllerそれぞれの依存関係が重要なのだと思いました。

今までMVCとは、Modelがどの範囲までカバーしているのかとか、Controllerは何をするのかとか、そういった役割についての定義だと思っていました。M,V,Cそれぞれの役割についてはさまざまな解釈があり、どれが正しいのかを判断する客観的な指標がありません(あるいはどれを正しいとしても問題ない)。

しかし、依存関係ありきで考えるとおのずとそれぞれの役割も定まることに気が付きました。

MはVもCも知らない。なのでModelは、単純に対象を表したオブジェクトになる。

VはCを知らずMを知っているので、Mのデータを視覚的に表すためのオブジェクトになる。

CはユーザのインプットをMやVに反映させる。

DBデータなどはCでとってきてMに入れてVにわたすのがいいのかな。