6ヶ月間のハニーポットログの可視化(構築及び視覚化手法)

毎月、飲み会1〜2回分くらいのお金を吸い続けさせながら運用している個人的なハニーポットですが、 データをためるだけためて塩漬けにするのもなんなので、過去6ヶ月分(2014年10月〜2015年3月)の データを可視化および公開しました。公開されているデータは http://pktviz.org/lurker から参照できます。 この記事ではデータの収集方法や可視化・分析方法、興味深かった分析結果について解説したいと思います。

データ収集方法

攻撃データの収集はAmazon EC2上のインスタンスを利用し、自作のハニーポットソフトウェアLurkerを動かして インターネット上からサーバのような常時稼働しているタイプのホストに対する攻撃を収集しました。 PCなど個人で使うようなホストへの攻撃はインターネットから直接的なアクセスではなく Drive by Download攻撃(悪意のあるWebサイトを閲覧した時に攻撃を受けるタイプ)やEメールを利用した攻撃に トレンドが移り久しいですが、公開サーバへの攻撃は日々継続しています。 今回は収集期間(2014年10月〜2015年3月)の間に1つのIPアドレスに対して24,844件のアクセスを受けました。

"ハニーポットの構造"

上の図がハニーポットの設計になります。青色のオブジェクトがハニーポット運用のために用意したもの、 赤が外部からの攻撃者になります。 ハニーポットの動作は非常にシンプルでTCPのSYNパケットに対して偽のSYN ACKパケットを応答し、 あとはデータを含むパケットが送られてきたらそれを記録してDBへ送るだけというものです。 ご存じの方も多いかと思いますが、TCPの通信は

  1. 通信を開始したいホストがSYNパケットを送る
  2. 通信を受けるホストがSYN ACKパケットを返す
  3. 通信開始側のホストがACKパケットを送る
  4. ここまできて両方のホストの準備が整った(Establihsed)ものと判断してデータの送受信がはじまる

という流れで開始します。ここでこのLurkerは送られてきたあらゆるTCP SYNパケットに対して ひたすら偽装したSYN ACKパケットだけを応答し、あとは何もせず放置しておきます。 そうするとSYNパケットを送ってきた攻撃側は勝手にEstablishedの状態になったと判断して、 攻撃データを送ってきてくれるので、あとは送られてきたデータを記録するだけです1。 データはログとしてfluentdに投げているので、あとはプラグインと設定次第で格納するDBは選びたい放題です。 特に深い理由はなく、自分がちょっと慣れているからという理由だけでMongoDBを使っています。 今回はこのDBから6ヶ月分のデータをとりだして、別途データを分析したものを公開しています2

データの可視化

前述したとおり、可視化されたデータは http://pktviz.org/lurker から参照できます。

今回の分析のポイントとして、攻撃のペイロード(実際に送信されたTCPのデータセグメント部分)の 類似性にもとづいて事前にデータをクラスタリングしました。 送信されてくるデータは完全に重複するものも数多くあるのですが、それ以上に攻撃者が使っているツールがわずかに違ったり、 あるいは攻撃に使っているパラメータが少し違うだけというようなものが多く観測されました。 もちろん、攻撃対象となるサービスのプロトコルに依存する部分もありますが、 下の図のようなクラスタリングを実施した結果、同じプロトコルでも複数の特徴が見える結果となりました。 類似度はペイロード同士の最長共通部分などを基準にし、24,844件のデータを569のクラスタにまとめることができました。

"攻撃データのクラスタリング例"

それぞれのクラスタはSampleという単位で扱っており、それぞれにSample IDが割り当てられています。 (代表値のペイロードからMD5のハッシュ値をわりあてただけです) このクラスタをベースにして、各クラスタの代表ペイロードデータ(Example payload (ascii + hex))、 宛先ポートの割合(Destination Port)、時系列での発生件数(Time Series Chart)をリストで表示しています。 宛先ポートの表示はd3pie、折れ線グラフはd3jsで描画しています。

