読者です 読者をやめる 読者になる 読者になる

ある研究者の手記

セキュリティとかゲームとかプログラミングとかそのへん

悪意のあるドメイン名のブラックリストをまとめて取得・管理するツール mdstore を公開しました

悪意のあるドメイン名のブラックリストを取得・管理する mdstore というツールを作って公開しました。

github.com

世の中にはフィッシング詐欺マルウェアによる攻撃に使われるドメイン名のブラックリストを公開しているサービスがいくつかあります(参考)。近年はDGA(Domain Generation Algorithm)を利用したマルウェアもあるためブラックリスト化だけでは追いつかない場合もありますが、それでも既知の攻撃に利用されるドメイン名の名前解決を発見もしくは防止できれば、水際で攻撃による被害を食い止められる可能性があります。

ただ、このようなブラックリストは提供しているサイトによってカバーしている領域などが違うため、ブラックリストごとに違うドメインが扱われています。多くのドメインを網羅しようとすると複数のサイトからデータを取得する必要がありますが、フォーマットが異なるなどの理由から一手間必要です。

このツールは複数のブラックリストをローカルにダウンロードし、DBに投げ入れて管理・利用することで、この一手間を簡略化しようというものです。2017年1月7日現在、以下の3サイトからデータを取得します。

注意:ブラックリストを提供している各サイトの利用規約では基本的にinternalな利用は認めているようですが、特に商用利用などをする場合には詳細をご自身でよく確認してください。

使い方

セットアップ

本ツールはnodeで動作し、redisにデータを格納します。動作を確認しているバージョンは以下のとおりです。

  • node: v7.2.1, v6.0, v6.1
  • redis: v3.2.6

インストールは環境に合わせてよしなにやってください。その後、npmを使ってmdstoreをインストールします。

$ npm install -g mdstore

パスを通すのが面倒でなければカレントディレクトリへのインストール(上記コマンドから-g を抜く)でも問題ありません。

さらにツール利用前にredis-serverが動作していることを確認してください。

  1. install mdstore by npm npm install -g mdstore
  2. start redis server, e.g. redis-server &

またデフォルトのredis server接続先 (localhost, port 6379, db 0) 以外を使いたい場合はオプションで指定できます。

  • -s or --host: redis server host
  • -p or --port: redis server port
  • -d or --db: redis server db

ブラックリストの更新

update コマンドを使うことで各サイトのブラックリストをダウンロードし、DBへの格納までを実施します。すでに対象のドメイン名が存在する場合は、取得したという履歴が追記されます。現在サポートしているサイトは3サイトだけですが、hpHostsが特に件数が多いため完了までに2〜3分かかります。

$ mdstore update
update: OK

ドメインを探す

get コマンドを使うことであるドメイン名が存在するかどうかを調べることができます。下記では例として 151.ru というドメイン名が存在しているかどうかをクエリしています。

% mdstore get 151.ru
2017-01-06T14:44:05.347Z { source: 'hphosts', ts: 1483713845.347 }

左のカラムが対象となるブラックリストをダウンロードした時刻になります。右側のtsのフィールドがタイムスタンプでこれをDateに変換したものです。ドメイン名がブラックリストに追加された時刻ではない点に注意してもらえればと思います。sourceはブラックリストの取得元を表しており、hphostsdnsbhmvpsのように表示されます。

その他、データの取得元で掲載されている項目に応じて追加のメタ情報が表示されます。

/etc/hosts の生成

ローカルのredisに保存してあるデータをもとに、悪意のあるドメイン名を 127.0.0.1 に強制的に変換する /etc/hosts を生成します。これを /etc/hosts と置き換えることで悪意のあるサーバと通信する可能性を低減させることができます。

$ mdstore hosts > hosts.txt
$ head hosts.txt
127.0.0.1       localhost
::1     localhost
127.0.0.1       www.wwsupport.net
127.0.0.1       www.memdesign.co.uk
127.0.0.1       www.titanweb.net
127.0.0.1       www.livingston.rs
127.0.0.1       iphonesupport.co.uk
127.0.0.1       up1702.info
127.0.0.1       dcstest.wtlive.com
127.0.0.1       ad.doubleclick.net.34325.9225.302br.net
$ sudo cp hosts.txt /etc/hosts         # Linuxの場合
$ sudo cp hosts.txt /private/etc/hosts # macOSの場合

データへのアクセス

CLIでアクセスする以外には、ローカルのredisに格納したデータはmdstoreのライブラリを使って参照することができます。以下のようなnodeのコードでアクセスできます。DNSの問い合わせログを持っている場合、自分でコードを書くことで不審なサイトへのアクセスがなかったかを確認できます。

var mdstore = new (require('mdstore')).Redis();
mdstore.update((err) => {
  // synced
        mdstore.get('is.the.domain.malicious.com', (err, res) => {
          if (res.length > 0) {
                  console.log('yes, the domain name is malicious');
          } else {
                  console.log('no, this is benign');
                }
        });
});

また、当然ですがredis serverに直接クエリすることも可能です。ただし、履歴データはMessagePackでエンコードされているので直接人間が読むのはちょっと難しいです。一応、以下のような1 linerで表示させることはできます。

$ redis-cli --raw lindex 151.ru 0 | node -e "process.stdin.pipe(require('msgpack-lite').createDecodeStream()).on('data', console.log);"