HOME > Scutumを支える技術 > Scutum技術ブログ

技術者ブログ

クラウド型WAF「Scutum(スキュータム)」の開発者/エンジニアによるブログです。
金床“Kanatoko”をはじめとする株式会社ビットフォレストの技術チームが、“WAFを支える技術”をテーマに幅広く、不定期に更新中!

2021年10月

          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
Scutum開発者/エンジニアによる技術ブログ WAF Tech Blog

HadoopとDunkheadでCodeRedワームの感染の様子を可視化する

はじめに

Dunkheadはタイムスタンプ付きのテキストデータ(アクセスログなど)を手軽に可視化するためのソフトウェアです。Hadoop上で動作するため、データのサイズが大きい、いわゆるビッグデータの場合にも使用することができます。

今回はCAIDAで公開されているCodeRedワーム感染時の時系列データを、Dunkheadで可視化してみます。CodeRedワームは12年前(2001年)に猛威をふるった、今となっては非常に懐かしいコンピュータウイルスです。わずか14時間の間に35万ものホストに感染し、当時のインターネットを大混乱に陥れました。

今回利用するCodeRedワームに関するデータセットは、下記の組織によって提供されています。

Support for the CAIDA Dataset on the Code-Red Worms was provided by Cisco Systems, the US Department of Homeland Security, the National Science Foundation, DARPA, and CAIDA Members.

The CAIDA Dataset on the Code-Red Worms - July and August 2001, David Moore and Colleen Shannon.

可視化の対象となるタイムスタンプ付きのデータはcodered-july.table.txtという名前のファイルで、29万行あり、サイズは21MBほどです。2013年の今となってはそれほど大きなものではないため、Hadoopを使わなくても解析可能ですが、ちょっと変わったデータセットということで、Dunkheadによる可視化のチュートリアルのひとつとして使ってみます。

生のデータを見てタイムスタンプ部のフォーマットを確認する

Dunkheadでデータを可視化する場合、まずは生のデータがどのようなものなのか、先頭の数十行程度でもよいので、実際にエディタで確認します。可視化の対象とするCodeRedワームのデータは、以下のようなフォーマットになっています。

# The tab seperated columns in this file are:
#  1.  start time
#  2.  end time
#  3.  TLD
#  4.  country
#  5.  latitude
#  6.  longitude
#  7.  AS number
#  8.  AS name

995557500.416929007     995557500.416929007     com     us      33.03   -96.74  7132    SBIS-AS (7132)
995555891.224946022     995587111.971   arpa    tw      24.15   120.67  3462    HINET-AS (3462)
995559414.895717978     995577450.949   arpa    us      34.07   -117.17 1       BBNPLANET (1)
995534024.986616969     995586691.982   arpa    us      39.58   -104.9  2914    VERIO (2914)
995556450.434137940     995586811.959   arpa    us      39.58   -104.9  2914    VERIO (2914)
995559336.812577009     995559712.060075998     arpa    tw      24.15   120.67  3462    HINET-AS (3462)
995563575.986   995565201.511910        arpa    br      -10     -55     13353   NETSTREAM (13353)
995566935.941   995586271.950   arpa    ru      60      47      6903    AHA-AS (6903)
995584651.959   995584934.978689        net     us      41.89   -87.62  19024   INTERNAP-BLK5 (19024)

各データはタブで区切られており、左から開始時間、終了時間、TLD、国、緯度、経度、ASナンバー、AS名となっているようです。

タイムスタンプ部のフォーマットはUNIX TIME(秒)で、小数点以下も存在しているようです。通常、Dunkheadの設定ファイルにおいてdatetime.formatの値はJavaのSimpleDateFormatのフォーマットに従った記述を行います。しかし今回のようにUNIX TIMEの場合には、該当するフォーマットが存在しません。そこで、かわりに「unixtime_second」あるいは「unixtime_millisecond」という表記を使用します(前者は秒の場合、後者はミリ秒の場合)。