"一覧表示画面でのSampleのサマリ"

このリストでは代表値の検索ぐらいはできるようにしておいたので、例えば:;といれて検索することで Shellshockっぽいパターンを抽出したり、_searchで検索することでElasticsearchの脆弱性を狙ったと思われる ものを抽出することができます3

またSample ID: xxx...のタイトルの部分をクリックすることで各クラスタの詳細な情報を見ることができます。

詳細の1つとなるのが、1つのクラスタにまとまっている複数のペイロードにどのようなバリエーションがあるのかというものを 可視化したものです。これはペイロードの差分をノードグラフにしてペイロードの分岐を示したものになります。 サムネイルをクリックすると大きい画像を表示しますが、中には数十MBのものもあるので注意して閲覧してもらえればと思います。 例えば下の図で示しているペイロードはQNAP NASのShellshock脆弱性を 狙った攻撃と見られますが、/cgi-bin/authLogin.cgi というパスを指定しているところまでは共通していますが、 攻撃コードとして最初に実行するコマンドが/bin/rm -rf /tmp.io.php/bin/rm -rf /tmp.S0.php/bin/rm -rf /tmp.io.shというようにいくつかのバリエーションがあることがわかります。 グラフ作成アルゴリズムがちょっとやっつけなので、重複するノードがあったりするのはご容赦ください4

"QNAP NASのShellshock脆弱性を狙ったとみられる攻撃のパターン1"

また、下の図も同様の図の一部ですが、上側の部分で途中でデータをダウンロードする先がhttp://stanislaw...http://185...http://lliillii...と少しずつ違っていたり、 下側の部分でデータ設置場所にしようとしているディレクトリも/share/HDB_DATA/home/httpd//home/httpd/cgiとバリエーションがあるのがわかります。 これによって同じ脆弱性やツールを用いた攻撃でも部分的に違ってくるということがわかります。 フルサイズの画像はこちらから参照できます。

"QNAP NASのShellshock脆弱性を狙ったとみられる攻撃のパターン2"

さらに送信元IPアドレスと宛先ポート番号について、それぞれどの時期にどれくらいの攻撃が発生していたのかを示す ヒートマップをそれぞれのクラスタごとに作成しています。時系列的な量的変化を表すのだと折れ線グラフが一般的ですが、 系列(ここでは送信元IPアドレスや宛先ポート番号の種類)の数が20をこえたあたりから折れ線グラフは極端に見づらくなってしまいます。 一度に多くの系列を表示させて時間相関が見やすくなること、そして数の比率より1件でも攻撃があったかどうか、という観点から 時系列ヒートマップで視覚化しました。明るい赤のほうが発生件数が多い時間帯で、マウスオーバーで実際の件数を見ることができます。 これによって、ツールや攻撃手法がどの時期に流行ったかや、攻撃対象となったサービスがどのように変化したかを読み取ることができます。

"送信元IPアドレスと攻撃発生日時のヒートマップ" "宛先ポート番号と攻撃発生日時のヒートマップ"

ちょっと長くなってしまったので、分析結果の紹介は記事を分けたいと思います。


  1. この仕組はもともとFFRIの村上純一さん(@junichi_m)が考案して実装を公開されていましたが、今は公開されていないので勝手に作りました。

  2. もちろんリアルタイムに直近のデータを表示させることもできますが、ハニーポットを特定可能な情報が含まれてしまうため、ここでは過去のデータだけを使っています。なお当該ハニーポットはすでにシャットダウンしています

  3. あと、90 90のように入力すると16進数としてバイナリ値としても検索できるはずです。

  4. というか、こういう複数のシーケンスからきれいな分岐のグラフをO(N log N)ぐらいで作れる簡単なアルゴリズムをご存知の方がいらっしゃいましたらぜひご教示ください。O(N2)ぐらいならいけそうなんですが、いかんせんデータ数が多いものが終わらない。。。

Comments