「Fakeshell」で標的型攻撃の演習環境を作る
標的型攻撃(APT: Advanced Persistent Threat)とは、特定の目的を達成するために特定の組織や個人を標的とする、長期的で持続的な攻撃のことを指します。この攻撃の特徴は、標的となる組織や個人を攻撃するために、様々な手段を用いることです。例えば、脆弱性を突いたり、フィッシング攻撃を行ったり、マルウェアを埋め込んだり、盗聴することなどです。
このような攻撃は、企業や政府機関をはじめとする、様々な組織が標的となることがあります。そのため、防御のためには、常に最新のセキュリティ対策を行い、社内でのセキュリティ意識の向上のための継続的なセキュリティトレーニングが求められます。
セキュリティトレーニングをする上で、本物のハッカーが使うような攻撃ツールや脆弱性を用意することは難しく実装に時間がかかります。しかし、実際には攻撃を行わずに画面の表示や痕跡の作成を演出するだけなら簡単に実装することができます。これを簡単に実装できるツール「Fakeshell」を公開しました。
例えば、攻撃者がよく使うと思われるnmapのようなポートスキャナやExploitKitについても、fakeshellに実装することで、攻撃側のシナリオを実装することができます。
使い方
実際にfakeshellを使うには、まず以下のコマンドを実行してライブラリをインストールします。
$ pip install fakeshell
次に、以下のようにしてライブラリをインポートします。
from fakeshell.shell import FakeShell
fake_sh = FakeShell(cwd="/tmp")
FakeShellクラスのrun_commandメソッドを使用すると、指定したコマンドを実行することができます。
for result in fake_sh.run_command("echo hoge > hoge.txt ; cat hoge.txt | md5sum"):
print(result)
実行すると以下のような結果が得られます。
c59548c3c576228486a1f0037eb16a1b -
上記のコマンドをインタラクティブに実行するためには以下のサンプルコードを実行してSSHサーバを起動して接続を行ってください。
git clone https://github.com/phishing-hunter/fakeshell
cd fakeshell/example
ssh-keygen -t rsa -b 4096 -m PEM -f /tmp/server.key
python fake_ssh_server.py &
ssh root@localhost -p 2222 # パスワードは(password)
また以下のように独自のコマンドを定義することができます。
from fakeshell.interpreter import register_command
def hello(args="", stdin=""):
stdout = f"Hello, {args}"
return stdout
register_command("hello", hello)
登録したコマンドは、以下のようにして実行できます。
for result in fake_sh.run_command("hello John"):
print(result)
演習シナリオの流れ
下記のサンプルコードは、fakeshellを使って標的型攻撃のシナリオを実装する方法を示しています。攻撃側のシナリオから説明します。
# スキャンを開始する
fakeshell> nmap -sV [攻撃対象のIPアドレス]
# 脆弱性を発見したら、exploitを使用して攻撃を開始する
fakeshell> exploit [脆弱性番号]
防御側のシナリオでは、まずシステムやネットワークの状態を確認するために、以下のようなコマンドを実行します。
fakeshell> netstat -tan
fakeshell> ps aux
fakeshell> last
攻撃者が使用した攻撃ツールや脆弱性を突いた具体的なコマンドやスクリプトを確認することで、攻撃の追跡や対策の検討を行うことができます。
fakeshell> cat /var/log/auth.log
fakeshell> grep -r "exploit" /var/log/auth.log
fakeshell> ls -l /tmp
また、以下のようなコマンドを使用することで、ファイアウォールやセキュリティ対策を行うことができます。
fakeshell> iptables -L
fakeshell> iptables -A INPUT -p tcp --dport 80 -j DROP
演習シナリオの実装
以下は、nmapコマンドをfakeshellに追加するためのサンプルコードです。
import shlex
def cmd_nmap(cmd_args="", std_in=""):
cmd_args = shlex.split(cmd_args)
if "--help" in cmd_args or "-h" in cmd_args:
return """
nmap - Network exploration tool and security/port scanner
Synopsis:
nmap [OPTION]... [TARGET]...
Description:
Scan the TARGET hosts to determine the service and version information.
Options:
-sV probe open ports to determine service/version info
-p [portlist] specify port range to scan
--top-ports num scan the top num most common ports
-oA [file] output scan results in the specified file in three formats
--help display this help and exit
"""
std_out = "ダミーの結果出力"
return std_out
register_command("nmap", cmd_nmap)
次は攻撃ツールを簡単に実装するための例です。
攻撃に成功したときの挙動や、攻撃に失敗したときの挙動をそれぞれ実装する必要があります。
以下に、cmd_exploit関数の例を示します。
import shlex
import random
def cmd_exploit(cmd_args="", std_in=""):
cmd_args = shlex.split(cmd_args)
if "--help" in cmd_args or "-h" in cmd_args:
return """
exploit - execute an exploit
Synopsis:
exploit [OPTION]... [EXPLOIT_NAME]
Description:
Execute the specified exploit.
Options:
--help display this help and exit
"""
if len(cmd_args) < 1:
return "Error: specify exploit name"
exploit_name = cmd_args[0]
# ダミーのログ追記
with open("/var/log/syslog", "a") as f:
f.write("Executed exploit: {}\n".format(exploit_name))
# 攻撃が成功する確率は50%
if random.randint(0, 1) == 0:
# バックドアを設置する
with open("/tmp/backdoor.sh", "w") as f:
f.write("#!/bin/bash\n")
f.write("echo 'I am a backdoor'\n")
return "Exploit success"
return "Exploit failed"
register_command("exploit", cmd_exploit)
まとめ
fakeshellは、セキュリティ演習だけでなくハニーポット構築、マルウェア解析用のサンドボックスなど、様々な用途で活用することができます。今後も、実際のLinuxシステムで使われるコマンドや、攻撃者がよく使うと思われるコマンドを、fakeshellでカスタマイズできるよう、開発を続けていく予定です。
この記事を読んで、少しでもお役に立てたなら幸いです。何か質問やご意見がありましたら、お気軽にご連絡ください。
Discussion