タイムスタンプ部は行の先頭から始まっているので、Dunkheadの設定ファイルを以下のように記述してみます。

{
        "datetime": {
                "format": "unixtime_second",
                "regex": "^[0-9\\.]{10,}"
        },  
        "fields": []
}

単位時間あたりの感染ホスト数を可視化する

Dunkheadを実行すると、以下の画像が1つだけ出力されます。これは単位時間(デフォルト値の5分)あたりのログの件数、つまり5分間に新たに感染したホスト数のグラフになります。ピーク時には約8000以上のホストが、たった5分の間に感染していたことがわかります。

CAIDAにあるレポート、The Spread of the Code-Red Worm (CRv2)のFigure4の図が、ちょうどこのグラフと同じ内容になっています(CAIDAでは縦軸の数値は5分ではなく、1分です)。


TLD別の感染ホスト数を可視化する

データにはTLDの情報が含まれているので、次にTLD別に単位時間あたりの感染ホスト数を可視化してみます。大量の画像が生成されるのを防ぐため、閾値(threshold)を100に設定します。また、regex項目でTLDにあたる左から三番目のアルファベットで構成される部分をグループ化し、それをkey項目の中で「$1」として使います。これによって、例えばTLDが「com」のデータは「TLD-com」で集められます。設定ファイルは次のようになります。

{
        "threshold": 100,
        "datetime": {
                "format": "unixtime_second",
                "regex": "^[0-9\\.]{10,}"
        },
        "fields": [
                {
                        "name": "TLD-$1",
                        "regex": "^[0-9\\.]+\\t+[0-9\\.]+\\t+([a-zA-Z]+)",
                        "type": "count"
                }
        ]
}

上記設定でDunkheadを実行すると、約50個ほどの画像ファイルが出力されます。ここではそのうちのいくつかについて見ていきます。

.comと.netは圧倒的な多さで、感染の様子もほとんど同じであることがわかります。.govや.milといった重要なドメインのホストについても、少数はやられているようです。また、.jpは.comなどの1/10程度の比率で感染していたようです。

感染停止時間に注目して可視化する

CodeRedワームはある時間になると感染を停止し、攻撃を開始するようにプログラミングされていました。データの左から2番目の数字が「感染フェーズが終わった」と見られる時間です。

995555891.224946022     995587111.971   arpa    tw      24.15   120.67  3462    HINET-AS (3462)
995559414.895717978     995577450.949   arpa    us      34.07   -117.17 1       BBNPLANET (1)
995534024.986616969     995586691.982   arpa    us      39.58   -104.9  2914    VERIO (2914)
995556450.434137940     995586811.959   arpa    us      39.58   -104.9  2914    VERIO (2914)

設定ファイルを次のように記述し、単位時間あたりの感染フェーズを終えたホストの数について可視化を行ってみます。

{
        "datetime": {
                "format": "unixtime_second",
                "regex": "^[^\\t]+\\t([0-9\\.]{10,})"
        },
        "fields": []
}

これにより、次のような画像が出力されます。

プログラミングされていた時刻に、いっせいに停止されていることがわかります。ピークに含まれないホストは、タイムゾーンの影響か、あるいは時計が狂っていたのでしょうか。この図は先述したCAIDAのレポート中のFigure6と同じものになります。


まとめ

今回は、Hadoop上で手軽にデータを可視化するためのソフトウェア、Dunkheadを使い、CodeRedワームの感染時のデータを可視化してみました。Dunkheadはこのように、タイムスタンプ付きのデータであればgrepするような感覚で、簡単に可視化を行うことができます。

今回解析対象としたデータは小さな規模のものでしたが、DunkheadはHadoop上で動作するアプリケーションであるため、データが大規模な場合にも今回と同様に「設定ファイルに注目したい項目を記述する」だけの簡単なアプローチで可視化が可能です。フィードバック等があればお気軽に@kinyukaまでお寄せください。