昨今Emotetなどといったサイバー攻撃の被害を受けたといったニュースを多く耳にするようになりました。サイバー攻撃の手口も巧妙になっているため、気付かないうちに感染してしまったということもあります。またセキュリティ対策を十分に実施しようとすると、膨大な時間とコストがかかってきます。
そこで今回はYAMAHAルータを使ったEmotet対策を実装してみたので共有します。YAMAHAルータには特定のIPアドレスの通信を遮断する機能(IPフィルター)があります。IPフィルターを利用して自動的にC2サーバのリストを更新して通信を遮断するスクリプトを作成しました。
※ただし今回紹介するスクリプトを利用することで100%対策できるわけではありません。
やったこと
スクリプトを作成してBlack Listの取得からYAMAHAルータへのIPフィルター設定まで一括で行います。下記図のように①にてスクリプトを実行すると、②~④までを自動的に実行します。このスクリプトを毎日実行すれば、常に最新のBlack ListのIPフィルターをYAMAHAルータに設定することができます。
システム環境
今回利用したシステム環境です。PythonでFEODO trackerからBlack Listを取得するスクリプトを書きます。シェルスクリプトでYAMAHAルータに接続してIPフィルターの設定を投入するスクリプトを書きます。
OS:Windows 10 Pro 64bit
バージョン:20H2
メモリ:16GB
CPU:Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz 3.19 GHz
Python 3.9.6
WSL(Windows Subsystem for Linux) Ubuntu version 1
スクリプト構成
今回は次のような3つのスクリプトから構成されます。
- get-black-list.py:FEODO trackerからBlack Listを取得してIPフィルターに投入するためのリストを作成します
- set-black-list.sh:取得したBlack Listを利用してYAMAHAルータにIPフィルターの設定を投入します
- excute.bat:上記二つのスクリプトをバッチ処理として実行するためのスクリプトです
スクリプト内容
get-black-list.py
get-black-list.pyはFEODO trakcerからBlack Listを抽出するスクリプトです。スクリプトを実行すると「list.txt」と「list_ip.txt」が作成されます。「list.txt」はFEODO trackerから取得したオリジナルのBlack Listです。オリジナルのリストを見て頂くとわかりますが、更新日時や体裁を整えるために「#」記号などが記載されています。YAMAHAルータのIPフィルターに必要なのは、IPアドレスのみですので文字列の抽出が必要となります。IPアドレスのみを抽出したリストが「list_ip.txt」になります。
まずwebページを取得して整形するために必要なモジュール(BeautifulSoup)をインポートしておきます。そしてFEODO trackerのURLを変数に格納しておきます。
次にFEODO trackerから取得したオリジナルのBlack Listを「list.txt」に格納します。ここでポイントはBeautifulSoupのメソッドで「.text」を利用することです(10行目付近)。このメソッドを使うことで取得したwebページの情報をテキストとして認識してくれます。オリジナルのテキスト情報を「list.txt」に保存しておきます。
次にオリジナルのテキストからIPアドレスのみを抽出します。先ほど作成したオリジナルの「list.txt」ファイルを呼び出し文字列の条件を指定してIPアドレスのみを抽出します(14行目以降)。頭文字が「#」or「改行(\n)」の場合はスキップ(continue)する条件を指定し、それ以外の場合はリストに格納します。抽出できたIPアドレスはYAMAHAルータのIPフィルターのフォーマットに合わせるために、カンマ区切りで文字列として結合します。
最後にカンマ区切りで作成されたIPリストを「ip_list.txt」に書き込んで終わりです。が、結合した文字列の最後に「改行(\n)」が残っているので忘れずに消しておきます(25行目付近)。
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 |
import requests from bs4 import BeautifulSoup def main(): load_url = "https://feodotracker.abuse.ch/downloads/ipblocklist_recommended.txt" html = requests.get(load_url) soup = BeautifulSoup(html.content, "html.parser") with open("list.txt","w") as file: file.write(soup.text) with open("list.txt") as f: ret = [] ip_list = "" for line in f: if line[0:1] == '#': continue elif line[0:1] == '\n': continue else: ret.append(line[:-1]) ip_list = ip_list + line[:-1] + "," print(ip_list[:-1]) with open("list_ip.txt","w") as file: file.write(ip_list[:-1]) if __name__=="__main__": main() |
set-black-list.sh
set-black-list.shはBlack ListをYAMAHAルータに投入するスクリプトです。スクリプトを実行するとYAMAHAルータにSSH接続を行ってIPフィルターの設定を行います。最後にオリジナルのリスト「list.txt」を日付を付けてリネームしてプログラムは終了します。
まず事前準備としてYAMAHAルータの接続に必要なログインパスワードを「login_pw.txt」に記載して保存しておきます。同様にadministrator権限に昇格するために必要なパスワードを「admin_pw.txt」に記載しておきます。
次に、YAMAHAルータに接続するためのコードを書きます。しかし、シェルスクリプトでsshするためにはプロンプトと対話モードで必要な情報を入力する必要があります。そこで、expect関数を利用します。こちらの関数でプロンプトから期待される回答があった場合に次のコマンドを送信するといった対話モードの自動化を実現することができます(8行目以降)。
簡単にexpect関数について説明します。まず対話モードになるために、「expect -c」と入力します。これで対話モードに切り替わります。次に「spawn」で入力したコマンドを送ります。次に「expect」コマンドでプロンプトから応答のあった内容とパターンマッチングを行います。パターンマッチングの結果、一致した場合は「send」コマンドを利用して次のコマンドを入力します。これを繰り返すことで、対話モードを自動化することができます。最後に「interact」コマンドで対話モードを終了します。
対話モードの注意点としては、「send」の後に入力したいコマンドを記載するだけでは実行してくれません。YAMAHAルータを実際に触ったら分かりますが、最後に「enter」を押す必要があります。「enter」の役割を担っているのが、「\r」になります。
次に少しだけYAMAHAルータに投入した設定内容について説明します。取得したBlack Listをすべて「reject」するフィルターの設定を行います。今回はフィルター番号2に取得したBlack Listを記載します(20行目)。C2サーバへの通信はすべて遮断するため、送信元、プロトコルは「*」にしています。
最後にFEODO trackerから取得したオリジナルのBlack Listをログフォルダに日付を付けて保存して終了です。
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 32 |
#!/bin/sh ip=`cat list_ip.txt` login_pw=`cat login_pw.txt` admin_pw=`cat admin_pw.txt` expect -c " set timeout 5 spawn ssh -p 22 <username>@<IP address> expect \"Password:\" send \"$login_pw\n\" expect \">\" send \"console line infinity\r\" expect \">\" send \"administrator\r\" expect \"Password:\" send \"$admin_pw\n\" expect \"#\" send \"ip filter 2 reject * $ip * * \r\" expect \"#\r\" send \"show config\r\" expect \"#\r\" send \"exit\r\" send \"Y\r\" expect \">\" send \"exit\r\" interact " date=`date "+%Y%m%d-%H%M%S"` mv list.txt ./log/list_$date.txt |
excute.bat
excute.batは先に記述したget-black-listt.pyとset-black-list.shを一つのバッチ処理として実行するためのプログラムです。特に難しいことはしていないので、解説は割愛します。
1 2 |
python /<File Path>/get-black-list.py wsl bash /<File Path>/set-black-list.sh |
これでexcute.batを実行するだけ、最新のBlack ListをYAMAHAルータに自動的に投入できるようになりました。
定期実行
バッチ処理で簡単に実行することができましたが、毎日バッチを手動で実行することは面倒くさいですよね。Windowsでは標準機能でタスクスケジューラがあり、毎日特定の時間にバッチ処理を実行することができます。設定の方法は私の過去の記事を参考にしてみてください。参考の記事はこちらからです。今回はwindows端末で定期実行を行っていますが、Linux系のOSの場合であれば、cronを利用することで同じように毎日特定の時間に処理を行うことができます。
まとめ
FEODO trackerで公開されているEmotetのC2サーバのBlack Listを収集してYAMAHAルータに自動投入するスクリプトを作成しました。Black Listの収集のためにPythonを利用し、YAMAHAルータのIPフィルターの設定に合うように文字列の整形が必要でした。またYAMAHAルータへのIPフィルターの設定はシェルスクリプトのexpect関数を利用することで対話モードになり、自動的に設定投入ができるようになりました。最後にバッチ処理として実行することで、毎日最新のBlack ListをYAMAHAルータに適用することができました。
今回はC2サーバの通信をすべてYAMAHAルータで遮断するという内容でした。実際はC2サーバと通信するようになるのは、端末が感染した後になります。したがって今回のスクリプトは端末が感染しても情報漏洩を防ぐ手段ということになります。またFEODO trackerのBlack Listをを投入したからといって100%情報漏洩を防ぐことができるとも言い切れません。したがって、日ごろからWindowsのパッチを適用することや怪しいファイルは開かないなどの基本的なセキュリティ対策が必須だと言えます。
コメント